home *** CD-ROM | disk | FTP | other *** search
- (**********************************************************)
- (* Modula-Kurs, Teil 5: Beispiel 1 *)
- (* (C) Peter Viczena & toolbox 1990 *)
- (**********************************************************)
-
- MODULE ArrayTstNeu;
-
- FROM InOut IMPORT WriteString, WriteLn,
- ReadInt, WriteInt, ReadString;
-
- CONST Anzahl = 4; (* Einzulesende Zahlen *)
-
- TYPE Nummern = INTEGER;
- Menge = [0..Anzahl]; (* Unterbereichstyp *)
-
- Teilnehmer = RECORD
- Name : ARRAY[1..20] OF CHAR;
- Strasse : ARRAY[1..30] OF CHAR;
- ORT : ARRAY[1..30] OF CHAR;
- Vorwahl : Nummern;
- TelNummer : Nummern;
- END;
-
- TelefonListe = ARRAY Menge OF Teilnehmer;
-
- VAR TestArray : TelefonListe;
- Zahl : Nummern;
- l : CARDINAL;
-
-
- PROCEDURE BubbleSort( VAR a : TelefonListe);
- (* sortiert TelefonListe *)
- VAR i, j,
- k : CARDINAL;
-
- BEGIN
- FOR i := 1 TO Anzahl DO (* Für alle Zahlen *)
- FOR j := Anzahl TO i BY -1 DO (* gehe die folgenden *)
- (* durch und schau, *)
- (* ob sie größer sind. Wenn ja, tausche *)
- IF a[j-1].TelNummer > a[j].TelNummer THEN
- k := a[j-1].TelNummer;
- a[j-1].TelNummer := a[j].TelNummer;
- a[j].TelNummer := k;
- END; (* IF *)
-
- END; (* FOR *)
- END; (* FOR *)
- END BubbleSort;
-
-
- BEGIN
- WriteString( 'Array-Test OF INTEGER'); WriteLn;
- WriteString( '---------------------'); WriteLn;
- WriteLn;
- WriteString('Bitte 5 Integer-Zahlen eingeben:'); WriteLn;
- WriteLn;
-
- FOR l := 0 TO Anzahl DO (* Lies Array-Komponenten ein *)
- WriteString('Name :');
- ReadString (TestArray[l].Name);
- WriteString( 'Zahl :');
- ReadInt( Zahl);
- WriteLn;
- TestArray[l].TelNummer := Zahl;
- END; (* FOR *)
-
- BubbleSort( TestArray); (* sortiere *)
-
- WriteString( 'Zahlen und Namen sortiert:'); WriteLn;
- WriteLn;
-
- FOR l := 0 TO Anzahl DO (* gib den Array aus *)
- WriteString('Name :');
- WriteString(TestArray[l].Name);
- WriteLn;
- WriteInt( TestArray[l].TelNummer, 5);
- WriteLn; WriteLn;
- END; (* FOR *)
-
- END ArrayTstNeu.
-
-
-
-
-
- (**********************************************************)
- (* Modula-Kurs, Teil 5: Beispiel 2 *)
- (* (C) Peter Viczena & toolbox 1990 *)
- (**********************************************************)
-
-
- MODULE CaseTest;
-
-
- TYPE ArtTyp = (Kunde,Lieferant, Privat);
-
- Adresse = RECORD
- Name : ARRAY[1..30] OF CHAR;
- Strasse : ARRAY[1..30] OF CHAR;
- ORT : ARRAY[1..30] OF CHAR;
- Vorwahl : Nummern;
- TelNummer : Nummern;
-
- CASE Art : ArtTyp OF
- Kunde : Kundennummer : INTEGER;
- | Lieferant : AnsprPartner : ARRAY [1..20] OF CHAR;
- | Privat : (* leer *)
- END; (* CASE *)
-
- END; (* RECORD *)
-
-
- VAR p1,p2, p3 : Adresse;
-
- BEGIN
-
- p1.Name := "Peter Lustig";
- p1.Strasse := "Pusteblumenweg 13";
- p1.Ort := "4690 Wanne Eickel";
- p1.Vorwahl := 02325;
- p1.Nummer := 99989;
- p1.Art := Kunde;
- p1.Kundenummer := 234;
-
-
- WITH p2 DO
- Name := "Advanced Applications";
- Strasse := "Sperlingweg 19";
- Ort := "7500 Karlsruhe 31";
- Vorwahl := 0721;
- Nummer := 700912;
- Art := Lieferant;
- AnsprPartner := "Herr Viczena";
- END; %---> Programm "Kreisbogen"
- %---> demonstriert die Verwendung des Befehls "arcto"
- %---> zur Darstellung abgerundeter Ecken
-
- % Hauptprogramm
-
- /Times-Roman findfont
- 15 scalefont
- setfont
-
- newpath % Seite öffnen
-
- % markiere Kreisabschnitt
-
- 0.1 setlinewidth % Linienstärke fein
- 0 setgray % 100 Prozent Schwarz
-
- 190 380 moveto % positioniere Cursor
- (Startposition) show % markiere Start und Ziel
- 200 400 moveto % positioniere Cursor
- 300 500 lineto % zeichne feine (Hilfs-)Linie
- 290 510 moveto % Abstand für den Text
- (X1,Y1) show
- 300 500 moveto % an den Endpunkt der 1. Linie
- 400 400 lineto % zeichne feine (Hilfs-)Linie
- 370 380 moveto % Abstand für den Text
- (X2,Y2) show
- stroke % Ausführung
-
- %------------------------------
- % zeichne die abgerundete Ecke
- %------------------------------
-
- 2.0 setlinewidth % grobere Linienstärke
- 200 400 movlem := Oben to (Start +1) By -1 DO
-
- BisherMax := Start;
- FOR TestElem := (Start+1) TO LetztesUnsortElem DO
- IF Feld[BisherMax] < Feld[TestElem] THEN
- BisherMax := TestElem
- END; (* IF *)
- END; (* FOR *)
-
- Tausch(Feld[BisherMax],Feld[LetzesUnsortElem]);
-
- END; (* FOR *)
-
- END MiniSort;
-
-
- PROCEDURE FindeMittel(Start, Oben:CARDINAL);
- (* setzt den zentralen Wert von Start, Oben, Mitte an die *)
- (* Indexposition von Start, damit die Partitionierung *)
- (* starten kann *)
-
- VAR Mitte: CARDINAL;
-
- BEGIN
-
- Mitte := (Start+Oben) DIV 2;
- IF Feld[Oben] < Feld[Mitte] THEN
- Tausch(Feld[Oben], Feld[Mitte])
- END;
-
- IF Feld[Start] < Feld[Mitte] THEN
- Tausch(Feld[Start], Feld[Mitte])
- END;
-
- IF Feld[Oben] < Feld[Start] THEN
- Tausch(Feld[Oben], Feld[Start])
- END;
-
- END FindeMittel;
-
-
- PROCEDURE Partitioniere (VAR m:CARDINAL);
-
- VAR l,r CARDINAL;
-
- BEGIN
-
- l := Start; (* linker Zeiger *)
- r := Oben; (* rechter Zeiger *)
- m := Start; (* mittlerer Zeiger *)
-
- While r > l DO
-
- While Feld[m]<Feld[t] AND (m<r) DO
- r := r-1; (* rutsche durch solange *)
- END; (* WHILE *) (* rechts alles größer ist *)
-
- IF m < r THEN
- Tausch (Feld[m], Feld[r]);
- m := r; (* Falls es ein kleineres *)
- END (* IF *) (* Feldelement gibt Tausche*)
-
- IF l < r THEN
-
- WHILE Feld[l] < Feld[m] AND (l<m)
- s:= S+1; (* rutsche durch solange *)
- END; (* WHILE *) (* links alles kleiner ist *)
-
- IF l < m THEN
- Tausch(Feld[l], Feld[m]);
- m := l; (* Falls es ein größeres *)
- END; (* IF *) (* Feldelement gibt Tausche *)
-
- END; (* IF *)
-
- END; (* WHILE *)
-
- END Partitioniere;
-
-
-
-
- PROCEDURE Quicksort (Start, Oben:CARDINAL);
-
- VAR p:Cardinal; (* der Index des Fixpunktes *)
-
- BEGIN
-
- IF (Oben-Start) > 8 THEN
- FindeMittel(Start, Oben);
- Partitioniere(p);
- Quicksort (Start, p-1);
- Quicksort (p+1, Oben);
-
- ELSE
- MiniSort(Start, Oben);
- END; (* IF *)
-
- END Quicksort;
-
-
- BEGIN (* der Rumpf von Sort *)
-
- Quicksort(Erstes, Letztes);
-
- END Sort;