Tablica rekorów Co tu nie gra????

0

WITAM zrobiłem program. Robi on wszystkie zalecenia zadania. Według mnie jest ono zrobione dobrze ale mój nauczyciel powiedział:
"Niestety program nie działa poprawnie. Nie wczytuje wszystkich danych. Być może jest problem z ustawieniem długości tablicy hęę...?"
tak właśnie... :) nie wiem o co mu chodzi

zadanie brzmi:
Szkoła robi stypendia dla studentów . Minimalne wymagania :

  • Ocena średnia nie wyższa niż 3
  • Co najmniej drugi rok studiów
  • Wiek ponad 40 lat
    Informacje o studentach zapisane są w n-elementowej tablicy rekordów postaci:
  • nazwisko
  • średnia ocena
  • rok studiów
  • wiek
    Uporządkować tablicę w ten sposób, że na początku znajdą się osoby, które mogą otrzymać stypendium, a w dalszej części pozostali.
    Program główny organizuje wprowadzanie danych, porządkowanie tablicy oraz wyświetlenie listy studentów, zaznaczyć, kto może uzyskać stypendium oraz obliczyć ile jest takich osób.
    mój program:

Program Pechowcy;

type
student=record
nazwisko:string;
srednia:real;
rok:byte;
wiek:byte;
stu:byte;               {Typ pomocniczy}
end;

tab=array of student;

var
c,k,d,n,z,j,i,q:integer;
x:tab;
r:real;
h:string;

begin
writeln;
writeln;
write('Podaj ile jest studentow: ');      readln(n);
writeln;
writeln;
writeln('Podaj info o studentach:');
writeln;

SetLength(x,n);

for z:=1 to n do  

begin
writeln;
writeln('Student:');
write('Nazwisko: ');  readln(x[z].nazwisko);
write('srednia ');    readln(x[z].srednia);
write('rok');         readln(x[z].rok);
write('wiek');        readln(x[z].wiek);

if ( (x[z].srednia<=3) and (x[z].rok>=2) and (x[z].wiek>40))  then 

begin
x[z].stu:=0;
end
else 
begin
x[z].stu:=1;
end;
end;

{algorytm flagi polskiej} 

i:=1; 
j:=n; 

while(i<j) do begin 

      while ((x[i].stu=0) and (i<n)) do begin 
      i:=i+1; 
      end; 

      while ((x[j].stu=1) and (j>1)) do begin 
      j:=j-1; 
      end; 

      if (j>i) then 
      begin 
      
      h:=x[i].nazwisko; 
      x[i].nazwisko:=x[j].nazwisko; 
      x[j].nazwisko:=h; 

      r:=x[i].srednia; 
      x[i].srednia:=x[j].srednia; 
      x[j].srednia:=r; 

      k:=x[i].rok; 
      x[i].rok:=x[j].rok; 
      x[j].rok:=k; 

      d:=x[i].wiek; 
      x[i].wiek:=x[j].wiek; 
      x[j].wiek:=d; 

      q:=x[i].stu; 
      x[i].stu:=x[j].stu; 
      x[j].stu:=q; 

      end; 

      i:=i+1; 
      j:=j-1; 
end; 

writeln;
writeln('    LISTA:    ');
writeln('------------------------------------------------');
writeln;

for z:=1 to n do

begin

writeln('Student:');
writeln('Nazwisko: ',x[z].nazwisko); 
writeln('Srednia Ocen: ',x[z].srednia:1:2);
writeln('Rok: ',x[z].rok);
writeln('Wiek: ',x[z].wiek);
if (x[z].stu=0) then begin writeln('Stypendium przyznane');
writeln('-------------------------------------------------');
writeln;
end;
if (x[z].stu=1) then begin writeln('Stypendium nieprzyznane'); 
writeln('-------------------------------------------------');
writeln;
end;
end;


for z:=1 to n do 

begin
if (x[z].stu=0) then  
c:=c+1;  

end;

writeln;
writeln('Liczba studentow ktorzy otrzymaja stypendium: ',c);
writeln;
readln;
end.

 

Proszę o pomoc o co chodzi mojemu nauczycielowi???

0

nie wiem jak w starym pascalu ale czy array nie jest przypadkiem indeksowane od 0?
pierwszy element tablicy ma indeks 0, drugi 1 itd.. a u Ciebie widze petle for, w ktorej zaczynasz indeksowanie od 1, wiec od drugiego elementu tablicy. pierwszy student zostanie pominiety.

0
  1. to nie jest „stary” Pascal bo używa tablic dynamicznych
  2. tablice dynamiczne (bez podania indeksów, np. array of student;) indeksowane od 0.
0

tak to jest fpc kompiler taki lampard na folderze:) hm... i o co tu może chodzić??

0

No przecież cimak i Azarien dali wskazówkę.

SetLength(x,n);//tworzy tablicę x[0..n-1]
0

no i ??? przecież program robi to samo:)

2
hiob21 napisał(a)

no i ??? przecież program robi to samo:)

naprawdę jesteś aż tak tępy czy tylko udajesz??

3

Podpowiadam:

for z:=1 to n do

Przeczytaj to, a potem komentarz do linijki wyżej:

tworzy tablicę x[0..n-1]

Wystarczająco duże litery?

0

Jetem początkujący wiec nie wiem. zmieniając for z=1 to n do na for z=0 to n-1 do wychodzą mi błędy w programie jakies zera o w ogóle (zamieniłem wszystkie funkcje for w programie)

0

Wszystkie Twoje problemy biorą się z tego, że nazwałeś program "Pechowcy". Sam napytałeś sobie biedy. Gdybyś nazwał program np. "Farciarze", to wszystko byłoby dobrze ;)

A tak już na poważnie, to sama zmiana indeksów pętli for ... do z 1..n na 0..n-1 nie wystarczy. Musisz jeszcze poprawić ten fragment kodu:

{algorytm flagi polskiej}
i:=1; 
j:=n; 

1 użytkowników online, w tym zalogowanych: 0, gości: 1