Problem z programem, pascal

Witam, mam oto taki programik z procedurami, który nie chce po wyswietleniu procedury menu, zamykac programu, gdy naciskam zero. Nie wiem, czy czegos brakuje w tej procedurze, albo moze cos pokrecilem. Jesli Ktos zna Pascala, mógłby mi pomóc, podpowiedzieć?? Z góry dzięki.

program stdpw;

uses crt;

type student=record

     nazwisko, imie: string[20];

     ocena: real;

     rok: integer;

     end;

     kartoteka=file of student;

     tablica=array[1..100] of student;

     var uczelnia: kartoteka;

         x: tablica;

         n: integer;


procedure zapisz;

var i, n: integer;

    pom: student;


begin

 write('Podaj liczbę studentów: '); readln(n);

 rewrite(uczelnia);

  for i:=1 to n do

   begin

    writeln('Podaj dane studenta nr ', i, ':');

    write('Nazwisko: '); readln(pom.nazwisko);

    write('Imię: '); readln(pom.imie);

    write('Ocena: '); readln(pom.ocena);

    write('Rok: '); readln(pom.rok);

    write(uczelnia, pom);

   end;

end;


procedure dopisz;

var i, n: integer;

    pom: student;


begin

 write('Podaj liczbę studentów: '); readln(n);

 reset(uczelnia);

 seek(uczelnia, FileSize(UCZELNIA));

  for i:=1 to n do

   begin

    writeln('Podaj dane studenta nr ', i, ':');

    write('Nazwisko: '); readln(pom.nazwisko);

    write('Imię: '); readln(pom.imie);

    write('Ocena: '); readln(pom.ocena);

    write('Rok: '); readln(pom.rok);

    write(uczelnia, pom);

   end;

end;


procedure odczyt;

var pom: student;


begin

 reset(uczelnia);

 writeln('Nazwisko':22, 'Imię':22, 'Ocena':8, 'Rok':4);

  while not eof(uczelnia) do

   begin

    read(uczelnia, pom);

    writeln(pom.nazwisko:22, pom.imie:22, pom.ocena:8:2, pom.rok:4);

   end;

end;


function srednia: real;

var pom: student;

    n: integer;

    s: real;


begin

reset(uczelnia);

s:=0;

n:=0;

 while not eof(uczelnia) do

  begin

   read(uczelnia, pom);

   s:=s+pom.ocena;

   n:=n+1;

  end;

   srednia:=s/n;

end;


procedure prymusi;

var pom: student;

    s: real;


begin

 s:=srednia;

 reset(uczelnia);

 writeln('Wykaz studentów z oceną > od średniej: ', s:8:2);

 writeln('Nazwisko':22, 'Imię':22, 'Ocena':8, 'Rok':4);

  while not eof(uczelnia) do

   begin

    read(uczelnia, pom);

     if pom.ocena>s then

      writeln(pom.nazwisko:22, pom.imie:22, pom.ocena:8:2, pom.rok:4);

   end;

end;


procedure wpisz;

begin

n:=0;

reset(uczelnia);

 while not eof(uczelnia) do

  begin

   n:=n+1;

   read(uczelnia, x[n]);

  end;

end;


procedure sortuj;

var i, k: integer;

    pom: student;

    zmiana: boolean;


begin

 repeat

  k:=n-1;

  zmiana:=false;

   for i:=1 to k do

    begin

     if x[i].nazwisko>x[i+1].nazwisko then

      begin

       pom:=x[i];

       x[i]:= x[i+1];

       x[i+1]:=pom;

       zmiana:=true;

       k:=i;

      end;

    end;

 until not zmiana;

end;


procedure zachowaj;

var i: integer;


begin

rewrite(uczelnia);

 for i:=1 to n do

  write(uczelnia, x[i]);

end;


procedure menu;

var f: integer;


begin

 repeat

 clrscr;

 writeln;

 writeln('Funkcje programu'); writeln();

 writeln('1. zapisz');

 writeln('2. dopisz');

 writeln('3. wyświetl');

 writeln('4. z najwyższą średnią');

 writeln('5. sortuj');

 writeln('0. koniec');

 readln(f);

 case f of

 1:zapisz;

 2:dopisz;

 3:odczyt;

 4:prymusi;

 5: begin wpisz; sortuj; zachowaj;

    end; end;

  readln;

 until f=0;

end;


begin

clrscr;

assign(uczelnia, 'uczelnia.psc');

menu;

zapisz;

dopisz;

odczyt;

prymusi;

wpisz;

sortuj;

zachowaj;

close(uczelnia);

readln;

end.

Nie przeglądałem jeszcze całe kodu ale patrząc na procedurę menu i główną część programu widzę, że nie bardzo wiesz chyba jeszcze co ten program ma robić. Najpierw czyścisz ekran, potem kojarzysz plik ze ścieżką, wyświetlasz menu (mniemam, że chcesz wiedzieć co user chce zrobić), po dokonaniu wyboru przez użytkownika wykonujesz daną operację, po czym wykonujesz wszystkie pozostałe tzn. zapisz, dopisz, odczyt, prymusi, wpisz, sortuj, zachowaj. Dość nielogiczne podejście do tematu zakładasz. Z tego wynika, że jeśli wybierzesz 0 to i tak wszystko pozostałe się wykona.

