Advertisement
ridjis

sortModula

Nov 12th, 2014
756
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE zad2;
  2. FROM InOut  IMPORT WriteLn, WriteString, ReadString, WriteCard, ReadCard;
  3. FROM FIO    IMPORT File, Close, Open, Create, Exists, RdCard, RdItem, WrStr, WrCard, WrLn;
  4. FROM Str    IMPORT Compare;
  5.  
  6. CONST izlazni = "out.txt";
  7.  
  8. TYPE String = ARRAY[1..80] OF CHAR;
  9.      Slog = RECORD
  10.                id    : CARDINAL;
  11.                knjiga: String;
  12.                pisac : String;      
  13.             END;
  14.      NIZ = ARRAY [1..1000] OF Slog;
  15.  
  16. VAR     niz: NIZ;
  17.     imeF, kljuc, kljuc2 : String;
  18.     velicina: CARDINAL;
  19.     ok : BOOLEAN;
  20.  
  21. PROCEDURE uNiz (imeF : String; VAR niz : NIZ; VAR velicina: CARDINAL);
  22. VAR f: File;
  23.     i : CARDINAL;
  24. BEGIN
  25.     IF Exists(imeF) THEN
  26.         f := Open(imeF);
  27.         velicina := RdCard(f);
  28.         FOR i := 1 TO velicina DO
  29.             niz[i].id := RdCard(f);
  30.             RdItem(f, niz[i].knjiga);
  31.             RdItem(f, niz[i].pisac);
  32.         END;
  33.     END;
  34.     Close(f);
  35. END uNiz;
  36.  
  37. PROCEDURE uFajl (imeF: String; niz: NIZ; velicina: CARDINAL);
  38. VAR f: File;
  39.     i: CARDINAL;
  40. BEGIN
  41.     f := Create(imeF);
  42.     FOR i := 1 TO velicina DO
  43.         WrCard(f, niz[i].id, 0);
  44.         WrLn(f);
  45.         WrStr(f, niz[i].knjiga);
  46.         WrLn(f);
  47.         WrStr(f, niz[i].pisac);
  48.         WrLn(f);
  49.     END;
  50.     WriteString("Podaci su upisani u fajl. ");
  51.     Close(f);
  52. END uFajl;
  53.  
  54. PROCEDURE Poredi (a,b : Slog; kljuc : String): INTEGER;
  55. BEGIN
  56.     IF Compare(kljuc, "id") = 0 THEN
  57.         IF (a.id < b.id) THEN
  58.             RETURN -1;
  59.         ELSIF (a.id > b.id) THEN
  60.             RETURN 1;
  61.         ELSE
  62.             RETURN 0;
  63.         END;
  64.     ELSIF Compare(kljuc, "knjiga") = 0 THEN
  65.         IF Compare(a.knjiga, b.knjiga) < 0 THEN
  66.             RETURN -1;
  67.         ELSIF Compare(a.knjiga, b.knjiga) > 0 THEN
  68.             RETURN 1;
  69.         ELSE
  70.             RETURN 0;
  71.         END;
  72.     ELSIF Compare(kljuc, "pisac") = 0 THEN
  73.         IF Compare(a.pisac, b.pisac) < 0 THEN
  74.             RETURN -1;
  75.         ELSIF Compare(a.pisac, b.pisac) > 0 THEN
  76.             RETURN 1;
  77.         ELSE
  78.             RETURN 0;
  79.         END;
  80.     END;
  81.     RETURN 2;  
  82. END Poredi;
  83.  
  84. PROCEDURE PorediDvaKljuca (a,b: Slog; kljuc, kljuc2: String): INTEGER;
  85. VAR rez : INTEGER;
  86. BEGIN
  87.     IF (Compare(kljuc, "id") = 0) THEN
  88.         IF (a.id > b.id) THEN
  89.             rez := 1;
  90.         ELSIF (a.id < b.id) THEN
  91.             rez := -1;
  92.         ELSE
  93.             rez := 0;
  94.         END;
  95.         IF (rez = 0) THEN
  96.             IF (Compare(kljuc2, "knjiga")) = 0 THEN
  97.                 rez := (Compare(a.knjiga, b.knjiga));
  98.             END;
  99.             IF (Compare(kljuc2, "pisac")) = 0 THEN
  100.                 rez := (Compare(a.pisac, b.pisac));
  101.             END;
  102.         END;
  103.     ELSIF (Compare(kljuc, "knjiga") = 0) THEN
  104.         rez := (Compare(a.knjiga, b.knjiga));
  105.         IF (rez = 0) THEN
  106.             IF (Compare(kljuc2, "id")) = 0 THEN
  107.                 IF (a.id > b.id) THEN
  108.                     rez := 1;
  109.                 ELSIF (a.id < b.id) THEN
  110.                     rez := -1;
  111.                 ELSE
  112.                     rez := 0;
  113.                 END;
  114.             END;
  115.             IF (Compare(kljuc2, "pisac")) = 0 THEN
  116.                 rez := (Compare(a.pisac, b.pisac));
  117.             END;
  118.         END;
  119.     ELSIF (Compare(kljuc, "pisac") = 0) THEN
  120.         rez := (Compare(a.pisac, b.pisac));
  121.         IF (rez = 0) THEN
  122.             IF (Compare(kljuc2, "id")) = 0 THEN
  123.                 IF (a.id > b.id) THEN
  124.                     rez := 1;
  125.                 ELSIF (a.id < b.id) THEN
  126.                     rez := -1;
  127.                 ELSE
  128.                     rez := 0;
  129.                 END;
  130.             END;
  131.             IF (Compare(kljuc2, "knjiga")) = 0 THEN
  132.                 rez := (Compare(a.knjiga, b.knjiga));
  133.             END;
  134.         END;
  135.     END;
  136.     RETURN rez;
  137. END PorediDvaKljuca;
  138.  
  139. PROCEDURE bubbleSort (VAR niz : NIZ; velicina : CARDINAL; kljuc : String);
  140. VAR i,j: CARDINAL;
  141.     tmp : Slog;
  142. BEGIN
  143.     FOR i := 1 TO velicina-1 DO
  144.         FOR j := i+1 TO velicina DO
  145.             IF (Poredi(niz[i],niz[j],kljuc)) > 0 THEN
  146.                 tmp := niz[i];
  147.                 niz[i] := niz[j];
  148.                 niz[j] := tmp;
  149.             END;
  150.         END;
  151.     END;   
  152. END bubbleSort;
  153.  
  154. PROCEDURE insertionSort (VAR niz: NIZ; velicina: CARDINAL; kljuc, kljuc2: String);
  155. VAR i,j: CARDINAL;
  156.     temp : Slog;
  157. BEGIN
  158.     FOR i := 2 TO velicina DO
  159.         j := i-1;
  160.         temp := niz[i];
  161.         WHILE (j > 0) & (PorediDvaKljuca(temp, niz[j], kljuc, kljuc2) < 0) DO
  162.             niz[j+1] := niz[j];
  163.             DEC(j);
  164.         END;
  165.         niz[j+1] := temp;
  166.     END;
  167. END insertionSort;
  168.  
  169. PROCEDURE selectionSort (VAR niz: NIZ; velicina : CARDINAL; kljuc, kljuc2 : String);
  170. VAR i,j,k : CARDINAL;
  171.     temp : Slog;
  172. BEGIN
  173.     FOR i := 1 TO velicina-1 DO
  174.         k := i;
  175.         temp := niz[i];
  176.         FOR j := i+1 TO velicina DO
  177.             IF (PorediDvaKljuca(niz[j], temp, kljuc, kljuc2) < 0) THEN
  178.                 k := j;
  179.                 temp := niz[j];
  180.             END;
  181.         END;
  182.         niz[k]:= niz[i];
  183.         niz[i]:= temp;
  184.     END;
  185. END selectionSort;
  186.  
  187. BEGIN
  188.     REPEAT
  189.         WriteString("Unesite ime fajla: ");
  190.         WriteLn;
  191.         ReadString(imeF);
  192.         IF NOT Exists(imeF) THEN
  193.             WriteString("Fajl ne postoji.");
  194.             WriteLn;
  195.         END;
  196.     UNTIL (Exists(imeF));
  197.    
  198.     uNiz(imeF, niz, velicina);
  199.    
  200.     REPEAT
  201.         WriteString("Unesite po kom polju zelite da sortirate podatke (id, pisac, knjiga): ");
  202.         WriteLn;
  203.         ReadString(kljuc);
  204.         WriteString("Unesite 2. kljuc (id, pisac, knjiga): ");
  205.         WriteLn;
  206.         ReadString(kljuc2);
  207.         IF (Compare(kljuc, "id") = 0) OR (Compare(kljuc, "pisac") = 0) OR (Compare(kljuc, "knjiga") = 0)
  208.         OR (Compare(kljuc2, "id") = 0) OR (Compare(kljuc2, "pisac") = 0) OR (Compare(kljuc2, "knjiga") = 0) THEN
  209.             selectionSort(niz, velicina, kljuc, kljuc2);
  210.             ok := TRUE;
  211.         ELSE
  212.             WriteString("Neispravno polje. ");
  213.             WriteLn;
  214.             ok := FALSE;
  215.         END;
  216.     UNTIL (ok);
  217.    
  218.     uFajl(izlazni, niz,velicina);
  219. END zad2.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement