Pascal I.      Pascal II.      Delphi       Linkek     
Pascal II.
01. Eljárások, függv...
01. Gyakorló feladatok
02. Felsorolt típus, ...
02. Gyakorló feladatok
03. Állományok kezelése
03. Gyakorló feladatok
04. Unitok, CRT unit
04. Gyakorló feladatok
05. DOS unit, rendezé...
05. Gyakorló feladatok
06. Rekurzió, quicksort
06. Gyakorló feladatok
07. Backtracking
07. Gyakorló feladatok
08. GRAPH unit
08. Gyakorló feladatok
09. Kép mozgatása
09. Gyakorló feladatok
10. Winmouse unit
10. Gyakorló feladatok
11. Dinamikus adatsze...
11. Gyakorló feladatok
12. Dinamikus adatsze...
12. Gyakorló feladatok
13. Dinamikus adatsze...
13. Gyakorló feladatok
Programozás 2 (Pascal)


     5 Dos unit, rendezési algoritmusok
   

  • dos unit

  • rendezési algoritmusok

        
     5.1 Dos unit

     A dos unit segítségével többek között lekérhetjük az aktuális dátumot és idõt.

     A dátumot a getdate eljárás segítségével kérhetjük le. A parancsnak négy paramétere van. Ebbe a négy paraméterként megadott változóba adja vissza az eljárás az aktuális évet, hónapot, napot és azt, hogy a hét melyik napja van éppen (0-vasárnap, 1-hétfõ, ...).

     Hasonlóan működik az idõ lekérésére is a gettime eljárás. Paraméterként itt is négy változót kell megadnunk, melyekben visszakapjuk az aktuális órát, percet, másodpercet és századmásodpercet. Ennek az eljárásnak a segítségével fogjuk késõbb lemérni az egyes rendezési algoritmusok futásának idõtartamát.

program Pelda21;
uses dos;
var d1,d2,d3,d4,t1,t2,t3,t4:word;
begin
 getdate(d1,d2,d3,d4);
 gettime(t1,t2,t3,t4);
 write('Mai datum: ',d1,'. ',d2,'. ',d3,'. ');
 case d4 of
  0: writeln('vasarnap');
  1: writeln('hetfo');
  2: writeln('kedd');
  3: writeln('szerda');
  4: writeln('csutortok');
  5: writeln('pentek');
  6: writeln('szombat')
 end;
 writeln('Ido: ',t1,':',t2,':',t3,'.',t4);
end.

     A dos unit összes eljárásának, függvényének és konstansának részletes leírása mintapéldákkal megtalálható a FreePascal súgójában (dokumentációjában).

  
     5.2 Rendezési algoritmusok

     Adott egy tömb, melyben véletlenszerű számok vannak. Feladatunk, hogy rendezzük ezeket a számokat növekvõ sorrendbe különbözõ algoritmusok segítségével. A rendezés idejét minden esetben mérjük le századmásodpercekben.

     Egyszerű rendezés (SimpleSort)

     Ez a programilag legegyszerűbb rendezési algoritmus. Mindegyik elemet összehasonlítjuk az összes utána következő elemmel két egymásba ágyazott ciklus segítségével. Ha az éppen összehasonlított két elem nem jó sorrendben van, akkor azokat rögtön ki is cseréljük.

     Rendezés a legkisebb elem kiválasztásával (MinSort, SelectSort)

     A módszer lényege, hogy az i. helyre ( i = 1,2,3,... ) sorban kiválasztjuk az i...elemekszama helyen levõk közül a legkisebbet.

     Rendezés a szomszédos elemek cseréjével (BubbleSort)

     A módszer lényege, hogy egyesével végignézzük a szomszédos elemeket, és ha elõbb van a nagyobb, megcseréljük azokat. Így biztosan a legnagyobb helyre kerül a legnagyobb elem ("a buborék felszáll"). Ugyanezt sorban végrehajtjuk az utolsó elõtti elemig stb., egészen az elsõig. Ha közben kiderül, hogy a tömb rendezett, az eljárást befejezzük.

     Rendezés beszúrásos módszerrel (InsertSort)

     A módszer hasonlít a kártyák kézben való rendezéséhez. Mindig vesszük a következõ elemet, s azt a megfelelõ helyre beszúrjuk úgy, hogy a többi, már rendezett elemet eggyel feljebb toljuk.

     Mindhárom rendezés pontos algoritmusa megtalálható az alábbi programban:

