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.
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.
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 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.
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.