Turbo Pascal für Windows 1 Aufbau eines Pascal-Programms Ein Pascal-Programm ist in folgende 3 Abschnitte gegliedert: PROGRAM Programmname; 1. Programmkopf USES wincrt; CONST………; VAR………….; 2.Deklarationsteil BEGIN …. 3. Hauptprogramm …. besteht aus Anweisungen und Blöcken von Anweisungen, die jeweils …. durch BEGIN und END zusammengehalten werden …. END. Regeln: - fast alle Pascal-Befehle werden durch ein Semikolon voneinander getrennt - Abarbeitung der Befehle in der Reihenfolge, in der sie im Programm stehen - nach BEGIN kein „ ;“ - nach END folgt ein Punkt, falls es das Ende des Hauptprogramms darstellt 2 Ein- und Ausgabe 2.1 Ausgabe WRITE(‘Hallo’); WRITE(a); WRITE(‘Hallo ‘,a) WRITELN(....); WRITELN; schreibt Hallo schreibt Wert der Variablen a (oder Konstanten) schreibt beides hintereinander das „Nächstgeschriebene“ fängt in einer neuen Zeile an schreibt Leerzeile (lies: „writeline“) CLRSCR; („clearscreen“) löscht den Bildschirm Aufgabe: Schreibe ein Programm Textausgabe, das einen dreizeiligen Text mit Leerzeilen zwischen den Zeilen ausgibt und speichere das Programm. 2.2 Eingabe READLN(a); Mit readln (lies: „readline“) wird ein Zeichen, eine Zahl oder ein Wort an den Rechner übergeben. Heißt soviel wie „lies“. Das Eingegebene wird hier der Variablen a zugewiesen. 2.3 Formatierung der Ausgabe 1 GOTO XY(13,8); schreibt Hallo an die Koordinaten der entsprechenden Bildschirmstelle WRITE(‘Hallo‘); (hier: Beginn mit Schreiben in die 13.Spalte und 8.Zeile des Bildschirms) WRITE(a:7:2); bewirkt, dass der Wert der Variablen a mit insgesamt 7 Stellen und davon 2 Stellen hinter dem „Komma“ angegeben wird 3 Konstanten und Variablen 3.1 Variablen Variablen sind Speicherplätze im Rechner, in denen Objekte wie Zahlen, Buchstaben oder Wörter gespeichert werden. Eine Variable hat einen Namen, einen Datentyp (werden beide im Deklarationsteil des Programms festgelegt) und einen Dateninhalt (wird im Hauptgang zugewiesen; jederzeit veränderbar) Bsp.: anzahl:=4 anzahl 4 Beispiele für Datentypen INTEGER :ganze Zahl von -32 768 bis +32 767 LONGINT :größere bzw. kleinere ganze Zahlen als im obigen Bereich angegeben REAL :reelle Zahlen BOOLEAN :logische Variable, kann nur die Worte TRUE (wahr) oder FALSE (falsch) annehmen CHAR :beliebiges Zeichen aus dem Zeichensatz des Rechners STRING :Zeichenketten aus beliebigen Zeichen, z.B. Wort oder Satz Beispiel: PROGRAM….; . . VAR anzahl, punkte:INTEGER; verbrauch:REAL; name:STRING; . . 3.2 Konstanten Speicherplatz, der einen Namen und einen Dateninhalt hat ↑ der Dateninhalt wird im Gegensatz zur Vorgehensweise bei Variablen auch im Deklarationsteil festgelegt und lässt sich im Hauptprogramm nicht mehr verändern! Bsp.: PROGRAM….; . 2 . CONST pi=3.1416; VAR… . . 4 Kommentare Damit der Programmtext übersichtlicher wird, fügt man i.a. einige erklärende Textzeilen ein. Kommentare lassen sich in geschweiften Klammern einfügen. Sie werden beim Übersetzen des Programms vom Rechner nicht beachtet. Bsp. PROGRAM Primzahlen; {das Programm berechnet alle Primzahlen bis 10.000} Welches Programm ist falsch, welches nicht (Begründung)? PROGRAM falsch; CONST Elf=11; BEGIN Elf:=Elf*2; WRITELN(Elf); END. PROGRAM richtig VAR Elf:integer; BEGIN Elf:=11; Elf:=Elf*2; WRITELN(Elf); END. Aufgabe: Tippe folgenes Programm in Turbo-Pascal und versuche es zu verstehen. Teste das Programm mit unterschiedlichen Eingaben. Ändere anschließend auch die Datentypen PROGRAM Vartest; {Programm zur Demonstration einfacher Datentypen} USES wincrt; CONST drei= 3; elfkommadrei=11.3; VAR ganz1,ganz2:INTEGER; name:STRING[20]; BEGIN { Hauptprogramm} CLRSCR; WRITELN (´Gib eine ganze Zahl ein: ‘); {Eingabe} READLN (ganz1); WRITELN (´Noch eine: ‘); READLN (ganz2); WRITELN; WRITE (´Gib deinen Namen ein: ‘); READLN (name); CLRSCR; WRITELN (´Hallo ‘,name,´!‘); {Ausgabe} WRITELN; WRITELN(´Die Konstanten dieses Programms ‘); WRITELN(´sind ‘,drei,‘ und ‘,elfkommadrei); 3 WRITELN; WRITELN(´Du hast folgende Zahlen eingegeben: `); WRITELN (ganz1,´ und ‘,ganz2); END. 5 Rechnen mit Pascal 5.1 Grundrechenarten Addition(+), Subtraktion(-), Multiplikation(*), Division(/) 5.2 andere Rechenoperationen i DIV j; Bsp.: 16 DIV 5 = 3; 22 DIV 8 = 2 ganzzahlige Division i MOD j; Bsp.: 16 MOD 5 = 1; 22 MOD = 6 Rest bei ganzzahliger Division ABS(x); Betrag von x TRUNC(x); Abschneiden der Nachkommastellen ROUND(x); rundet reelle Zahl zu ganzer Zahl SQR(x); „square“ (Quadrat) x² SQRT(x); „squareroot“: Wurzel von x SIN(x) COS(x) TAN(x) EXP(x); ex LN(x); natürlicher Logarithmus von x Aufgabe1: Schreibe ein Programm Paket, das nach Eingabe von Länge, Höhe und Breite eines Pakets dessen Volumen und Oberfläche ausgibt. Aufgabe 2: Schreibe ein Programm Kugel, das das Volumen einer Kugel auf 2 Stellen hinter dem Komma berechnet. (Ausgabe: Bildschirmmitte); Kommentare hinzufügen. 6 Wiederholungsanweisungen 6.1 Die FOR-Anweisung Aufgabe: Schreibe ein Programm, das die Zahlen von 1..100 ausdruckt Lösung PROGRAM zaehle; USES wincrt; VAR i:integer; BEGIN FOR i:=1 to 100 DO {Die Zählvariable i wird von 1 bis 100 hochgezählt und in jedem WRITELN(i); Schleifendurchlauf ausgedruckt; falls der Schleifenrumpf (hier: 4 WRITELN(i)) aus mehr als einem Befehl besteht muss die Schleife mit BEGIN und END geklammert werden} END. Aufgabe1 Schreibe ein Programm Summe1, das nach Eingabe von 10 reellen Zahlen deren Summe ausgibt. Aufgabe2 Schreibe ein Programm Summe2, das nach Eingabe einer natürlichen Zahl n die Summe 1 1 1 1 1 ... ausgibt. 2 3 4 n Wenn man vor Schleifenbeginn nicht weiß, wie oft eine Schleife durchlaufen wird, kann die FOR-Anweisung nicht angewandt werden! Wir benötigen ein anderes Schleifenkonstrukt: 6.2 Die REPEAT-Anweisung Beginn der Schleife führe Schleifenrumpf aus nein Bedingung erfüllt? ja Ende der Schleife In Turbo-Pascal REPEAT Anweisung 1; .... .... Anweisung n; UNTIL Bedingung; Aufgabe1 Schreibe ein Programm Summe3, das wiederholt zur Eingabe einer natürlichen Zahl auffordert, solange bis eine Null eingegeben wird. Dann soll das Programm die Summe der eingegebenen Zahlen ausgeben. 5 Aufgabe2 Schreibe ein Programm Summe4, das zusätzlich zu Summe3 noch den Mittelwert und die Anzahl der Zahlen ausgibt. 6.3 Die WHILE-Anweisung Die while-Schleife ähnelt der „repeat“-Schleife. Sie muss aber im Gegensatz zur REPEATSchleife nicht unbedingt einmal durchlaufen werden. nein Bedingung erfüllt? Ende der Schleife ja führe Schleifenrumpf aus In Turbo-Pascal WHILE Bedingung DO BEGIN Anweisung 1; …. …. Anweisung n; END; Bemerkungen: Beispiele für Bedingungen: a = 4 x<8 h >= 13 s = ‘a‘ (falls s CHAR-Variable) name = ‘info‘ (falls name STRING-Variable) b = TRUE (falls b BOOLEAN-Variable) a <> 4 (a ungleich 4) (a <> 4) AND (b <> 8) (a ungleich 4 und b ungleich 8) (a <> 4) OR (b <> 8) (a ungleich 4 oder b ungleich 8) Aufgabe1 Schreibe ein Programm Summe5. Es soll das gleiche leisten wie Summe4 aus 6.2. Statt der REPEAT-Schleife ist aber eine WHILE-Schleife zu verwenden. 7 Entscheidungen Oft sollen bestimmte Anweisungen nur dann ausgeführt werden, wenn eine Bedingung (oder mehrere) erfüllt ist (sind). 6 WENN Bedingung erfüllt DANN tue irgendetwas 7.1 Die IF-THEN-Konstruktion Turbo-Pascal: IF logischer Ausdruck THEN Anweisung(en); sollen mehrere Anweisungen ausgeführt werden, werden sie wieder mit BEGIN…END zusammengefasst. Beispiele für mögliche logische Ausdrücke Zahl > 0 Ergebnis = 1 Wert = ´true´ Name = ´Sandra´ 7.2 Die IF-THEN-ELSE-Konstruktion Zweiseitige Entscheidung: WENN Bedingung erfüllt DANN tue irgendetwas SONST tue etwas anderes Turbo-Pascal: IF logischer Ausdruck THEN Anweisung(en); ELSE Anweisung(en) ; {BEGIN…END bei mehreren Anweisungen} Vor ELSE darf kein „ ;“ stehen ! Aufgabe1 Schreibe ein Programm Minimum, das nach Eingabe von 10 natürlichen Zahlen die kleinste der eingegebenen Zahlen ausgibt. Aufgabe2 Schreibe ein Programm Zahlenraten: der Computer soll eine Zufallszahl zwischen 0 und 99 erzeugen (RANDOMIZE; zufallszahl:=RANDOM(99)). Nun soll diese Zahl erraten werden. Der Computer teilt jeweils mit, ob die geratene Zahl zu klein oder zu groß ist. Falls die Zahl erraten wurde, soll angegeben werden in welchem Versuch die Zahl geraten wurde. Aufgabe3 Schreibe ein Programm gerade, das wiederholt zur Eingabe einer ganzen Zahl > 0 auffordert, solange bis eine 0 eingegeben wird. Das Programm soll nach jeder eingegebenen Zahl entscheiden, ob die eingegebene Zahl gerade oder ungerade ist und dies ausgeben. Aufgabe4 Schreibe ein Programm geradeSumme, das wiederholt zur Eingabe einer ganzen Zahl auffordert, solange bis eine 0 eingegeben wird. Dann soll die Summe der positiven und die Summe der negativen Zahlen gesondert ausgegeben werden. 7 8 Felder Der Computer dient dazu, große Datenmengen zu verarbeiten. Mit den bisher kennengelernten Mitteln ist dies jedoch kaum möglich bzw. sehr mühsam. Will man z.B. nur 100 Zahlen eingeben, so ist dies schon sehr aufwendig: VAR zahl1, zahl2, ... , zahl100: integer; BEGIN writeln(’1. Zahl:’); readln(zahl1); writeln(’2. Zahl:’); readln(zahl2); ........................ writeln(’100. Zahl:’); readln(zahl100); Dieses Problem lässt sich durch die Benutzung eines Feldes (engl. array) elegant lösen. Die 100 Zahlen werden dabei alle in einem einzigen Feld mit dem Namen „zahl“ abgelegt. Dieses Feld hat somit 100 Speicherplätze in denen die einzelnen Zahlen abgelegt werden: zahl: 4 46 8 1. 2. 3. Speicherplatz des Feldes (Index) 24 100. Auf die einzelnen Speicherplätze eines Feldes kann dann mithilfe des Index zugegriffen werden. Bsp: zahl[3] = ......; zahl[100] = ...... Beispiel: VAR i:integer; zahl: array [1..100] of integer; {i: Laufvariable} {Deklaration des Feldes} BEGIN FOR i := 1 TO 100 DO BEGIN writeln(i,’. Zahl: ’); readln(zahl[i]); END; FOR i := 1 TO 100 DO writeln(i,’. Zahl: ’,zahl[i]); Aufgabe 1 Schreibe wie im Unterricht besprochen ein Programm das den Schnittpunkt zweier Geraden berechnet. Eingegeben werden sollen die Steigungen und y-Achsenabschnitte der Geraden. Aufgabe 2 Schreibe folgendes Programm: ein Feld der Größe 100 soll mit Zufallszahlen von 0 bis 499 8 belegt werden. Danach soll das Feld in einer zweiten Schleife durchlaufen werden. Dabei sollen alle geraden Feldelemente ausgegeben werden. Aufgabe 3 Wir programmieren die “Suchen-und-Ersetzen-Funktion“ in einem Text (z.B. Word). Es soll ein Text mit 10 Wörtern eingegeben werden (Tipp: die einzelnen Wörter als Feldelemente in einem Feld speichern – Datentyp String). Dann soll ein Wort eingegeben werden das ersetzt werden soll und ein Wort durch das ersetzt wird. Bsp: ersetze im Text überall das Wort „Hunger“ durch das Wort „Durst“. Erweitere das Programm so, dass gezählt und ausgegeben wird, wieviele Worte ersetzt worden sind. Aufgabe 4 Zum Abschluss noch ein schwierigeres Programm: Es sollen alle Primzahlen bis 10000 ausgegeben werden. Dies soll nach dem Verfahren „Sieb des Eratosthenes“ erfolgen. Die Feldvariable p, deren Komponenten vom Typ boolean sind, wird zunächst deklariert. Ihre Elemente p[i] werden jeweils auf false gesetzt: p[2]:=false, p[3]:=false, ... , p[10000]:=false. Jetzt wird der Index auf 2 gesetzt und untersucht, ob p[i] false ist. Wenn ja, wird der Index, also 2, ausgegeben. Dann werden alle Elemente mit Indizes, die ein Vielfaches von 2 sind auf true gesetzt, vorausgesetzt, dass i 10000 ist: p[4]:=true, p[6]:=true, ... , p[10000]:=true. Anschließend wird der Index i auf 3 gesetzt und das oben beschriebene verfahren wiederholt. Dabei wird also 3 ausgegeben und alle Vielfachen werden auf true gesetzt. Dieses Verfahren wird nun solange wiederholt, bis der Index i den Wert 10000 erreicht hat. 9 Prozeduren und Funktionen 9.1 Prozeduren Beispiel PROGRAM Test; var a,b,c, ….; PROCEDURE Hallo; var d ….; BEGIN writeln(’Hallo’); END; PROCEDURE Du; BEGIN writeln(’Du’); END; BEGIN {Hauptprogramm} Hallo; Du; readln; END. Eine Prozedur ist ein Unterprogramm (Teilprogramm) das durch Nennung des Prozedurnamens (Bsp: Hallo, Du, …) aufgerufen wird. Variablen des Hauptprogramms (globale Variablen) sind auch in Prozeduren gültig (im Beispiel: a, b, c). 9 Eine Prozedur kann eine andere aufrufen (dabei muss die aufrufende Prozedur aber immer vor der aufrufenden Prozedur stehen, im Beispiel könnten wir also in der Prozedur ’Du’ die Prozedur ‚Hallo’ aufrufen, nicht aber umgekehrt). Variablen und Konstanten, die in einer Prozedur deklariert werden, nennt man lokale Variablen. Diese können nur in der Prozedur verwendet werden, in der sie definiert sind. Im Hauptprogramm und in anderen Prozeduren sind sie nicht gültig (im Beispiel d in der Prozedur ‚Hallo’). Aufgabe1 Schreibe ein Programm, welches die Fakultät einer Zahl, die eingegeben werden soll, ausgibt. Dabei sind die drei Prozeduren „Eingabe“, „Berechnung“ und „Ausgabe“ zu verwenden. Das Hauptprogramm soll folgendermaßen aussehen: BEGIN Eingabe; {Zahl von der die Fakultät berechnet werden soll} Berechnung; {Berechnung der Fakultät} Ausgabe; {Ausgabe des Ergebnisses} END. Aufgabe2 Entwickle ein Programm, welches zu einer Menge von 10 einzugebenden Zahlen deren Minimum bestimmt und angibt, ob sich mindestens zwei gleiche Zahlen in der Menge befinden. Gestalt des Hauptprogramms: BEGIN Eingabe; {Eingabe der 10 Zahlen} Minimum; {Bestimmung und Ausgabe des Minimums} gleiche_Elemente {Untersuchung und Ausgabe ob in der Menge mindestens zwei gleiche Elemente vorkommen} END. Erweiterung des Prozedurkonzepts 1 Wertübergabe an Prozeduren Bsp: PROGRAM multiplikation; USES wincrt; VAR a:integer; b:real; PROCEDURE mult (x:integer; y:real); BEGIN writeln (‘Das Produkt der beiden Zahlen beträgt ‘,xy:7:2); END; BEGIN {Hauptprogramm} writeln (‘Geben Sie eine ganze Zahl ein: ‘); readln (a); writeln (‘Geben Sie eine reelle Zahl ein: ‘); readln (b); mult (a,b); END. 10 Hinter dem Prozedurnamen wird eine Liste von Parametern aufgeführt, die an die Prozedur übergeben werden. Die Prozedur „mult“ muss mit genau einem Wert vom Typ integer und einem Wert vom Typ real aufgerufen werden und zwar in dieser Reihenfolge. Beispiele für Prozeduraufrufe: . . BEGIN {Hauptprogramm} a:=1; b:=2.5; c:=3; mult (a,b); o.k. mult (a,c); o.k. mult (1,3.5); o.k. mult (2.4,2); falsche Reihenfolge mult (a,b,c); falsche Anzahl an Werten Bsp2: PROGRAM wertuebergabe; USES wincrt; VAR a:integer; PROCEDURE test (x:integer); BEGIN x:=x+5; writeln (x); END; BEGIN {Hauptprogramm} a:=4; writeln (a); test (2); test (a); writeln (a); END. Was druckt das Programm ? 4 7 9 4 2 Variablenübergabe an Prozeduren Bsp: PROGRAM multiplikation2; USES wincrt; VAR a:integer; b,c:real; PROCEDURE mult2 (x:integer; y:real; VAR z:real); BEGIN z:=xy; END; BEGIN {Hauptprogramm} writeln (‘Geben Sie eine ganze Zahl ein: ‘); readln (a); writeln (‘Geben Sie eine reelle Zahl ein: ‘); readln (b); mult2 (a,b,c); 11 writeln (‘Das Produkt der beiden Zahlen beträgt ‘,c:7:2); END. Es wäre wünschenswert, von der Prozedur auch Werte zurückzubekommen. Deshalb können Variablen an die Prozedur übergeben werden, die nach Durchlaufen der Prozedur verändert wieder zurückgegeben werden. Diesen Variablen wird das Schlüsselwort „VAR“ vorangestellt. Beispiele für Prozeduraufrufe: . . a:=1; b:=2.5; d:=3; mult2 (a,b,c); o.k. mult2 (1,2,3); falscher Aufruf; an dritter Stelle muss eine Variable stehen Bsp: PROGRAM variablenuebergabe; USES wincrt; VAR x:integer; PROCEDURE eins (a:integer); BEGIN a:=a+2; writeln (a); END; PROCEDURE zwei (VAR a:integer); BEGIN a:=a+2; writeln (a); END; BEGIN {Hauptprogramm} x:=3; writeln (x); eins (x); writeln (x); zwei (x); writeln (x); END. Was druckt das Programm ? 3 5 3 5 5 Bsp2: PROGRAM variablenuebergabe2; USES wincrt; VAR x,y:integer; PROCEDURE eins (x:integer; VAR a:integer); BEGIN x:=x2; writeln (x); a:=x; END; BEGIN {Hauptprogramm} x:=2; eins (x,y); 12 writeln (x); writeln (y); END. Was druckt das Programm ? 4 2 4 Aufgabe 3 Schreibe ein Programm das folgendes leistet: Im Hauptprogramm soll eingegeben werden, ob 1. 2. 3. 4. 5. das Volumen eines Kegels die Oberfläche eines Quaders die Summe der Zahlen von 1 bis n der Mittelwert von n Zufallszahlen zwischen 1 und 100 das Kapitel nach n Jahren berechnet werden soll. Danach sollen die erforderlichen Parameter ebenfalls im Hauptprogramm eingegeben werden. Dies sind bei 1. 2. 3. 4. 5. Radius der Grundfläche und Höhe des Kegels Länge, Breite und Höhe des Quaders n n Anfangskapital, Zinssatz und Anzahl der Jahre. Diese Parameter sollen dann jeweils an eine Prozedur übergeben werden. In der entsprechenden Prozedur soll dann das jeweilige Ergebnis berechnet werden. Dann soll das Ergebnis an das Hauptprogramm zurückübergeben werden. Die Ausgabe des Ergebnisses soll erst im Hauptprogramm erfolgen (keine Ausgabe innerhalb der Prozeduren). 9.2 Funktionen Funktionen sind den Prozeduren recht ähnliche Konstruktionen, die sich jedoch von den Prozeduren dadurch unterscheiden, dass sie genau einen Wert als Ergebnis haben. Man ruft eine Funktion wie eine Prozedur mit oder ohne Variablenübergabe auf. Zurückgegeben wird aber nur ein einziger Wert. Bsp: FUNCTION mult (x:integer; y:real): real; BEGIN mult:=x*y; END; Aufgerufen wird diese Funktion dann z.B. mit y:=mult(2,3.1) oder writeln(mult(a,b)). Es werden also keine Variablen zurückübergeben wie dies bei Prozeduren der Fall war, sondern nur ein Wert. 13 Aufgabe 4 Schreibe ein Programm das nach Eingabe einer reellen Basis b und eines ganzzahligen Exponenten e die Potenz be berechnet und ausgibt. Das Programm soll eine Funktion enthalten, die be berechnet. Sowohl die Eingabe von b und e als auch die Ausgabe des Ergebnisses soll aber im Hauptprogramm stattfinden ! Erweitere das Programm um eine weitere Funktion deiner Wahl ! Aufgabe 5 Was druckt folgendes Programm ? PROGRAM uebung; VAR r,s:integer; PROCEDURE uebung2(x,y,z:integer; VAR a,b:integer); VAR v:real; w:integer BEGIN r:=x+1; s:=y/2; v:=r·z/s; writeln(v-1); w:=s·3; writeln(w+1); r:=r+1; a:=r·2; writeln(r); b:=a·2; END; BEGIN r:=4; s:=3; writeln(s); uebung2(1,2,3,r,s); writeln(r); writeln(s); END. Lösung: 3,5,4,3,6,12 14