program Pelda22;
uses crt, dos;
const elemekszama = 30000;
var a,b:array [1..elemekszama] of integer;
    ido:longint;
     i:integer;

procedure kiiras;
var i:integer;
begin
 for i:=1 to elemekszama do write(a[i],' ');
 writeln;
 writeln;
end;

procedure stopperbe;
var t1,t2,t3,t4:word;
begin
 gettime(t1,t2,t3,t4);
 ido:=t4+100*(t3+60*(t2+60*t1));
end;

procedure stopperki;
var t1,t2,t3,t4:word;
begin
 gettime(t1,t2,t3,t4);
 ido:=t4+100*(t3+60*(t2+60*t1))-ido;
end;

{ egyszeru rendezes }
procedure simplesort;
var i,j,x:integer;
begin
 for i:=1 to elemekszama-1 do
  for j:=i+1 to elemekszama do
     if a[i]>a[j] then begin
                        x:=a[i];
                        a[i]:=a[j];
                        a[j]:=x;
                       end;
end;

{ rendezes a legkisebb elem kivalasztasaval }
procedure minsort;
var i,j,min,x:integer;
begin
 for i:=1 to elemekszama-1 do
  begin
   min:=i;
   for j:=i+1 to elemekszama do
     if a[j]<a[min] then min:=j;
   x:=a[i];
   a[i]:=a[min];
   a[min]:=x;
  end;
end;

{ rendezes a szomszedos elemek cserejevel }
procedure bubblesort;
var i,j,x:integer;
    ok:boolean;
begin
 i:=elemekszama-1;
 ok:=false;
 while (i>=1) and (not ok) do
  begin
   ok:=true;
   for j:=1 to i do
     if a[j]>a[j+1] then begin
                         x:=a[j];
                         a[j]:=a[j+1];
                         a[j+1]:=x;
                         ok:=false;
                         end;
   dec(i);
  end;
end;

{ rendezes beszurasos modszerrel }
procedure insertsort;
var i,j,x,ment:integer;
begin
 for i:=2 to elemekszama do
  begin
   if a[i]<a[i-1] then begin
                       ment:=a[i];
                       j:=i;
                       repeat
                        dec(j);
                        a[j+1]:=a[j];
                       until (j=1) or (a[j-1]<=ment);
                       a[j]:=ment;
                       end;
  end;
end;

{ foprogram }
begin
 clrscr;
 writeln(elemekszama,' drb. elem rendezese:');
 writeln;
 randomize;
 for i:=1 to elemekszama do b[i]:=random(64000)-32000;
 
{ mindig a-t fogjuk rendezni, b-ben meghagyjuk a kigeneralt szamokat}
 a:=b;
 
{ rendezes }
 stopperbe;
 simplesort;
 stopperki;
 
{ kiiras }
 writeln('SimpleSort: ',ido,' szazadmasodperc');
 a:=b;
 
{ rendezes }
 stopperbe;
 minsort;
 stopperki;
 
{ kiiras }
 writeln('MinSort: ',ido,' szazadmasodperc');
 a:=b;
 
{ rendezes }
 stopperbe;
 bubblesort;
 stopperki;
 
{ kiiras }
 writeln('BubbleSort: ',ido,' szazadmasodperc');
 a:=b;
 
{ rendezes }
 stopperbe;
 insertsort;
 stopperki;
 
{ kiiras }
 writeln('InsertSort: ',ido,' szazadmasodperc');
end. 
    

    A rendezési algoritmusokat animációk segítségével bemutató program letölthető itt:
   


rendalgo.exe

     

(C) 2004-2013, PaedDr. Végh Ladislav, Komárno, Szlovákia