Popraw proszę tytuł tematu i obejmij kod znacznikiem code lub quote

chcę żeby program wyświetlał menu, potem po naciśnięciu odpowiedniej liczby, uruchamioał procedurę tylko tą jedną, z tego co widzę, po uruchomieniu programu tak jest, tylko nie reaguje na 0, które konczy program, wszystkie pozostałe nie wykonują się chyba razem, bo gdy wychodze z programu, i włączam go znów, a potem wyświetlam dane to nie są one posortowane.

Po wywołaniu procedury menu, uruchamiasz kolejne procedury: zapisz; dopisz; odczyt; prymusi; wpisz; sortuj; zachowaj. Jeżeli to nie było celowe (a tak uważam) to usuń te wywołania w tych miejscach i po problemie.

usunąłem te procedury, ale program nie chciał się uruchomic, jak dopisałem procedure menu; uruchomił sie, lecz nadal jest problem z zerem :confused:

zamiast:

begin

clrscr;

assign(uczelnia, 'uczelnia.psc');

menu;

zapisz;

dopisz;

odczyt;

prymusi;

wpisz;

sortuj;

zachowaj;

close(uczelnia);

readln;

end.

napisz:

begin

clrscr;

assign(uczelnia, 'uczelnia.psc');

menu;

close(uczelnia);

readln;

end.

procedure menu zmień na:

procedure menu;

var f: integer;


begin

 repeat

 clrscr;

 writeln;

 writeln('Funkcje programu'); writeln();

 writeln('1. zapisz');

 writeln('2. dopisz');

 writeln('3. wyświetl');

 writeln('4. z najwyższą średnią');

 writeln('5. sortuj');

 writeln('0. koniec');

 readln(f);

 case f of

 1:zapisz;

 2:dopisz;

 3:odczyt;

 4:prymusi;

 5: begin wpisz; sortuj; zachowaj;

    end; end;

 until f=0;

end;

Potem napisz czy coś dało, bo nie mam na tym kompie kompilatora.

w głównym jest tylko menu; a w procedurze zmieniłem jak pokazałes, tzn. tam usunąłes tylko readln;, ale program reagował wtedy tylko na 1 i 2-jke cyfry, wiec jeszcze cos tam porobilem i zostawilem tak jak mówiles tylko dopisałem readln; przed until f=0; teraz reaguje na wszystkie od 1-5, a zeby wyjsc z programu to musze wcisnac 3x zero :/, ale wychodzi :confused: nie wiem juz sam co tam jest grane, dzieki wielkie za dotychczasową pomoc

procedure menu;

var f: integer;


begin

 repeat

 clrscr;

 writeln;

 writeln('Funkcje programu'); writeln();

 writeln('1. zapisz');

 writeln('2. dopisz');

 writeln('3. wyświetl');

 writeln('4. z najwyższą średnią');

 writeln('5. sortuj');

 writeln('0. koniec');

 readln(f);

 case f of

 1:zapisz;

 2:dopisz;

 3:odczyt;

 4:prymusi;

 5: begin wpisz; sortuj; zachowaj;

    end; end; readln;

 until f=0

end;


begin

clrscr;

assign(uczelnia, 'uczelnia.psc');

menu;

close(uczelnia);

readln;

end.

W procedurze menu odczytujesz wpisany klawisz readln(f), potem sprawdzasz co wybrał user, to po co tam na końcu przed until piszesz readln? Przecież przez to komputer czeka na wciśnięcie jeszcze raz enter. Jeżeli rozumiem to chodzi Ci o to, że chcesz jeszcze żeby po wykonaniu każdej czynności w case ekran się zatrzymywał, a po zerze nie.

procedure menu;

var

  f: integer;

begin

  repeat

    clrscr;

    writeln;

    writeln('Funkcje programu'); writeln();

    writeln('1. zapisz');

    writeln('2. dopisz');

    writeln('3. wyświetl');

    writeln('4. z najwyższą średnią');

    writeln('5. sortuj');

    writeln('0. koniec');

    readln(f);

    case f of

    1: begin

         zapisz;

         readln;

       end;

    2: begin

         dopisz;

         readln;

       end;

    3: begin

         odczyt;

         readln;

       end;

    4: begin

         prymusi;

         readln;

       end;

    5: begin

         wpisz;

         sortuj;

         zachowaj;

         readln;

       end;

   end;

  until f=0;

end;


begin

  clrscr;

  assign(uczelnia, 'uczelnia.psc');

  menu;

  close(uczelnia);

end.

Spróbuj tego teraz powinno być ok.

thx wielkie Damarus, dzięki Tobie program działa jak trzeba :slight_smile:

Sorry, że nie potrafiłem szybciej, ale dopiero teraz mogłem zainstalować kompilator. Wczoraj męczyłem się nad naprawieniem sobie kompa, bo po aktualizacji sterowników zaczął się sypać. W każdym bądź razie miło mi, że mogłem pomóc.

Pozdrawiam.