Kontrola DÚ Pascal

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Kontrola DÚ Pascal

Příspěvek 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
Probook 430G2
Zivan
Začátečník
Začátečník
Registrován: 30. čer 2005
Bydliště: Brno
Kontaktovat uživatele:

Re: Kontrola DÚ Pascal

Příspěvek od Zivan »

Zadani neceho jineho nez kladneho celeho cisla neresis? Co hodnota S pred cyklem?

Pro cele kladne cislo by byl vhodnejsi cyklus FOR.
HP Elitebook 845 G8 (Ryzen 5650U, 32GB RAM, WD SN570 1TB, 14" fullHD IPS) + HP USB-C G5 Essential + 29" LG 29UM65 + 22" Eizo S2202W
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek 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. :)
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek 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ě?
Probook 430G2
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek 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?
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek 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/
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
Ssnake
Začátečník
Začátečník
Registrován: 25. led 2005
Bydliště: chotebuz

Re: Kontrola DÚ Pascal

Příspěvek 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
FD node 202, ST45SF, Z97i, i7-4980HQ CB20:1718,CB24:254 NH-L9i, 2x8, R9NANO , 5100MAX
x850xtPE, x1950xtx, hd2900gt, hd3870, hd4890, hd5870 - - 6800ultra, 7900gtx, 8800gtx, 9800gtx+, gtx285
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek 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.....
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek 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ů.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
Zivan
Začátečník
Začátečník
Registrován: 30. čer 2005
Bydliště: Brno
Kontaktovat uživatele:

Re: Kontrola DÚ Pascal

Příspěvek od Zivan »

Dalsi problem by pak mohl byt v realnych cislech, pouzil bych operator MOD misto funkce frac() a hodnotu D nepotrebujes.
HP Elitebook 845 G8 (Ryzen 5650U, 32GB RAM, WD SN570 1TB, 14" fullHD IPS) + HP USB-C G5 Essential + 29" LG 29UM65 + 22" Eizo S2202W
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek od PS3master »

Tak problém vyřešen díky.
Stačilo přepsat na

Kód: Vybrat vše

until (A<2) or (C=true);
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.
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek 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íš.
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek od PS3master »

Body 1,2,4 chápu, ale 3 bod vůbec, mohl by jsi to trochu objasnit?
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek 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š:

Kód: Vybrat vše

...
podm = true;
if podm then
  ...
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áš:

Kód: Vybrat vše

if podm = 0 then ...
(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š? :-)
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek 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ď?
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek od Maranov »

To by mělo už fungovat, ne?
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek 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?
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek 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čí. :)
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
PS3master
Začátečník
Začátečník
Registrován: 25. lis 2011

Re: Kontrola DÚ Pascal

Příspěvek od PS3master »

Zase nechápu :D .Jako ověření zda je A přirozené číslo?
Probook 430G2
Maranov
Mírně pokročilý
Mírně pokročilý
Uživatelský avatar
Registrován: 21. črc 2006

Re: Kontrola DÚ Pascal

Příspěvek od Maranov »

Zkus zadat 1 nebo 0. :)
DESKTOP: C2D E8200 (pasivně); ATI HD 3870 (AC S1, 120 fan@5V); 4GB RAM; OCZ Vertex2 SSD 64GB; 320+320+250GB JBOD (odhlučněno); 2x FSC P19-2 (2056x1024)
MOBILE: Lenovo Thinkpad T420 4177 CTR, Crucial M4 SSD 128GB, 6GB RAM; FSC P19-2; Logitech G400
POCKET: Nokia Hulmia 800; Hitachi 500GB@Scythe Kamazo 2 (eSATA); Creative EP-630
AUDIO: Sennheiser HD 555 (foam mod), NuForce Icon µDAC, FLAC, ReplayGain, f2k

"A Man's mortality is a compass that points his way in life."
Odpovědět

Zpět na „Programování a web“