Matematické Fórum

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

#1 18. 04. 2011 15:01

Hudler
Příspěvky: 130
Škola: FIT CVUT
Reputace:   
 

Pascal - chyba v algoritmu

Zdravím

Potřeboval bych poradit s nalezením chyby v algoritmu.

Code:

program zaci_H;
type
student = record
        jmeno:string;
        narozen:integer;
        znamky:array [1..5] of byte;
        end;

var Fkniha:file of student;
    trida:array [1..30] of student;
    zak:student;
    konec:boolean;
    i,j,k:integer;

begin
assign(Fkniha,'studenti.dat');
rewrite(Fkniha);
konec:=false;
repeat
i+=1;
writeln('Zadejte jmeno: [ENTER - konec vstupu]');
readln(trida[i].jmeno);
if trida[i].jmeno <>'' then
   begin
   writeln('Zadejte rok narozeni: ');
   read(trida[i].narozen);
   for j:=1 to 5 do
       begin
       writeln('Zadejte znamku: ');
       read(trida[i].znamky[j]);
       end;
   end
else
    konec:=true;
write(Fkniha,trida[i]);
until konec;
close(Fkniha);
writeln;

reset (Fkniha);
while not (eof(Fkniha))  do
      begin
      read(Fkniha,zak);
      if zak.jmeno<>'' then
         begin
         writeln('Jmeno: ',zak.jmeno);
         writeln('Narozen: ',zak.narozen);
         write('Znamky: ');
         for k:=1 to 5 do
             write(zak.znamky[k],' ');
         writeln;
         end;
      end;
close(Fkniha);

readln;readln;
end.

Program má načítat studenty, dokud při zadávání jména nezadáme žádnou hodnotu. Místo toho načte pouze jednoho studenta, u druhého ještě vypíše 'Zadejte jmeno...', ale potom hned skočí na výpis. Nemůžu se dopátrat kde je chyba.

Děkuji

Offline

  • (téma jako vyřešené označil(a) Hudler)

#2 18. 04. 2011 15:18 — Editoval Hudler (18. 04. 2011 15:21)

Hudler
Příspěvky: 130
Škola: FIT CVUT
Reputace:   
 

Re: Pascal - chyba v algoritmu

repeat
i+=1;

Pascal to nastaví na 0 defaultně, ale vím že je to správnější to psát ručně.

Pořád stejný problém.

Offline

 

#3 18. 04. 2011 15:18

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Pascal - chyba v algoritmu

Nebude to tím, že 'i' není nijak inicializované a trida[i] tak začně ukazovat mimo meze [1..30]? Zkus i:=0 před ten repeat-cyklus.

Offline

 

#4 18. 04. 2011 15:29

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Pascal - chyba v algoritmu

OK, asi teda inicializuje.

No každopádně. Oprášil jsem Pascal a zkompiloval jsem si to. Pro načítání těch čísel používáš read(), což nepřečte enter. Dalšímu read() -- zdá se -- tohle nijak nevadí a čeká na zadání čísla, ale jakmile přijde první readln(), což je ve druhé interaci, hned celý readln() skončí jakoby uživatel na klávesnici zadal hned enter.

Místo obou výskytů read() použij readln().

Offline

 

#5 18. 04. 2011 15:39 — Editoval Hudler (18. 04. 2011 15:43)

Hudler
Příspěvky: 130
Škola: FIT CVUT
Reputace:   
 

Re: Pascal - chyba v algoritmu

Děkuji. Stále mi sice není přesně jasné, proč můj postup nefunguje, každopádně s readln vše funguje tak jak má.

Pochopil jsem to tak, že ten enter tam vlastně zůstal z předchozího zadávání a přečetl se až při readln...

Offline

 

#6 19. 04. 2011 08:21

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Pascal - chyba v algoritmu

Ano, enter tam zustal z predchoziho zadavani. Je jen otazkou, proc jej nezkonzumuje nasledujici read() a neskonci tak s chybou, protoze enter neni cislo. To bude nejaka pascalovska specialita. Kdyz totiz v zadani cisla zadas treba pismeno, konci cely program s chybou.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson