[Pascal] problem z wyswietlaniem posrtowanych elementow

0

siema mam problem z programem po napisaniu procedury na sortowanie nie wyswietla mi na ekranie posortowani uczniowie moze ktos wie jak mi <ort>pomóc</ort> ??

uses CRT;

type
      uczniowie = record
               imie    :string[20];
               nazwisko:string[25];
               srednia :real;
               miejsce : byte;
               end;
     plik=file of uczniowie;

LABEL powrot,koniec;
var

tablica : array [1..2] of uczniowie;
	temp : uczniowie;
uczen1,uczen2:uczniowie;
wybor:integer;
pom:boolean;
f:plik;
name:string;
procedure Wypelnij(var k:uczniowie);
begin
  WITH k do
    begin
      write('Podaj imie: ');
      readln(imie);
      write('Podaj nazwisko: ');
      readln(nazwisko);
      write('Podaj sredia: ');
      readln(srednia);
    end;
end;


procedure Wyswietl(k:uczniowie);
begin
  WITH k do
    begin
    writeln;
    writeln('Imie:       ',imie);
    writeln('Nazwisko:    ',nazwisko);
    writeln('srednia:        ',srednia);
    end;
end;

procedure ZapiszDoPliku(uczen1,uczen2:uczniowie;nazwa:string);
begin
assign(f,nazwa);
rewrite(f);
write(f,uczen1);
write(f,uczen2);
close(f);
end;

procedure CzytajZPliku(nazwa:string);
begin
assign(f,nazwa);
reset(f);
read(f,uczen1);
Wyswietl(uczen1);
read(f,uczen2);
Wyswietl(uczen2);
close(f);
end;

Procedure Sortuj;
var
uczen1,uczen2:byte;


begin
for uczen1:=1 to 2 do
	for uczen2:=uczen1+1 to 3 do
	if (tablica[uczen1].srednia<tablica[uczen2].srednia) then
	begin
		temp:=tablica[uczen1];
		tablica[uczen1]:=tablica[uczen2];
		tablica[uczen2]:=temp;
	end;
for uczen1:=1 to 2 do
	tablica[uczen1].miejsce:=uczen1;
end;


Begin
clrscr;
powrot:
writeln('Menu:');
writeln;
writeln('1.Wypelnij dane uczniow.');
writeln('2.Wyswietl dane dwoch uczniow.');
writeln('3.Zapisz do pliku');
writeln('4.Porownaj srednie uczniow');
writeln('5.Wyjscie');
writeln;
readln(wybor);
case wybor of
1:begin
  writeln('Podaj dane pierwszego ucznia :');
  Wypelnij(uczen1);
  writeln;
  writeln('Podaj dane drugiego ucznia :');
  Wypelnij(uczen2);
  pom:=true;
  goto powrot;
  end;
2:begin
  if (not pom)then
  begin
  writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)');
  readkey;
  clrscr;
  goto powrot;
  end
  else
  begin
  Wyswietl(uczen1);
  writeln;
  Wyswietl(uczen2);
  end;
  readkey;
  goto powrot;
  end;

3:begin
  writeln('Podaj nazwe');
  readln(name);
   ZapiszDoPliku(uczen1,uczen2,name);
   CzytajZPliku(name);
   readln;
  end;
4:begin
  writeln('Wyrzsza srednia ma :');
  Sortuj;             {<------------------------------------------tu powinno mi chyba posortowac  wyswietlic a zamiast tego wylaczas mi sie}
                    
  readln;
  end;

else goto koniec;
end;
koniec:
end.

z gory dzieki za pomoc ;]

0

popraw wcięcia, wywal GOTO, wyświetlanie musi być w pętli

0

lol <ort>przecieŻ</ort> wyswietlanie jest w ort! ;]

0

lol przecieŻ wyswietlanie jest w pentli

procedure Wyswietl(k:uczniowie);
begin
  WITH k do
    begin
    writeln;
    writeln('Imie:       ',imie);
    writeln('Nazwisko:    ',nazwisko);
    writeln('srednia:        ',srednia);
    end;
end;

begin
  Wyswietl(uczen1);
  writeln;
  Wyswietl(uczen2);
end;

Gdzie masz tą pętlę bo nie wiem? :|

Polecam też słownik ortograficzny.

0

moze byc taka :D?

Procedure Wyswietl;
var
	uczen1:Byte;
