MODULE Sterne; IMPORT Read, Write, Conclusions, RandomGenerators; CONST prim = 19; (* sollte Primzahl sein *) TYPE Name = ARRAY 30 OF CHAR; Liste = POINTER TO Element; Element = RECORD name: Name; next: Liste; END; HashTable = ARRAY prim OF Liste; Stars = POINTER TO Star; Star = RECORD starName: Name; END; VAR value,i: INTEGER; anchor: HashTable; star,s: Stars; PROCEDURE HashFkt(name: Name): INTEGER; VAR i, res: INTEGER; BEGIN i := 0; res := 0; WHILE (name[i] # 0X) & (i < LEN(name)) DO res := res + ORD(name[i]) * (i+1) * (i+1); INC(i); END; RETURN res MOD 19; END HashFkt; (* Fuer jede moegliche Hashadresse eine Liste anlegen. *) PROCEDURE Init(); VAR counter: INTEGER; BEGIN counter := 0; WHILE counter < LEN(anchor) DO anchor[counter] := NIL; INC(counter); END; END Init; (* Elemente in Hashtabelle einfuegen *) (* Falls Ueberlauf dann sortiert einfuegen *) PROCEDURE Insert(name: Name); VAR tmp, pre, elem: Liste; add: INTEGER; BEGIN add := HashFkt(name); pre := NIL; tmp := anchor[add]; (* Suche nach dem potentiellen Vorgaenger, * existiert kein Vorgaenger zeigt pre auf NIL * (potentieller Vorgaenger, da das Element erst * noch nach dem "Vorgaenger" eingefuegt werden * muss...)! *) WHILE (tmp # NIL) & (tmp.name < name) DO pre := tmp; tmp := tmp.next; END; (* Kein Vorgaenger vorhanden *) IF pre = NIL THEN NEW(elem); elem.name := name; elem.next := anchor[add]; anchor[add] := elem; (* Vorgaenger vorhanden *) ELSE NEW(elem); elem.name := name; elem.next := pre.next; pre.next := elem; END; END Insert; PROCEDURE Ausgabe(); VAR counter: INTEGER; tmp: Liste; BEGIN counter := 0; WHILE counter < LEN(anchor) DO Write.Int(counter,3); Write.String(": "); tmp := anchor[counter]; WHILE tmp # NIL DO Write.String(tmp.name); Write.String(" "); tmp := tmp.next; END; Write.Ln; INC(counter); END; END Ausgabe; (* Erzeugt eine Zufallszahl zwischen 1 und max *) PROCEDURE RandomNumber(max : INTEGER) : INTEGER; BEGIN RETURN ( (SHORT(RandomGenerators.Int32Val()) MOD max) + 1 ); END RandomNumber; (* Erzeugt zufaellige 5-stellige "Sternennamen" *) PROCEDURE StarGenerator(): Stars; VAR rand, counter: INTEGER; BEGIN NEW(star); counter := 0; WHILE counter <= 5 DO rand := RandomNumber(26) + 64; star.starName[counter] := CHR(rand); INC(counter); END; star.starName[5] := 0X; RETURN star; END StarGenerator; BEGIN Write.Ln; Init(); Insert("Sonne"); Insert("PGC2375"); Insert("NGC224"); Insert("Andromeda"); Insert("Plejaden"); Insert("Sirius"); Insert("M31"); Insert("PGC2558"); i := 1; WHILE i <= 20 DO s := StarGenerator(); Insert(s.starName); INC(i); END; Ausgabe(); Write.Ln; Write.Ln; END Sterne.