Stránka 1 z 2
Kontrola DÚ Pascal
Napsal: čtv 19. led 2012, 21:00
od PS3master
Máme Dú do programování, kterej bude oznámkován,tak bych se chtěl zeptat(a poprosit vas),jestli to mám dobře
Zadání:
Napište program pro vynásobení dvou celých kladných čísel pomocí sčítání.
Přišlo mi to strašně primitivní, tak se raději ptám,takže program:
Program scitani;
var A,B,S,I:integer;
Begin
Readln('Zadej mi prvni cislo:' ,A);
Readln('Zadej mi druhe cislo:' ,B);
Repeat S:=S+A;
I:=I+1;
Until I=B;
write('Soucet cisel je: ' ,S)
readkey;
end.
Myslíte,že je to dobře?

Moc vám děkuji
Re: Kontrola DÚ Pascal
Napsal: čtv 19. led 2012, 21:31
od Zivan
Zadani neceho jineho nez kladneho celeho cisla neresis? Co hodnota S pred cyklem?
Pro cele kladne cislo by byl vhodnejsi cyklus FOR.
Re: Kontrola DÚ Pascal
Napsal: čtv 19. led 2012, 22:01
od Maranov
Je to celkem dobře, ale byly by výtky:
- Nejdůležitější: každá proměnná by měla být inicializována, buď ReadLn(), jinou funkcí, přiřazením, čímkoliv. Není pravidlem, že hodnota musí být na začátku 0, je lepší být v tomto důslednější (hlavně v C/C++).
- Sice je zadáno, že jde o kladné číslo, ale přesto není důvod, proč použít Repeat-Until.
- - Zapamatuj si tohle:
- - Používám index (procházím pole, sčítám něco, provádím něco X krát) - použiji For.
- - Pokud potřebuji obecnější podmínku, použiji While.
- - Teprve pokud potřebuješ, aby proběhl cyklus
alespoň jednou, použiješ Repeat-Until
- Třetí věc souvisí s tím cyklem, většinou když chceš něco provést Bkrát, provedeš to "od B postupně až po 1" - určitě pochopíš, co tím myslím.