begin
for i:=1 to 18 do
if (tablica[uczen1].nazwa<>'') then
with tablica[uczen1] do
    begin
    writeln;
    writeln('Imie:       ',imie);
    writeln('Nazwisko:    ',nazwisko);
    writeln('srednia:        ',srednia);
	
	
	
end;
end;
0

To powinno działać :)

0

bardzo prosze wez mi to popraw bo mnie juz kur***a strzela ;]

Program Teams;
uses crt;
type
	uczen = record
               nazwa:string;
               imie    :string[20];
               nazwisko:string[25];
               srednia :real;
               miejsce : byte;

	end;
        plik=file of uczen;
var
	tablica : array [1..18] of uczen;
	temp : uczen;
        uczen1,uczen2:uczen;
        wybor:integer;
        pom:boolean;
        f:plik;

Procedure Wyswietl;
var
	i:Byte;
begin
for i:=1 to 18 do
if (tablica[i].nazwa<>'') then
with tablica[i] do
begin
	writeln('Imie: ',Imie);
        writeln('Nazwisko: ',Nazwisko);
        writeln('Srednia: ',Srednia);
	writeln('-------------------------------');
end;
end;

Procedure Sortuj;
var

i,j:byte;

begin
for i:=1 to 17 do
	for j:=i+1 to 18 do
	if (tablica[i].punkty<tablica[j].punkty) then
	begin
		temp:=tablica[i];
		tablica[i]:=tablica[j];
		tablica[j]:=temp;
	end;
for i:=1 to 18 do
	tablica[i].miejsce:=i;
end;


procedure Wypelnij(var k:uczen);
begin
  WITH k do
    begin
      write('Podaj imie: ');
      readln(imie);
      write('Podaj nazwisko: ');
      readln(nazwisko);
      write('Podaj sredia: ');
      readln(srednia);
    end;
end;

procedure ZapiszDoPliku(uczen1,uczen2:uczen;nazwa:string);
begin
assign(f,nazwa);
rewrite(f);
write(f,uczen1);
write(f,uczen2);
close(f);
end;

procedure CzytajZPliku(nazwa:string);
begin
assign(f,nazwa);
reset(f);
read(f,uczen1);
Wyswietl;
read(f,uczen2);
Wyswietl;
close(f);
end;

Begin
clrscr;
writeln('Menu:');
writeln;
writeln('1.Wypelnij dane uczniow.');
writeln('2.Wyswietl dane dwoch uczniow.');
writeln('3.Zapisz do pliku');
writeln('4.Porownaj srednie uczniow');
writeln('5.Wyjscie');
writeln;
readln(wybor);
case wybor of
1:begin
  writeln('Podaj dane pierwszego ucznia :');
  Wypelnij(uczen1);
  writeln;
  writeln('Podaj dane drugiego ucznia :');
  Wypelnij(uczen2);
  pom:=true;

  end;
2:begin
  if (not pom)then
  begin
  writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)');
  readkey;
  clrscr;
  end
  else
  begin
  CzytajZPliku;
  end;
  readkey;
  end;

3:begin
  writeln('Podaj nazwe');
  readln;
   ZapiszDoPliku;
   CzytajZPliku;
   readln;
  end;
4:begin
  writeln('Wyrzsza srednia ma :');
  Sortuj;
  wyswietl;
  readln;
  end;
end;
end.

z gory dzieki

0

wyrzsza
....
....pisze się troche inaczej ;-)
Mógłbyś troche dokładniej opisać problem?? Nie kompiluje się czy wyświetla jakieś krzaki czy jeszcze coś innego??

0

mam dysortografie wiec juz mozesz mnie nie poprawiac ;]
a problem jest taki ze wyswietla sie bledow strasznie duzo i gdy 1 poprawie to jakis nastepny sie wyswietla ;] czyli <ort>niechce</ort> sie kompilowac ;]

0

Słownik ortograficzny, Word, OpenOffice, FF 2.0 - wszystko to sprawdza pisownię. Jak napisałem w pierwszym poście. Popraw ten kod wizualnie, bo nie chce mi się tego bałaganu analizować. Wcięcia, wcięcia i jeszcze raz wcięcia.

0

1.W procedurze Wyswietl zamiast :

with tablica[i] do
begin
        writeln('Imie: ',Imie);
        writeln('Nazwisko: ',Nazwisko);
        writeln('Srednia: ',Srednia);
        writeln('-------------------------------');
end;

powinno chyba być:

with tablica[i] do
begin
        writeln('Imie: ',Imie);
        writeln('Nazwisko: ',Nazwisko);
        writeln('Srednia: ',Srednia);
end;
writeln('-------------------------------');

2.Procedura CzytajZPliku odczytuje dane o tylko 2 uczniach. Jeżeli chcesz odczytać dane o wszystkich to napisz to tak:

 procedure CzytajZPliku(nazwa:string);
begin
assign(f,nazwa);
reset(f);
for i:=1 to 18 do
read(f,uczen[i]);
Wyswietl;
close(f);
end;
  1. Do procedur ZapiszDoPliku i CzytajZPliku musisz podać pełną ścieżke pliku chyba że jest on w tym samym folderze co program. Jak nadal nie będzie działać to napisz jakie błędy wyświetla.
    4.Ja mam dysortografie i dysgrafie i jakoś robie troche mniej błędów. Staraj się bardziej :-)
0

Ja to kompletnie nie czaję fragmentu : "podaj dane dwóch uczniów". Po co to?

0

wiecie <ort>przecieŻ</ort> ort! choddzi ;]

sorry ze <ort>NIE MA</ort> tych wciec ale facet na lekcji tak robi wiec ja sie tez przyzwyczailem ;]

Program Teams;
uses crt;
type
        uczen = record
               nazwa:string;
               imie    :string[20];
               nazwisko:string[25];
               srednia :real;
               miejsce : byte;

        end;
        plik=file of uczen;
var
        tablica : array [1..18] of uczen;
        temp : uczen;
        uczen1,uczen2:uczen;
        wybor:integer;
        pom:boolean;
        f:plik;

Procedure Wyswietl;
var
        i:Byte;
begin
        for i:=1 to 18 do
           if (tablica[i].nazwa<>'') then
             with tablica[i] do

        begin
                  writeln('Imie: ',Imie);
                  writeln('Nazwisko: ',Nazwisko);
                  writeln('Srednia: ',Srednia);
                  writeln('-------------------------------');
        end;
end;

Procedure Sortuj;
var

        i,j:byte;

begin
        for i:=1 to 17 do
        for j:=i+1 to 18 do
        if (tablica[i].punkty<tablica[j].punkty) then

           begin
                temp:=tablica[i];
                tablica[i]:=tablica[j];
                tablica[j]:=temp;
           end;
        for i:=1 to 18 do
        tablica[i].miejsce:=i;
end;


procedure Wypelnij(var k:uczen);
begin
     WITH k do
            begin
                 write('Podaj imie: ');
                 readln(imie);
                 write('Podaj nazwisko: ');
                 readln(nazwisko);
                 write('Podaj sredia: ');
                 readln(srednia);
             end;
end;

procedure ZapiszDoPliku(uczen1,uczen2:uczen;nazwa:string);
begin
           assign(f,nazwa);
           rewrite(f);
           write(f,uczen1);
           write(f,uczen2);
           close(f);
end;

procedure CzytajZPliku(nazwa:string);
begin
           assign(f,nazwa);
           reset(f);
           read(f,uczen1);
           Wyswietl;
           read(f,uczen2);
           Wyswietl;
           close(f);
end;

Begin
clrscr;
         writeln('Menu:');
         writeln;
         writeln('1.Wypelnij dane uczniow.');
         writeln('2.Wyswietl dane dwoch uczniow.');
         writeln('3.Zapisz do pliku');
         writeln('4.Porownaj srednie uczniow');
         writeln('5.Wyjscie');
         writeln;
         readln(wybor);
case wybor of
   1:begin
         writeln('Podaj dane pierwszego ucznia :');
         Wypelnij(uczen1);
         writeln;
         writeln('Podaj dane drugiego ucznia :');
         Wypelnij(uczen2);
         pom:=true;

   end;

     2:begin
        if (not pom)then
                 begin
                      writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)');
                      readkey;
                      clrscr;
                  end
                    else

                         begin
                              CzytajZPliku;
                         end;
                    readkey;
      end;

     3:begin
           writeln('Podaj nazwe');
           readln;
           ZapiszDoPliku;
           CzytajZPliku;
           readln;
      end;
     4:begin
           writeln('Wyrzsza srednia ma :');
           Sortuj;
           wyswietl;
           readln;
      end;
