problem z sortowanie m pascal

marcin547
Użytkownik
Użytkownik
Posty: 73
Rejestracja: 3 lis 2007, o 22:33
Płeć: Mężczyzna
Lokalizacja: warszawa
Podziękował: 41 razy

problem z sortowanie m pascal

Post autor: marcin547 »

chodzi mi zeby ten program posortował mi dane z pilku np po wieku ale moze byc po czym innym ale on nie dziala bo prawdopodobnie zapisuje je jako calosc to tablicy
wypisuje prawidlowo ale nic nie sortuje prosze o pomoc pozdrawiam Marcin
cos jest nie tak z procedura sortuj i wypisz

Kod: Zaznacz cały

program szkola;
uses
  Crt , logowanie;

Const 
K = 1;  
 p='dane.dat';
  plik_tymczasowy = 'tmp.dat';
Type
TOsoba = Record
        nr   : integer;
        imie : String[40];
        nazw : String[50];
        wiek : Byte;
        plec : Char;
end;
   moj_plik = file of TOsoba;
Tab = Array [1..K] of TOsoba;
Var
  
  Osoba : TOsoba;
  f    : file of TOsoba;
  x    : byte; 
  zmienna , zmienna1 : string;
  temp : moj_plik;             {zmienne plikowe}
   o    : TOsoba;
     j,I :   integer; 
  T : Tab; 
Procedure Wypisz(T:Tab);
 
        begin    
         assign(f,p);
Reset(f);
While Not EoF(f) Do                 {wyswietl cala zawartosc pliku}
           

begin
 read (f, Osoba);
 With T[I] Do
   begin
        Write('Imi�:',Osoba.Imie:10,'   ');
        Write('Nazwisko:',Osoba.Nazw:15,'   ');
        Write('Wiek:',Osoba.Wiek:10,'   ');
        Writeln('Pˆe†:',Osoba.Plec:10);
   end;

 
End; 
Close(f);
end;

Procedure Sortuj(var T:Tab);
{
        Procedura sortuje wg wieku
        dane zawarte w tablicy
}

Var I,J : Byte;         {zmienne sterujace petla}
    Z   : TOsoba;         {zmienna pomocnicza potrzebna do sortowania}

 begin    
         assign(f,p);
Reset(f);
While Not EoF(f) Do                 {wyswietl cala zawartosc pliku}

Begin
 read (f, Osoba);
 For I:=1 to K-1 do
   For J:=I+1 to K do
     if T[I].wiek>T[J].wiek then
        begin
          Z:=T[I];
          T[I]:=T[J];
          T[J]:=Z;
        end;
End; {---of S---}
end;

procedure NoweDane;          
begin
 repeat
  clrscr;
  writeln('1 Wywietl menu');
  writeln('2 Wyswietl wszystkie rekordy');
  writeln('3 Dodaj rekord');
  writeln('4 Kasuj  rekord');
  writeln('5 Posortuj');
  writeln('6 Wyszukaj');
  writeln('7 Koniec');
  writeln;
  writeln(' podaj cyfre '); 
  readln(x);
 until (x > 0) and (x < 8)

end;
procedure Pokaz;             

begin                                
  if x =1 then
  begin
   clrscr;
   writeln('1 Wywietl menu');
   writeln('2 Wyswietl wszystkie rekordy');
   writeln('3 Dodaj rekord');
   writeln('4 Kasuj  rekord');
   writeln('5 Posortuj');
   writeln('6 Edytuj rekord');
   writeln('7 Wyszukaj');
   writeln('8 Koniec');
   writeln;
   writeln(' podaj cyfre ');
            end;
  if x =2 then


begin 
clrscr; 
assign(f,p);
Reset(f);
While Not EoF(f) Do
        begin    
                         {wyswietl cala zawartosc pliku}
            read (f, Osoba);
            Write('Nr : ');
	    Writeln(Osoba.Nr,' ');
	    Write('Imie : ');
            Writeln(Osoba.Imie,' ');
            Write('Nazwisko : ');
            Writeln(Osoba.Nazw,' ');
            Write('Wiek : ');  
            Writeln(Osoba.Wiek,' ');
            Write('Plec : ');  
            Writeln(Osoba.Plec,' ');
            Writeln ('********************************************');    
   end;
Close(f);
 

            end;
 
  if x =3 then

  begin
  
 
 assign(f,p);
 reset(f);
  {$I-}  seek (f,FileSize(f)); {$I+}
  if IOResult=0 then
  seek (f,FileSize(f));

With Osoba Do
begin
repeat
Writeln('Podaj dane osob lub enter by skończyć');
 Write('Imie : ');     Readln(Imie);
 if (Imie<>'') then
begin
	Write('Nazwisko : '); Readln(Nazw);
    Write('Wiek : ');     Readln(Wiek);
  Write('Plec : ');     Readln(Plec);
Write('Nr : ');     Readln(Nr);
write (f, Osoba);
end;
  

until (Osoba.Imie='');

close(f);
   
            end;
