Advertisement
pseudocreator

SPA2 Hash1

Oct 27th, 2014
533
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (*----------Spisak procedura-------------
  2. -----------------------------------------
  3. PROCEDURE NapraviListu(VAR l: Lista);                                   radi
  4. -----------------------------------
  5. PROCEDURE Init(VAR t: Tabela);                                          radi
  6. -----------------------------------
  7. PROCEDURE UnistiTabelu(VAR t: Tabela);                                  radi
  8. -----------------------------------
  9. PROCEDURE UbaciLista(VAR l: Lista; e: InfoTip);                         radi
  10. -----------------------------------
  11. PROCEDURE Hash(e: InfoTip): INTEGER;                    implementirati ideju
  12. -----------------------------------
  13. PROCEDURE Provera(l: Lista; e1: InfoTip): BOOLEAN;                      radi
  14. -----------------------------------
  15. PROCEDURE UbaciTabela(e: InfoTip; VAR t: Tabela;                        radi
  16. VAR duplikat: BOOLEAN; VAR ok: BOOLEAN);
  17. -----------------------------------                                     radi
  18. PROCEDURE UnesiPodatkeRucno(VAR t: Tabela);
  19. -----------------------------------                                 imp. id.
  20. PROCEDURE UcitajNovi(f: FIO.File,e: InfoTip);
  21. -----------------------------------
  22. PROCEDURE UnesiPodatkeIzFajla(imeFajla: ARRAY OF CHAR; VAR t: Tabela; VAR ok: BOOLEAN;
  23.       VAR duplikata: CARDINAL; VAR losih: CARDINAL);            imp. id.
  24. -----------------------------------
  25. PROCEDURE Izbaci(e: InfoTip; VAR t: Tabela;VAR izbacen: BOOLEAN);       radi
  26. -----------------------------------
  27. PROCEDURE IspisImeSoba(e: InfoTip);                                     radi
  28. -----------------------------------
  29. PROCEDURE StampajLista(l: Lista);                                       radi
  30. -----------------------------------
  31. PROCEDURE StampajTabela(VAR t: Tabela);                                 radi
  32. -----------------------------------
  33. ----------->> 27.10.2014. SPA2                                            *)
  34.  
  35. MODULE hashh;
  36. FROM IO IMPORT WrStr,WrLn;
  37. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  38. FROM InOut IMPORT WriteInt, ReadInt, ReadString;
  39. IMPORT FIO;
  40. FROM Str IMPORT Compare, Length;
  41.  
  42. CONST
  43.      MaxDuzReci = 20;
  44.      VelicinaTabele = 5;
  45.      imeFajla = "f.txt";
  46. TYPE
  47.     String = ARRAY[1..MaxDuzReci] OF CHAR;
  48.     InfoTip = RECORD
  49.                  ime : String;
  50.                  soba : INTEGER
  51.               END;
  52.     (*def tipa *)
  53.     Lista = POINTER TO Element;
  54.     Element = RECORD
  55.                  el : InfoTip;
  56.                  veza : Lista
  57.               END;
  58.     Tabela = POINTER TO Glavni;
  59.     Glavni = RECORD
  60.                 ukupno : CARDINAL;
  61.                 broj : ARRAY[0..VelicinaTabele-1] OF CARDINAL;
  62.                 sadrzaj : ARRAY[0..VelicinaTabele-1] OF Lista
  63.               END;
  64.  
  65.  
  66. (*Pravljenje liste sa granicnikom i inicijalizovanje tabele*)
  67. PROCEDURE NapraviListu(VAR l: Lista);
  68. BEGIN
  69.      NEW(l);
  70.      l^.veza := l
  71. END NapraviListu;
  72. PROCEDURE Init(VAR t: Tabela);
  73. VAR
  74.    i : INTEGER;
  75. BEGIN
  76.      NEW(t);
  77.      t^.ukupno := 0;
  78.      FOR i := 0 TO (VelicinaTabele-1) DO
  79.         t^.broj[i] := 0;
  80.         NapraviListu(t^.sadrzaj[i])
  81.      END
  82. END Init;
  83.  
  84. (*brisanje liste sa granicnikom i tabele*)
  85. PROCEDURE UnistiListu(VAR l: Lista);
  86. VAR
  87.    temp : Lista;
  88. BEGIN
  89.      WHILE (l^.veza # l) DO
  90.           temp := l^.veza;
  91.           l^.veza := l^.veza^.veza;
  92.           DISPOSE(temp)
  93.      END
  94. END UnistiListu;
  95. PROCEDURE UnistiTabelu(VAR t: Tabela);
  96. VAR
  97.    i : INTEGER;
  98.    temp : Lista;
  99. BEGIN
  100.      FOR i := 0 TO (VelicinaTabele-1) DO
  101.         UnistiListu(t^.sadrzaj[i])
  102.      END;
  103.      DISPOSE(t)
  104. END UnistiTabelu;
  105.  
  106. PROCEDURE UbaciLista(VAR l: Lista; e: InfoTip);
  107. VAR
  108.    novi : Lista;
  109. BEGIN
  110.      NEW(novi);
  111.      novi^.el.ime := e.ime;
  112.      novi^.el.soba := e.soba;
  113.      novi^.veza := l^.veza;
  114.      l^.veza := novi
  115. END UbaciLista;
  116.  
  117. PROCEDURE Hash(e: InfoTip): INTEGER;
  118. VAR
  119.    vr, i: CARDINAL; (*Implementirati u zavisnosti od zadate
  120.                  strukture podataka*)
  121. BEGIN
  122.      (* osnovna ideja -->
  123.        FOR i := 1 TO MaxDuzReci DO
  124.          vr := vr + ORD(e.ime[i]);
  125.        END;
  126.        vr := ((vr + (e.soba)) MOD VelicinaTabele) *)
  127.      RETURN 3;
  128. END Hash;
  129. PROCEDURE Provera(l: Lista; e1: InfoTip): BOOLEAN;
  130. VAR (*Vrati TRUE ako nije doslo do poklapanja, u suprotnom vrati FALSE*)
  131.    f1, f2 : BOOLEAN;
  132.    e2 : InfoTip;
  133.    temp : Lista;
  134. BEGIN
  135.      IF l^.veza # l THEN
  136.         temp := l^.veza;
  137.         WHILE temp # l DO
  138.             e2 := temp^.el;
  139.             f1 := Compare(e1.ime,e2.ime) = 0;
  140.             f2 := e1.soba = e2.soba;
  141.             IF (f1 AND f2) THEN
  142.               RETURN FALSE;
  143.             END;
  144.             temp := temp^.veza;
  145.         END
  146.      END;
  147.      RETURN TRUE;
  148. END Provera;
  149.  
  150. PROCEDURE UbaciTabela(e: InfoTip; VAR t: Tabela;
  151. VAR duplikat: BOOLEAN; VAR ok: BOOLEAN);
  152. VAR
  153.    k : INTEGER;
  154. BEGIN
  155.      k := Hash(e);
  156.      IF k < VelicinaTabele THEN
  157.        ok := TRUE;
  158.        IF (Provera(t^.sadrzaj[k], e)) THEN
  159.         (*t^.sadrzaj[k]^.el.ime := e.ime;
  160.           t^.sadrzaj[k]^.el.soba := e.soba; *)
  161.           UbaciLista(t^.sadrzaj[k],e);
  162.           INC(t^.broj[k]);
  163.           INC(t^.ukupno);
  164.           duplikat := FALSE
  165.        ELSE
  166.            duplikat := TRUE;
  167.            WrStr("Exc Postojeci Element");
  168.        END
  169.      ELSE
  170.          duplikat := FALSE; (*Vrednost po difoltu*)
  171.          ok := FALSE
  172.      END;
  173.      WrStr("***************Ukupno ima"); WriteInt(t^.ukupno,0); WrLn();
  174. END UbaciTabela;
  175.  
  176. PROCEDURE UnesiPodatkeRucno(VAR t: Tabela);
  177. VAR
  178.    n, i : INTEGER;
  179.    e1 : InfoTip;
  180.    ok1, ok2 : BOOLEAN;
  181. BEGIN
  182.      WrStr("Unesite broj unosa: ");
  183.      ReadInt(n);
  184.      FOR i := 1 TO n DO
  185.         WrStr("Unos "); WriteInt(n,0); WrLn();
  186.         WrStr("  ime: "); ReadString(e1.ime);
  187.         WrStr(" broj: "); ReadInt(e1.soba); WrLn();
  188.         UbaciTabela(e1,t,ok1,ok2);
  189.      END;
  190.      WrStr("Kraj unosa."); WrLn();
  191. END UnesiPodatkeRucno;
  192.  
  193. (*PROCEDURE UcitajNovi(f: FIO.File,e: InfoTip);
  194. BEGIN   (*Implementirati ucitavanje stringa a zatim broja,
  195.           potrebno dodatno izvrsiti prepravljanje unosa tako
  196.           da se posle stringa dodaje spec simbol kako bi znali
  197.           gde je kraj stringa a gde pocetak broja, ili prosto citati dok
  198.           razlicito od broj pod pretpostavkom da nema razmaka i da
  199.           u imenu ne postoji broj u suprotnom program puca
  200.           (ovakva imp je zapoceta u proceduri dole)                   *)
  201. END UcitajNovi;
  202. PROCEDURE UnesiPodatkeIzFajla(imeFajla: ARRAY OF CHAR; VAR t: Tabela; VAR ok: BOOLEAN;
  203.       VAR duplikata: CARDINAL; VAR losih: CARDINAL);
  204. VAR
  205.   f : FIO.File;
  206.   novi : InfoTip;
  207.   duplikat, dobarh : BOOLEAN;
  208. BEGIN
  209.   duplikata := 0;
  210.   losih := 0;
  211.   IF NOT FIO.Exists(imeFajla) THEN
  212.     ok:=FALSE
  213.   ELSE
  214.     ok := TRUE;
  215.     f := FIO.Open(ime);
  216.     FIO.EOF:=FALSE;
  217.     WHILE (NOT FIO.EOF) DO
  218.       (*UcitajNovi(f, novi);*)
  219.       FIO.RdStr(str);
  220.       FOR i := 1 TO MaxDuzReci DO
  221.       IF ((ORD(str[i]) < 48) AND (ORD(str[i]) > 57)) THEN
  222.          INC(n1)
  223.       END;
  224.       (*zavrsiti dodavanje *)
  225.  
  226.       UbaciTabela(novi, t, duplikat, dobarh);
  227.       IF NOT dobarh THEN
  228.         INC(losih);
  229.       ELSIF duplikat THEN
  230.         INC(duplikata);
  231.       END;
  232.     END;
  233.     FIO.Close(f)
  234.   END
  235. END UnesiPodatkeIzFajla;                              *)
  236.  
  237. PROCEDURE Izbaci(e: InfoTip; VAR t: Tabela;VAR izbacen: BOOLEAN);
  238. VAR
  239.    temp, del : Lista;
  240.    k : CARDINAL;
  241. BEGIN
  242.   k := Hash(e);
  243.   izbacen := FALSE;
  244.   IF k < VelicinaTabele THEN
  245.     t^.sadrzaj[k]^.el := e;
  246.     temp := t^.sadrzaj[k];
  247.     WHILE (NOT Provera(temp^.veza, e)) DO
  248.      temp := temp^.veza;
  249.     END;
  250.     IF temp^.veza # t^.sadrzaj[k] THEN
  251.       izbacen := TRUE;
  252.       DEC(t^.ukupno);
  253.       DEC(t^.broj[k]);
  254.       del := temp^.veza;
  255.       temp^.veza := del^.veza;
  256.       DISPOSE(del);
  257.      END
  258.   END
  259. END Izbaci;
  260.  
  261. PROCEDURE IspisImeSoba(e: InfoTip);
  262. BEGIN
  263.      WrLn(); WrStr("  ime: "); WrStr(e.ime); WrLn();
  264.              WrStr("  soba broj: "); WriteInt(e.soba,0);
  265.              WrLn()
  266. END IspisImeSoba;
  267. PROCEDURE StampajLista(l: Lista);
  268. VAR
  269.    temp : Lista;
  270. BEGIN
  271.      IF l^.veza = l THEN
  272.        WrStr(" je prazna."); WrLn(); WrLn();
  273.      ELSE
  274.          temp := l^.veza;
  275.          WHILE (temp # l) DO
  276.             IspisImeSoba(temp^.el);
  277.             temp := temp^.veza
  278.          END
  279.      END;
  280. END StampajLista;
  281. PROCEDURE StampajTabela(VAR t: Tabela);
  282. VAR
  283.     i : INTEGER;
  284. BEGIN
  285.      IF t^.ukupno # 0 THEN
  286.        WrLn(); WrLn();
  287.        WrStr("----------------------------ISPIS TABELE--------------------------"); WrLn(); WrLn();
  288.        FOR i := 0 TO (VelicinaTabele-1) DO
  289.           WrStr("Iz tabele, Lista:"); WriteInt(i+1,0); WrStr(" ima "); WriteInt(t^.broj[i],0);
  290.           WrStr(" elemenata, i to su");
  291.           StampajLista(t^.sadrzaj[i])
  292.        END
  293.      ELSE
  294.          WrStr("Tabela je prazna."); WrLn();
  295.      END
  296. END StampajTabela;
  297.  
  298.  
  299. (*Telo Programa---------------------------------------------------------------*)
  300. VAR
  301.    ok1, ok2, ok3, ok4 : BOOLEAN;
  302.    t1, t2 : Tabela;
  303.    int1, int2, int3 : INTEGER;
  304.    str1, str2, str3 : String;
  305.    e1, e2, e3, e4 : InfoTip;
  306.    l, l1, l2, l3 : Lista;
  307. BEGIN
  308.  
  309.  
  310. END hashh.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement