Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (*----------Spisak procedura-------------
- -----------------------------------------
- PROCEDURE NapraviListu(VAR l: Lista); radi
- -----------------------------------
- PROCEDURE Init(VAR t: Tabela); radi
- -----------------------------------
- PROCEDURE UnistiTabelu(VAR t: Tabela); radi
- -----------------------------------
- PROCEDURE UbaciLista(VAR l: Lista; e: InfoTip); radi
- -----------------------------------
- PROCEDURE Hash(e: InfoTip): INTEGER; implementirati ideju
- -----------------------------------
- PROCEDURE Provera(l: Lista; e1: InfoTip): BOOLEAN; radi
- -----------------------------------
- PROCEDURE UbaciTabela(e: InfoTip; VAR t: Tabela; radi
- VAR duplikat: BOOLEAN; VAR ok: BOOLEAN);
- ----------------------------------- radi
- PROCEDURE UnesiPodatkeRucno(VAR t: Tabela);
- ----------------------------------- imp. id.
- PROCEDURE UcitajNovi(f: FIO.File,e: InfoTip);
- -----------------------------------
- PROCEDURE UnesiPodatkeIzFajla(imeFajla: ARRAY OF CHAR; VAR t: Tabela; VAR ok: BOOLEAN;
- VAR duplikata: CARDINAL; VAR losih: CARDINAL); imp. id.
- -----------------------------------
- PROCEDURE Izbaci(e: InfoTip; VAR t: Tabela;VAR izbacen: BOOLEAN); radi
- -----------------------------------
- PROCEDURE IspisImeSoba(e: InfoTip); radi
- -----------------------------------
- PROCEDURE StampajLista(l: Lista); radi
- -----------------------------------
- PROCEDURE StampajTabela(VAR t: Tabela); radi
- -----------------------------------
- ----------->> 27.10.2014. SPA2 *)
- MODULE hashh;
- FROM IO IMPORT WrStr,WrLn;
- FROM Storage IMPORT ALLOCATE, DEALLOCATE;
- FROM InOut IMPORT WriteInt, ReadInt, ReadString;
- IMPORT FIO;
- FROM Str IMPORT Compare, Length;
- CONST
- MaxDuzReci = 20;
- VelicinaTabele = 5;
- imeFajla = "f.txt";
- TYPE
- String = ARRAY[1..MaxDuzReci] OF CHAR;
- InfoTip = RECORD
- ime : String;
- soba : INTEGER
- END;
- (*def tipa *)
- Lista = POINTER TO Element;
- Element = RECORD
- el : InfoTip;
- veza : Lista
- END;
- Tabela = POINTER TO Glavni;
- Glavni = RECORD
- ukupno : CARDINAL;
- broj : ARRAY[0..VelicinaTabele-1] OF CARDINAL;
- sadrzaj : ARRAY[0..VelicinaTabele-1] OF Lista
- END;
- (*Pravljenje liste sa granicnikom i inicijalizovanje tabele*)
- PROCEDURE NapraviListu(VAR l: Lista);
- BEGIN
- NEW(l);
- l^.veza := l
- END NapraviListu;
- PROCEDURE Init(VAR t: Tabela);
- VAR
- i : INTEGER;
- BEGIN
- NEW(t);
- t^.ukupno := 0;
- FOR i := 0 TO (VelicinaTabele-1) DO
- t^.broj[i] := 0;
- NapraviListu(t^.sadrzaj[i])
- END
- END Init;
- (*brisanje liste sa granicnikom i tabele*)
- PROCEDURE UnistiListu(VAR l: Lista);
- VAR
- temp : Lista;
- BEGIN
- WHILE (l^.veza # l) DO
- temp := l^.veza;
- l^.veza := l^.veza^.veza;
- DISPOSE(temp)
- END
- END UnistiListu;
- PROCEDURE UnistiTabelu(VAR t: Tabela);
- VAR
- i : INTEGER;
- temp : Lista;
- BEGIN
- FOR i := 0 TO (VelicinaTabele-1) DO
- UnistiListu(t^.sadrzaj[i])
- END;
- DISPOSE(t)
- END UnistiTabelu;
- PROCEDURE UbaciLista(VAR l: Lista; e: InfoTip);
- VAR
- novi : Lista;
- BEGIN
- NEW(novi);
- novi^.el.ime := e.ime;
- novi^.el.soba := e.soba;
- novi^.veza := l^.veza;
- l^.veza := novi
- END UbaciLista;
- PROCEDURE Hash(e: InfoTip): INTEGER;
- VAR
- vr, i: CARDINAL; (*Implementirati u zavisnosti od zadate
- strukture podataka*)
- BEGIN
- (* osnovna ideja -->
- FOR i := 1 TO MaxDuzReci DO
- vr := vr + ORD(e.ime[i]);
- END;
- vr := ((vr + (e.soba)) MOD VelicinaTabele) *)
- RETURN 3;
- END Hash;
- PROCEDURE Provera(l: Lista; e1: InfoTip): BOOLEAN;
- VAR (*Vrati TRUE ako nije doslo do poklapanja, u suprotnom vrati FALSE*)
- f1, f2 : BOOLEAN;
- e2 : InfoTip;
- temp : Lista;
- BEGIN
- IF l^.veza # l THEN
- temp := l^.veza;
- WHILE temp # l DO
- e2 := temp^.el;
- f1 := Compare(e1.ime,e2.ime) = 0;
- f2 := e1.soba = e2.soba;
- IF (f1 AND f2) THEN
- RETURN FALSE;
- END;
- temp := temp^.veza;
- END
- END;
- RETURN TRUE;
- END Provera;
- PROCEDURE UbaciTabela(e: InfoTip; VAR t: Tabela;
- VAR duplikat: BOOLEAN; VAR ok: BOOLEAN);
- VAR
- k : INTEGER;
- BEGIN
- k := Hash(e);
- IF k < VelicinaTabele THEN
- ok := TRUE;
- IF (Provera(t^.sadrzaj[k], e)) THEN
- (*t^.sadrzaj[k]^.el.ime := e.ime;
- t^.sadrzaj[k]^.el.soba := e.soba; *)
- UbaciLista(t^.sadrzaj[k],e);
- INC(t^.broj[k]);
- INC(t^.ukupno);
- duplikat := FALSE
- ELSE
- duplikat := TRUE;
- WrStr("Exc Postojeci Element");
- END
- ELSE
- duplikat := FALSE; (*Vrednost po difoltu*)
- ok := FALSE
- END;
- WrStr("***************Ukupno ima"); WriteInt(t^.ukupno,0); WrLn();
- END UbaciTabela;
- PROCEDURE UnesiPodatkeRucno(VAR t: Tabela);
- VAR
- n, i : INTEGER;
- e1 : InfoTip;
- ok1, ok2 : BOOLEAN;
- BEGIN
- WrStr("Unesite broj unosa: ");
- ReadInt(n);
- FOR i := 1 TO n DO
- WrStr("Unos "); WriteInt(n,0); WrLn();
- WrStr(" ime: "); ReadString(e1.ime);
- WrStr(" broj: "); ReadInt(e1.soba); WrLn();
- UbaciTabela(e1,t,ok1,ok2);
- END;
- WrStr("Kraj unosa."); WrLn();
- END UnesiPodatkeRucno;
- (*PROCEDURE UcitajNovi(f: FIO.File,e: InfoTip);
- BEGIN (*Implementirati ucitavanje stringa a zatim broja,
- potrebno dodatno izvrsiti prepravljanje unosa tako
- da se posle stringa dodaje spec simbol kako bi znali
- gde je kraj stringa a gde pocetak broja, ili prosto citati dok
- razlicito od broj pod pretpostavkom da nema razmaka i da
- u imenu ne postoji broj u suprotnom program puca
- (ovakva imp je zapoceta u proceduri dole) *)
- END UcitajNovi;
- PROCEDURE UnesiPodatkeIzFajla(imeFajla: ARRAY OF CHAR; VAR t: Tabela; VAR ok: BOOLEAN;
- VAR duplikata: CARDINAL; VAR losih: CARDINAL);
- VAR
- f : FIO.File;
- novi : InfoTip;
- duplikat, dobarh : BOOLEAN;
- BEGIN
- duplikata := 0;
- losih := 0;
- IF NOT FIO.Exists(imeFajla) THEN
- ok:=FALSE
- ELSE
- ok := TRUE;
- f := FIO.Open(ime);
- FIO.EOF:=FALSE;
- WHILE (NOT FIO.EOF) DO
- (*UcitajNovi(f, novi);*)
- FIO.RdStr(str);
- FOR i := 1 TO MaxDuzReci DO
- IF ((ORD(str[i]) < 48) AND (ORD(str[i]) > 57)) THEN
- INC(n1)
- END;
- (*zavrsiti dodavanje *)
- UbaciTabela(novi, t, duplikat, dobarh);
- IF NOT dobarh THEN
- INC(losih);
- ELSIF duplikat THEN
- INC(duplikata);
- END;
- END;
- FIO.Close(f)
- END
- END UnesiPodatkeIzFajla; *)
- PROCEDURE Izbaci(e: InfoTip; VAR t: Tabela;VAR izbacen: BOOLEAN);
- VAR
- temp, del : Lista;
- k : CARDINAL;
- BEGIN
- k := Hash(e);
- izbacen := FALSE;
- IF k < VelicinaTabele THEN
- t^.sadrzaj[k]^.el := e;
- temp := t^.sadrzaj[k];
- WHILE (NOT Provera(temp^.veza, e)) DO
- temp := temp^.veza;
- END;
- IF temp^.veza # t^.sadrzaj[k] THEN
- izbacen := TRUE;
- DEC(t^.ukupno);
- DEC(t^.broj[k]);
- del := temp^.veza;
- temp^.veza := del^.veza;
- DISPOSE(del);
- END
- END
- END Izbaci;
- PROCEDURE IspisImeSoba(e: InfoTip);
- BEGIN
- WrLn(); WrStr(" ime: "); WrStr(e.ime); WrLn();
- WrStr(" soba broj: "); WriteInt(e.soba,0);
- WrLn()
- END IspisImeSoba;
- PROCEDURE StampajLista(l: Lista);
- VAR
- temp : Lista;
- BEGIN
- IF l^.veza = l THEN
- WrStr(" je prazna."); WrLn(); WrLn();
- ELSE
- temp := l^.veza;
- WHILE (temp # l) DO
- IspisImeSoba(temp^.el);
- temp := temp^.veza
- END
- END;
- END StampajLista;
- PROCEDURE StampajTabela(VAR t: Tabela);
- VAR
- i : INTEGER;
- BEGIN
- IF t^.ukupno # 0 THEN
- WrLn(); WrLn();
- WrStr("----------------------------ISPIS TABELE--------------------------"); WrLn(); WrLn();
- FOR i := 0 TO (VelicinaTabele-1) DO
- WrStr("Iz tabele, Lista:"); WriteInt(i+1,0); WrStr(" ima "); WriteInt(t^.broj[i],0);
- WrStr(" elemenata, i to su");
- StampajLista(t^.sadrzaj[i])
- END
- ELSE
- WrStr("Tabela je prazna."); WrLn();
- END
- END StampajTabela;
- (*Telo Programa---------------------------------------------------------------*)
- VAR
- ok1, ok2, ok3, ok4 : BOOLEAN;
- t1, t2 : Tabela;
- int1, int2, int3 : INTEGER;
- str1, str2, str3 : String;
- e1, e2, e3, e4 : InfoTip;
- l, l1, l2, l3 : Lista;
- BEGIN
- END hashh.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement