Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit

Zdravím,
mám napsat program v Pascalu, který pro n studentů vypíše zda student prospěl, prospěl s vyznamenáním nebo neprospěl. Počet předmětů je zadán konstantou. Program na závěr vypíše počet a čísla studentů, kteří neprospěli.
program vysvedceni;
type t_prospech=(prospel_s_vyznamenanim,prospel,neprospel);
t_znamka=1..5;
var prospech:t_prospech;
p:real; {prumer znamek}
petka:(ma5,nema5);
trojka:(ma3,nema3);
znamka:t_znamka;
p_s {pocet studentu},s {soucet znamek},i1,i2,p_s_n {pocet studentu, kteri neprospeli}:integer;
const p_p=5; {pocet predmetu}
begin
writeln('Zadej pocet studentu');
read(p_s);
s:=0;
p_s_n:=0;
for i1:=1 to p_s do begin
petka:=nema5;
trojka:=nema3;
prospech:=prospel;
for i2:=1 to p_p do begin
writeln('Zadej znamku');
read(znamka);
if znamka=5 then petka:=ma5;
if znamka=3 then trojka:=ma3;
s:=s+znamka;
end;
if petka=ma5 then begin
prospech:=neprospel;
p_s_n:=p_s_n+1;
end;
p:=s/p_p;
if (p<=1.5) and (trojka=nema3) then prospech:=prospel_s_vyznamenanim;
if prospech=prospel then writeln ('Student cislo ',i1,' prospel');
if prospech=prospel_s_vyznamenanim then writeln ('Student cislo ',i1,' prospel s vyznamenanim');
if prospech=neprospel then writeln ('Student cislo ',i1,' neprospel')
end;
end.Stále mi to hází Fatal: Compilation aborted
A ještě otázka: Jak tam vložit ten závěrečný výpis s počtem studentů, kteří neprospěli s jejich čísly?
Díky za pomoc.
Offline

Kdyz ti to hazi tu chybu Fatal: Compilation aborted, tak neukaze to misto, kde je chyba, a co je to za chybu?
Je tam potreba opravit alespon tohle -
Jak mas:
if petka:=ma5 then begin
tak tam nepatri ta dvojtecka, spis by melo byt:
if petka=ma5 then begin
A pak v te treti radce od konce mas nejake dvojite writeln :-) (a neni tam strednik) takze by to melo vypdat takhle podle me:
if prospech=neprospel then writeln ('Student cislo ',i1,'neprospel');
Kdyztak dej vedet, jestli to pomohlo, jeste se podivam na ten zaverecny vypis. Asi budes muset postupne do pole ukladat cisla tech studentu, a pak na konci je vypsat z toho pole.
Offline

↑ Lumikodlak:
Už to funguje :) Hloupé chyby ;)
Opraveno v původním postu.
Jinak pro výpis nemůžu použít pole - pouze jednoduché datové typy (integer, real, bolean, char, interval, výčet)
Offline

Tak to me vazne vubec nic nenapada :-)
To je dane v zadani, ze muzes pouzit jen jednoduche datove typy? Je tam dany maximalni pocet studentu? Asi bych musel videt cele zadani, jinak vazne nic me nenapada. Nebo to myslis tak, ze 'writeln' umi vypsat jen jednoduchy datovy typ, a ne cele pole?
Offline

↑ Lumikodlak:
No nemám zadání celé, protože ani celé nebylo, bylo vysvětlené, co to má dělat - to jsem napsala.
Jednoduché datové typy jsou určené tím, že se jedná o práci do školy, kde jsme pole nebrali, takže nemůže být použité. Ptala jsem se na to a nemůže. Pole mě totiž napsalo taky ;)
Počet je jasnej jak vypsat, ale ty jejich čísla? :(
Maximální počet studentů není dán.
Offline

↑ TomDlask:
Taky není možné použít :( Ale díky.
Offline
Nápad: použít integer "jako" pole nebo string. Nejlépe to uvedu na příkladu s konkrétními hodnotami:
Na začátku programu bude mít tento integer hodnotu 0.
Řekněme, že to (třeba) 6. student nezvládl a proto bude na konci vypsán. Do integeru zapíšeš 16. Jedničku proto, že 6ka je jednociferná a samotnou šestku. Po prvním zapsání by tam tedy bylo 16.
Dále tam budeš potřebovat uložit číslo 29. Chtěla by jsi tam tedy také přidat (obdobně jako u minulého případu) 229 (dva proto, protože 29 je dvojciferné, potom následuje ta devětadvacítka). Původní hodnotu vynásobíš tisícem (dostaneš 16000) a přičteš těch 229 => máš tam 16229.
Potom (uvádím poslední příklad zápisu) chceš uložit číslo 50. Padesátka má 2 cifry, proto ukládáš 250. Původní integer vynásobíš tisícem a přičteš 250. Získáváš 16229250. (chtělo by to spíš longint)
Jak to potom přečíst:
První cifra čísla je 1 => budeme číst jedno číslo => dostaneme 6, "odtrhneme" od čísla tyhle dvě (dvě = tu jednu identifikační + šestku) cifry (získáme 229250)
První cifra je dvojka => odebereme dvě čísla => dostanem 29, "odtrhneme" od čísla tyto tři (tři = jednu identifikační + 29) cifry (získáme 250)
První cifra je dvojka => odebereme dvě čísla => dostaneme 50, "odtrhneme" od čísla tyto tři cifry.
V tom integeru nám už zbyla jen původní 0. Vše jsme již vypsali.
Pro tento postup je ale třeba znát operace mod a div, počítat mocniny desítky a možná i logaritmus. Bude ale fungovat jen na malý počet ukládaných čísel, pro vyšší by to chtělo "delší" datový typ. Jestliže je ale možno použít string, tak tam by se to dělalo podobně a mnohem jednodušeji.
Offline