end;
end.

a jak cos to mi chodzi aby ten program dodawal 2 recordy(2 uczniow) zapisywal je do pliku i odczytywal z pliku oraz wyznaczal ktory z nich posiada wyzsza srednia ;]

mam nadzieje ze takie wciecia moga byc ;] bo ja <ort>niewiem </ort>jak zabardzo je dsie robi ;]

0
Oleksy_Adam napisał(a)

Ja to kompletnie nie czaję fragmentu : "podaj dane dwóch uczniów". Po co to?

bo to ma byc mini baza 2 uczniow a dane trzeba podac bo jakos musza sie oni nazywac chyba i wpisac ajak srednia maja aby potem ja porowna ;]

0

wiecie przecieŻ oco choddzi ;]

nie przecieŻ tylko przecież
No właśnie tak powoli przestaje rozumieć o co Ci chodzi :-/ Napisz o co dokładnie Ci chodzi to może ktoś Ci w sensowny sposób odpowie. Napisałem Ci już raz co jest źle w procedurze wyswietl to teraz napisałes to tak samo. A skoro to ma być mini-baza 2 uczniów to po co to:

begin
        for i:=1 to 17 do {po co 17 jak mają być tylko DWA}
        for j:=i+1 to 18 do
        if (tablica[i].punkty<tablica[j].punkty) then

           begin
                temp:=tablica[i];
                tablica[i]:=tablica[j];
                tablica[j]:=temp;
           end;
        for i:=1 to 18 do
        tablica[i].miejsce:=i;
end;

i to:

tablica : array [1..18] of uczen;

[???]
P.S.
Czym się różnią od siebie druga i trzecia wersja kodu??

0

w 3 sa <ort>wciencia </ort>ktore chcial Oleksy_Adam ;]

a zadanie konkretnie brzmi tak ;] : "Napisz prostą mini bazę uczniow, która będzie miała procedure dodawania dwoch rekordow,zapisywania obu rekordy do pliku i odczytywania rekordow z pliku (po odczytaniu z pliku nalezy dany rekord wyswietlic na ekran),oraz procedure lub funkcje porównywania, który z uczniow ma wyzsza srednia.Nalezy wykonac stosowne menu"

a co to za roznica 2 czy 18 jesli ort! chce np dodac wiecej uczniow to dlatego jest 18 <ort>wrazie </ort>czego a tablica to chyba moim zdanie zeby przechowac recordy i potem je posortowac chyba ze sie mysle ;] ??

0

Dlatego napisałem, że nie kumam bo masz array 1..18 i zapisujesz to dwa razy do pliku. Wygląda to jak by miało być dla dwóch klas po 18 uczniów.

0

kto wie jak to poprawic ??
aktualnie to wyglada tak :

[code]
Program Teams;
uses crt;
type
uczen = record
nazwa:string;
imie :string[20];
nazwisko:string[25];
srednia :real;
miejsce : byte;

    end;
    plik=file of uczen;

var
tablica : array [1..18] of uczen;
temp : uczen;
uczen1,uczen2:uczen;
wybor:integer;
pom:boolean;
f:plik;

Procedure Wyswietl;
var
i:Byte;
begin
for i:=1 to 18 do
if (tablica[i].nazwa<>'') then
with tablica[i] do

    begin
              writeln('Imie: ',Imie);
              writeln('Nazwisko: ',Nazwisko);
              writeln('Srednia: ',Srednia);
              writeln('-------------------------------');
    end;

end;

Procedure Sortuj;
var

    i,j:byte;

begin
for i:=1 to 17 do
for j:=i+1 to 18 do
if (tablica[i].srednia<tablica[j].srednia) then

       begin
            temp:=tablica[i];
            tablica[i]:=tablica[j];
            tablica[j]:=temp;
       end;
    for i:=1 to 18 do
    tablica[i].miejsce:=i;

end;

procedure Wypelnij(var k:uczen);
begin
WITH k do
begin
write('Podaj imie: ');
readln(imie);
write('Podaj nazwisko: ');
readln(nazwisko);
write('Podaj sredia: ');
readln(srednia);
end;
end;

procedure ZapiszDoPliku(uczen1,uczen2:uczen;nazwa:string);
begin
assign(f,nazwa);
rewrite(f);
write(f,uczen1);
write(f,uczen2);
close(f);
end;

procedure CzytajZPliku(nazwa:string);
begin
assign(f,nazwa);
reset(f);
read(f,uczen1);
Wyswietl;
read(f,uczen2);
Wyswietl;
close(f);
end;

Begin
clrscr;
writeln('Menu:');
writeln;
writeln('1.Wypelnij dane uczniow.');
writeln('2.Wyswietl dane dwoch uczniow.');
writeln('3.Zapisz do pliku');
writeln('4.Porownaj srednie uczniow');
writeln('5.Wyjscie');
writeln;
readln(wybor);
case wybor of
1:begin
writeln('Podaj dane pierwszego ucznia :');
Wypelnij(uczen1);
writeln;
writeln('Podaj dane drugiego ucznia :');
Wypelnij(uczen2);
pom:=true;

end;

 2:begin
    if (not pom)then
             begin
                  writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)');
                  readkey;
                  clrscr;
              end
                else

                     begin
                          CzytajZPliku;
                     end;
                readkey;
  end;

 3:begin
       writeln('Podaj nazwe');
       readln;
       ZapiszDoPliku;
       CzytajZPliku;
       readln;
  end;
 4:begin
       writeln('Wyrzsza srednia ma :');
       Sortuj;
       wyswietl;
       readln;
  end;

end;
end.

[/code]

a bledy takie mi wyskakuja :

[URL=http://imageshack.us][img]http://img409.imageshack.us/img409/3548/bladvq3.jpg[/img][/URL]

z gory dzieki za pomoc ;]

0

Polecam DOKŁADNE przestudiowanie mojej poprzedniej i jeszcze poprzedniej odpowiedzi. Powinno pomóc!!
A poza tym to nie zainicjowałeś zmiennej pom i przez to mogą Ci różne wałki się pojawić w czasie działania programu. I Twój program jak już się skompiluje to (raczej) nie będzie działał prawidłowo: Jeżeli odpalisz go raz i zapiszesz cośtam do pliku, a potem wyłączysz proga i włączysz to jak będziesz chciał odczytać dane z pliku to writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)');
I jeszcze jedna sprawa: Bierz pod uwagę cudzą krytykę, bo bardzo się to przydaje i dużo się można dzięki niej nauczyć :-) (wiem z doświadczenia :-) ) (jak nie wiesz o co chodzi to:

Wyrzsza
i popraw to o czym pisałem wcześniej) Powodzenia!! Uf.. ale się rozpisałem :-)

O_o właśnie zauważyłem czemu nie działa :-) Nie przekazujesz parametrów do procedur ZapiszDoPliku i CzytajZPliku. CZyli owinno być: ZapiszDoPliku(uczen1, uczen2,nazwa); i Odczytaj_ZPliku(nazwa);{nazwe oczywiście wcześniej musisz podać(read[ln]). Powinno zadziałać.

0

A poza tym to nie zainicjowałeś zmiennej pom

pytanko co to znaczy ;] bo nierozumiem i jak mam zainicjiwac to ;]??

0

w sumie dzieki pomoglo prawie bo zostal jeden blad ;] "there were 1 errors compiling module, stopping" i kursor wskasuje linijke pod ostatnim end. i kompletnie niewiem ocb ;]

0

Zinicjować- przypisać wartość początkową(o ile się nie myle jak chcesz to tutaj znajdziesz definicje <url>www.google.pl</url>). TP w razie nie zinicjowania zmiennej globalnej przypisuje jej wartość 0;
Na Twoim miejscu zamiast tego:

2:begin
        if (not pom)then
                 begin
                      writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)');
                      readkey;
                      clrscr;
                  end
                    else

                         begin
                              CzytajZPliku;
                         end;
                    readkey;

zrobiłbym sprawdzenie czy plik istnieje i jak tak to wczytywanie pliku+sprawdzenie ile danych wpisał. If >0 then continue else writeln('Nalezy wypelnic dane przed ich wyswietlenie!Wybierz opcje (1)'); To tak mniej-więcej troche już późno i zmęczony jestem więc coś może być źle :-P
Na pewno tylko ten jeden błąd został?? Dziwne wydawało mi się zawsze że on nie występuje "samemu" :-) Podaj numer tego błędu i znajdź sobie w googlach spis błędów.

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