Guest User

Untitled

a guest
Mar 10th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <* M2ADDTYPES + *>
  2. IMPLEMENTATION MODULE zadatak;
  3. (* Potrebno je raditi na 3 procedure, Hash, Ubaci i IzFajla.
  4.    Test program se moze pokretati i bez modifikacija
  5.    *)
  6.  
  7. IMPORT IO;
  8. IMPORT FIO;
  9.  
  10. FROM Str IMPORT Length;
  11. IMPORT Str;
  12. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  13. IMPORT HashT;
  14.  
  15. (* Potrebno je popraviti ovu funkciju da daje
  16.     raznolike vrednosti radi efikasnijeg
  17.     popunjavanja tabele.
  18. *)
  19. PROCEDURE Hash(elem: InfoTip) : CARDINAL;
  20. VAR
  21.   rez:CARDINAL;
  22.   razlicitbroj,rezint, i, j, zbirreda, telem:INTEGER;
  23. BEGIN
  24.   rez:= 0;
  25.   rezint:=0;
  26.   zbirreda:=0;
  27.   razlicitbroj:=4733;
  28.   FOR i:=1 TO 3 DO
  29.     FOR j:=1 TO 3 DO
  30.       zbirreda:=zbirreda+(elem[i,j]*razlicitbroj) MOD 53;
  31.       razlicitbroj:= (razlicitbroj * 7057) MOD 6073;
  32.     END;
  33.     razlicitbroj:= (razlicitbroj * 7883) MOD 6199;
  34.     rezint:= rezint + ((zbirreda*zbirreda*razlicitbroj) MOD 6073);
  35.     razlicitbroj:= (razlicitbroj * 5827) MOD 6569;
  36.     zbirreda:=0;
  37.   END;
  38.   FOR j:=1 TO 3 DO
  39.     FOR i:=1 TO 3 DO
  40.       zbirreda:=zbirreda+(elem[i,j]*razlicitbroj) MOD 73;
  41.       razlicitbroj:= (razlicitbroj * 5473) MOD 6073;
  42.     END;
  43.     razlicitbroj:= (razlicitbroj * 7096) MOD 6569;
  44.     rezint:= rezint + ((zbirreda*zbirreda*razlicitbroj) MOD 5741);
  45.     razlicitbroj:= (razlicitbroj * 4787) MOD 6199;
  46.     zbirreda:=0;
  47.   END;
  48.   IF rezint < 0 THEN
  49.     rez:= -17 * rezint;
  50.   ELSE
  51.     rez := rezint;
  52.   END;
  53.   rez := rez  MOD VelicinaTabele;
  54.   RETURN rez;
  55. END Hash;
  56.  
  57. (* Procedure vezane za InfoTip *)
  58. (* =========================== *)
  59.        
  60. PROCEDURE Compare(e1: InfoTip; e2: InfoTip):INTEGER;
  61. VAR
  62.     i,j: CARDINAL;
  63.     rez : INTEGER;
  64. BEGIN
  65.     rez := 0;
  66.     i:=1;
  67.     j:=1;
  68.     WHILE (i<=Dim) AND (rez=0) DO
  69.         IF (e1[i,j] > e2[i,j]) THEN
  70.             rez := 1;
  71.         ELSIF (e1[i,j] < e2[i,j]) THEN
  72.             rez := -1;
  73.         END;
  74.         INC(j);
  75.         IF j>Dim THEN
  76.             j:=1;
  77.             INC(i);
  78.         END;
  79.     END;
  80.     RETURN rez;
  81. END Compare;
  82.  
  83. PROCEDURE WrInfo(elem: InfoTip);
  84. VAR
  85.     i,j: CARDINAL;
  86. BEGIN
  87.     FOR i:=1 TO Dim DO
  88.         FOR j:=1 TO Dim DO
  89.             IO.WrInt(elem[i,j],0);
  90.             IO.WrStr(" ");
  91.         END;
  92.         IO.WrLn;
  93.     END;
  94. END WrInfo;
  95.  
  96. PROCEDURE RdInfo(VAR elem: InfoTip);
  97. VAR
  98.     i,j : CARDINAL;
  99. BEGIN
  100.     FOR i:=1 TO Dim DO
  101.       FOR j:=1 TO Dim DO
  102.         IO.WrStr("unesite broj ");
  103.         IO.WrCard(i,0);
  104.         IO.WrStr(", ");
  105.         IO.WrCard(j,0);
  106.         IO.WrStr(":");
  107.         IO.WrLn;
  108.         elem[i,j] := IO.RdInt();
  109.       END;
  110.     END;
  111.     IO.WrLn;
  112. END RdInfo;
  113.  
  114. PROCEDURE FRdInfo(f: FIO.File; VAR elem: InfoTip);
  115. VAR
  116.     i,j : CARDINAL;
  117. BEGIN
  118.     FOR i:=1 TO Dim DO
  119.       FOR j:=1 TO Dim DO
  120.         elem[i,j] := FIO.RdInt(f);
  121.       END;
  122.     END;
  123.     IF (FIO.Size(f)<FIO.GetPos(f)+2) THEN
  124.         FIO.EOF := TRUE;
  125.     END;
  126. END FRdInfo;
  127.  
  128. PROCEDURE Inicijalizuj(VAR t:Tabela);
  129. VAR
  130.   i : CARDINAL;
  131. BEGIN
  132.   NEW(t);
  133.   t^.ukupno := 0;
  134.   FOR i := 0 TO VelicinaTabele - 1 DO
  135.     t^.broj[i] := 0;
  136.     NEW(t^.sadrzaj[i]);
  137.     t^.sadrzaj[i]^.veza := t^.sadrzaj[i];
  138.   END
  139. END Inicijalizuj;
  140.  
  141. PROCEDURE Unisti(VAR t:Tabela);
  142. VAR
  143.   i : CARDINAL;
  144.   pom : List;
  145. BEGIN
  146.   FOR i := 0 TO VelicinaTabele - 1 DO
  147.     WHILE t^.sadrzaj[i]^.veza # t^.sadrzaj[i] DO
  148.       pom := t^.sadrzaj[i]^.veza;
  149.       t^.sadrzaj[i]^.veza := pom^.veza;      
  150.       DISPOSE(pom)
  151.     END;
  152.     DISPOSE(t^.sadrzaj[i])
  153.   END;
  154.   DISPOSE(t)
  155. END Unisti;
  156.  
  157. (* Proceduru treba implementirati tako da element "elem" ubaci u
  158.    tabelu "t". Ukoliko hash vrednost elementa nije adekvatna treba postaviti
  159.    "ok" na FALSE, a inace na TRUE. Ako element vec postoji
  160.    u tabeli postaviti "duplikat" na TRUE, a inace na FALSE.
  161. *)
  162. PROCEDURE Ubaci(elem: InfoTip; VAR t: Tabela;
  163.         VAR duplikat: BOOLEAN; VAR ok: BOOLEAN);
  164. VAR
  165.   prethodni,novi:List;
  166.   pozicija:CARDINAL;
  167. BEGIN
  168.   ok:=FALSE;
  169.   duplikat:=FALSE;
  170.   pozicija:=Hash(elem);
  171.   IF pozicija < VelicinaTabele THEN
  172.     ok:=TRUE;
  173.     prethodni:=t^.sadrzaj[pozicija];
  174.     prethodni^.el:=elem;
  175.     WHILE (Compare(prethodni^.veza^.el,elem) # 0) DO
  176.       prethodni:=prethodni^.veza;
  177.     END;
  178.     IF prethodni^.veza = t^.sadrzaj[pozicija] THEN
  179.       NEW(novi);
  180.       novi^.el:=elem;
  181.       novi^.veza:=prethodni^.veza;
  182.       prethodni^.veza:=novi;
  183.       ok:=TRUE;
  184.       INC(t^.ukupno);
  185.       INC(t^.broj[pozicija]);
  186.     ELSE
  187.       duplikat:=TRUE;
  188.     END;
  189.   END;
  190. END Ubaci;
  191.  
  192. (* Proceduru treba implementirati da iz fajla "ime"
  193.    doda podatke u tabelu "t". U parametru "duplikata"
  194.    treba vratiti koliko je bilo duplikata pri unosu,
  195.    a u "losih" koliko je bilo pogresnih Hash vrednosti.  
  196.    Ukoliko fajl ne postoji treba postaviti parametar "ok" na FALSE.
  197. *)
  198. PROCEDURE IzFajla(ime: ARRAY OF CHAR; VAR t: Tabela; VAR ok: BOOLEAN;
  199.         VAR duplikata: CARDINAL; VAR losih: CARDINAL);
  200. VAR
  201.   f : FIO.File;
  202.   novi : InfoTip;
  203.   duplikat, dobarhes : BOOLEAN;
  204. BEGIN
  205.   duplikata := 0;
  206.   losih := 0;
  207.   IF NOT FIO.Exists(ime) THEN
  208.     ok:=FALSE
  209.   ELSE
  210.     ok := TRUE;
  211.     f := FIO.Open(ime);
  212.     FIO.EOF:=FALSE;
  213.     WHILE (NOT FIO.EOF) DO
  214.       FRdInfo(f, novi);
  215.       Ubaci(novi, t, duplikat, dobarhes);
  216.       IF NOT dobarhes THEN
  217.         INC(losih);
  218.       ELSIF duplikat THEN
  219.         INC(duplikata);
  220.       END;
  221.     END;
  222.     FIO.Close(f)
  223.   END
  224. END IzFajla;
  225.  
  226. PROCEDURE Izbaci(elem : InfoTip;
  227.                  VAR t : Tabela;
  228.          VAR ok : BOOLEAN);
  229. BEGIN
  230.     IO.WrStr("-- Procedura nije implementirana -- ");
  231.     ok:=FALSE;
  232. END Izbaci;
  233.  
  234. PROCEDURE Sadrzaj(VAR t: Tabela);
  235.     VAR
  236.       i: CARDINAL;
  237.       tekuci: List;
  238. BEGIN
  239.     IO.WrStr('Sadrzaj:');
  240.     IO.WrLn;
  241.     FOR i:= 0 TO VelicinaTabele-1 DO
  242.       tekuci:= t^.sadrzaj[i]^.veza;
  243.       WHILE tekuci# t^.sadrzaj[i] DO
  244.         WrInfo(tekuci^.el);
  245.     IO.WrLn;
  246.         tekuci:= tekuci^.veza;
  247.       END;
  248.     END;
  249. END Sadrzaj;
  250.  
  251. PROCEDURE Nnad2(n: CARDINAL) : LONGCARD;
  252. BEGIN
  253.   IF n > 1 THEN
  254.     RETURN (VAL(LONGCARD,n) * VAL(LONGCARD,n - 1)) DIV 2
  255.   ELSE
  256.     RETURN 0
  257.   END
  258. END Nnad2;
  259.  
  260. PROCEDURE IspisiNule(b: LONGCARD; duzina: CARDINAL);
  261. VAR
  262.   cifara, i: CARDINAL;
  263. BEGIN
  264.   IF b # 0 THEN
  265.     cifara := 0;
  266.     WHILE b # 0 DO
  267.       INC(cifara);
  268.       b := b DIV 10
  269.     END
  270.   ELSE
  271.     cifara := 1
  272.   END;
  273.   FOR i := 1 TO duzina-cifara DO
  274.     IO.WrChar('0')
  275.   END
  276. END IspisiNule;
  277.  
  278. PROCEDURE Kolizije(VAR t : Tabela);
  279. VAR
  280.   i, decimalni : CARDINAL;
  281.   zbir, decimalniLong : LONGCARD;
  282.   procenat, chi, prosek : REAL;
  283. BEGIN
  284.   WITH t^ DO
  285.     IO.WrStr("Ukupno elemenata: "); IO.WrCard(ukupno, 0); IO.WrLn;
  286.  
  287.     IO.WrStr("Faktor popunjenosti: ");
  288.     zbir := 0;
  289.     FOR i := 0 TO VelicinaTabele - 1 DO
  290.       IF broj[i] > 0 THEN
  291.         INC(zbir);
  292.       END
  293.     END;
  294.     procenat := FLOAT(zbir) * 100.0 / FLOAT(VelicinaTabele);
  295.     IO.WrCard(TRUNC(procenat),0); IO.WrChar('.');
  296.     decimalni := TRUNC((procenat - FLOAT(TRUNC(procenat)))*100.0);
  297.     IspisiNule(VAL(LONGCARD,decimalni), 2);
  298.     IO.WrCard(decimalni,0); IO.WrChar('%');
  299.     IO.WrLn;
  300.  
  301.     IO.WrStr("Ukupno kolizija: ");
  302.     zbir := 0;
  303.     FOR i := 0 TO VelicinaTabele - 1 DO
  304.       zbir := zbir + Nnad2(broj[i]);
  305.     END;
  306.     IO.WrLngCard(zbir, 0);
  307.     IO.WrLn;
  308.  
  309.     IO.WrStr("Hi-kvadrat test: ");
  310.     chi := 0.0;
  311.     IF ukupno > 0 THEN
  312.       prosek := FLOAT(ukupno)/FLOAT(VelicinaTabele);
  313.       FOR i := 0 TO VelicinaTabele - 1 DO
  314.         chi := chi + ((FLOAT(broj[i]) - prosek) * (FLOAT(broj[i]) - prosek) / prosek);
  315.       END
  316.     END;
  317.  
  318.     IO.WrLngCard(VAL(LONGCARD,chi),0); IO.WrChar('.');
  319.     decimalniLong := VAL(LONGCARD,(chi - VAL(REAL,TRUNC(chi)))*1.0E+8);
  320.     IspisiNule(decimalniLong, 8);
  321.     IO.WrLngCard(decimalniLong,0);
  322.     IO.WrLn
  323.   END
  324. END Kolizije;
  325.  
  326. END zadatak.
Add Comment
Please, Sign In to add comment