MODULE BubbleSort; IMPORT Read, Write, ConstStrings; CONST lengthArray = 4; lengthName = 40; lengthFach = 30; TYPE Name = ARRAY lengthName OF CHAR; Fach = ARRAY lengthFach OF CHAR; Student = RECORD vorname, nachname: Name; studienfach: Fach; matrnr: INTEGER; END; Studenten = ARRAY lengthArray OF Student; Compare = PROCEDURE(stud1, stud2: Student):INTEGER; VAR studis: Studenten; z: INTEGER; PROCEDURE CompareVorname(s1, s2: Student) : INTEGER; (* Vergleicht die Vornamen von 2 Studenten *) VAR str1, str2: ConstStrings.String; i :INTEGER; BEGIN ConstStrings.Create(str1,s1.vorname); ConstStrings.Create(str2,s2.vorname); RETURN ConstStrings.Compare(str1,str2); END CompareVorname; PROCEDURE CompareNachname(s1, s2: Student) : INTEGER; (* Vergleicht die Nachnamen von 2 Studenten *) VAR str1, str2: ConstStrings.String; i :INTEGER; BEGIN ConstStrings.Create(str1,s1.nachname); ConstStrings.Create(str2,s2.nachname); RETURN ConstStrings.Compare(str1,str2); END CompareNachname; PROCEDURE CompareStudienfach(s1, s2: Student) : INTEGER; (* Vergleicht das Studienfach von 2 Studenten *) VAR str1, str2: ConstStrings.String; i :INTEGER; BEGIN ConstStrings.Create(str1,s1.studienfach); ConstStrings.Create(str2,s2.studienfach); RETURN ConstStrings.Compare(str1,str2); END CompareStudienfach; PROCEDURE CompareMatr(s1, s2: Student) : INTEGER; (* Vergleicht die Matrikelnummern von 2 Studenten *) BEGIN IF s1.matrnr < s2.matrnr THEN RETURN -1; ELSIF s1.matrnr > s2.matrnr THEN RETURN 1; ELSE RETURN 0; END; END CompareMatr; PROCEDURE Swap(VAR s1,s2: Student); (* Vertauscht s1 und s2 *) VAR tmp: Student; BEGIN tmp := s1; s1 := s2; s2 := tmp; END Swap; PROCEDURE Sort(VAR std: ARRAY OF Student; cmp: Compare); (* Sortiert nach dem Bubblesort Algorithmus *) VAR i, j, h: INTEGER; BEGIN i := 0; WHILE (i < LEN(std)) DO j := i + 1; WHILE (j < LEN(std)) DO IF cmp(std[i], std[j]) > 0 THEN Swap(std[i],std[j]); END; INC(j); END; INC(i); END; END Sort; PROCEDURE Print(std: ARRAY OF Student); (* Ausgabe *) VAR i: INTEGER; BEGIN i := 0; WHILE (i < LEN(std)) DO Write.String("Student "); Write.Int(i + 1,0); Write.String(": "); Write.String(" "); Write.String(studis[i].vorname); Write.String(" "); Write.String(studis[i].nachname); Write.String(" "); Write.String(studis[i].studienfach); Write.String(" "); Write.Int(studis[i].matrnr,7); Write.Ln; INC(i); END; END Print; BEGIN (* Studentendaten einlesen *) z := 0; WHILE z < lengthArray DO Write.Ln; Write.String("Student "); Write.Int(z + 1,0); Write.String(":"); Write.Ln; Write.String("Vorname? "); Read.String(studis[z].vorname); Write.String("Name? "); Read.String(studis[z].nachname); Write.String("Studienfach? "); Read.String(studis[z].studienfach); Write.String("Matrikelnummer? "); Read.Int(studis[z].matrnr); INC(z); END; Print(studis); Sort(studis, CompareMatr); Write.Ln; Print(studis); Sort(studis, CompareNachname); Write.Ln; Print(studis); Sort(studis, CompareStudienfach); Write.Ln; Print(studis); Sort(studis, CompareVorname); Write.Ln; Print(studis); END BubbleSort.