MODULE Punkte; IMPORT Read, Write, Streams; TYPE Liste = POINTER TO Elements; Elements = RECORD punkte: INTEGER; name: ARRAY 30 OF CHAR; next: Liste; prev: Liste; END; VAR anchor,pointer,temp,pred: Liste; (* Achtung: Die letzte Eingabe direkt mit Ctrl-d abschliessen *) (* (d.h. direkt nachdem die letzte Zahl eingegeben wurde *) (* kein Return druecken), *) (* da der Wert sonst als 0 eingelesen wird! *) PROCEDURE Eingabe(); BEGIN WHILE ~ Streams.stdin.eof DO NEW(pointer); Read.Int(pointer.punkte); (* Read.String(pointer.name); *) temp := anchor; IF (pointer.punkte >= 50) THEN (* Suche Element *) WHILE (temp.punkte <= pointer.punkte) & (temp.next # NIL) DO pred := temp; temp := temp.next; END; (* Element am Ende der Liste einfuegen *) IF (temp.next = NIL) & (pointer.punkte >= temp.punkte) THEN pointer.next := temp.next; (* := NIL *) temp.next := pointer; (* Element mittendrin einfuegen *) ELSE pointer.next := pred.next; (* := temp *) pred.next := pointer; END; ELSE (* < 50 *) (* Suche Element *) WHILE (temp.punkte > pointer.punkte) & (temp.prev # NIL) DO pred := temp; temp := temp.prev; END; (* Element am Ende der Liste einfuegen *) IF (temp.prev = NIL) & (pointer.punkte < temp.punkte) THEN pointer.prev := temp.prev; temp.prev := pointer; (* Element mittendrin einfuegen *) ELSE pointer.prev := pred.prev; pred.prev := pointer; END; END; END; END Eingabe; BEGIN Write.Ln; Write.Ln; Write.String("Schwellwert eingeben"); Write.Ln; NEW(pointer); Read.Int(pointer.punkte); (* Read.String(pointer.name); *) anchor := pointer; Write.Ln; Write.String("Weitere Werte eingeben"); Write.Ln; Eingabe; (* Ergebnis ausgeben... *) Write.Ln; Write.Ln; Write.String("Bestanden"); Write.Ln; temp := anchor; WHILE (temp.next # NIL) DO temp := temp.next; Write.Int(temp.punkte,0); Write.Ln; END; Write.Ln; Write.Ln; Write.String("Nicht Bestanden"); Write.Ln; temp := anchor; WHILE (temp.prev # NIL) DO temp := temp.prev; Write.Int(temp.punkte,0); Write.Ln; END; END Punkte.