end;

  if x =4 then
  begin
        Write('Podaj pozycje do usuniecia:'); ReadLn(j);

  Reset(f);
   Assign(temp,plik_tymczasowy);
   ReWrite(temp);

    While Not EoF(f) Do                     {dopoki nie ma konca pliku}
        begin
            read(f,o);                      {czytaj zawartosc pliku}
             if o.nr <> j then                 {jezeli id z rekordu <> od}
                begin                          {pozycji do usuniecia}
                    o.nr := FilePos(temp)+1;   {zacznij od id=1 i zwiekszaj o 1}
                    write(temp,o);             {zapisz rekord do pliku}
                end;
        end;
   Close(temp);
   Close(f);

   Erase(f);                  {usun plik_z_danymi}

   ReName(temp,p);      
            end;


 if x =5 then

BEGIN

 ClrScr;
 

 Writeln('Przed sortowaniem:'); WriteLn;
 For I:=1 To K Do
        Wypisz(T);

 Sortuj(T);

 WriteLn;
 Writeln('Po sortowaniu:'); WriteLn;
 For I:=1 To K Do
        Wypisz(T);

 ReadLn;




            end;


if x =6 then
begin
assign(f,p);
Reset(f);
writeln('Podaj imie');
readln(zmienna);
writeln('Podaj nazwisko');
readln(zmienna1);
While Not EoF(f) Do
        begin    	  
          read (f, Osoba);
       if (pos(Osoba.Imie , zmienna)>0) and
             (pos(Osoba.Nazw , zmienna1)>0) then
            	  writeln ('dana jest');  
                 writeln;
        end;
        
Close(f);	      
       end;
   
if x =7 then
	begin

     halt;

 end;
end;
var
 x1 : byte;	
begin
haslo1;
  repeat
   ClrScr;
 
NoweDane;
 Pokaz;  
write(' koniec  - 7 , 1 - menu ');
  readln(x1);
  until (x1 = 7);
end. 
[ Dodano: 29 Stycznia 2008, 00:25 ]
aha chodzi mi zeby ten program tez jak posortuje zapisywal je do innego pliku \
wsumie cos takiego

Zadanie 45
Napisa program, który z pliku tekstowego wczytuje list nazwisk, sortuje je i wypisuje do
innego pliku tekstowego

nie wiem czy dam sam go rade przerobic
Ostatnio zmieniony 29 sty 2008, o 14:22 przez marcin547, łącznie zmieniany 1 raz.
Quider
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 30 paź 2007, o 17:58
Płeć: Mężczyzna
Lokalizacja: Katowice

problem z sortowanie m pascal

Post autor: Quider »

tak na szybko moge ci podpowiedziec ze po majmniejszej lini oporu moglbys stworzyc jeszcze tablice do ktorej bedizesz wpisywac wiek osob po czym posortujesz ja babelkowo, nie widze problemu jak narazie...
Awatar użytkownika
N4RQ5
Użytkownik
Użytkownik
Posty: 421
Rejestracja: 15 lis 2006, o 16:22
Płeć: Mężczyzna
Lokalizacja: Suwałki/Wawa
Pomógł: 104 razy

problem z sortowanie m pascal

Post autor: N4RQ5 »

Czy w procedurze Sortuj zakładasz że dane są już w tablicy? Jeśli tam to po co wczytujesz je jeszcze raz i w dodatku w pętli wczytującej za każdym razem sortujesz tablicę?
W dodatku w obu procedurach wczytujesz dane do zmiennej Osoba a wypisujesz z tabeli T. Skąd one niby mają się tam znaleźć? Wczytuj dane bezpośrednio do tabeli.
Blizniack
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 13 mar 2008, o 20:45
Płeć: Mężczyzna
Lokalizacja: Wejherowo
Podziękował: 1 raz

problem z sortowanie m pascal

Post autor: Blizniack »

Nie wiem ile to ma linii, ale podejrzewam, że o ok. 100 za dużo +.+
Napisałbym ci to w 30 do 50 linii jak bardzo chcesz...
Używaj innych algorytmów niż bąbelki, kubełki czy pętelki, bo działają w czasie o(n^2) (pętelki w o(n^2 log n) ale za to mają złożoność pamięciową dążącą do n^n, więc nie warto ). Masz do dyspozycji Quicksorta, Mergesorta i Heapsorta, wszystkie działają w czasie o(n log n) i zajmują minimum pamięci (nawet do n pamięci).
Podam ci kod quicksorta:

procedure QuickSort(var Dane: Wektor; Lewy, Prawy : integer);
var
i, j : integer;
podzial, x : real;
begin
i := lewy;
j := prawy
podzial := Dane[(Lewy+Prawy) div 2];
repeat
while Dane < podzial do
Inc(i);
while podzial < dane[j] do
Dec(j);
if i j);
if Lewy < j then QuickSort(Dane, Lewy, j);
if i < Prawy then QuickSort(Dane, i, Prawy);
end;

Mergesort to z kolei dołączony do Turbo Pascala 7.0 plik o nazwie shellsort

Pozdrawiam i życzę sukcesów oraz krótszych kodów
ODPOWIEDZ