Re: Kontrola DÚ Pascal
Napsal: čtv 19. led 2012, 22:28
od PS3master
Zivan píše:Zadani neceho jineho nez kladneho celeho cisla neresis? Co hodnota S pred cyklem?
Pro cele kladne cislo by byl vhodnejsi cyklus FOR.
Ve škole nám říkali,že pokud neurčíme hodnotu proměnné, program jí automaticky přiřadí 0
Jak bych měl řešit kladné číslo? Jako napsat před cyklus něco jako toto?:
if A<0 then write('Nebylo zadano kladne cislo');
if B<0 then write('Nebylo zadano kladne cislo');
Maranov: To s tím B jsi myslel nějak takhle
Repeat
S:=S+A;
B:=B-1;
until
B=0;
Chápu správně?
Re: Kontrola DÚ Pascal
Napsal: čtv 19. led 2012, 22:33
od PS3master
Nevíte,kde bych stáhl pascal? Stáhl jsem delphi lite,ale tam se zatím moc nevyznám
Jinak k tomu for...nevím,říkali nám,že máme používat to co nám přijde nejlogičtější,mě přijde repeat,until,myslíte,že je lepší for?
Re: Kontrola DÚ Pascal
Napsal: čtv 19. led 2012, 22:53
od Maranov
Maranov: To s tím B jsi myslel nějak takhle
Repeat
S:=S+A;
B:=B-1;
until
B=0;
Chápu správně?
Tak trochu... spoj si to s tím, jak jsem psal "když něco provádím X krát". Pokud používáš nějaký index nebo k něčemu v cyklech přičítáš, použiješ For. Věř mi, pár jsem jich napsal. Asi v dvanácti jazycích.
Kontrolovat podmínky je správné, jen nezapomeň na jednu věc - po výpisu program pokračuje, musíš ho ukončit nebo se zeptat znovu (v cyklu).
Na tvorbu jsem svého času používal Free Pascal
http://www.stahuj.centrum.cz/vyvojove_n ... ee-pascal/
Re: Kontrola DÚ Pascal
Napsal: pát 20. led 2012, 09:38
od Ssnake
pascal uz moc nepamatuju, rekni ze se chces ucit C a ne pascal (s DevCPP treba), vyuka pascalu uz se presmerovala na C pred X lety
kdyz uz budes mit A i B (a oba kladna, tvuj kod nebere do uvahy nulu a s nulou bude pocitat spatne) tak
int S=0;
for (i=0;i<B;i++) S+=A;
nebo for (i=1;i<=B;i++) S+=A;
ten repeat se mi zda zbytecne dlouhy, a s FOR klidne muze byt A i B =0 (cyklus se neprovede a S zustane 0)
a pak jen vypises S. snad to jde pochopit a do syntaxe pascalu to uz hodis lehce
Re: Kontrola DÚ Pascal
Napsal: sob 17. bře 2012, 18:40
od PS3master
Tak zkouším další úkoly a mám problém...mám udělat program za pomoci repeat until, který zjistí zda zadané číslo je prvočíslo
Kód: Vybrat vše
program prvocislo;
var A,B,D:real; C:boolean;
begin
clrscr;
writeln('Zadej mi cislo na overeni zda je prvocislo');
readln(A);
C:=false;
B:=A;
repeat A:=A-1; D:=B/A; if frac(D)=0 then C:=true;
until (A>2) and (C=false);
if C=false then writeln('Zadane cislo je prvocislo')
else writeln('Zadane cislo neni prvocislo');
end.
Jenže mi to nejede a nevím proč...??? Mohli by jste mi pomoct?
Program na každé číslo které zadám napíše, že je prvočíslo.....
Re: Kontrola DÚ Pascal
Napsal: sob 17. bře 2012, 23:54
od Maranov
Je to dost nečitelné, mám-li se vyjádřit. Problém je ten, že Pascal opakuje repeat-until cyklus když je podmínka NEplatná, na rozdíl od C-jazyků.
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 10:32
od Zivan
Dalsi problem by pak mohl byt v realnych cislech, pouzil bych operator MOD misto funkce frac() a hodnotu D nepotrebujes.
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 15:28
od PS3master
Tak problém vyřešen díky.
Stačilo přepsat na
Nevěděl jsem, že until vlastně znamená zápor. A ukončení cyklu má nastat, v jednom ze dvou případů, proto or...No jo jsem začátečník, takže děkuju, že mi pomáháte.
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 18:03
od Maranov
Tohle ti ale taky nebude fungovat, ne? Musíš se zastavit už při A = 2, takhle proběhne i dělení 1, což je vždy se zb. 0.
Další věci:
- Pojmenovávej proměnné normálně (A - vstupniCislo, B - delitel, C - jePrvocislo), nezáleží tak na tom, jaký budeš mít styl, hlavně aby byl konzistentní.
- Máš tam zbytečně moc proměnných. Místo "D:=B/A; if frac(D)=0" můžeš napsat "if frac(B/A)=0" a podobně. Když dáš ten "if" do podmínky cyklu, namísto "C=true", tak ušetříš i proměnnou C.
- "C=true" je lepší zkrátit na "C". Prostě se ptáš "jestli platí C", boolean je sám o sobě logický výsledek, nemusíš ho porovnávat. V jazyce C by jsi s tím navíc narazil. Stejně tak "C=false" je lepší nahradit "NOT C".
- Piš to slušně, odsazuj, odřádkovávej, piš mezery mezi operátory "1 + 2" namísto "1+2". Až budeš psát něco složitějšího, pochopíš.
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 21:24
od PS3master
Body 1,2,4 chápu, ale 3 bod vůbec, mohl by jsi to trochu objasnit?
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 22:02
od Maranov
Podmínka if, repeat, while apod. přijímá výsledek typu boolean. Ten se dá získat jako výsledek nějaké logické operace - výrazu, jehož výsledkem je "ano (true)" nebo "ne (false)" (třeba "rovná se?", "je menší než X?",...).
Boolean hodnoty (výsledek takového výrazu) můžeš samozřejmě uložit jako proměnnou - tak jak to děláš. Jelikož podmínky přijímají boolean a proměnná je typu boolean, tak nemusíš nic porovnávat, prostě napíšeš:
Což nejen vypadá lépe, ale v jazycích, které nemají "silný" typ boolean to je i bezpečnější. Takové jazyky typicky interpretují 0, prázdný řetězec nebo prázdný seznam proměnných jako "false" a cokoliv jiného jako "true". Čímž vzniká problém, že když se zeptáš:
(což je jako by jsi v Pascal napsal podm = false)
tak si zaděláváš na malér, protože pokud podm bude třeba prázdný řetězec, tak sice to je "false", ale podmínka selže, protože to není konkrétně tato reprezentace (nula).
Klasicky C/C++ interpretuje 0 jako false a cokoliv jiného jako true.
Prostě se tomuhle všichni vyhýbají jako moru, protože je v tom pak bordel. Kapiš?

Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 23:07
od PS3master
Kód: Vybrat vše
begin
clrscr;
writeln ('Zadej mi cislo na overeni zda je prvocislo');
readln (A);
B:=A;
repeat A:=A-1; if frac(B/A)=0 then C:=true;
until (A=2) or C ;
if not C then writeln('Zadane cislo je prvocislo')
else writeln('Zadane cislo neni prvocislo');
Co teď?
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 23:30
od Maranov
To by mělo už fungovat, ne?
Re: Kontrola DÚ Pascal
Napsal: ned 18. bře 2012, 23:41
od PS3master
Ale jo, ono to fungovalo i před tím, já jenom jsem postnul, jestli jsem tě správně pochopil a tím C?
Re: Kontrola DÚ Pascal
Napsal: pon 19. bře 2012, 10:08
od Maranov
Jo, pochopil. Dá se to ale ještě dost vylepšit, kontrola platnosti vstupu tam třeba chybí.
Ale jestli jsi s tím spokojený, tak to stačí.

Re: Kontrola DÚ Pascal
Napsal: pon 19. bře 2012, 10:10
od PS3master
Zase nechápu

.Jako ověření zda je A přirozené číslo?
Re: Kontrola DÚ Pascal
Napsal: pon 19. bře 2012, 10:40
od Maranov
Zkus zadat 1 nebo 0.
