Strukturierte Programmierung IFB 2002 Tobias Selinger Strategie Strukturierte
Strukturierte Programmierung IFB 2002 Tobias Selinger
Strategie ? Strukturierte Programmierung 2 TS Welt Computer große Aufgabe großes Programm ? ?
Strategie: Teile und herrsche Strukturierte Programmierung 3 Welt Computer große Aufgabe großes Programm Manager A A Arbeitskräfte TS Hauptprogramm A A UP UP Unterprogramme
Strukturierte Programmierung 4 TS Beispiel: Geometrie-Programm zeichne berechne Punkt (x, y) Strecke AB Abstand (P, Q) berechne Schnitt (g, h). . .
Strukturierte Programmierung 5 TS Beispiel: Medienmanagementsystem für CDs, MCs, MP 3 s, . . . zeige füge Daten Medienliste hinzu lösche Daten speichere Medienliste . . .
Strukturierte Programmierung 6 TS Vorteile von Unterprogrammen 1. Spracherweiterung: benannt werden. Die UPe können aussagekräftig 2. Baustein-Prinzip: aufbauen. UPe können aufeinander 3. Ökonomie: UPe müssen nur einmal programmiert werden und sind dann beliebig oft benutzbar. 4. Teamarbeit: UPe können unabhängig voneinander programmiert und getestet werden. 5. Klarheit: HP ist kurz und verständlich, Details werden ausgeblendet.
Strukturierte Programmierung 7 TS Strukturierung des Ablaufs der Daten Unterprogramme für Teilaufgaben eigene Datentypen für spezielle Daten
Funktionen und Prozeduren Strukturierte Programmierung 8 TS In Pascal gibt es zwei Arten von Unterprogrammen: Funktionen: berechnen einen Ergebniswert und liefern diesen Wert zurück (an das HP). Beispiel: sin(x) Prozeduren: tun „irgend etwas“. Beispiel: clrscr
Vordefinierte Funktionen 9 Strukturierte Programmierung Einige nützliche Funktionen sind bereits vordefiniert, z. B. TS round(x) liefert den gerundeten Wert sqr(x), sqrt(x) liefern x 2 bzw. x exp(x), ln(x), sin(x), cos(x), arctan(x) random(x) liefert eine Zufallszahl ist, odd(x) liefert true , falls x ungerade ansonsten false length(text) liefert die Länge eines Textes, d. h. die Anzahl seiner Zeichen und readkey wartet auf einen Tastendruck liefert das entsprechende Zeichen
Vordefinierte Prozeduren 10 Strukturierte Programmierung Ebenso gibt es vordefinierte Prozeduren: TS write(text) gibt einen Text aus readln(x) setzt x auf den eingegebenen Wert clrscr löscht den Bildschirm inc(n), dec(n) delay(n) erhöht bzw. erniedrigt n (um 1) erzeugt eine Pause von n msec textcolor(farbe) ändert die Textfarbe str(zahl, text) erzeugt zu einer gegebenen Zahl den entsprechenden Text-String
Übersicht: Units Strukturierte Programmierung 11 TS Diese vordefinierten Prozeduren und Funktionen werden in Bibliotheken („Units“) zusammengefasst. Turbo Pascal stellt u. a. die folgenden Units zur Verfügung: system crt graph 3 für Standardaufgaben für spezielle Ein-/Ausgaben für Grafikaufgaben für Turtlegrafik write sin random. . . readkey delay textcolor. . . put. Pixel line. To circle. . . show. Turtle turn. Left forwd. . .
Deklarieren von Units Strukturierte Programmierung 12 TS Bei der Verwendung einer Unit muss sie im Programmkopf mittels uses deklariert werden. (Ausnahme: Die Unit system wird automatisch deklariert!) Beispiel: program demo; uses crt, graph 3; var. . . begin. . . Deklaration von crt und graph 3
13 Definieren eigener Funktionen Strukturierte Programmierung Eine Funktion kann als Black-Box betrachtet werden: TS Eingabedaten Rückgabewert Funktion
Beispiel: kubik(x) 14 Strukturierte Programmierung Eine Funktion kann als Black-Box betrachtet werden: TS Beispiel: Eingabedaten Rückgabewert kubik(x) x: real kubik
Funktions-Kopf 15 Strukturierte Programmierung Eine Funktion kann als Black-Box betrachtet werden: TS Beispiel: Eingabedaten Rückgabewert kubik(x) x: real kubik Definition: function kubik Funktionsname (x: real): real; Eingabevariable und Typ Rückgabetyp
Funktions-Definition 16 Strukturierte Programmierung Eine Funktion kann als Black-Box betrachtet werden: TS Beispiel: Eingabedaten Rückgabewert kubik(x) x: real kubik Definition: Berechnung und Zuweisung des Funktionswertes function kubik (x: real): real; begin kubik : = x*x*x; end; {kubik}
17 Gesamtprogramm Kubik. Demo Strukturierte Programmierung program Kubik. Demo; TS var Zahl: real; function kubik (x: real): real; begin kubik : = x*x*x; end; {kubik} Funktionsaufruf mit Eingabewert 7 Definition der Funktion kubik(x) begin {HP} Funktionsaufruf mit Eingabe-variable writeln(kubik(7)); Zahl write('Ihre Zahl: '); readln(Zahl); writeln(' hoch 3 ist ', kubik(Zahl)); readln; d. h. innerhalb der Funktion wird für x end. der Wert von Zahl eingesetzt
Strukturierte Programmierung 18 TS Beispiel: Harmonische Reihe Ein weiteres Beispiel: Der Wert der harmonischen Reihe 1 + ½ + 1/3 + ¼ +. . . + 1/n soll mit einer Funktion harm. Reihe berechnet werden! Black-Box-Modell ?
Strukturierte Programmierung 19 Beispiel: Harmonische Reihe Ein weiteres Beispiel: Der Wert der harmonischen Reihe 1 + ½ + 1/3 + ¼ +. . . + 1/n soll mit einer Funktion harm. Reihe berechnet werden! Black-Box-Modell: n: integer real harm. Reihe TS
Funktion mit lokalen Variablen 20 Strukturierte Programmierung Definition: TS function harm. Reihe (n: integer): real; var i: integer; summe: real; Deklaration von lokalen Variablen (nur innerhalb dieser begin Funktion gültig) summe : = 0; for i: =1 to n do summe : = summe + 1/i; harm. Reihe : = summe; end; {harm. Reihe} Hilfsvariable summe erforderlich (weil die Funktionsvariable harm. Reihe nur als Zuweisungsziel erlaubt ist)
21 Gesamtprogramm Strukturierte Programmierung program Harmonische. Reihe; TS var n. Max: integer; Deklaration von globalen Variablen function harm. Reihe (n: integer): real; . . . Definition der end; {harm. Reihe} Funktion incl. lokalen Variablen Funktionsaufruf begin {HP} mit Eingabewert writeln(harm. Reihe(100)); 100 readln(n. Max); writeln(harm. Reihe(n. Max)); readln; Funktionsaufruf end. mit Eingabevariable n. Max
Funktionsdefinition Strukturierte Programmierung 22 TS Allgemeine Funktionsdefinition: function <Fktname>(<Eingabedaten>): <Rückgabetyp>; <Deklaration der lokalen Variablen> begin <Anweisungen incl. Zuweisung an den Fktnamen> end; {<Fktname>}
Übungen zu Funktionen 23 Strukturierte Programmierung Übungen zu Funktionen (ohne lokale Variable): TS Schreiben Sie ein Programm Funk 1 mit wenigstens dreien der folgenden Funktionen. Testen Sie Ihren Code! a) hyp(a, b) berechnet die Hypotenusenlänge zu a und b. b) potenz(x, y) berechnet xy (mittels exp und ln). c) Vzyl(radius, hoehe) berechnet das Zylindervolumen. d) max(a, b) berechnet das Maximum von zwei Zahlen. e) Augenzahl liefert die zufällige Augenzahl eines Würfels. f) teilbar(zahl, teiler) prüft, ob die Zahl durch den Teiler teilbar ist. (Tipp: Nutze Modulo-Funktion a mod b ) g) Schaltjahr(n) ist. prüft, ob das Jahr n ein Schaltjahr h) rot(zahl) prüft, ob die Zahl bei Roulette rot ist. (Tipp: ungerade von 1 bis 9, 19 bis 27, gerade von 12 bis 18, 30 bis 36)
Vertiefende Übungen 24 Strukturierte Programmierung Vertiefende Übungen (z. T. mit lokalen Variablen): TS Definieren und testen Sie folgende Funktionen: a) fak(n) berechnet die Fakultät von n. b) binko(n, k) berechnet den Binomialkoeffizient „n über k“. (Tipp: Verwenden Sie hierzu die Funktion fak) c) gg. T(a, b) berechnet den größten gemeinsamen Teiler d) primzahl(n) prüft, ob n eine Primzahl ist. Informieren Sie Sich über den Datentyp string (siehe folgende Folie), dann programmieren Sie: d) anzahl_e(text) auftritt. zählt, wie oft der Buchstabe „e“ im Text e) palindrom(wort) prüft, ob das Wort ein Palindrom ist. (Bsp. : ANNA, RADAR)
Exkurs: Der Datentyp string Strukturierte Programmierung 25 TS Wertebereich: Zeichenketten („Texte“ incl. Ziffern und Sonderzeichen) bis max. 255 Zeichen. Beispiel: var s: string; s : = 'Hund? '; write(s); s[2] : = 'a'; write(s); write(s[1]); write(length(s));
Beispiel mit Erklärungen Strukturierte Programmierung 26 TS Wertebereich: Zeichenketten („Texte“ incl. Ziffern und Sonderzeichen) bis max. 255 Zeichen. Beispiel: var s: string; 1. 2. 3. 4. 5. s : = 'Hund? '; 'H' 'u' 'n' 'd' '? ' write(s); s[2] : = 'a'; Zugriffe auf das write(s); 2. bzw. 1. Zeichen write(s[1]); des Strings s write(length(s)); liefert die Länge von s
Prozeduren im Black-Box-Modell Strukturierte Programmierung 27 Auch Prozeduren können als Black-Box dargestellt werden, z. B. : x, y goto. XY(x, y) a readln(a) readln n inc(n) TS goto. XY inc
Arten der Parameter-Übergabe Strukturierte Programmierung 28 Auch Prozeduren können als Black-Box dargestellt werden, z. B. : x, y Eingabeparameter goto. XY(x, y) a readln(a) readln n inc(n) TS goto. XY inc die Werte gehen nur in die Prozedur hinein call by value
Arten der Parameter-Übergabe (ff. ) Strukturierte Programmierung 29 Auch Prozeduren können als Black-Box dargestellt werden, z. B. : x, y Eingabeparameter goto. XY(x, y) readln(a) a Ausgabeparameter readln n inc(n) TS goto. XY die Werte gehen nur in die Prozedur hinein inc die Variable a wird mit einem Wert „gefüllt“ Übergabeparameter die Variable n wird übergeben und verändert call by value call by reference
Prozedur-Köpfe 30 Strukturierte Programmierung Übersetzung in entsprechende Prozedurköpfe: TS x, y goto. XY procedure goto. XY (x, y: integer); a readln n inc procedure readln (var a: real); Referenz- bzw. „Variablen“-Parameter procedure inc (var n: integer);
Prozedur tausche (a, b). . . Strukturierte Programmierung 31 TS Beachte: Im Gegensatz zu einer Funktion liefert eine Prozedur keinen „Rückgabewert“ zurück, aber sie kann beliebig viele Variablen verändern! Beispiel 1: Die Prozedur tausche(a, b) soll den Wert zweier Variablen vertauschen! Black-Box-Modell ? Prozedurkopf ?
. . . mit Prozedurkopf. . . Strukturierte Programmierung 32 Beachte: Im Gegensatz zu einer Funktion liefert eine Prozedur keinen „Rückgabewert“ zurück, aber sie kann beliebig viele Variablen verändern! Beispiel 1: Die Prozedur tausche(a, b) soll den Wert zweier Variablen vertauschen! a, b Black-Box-Modell: tausche Prozedurkopf: procedure tausche (var a, b: real); Ein vergessenes var ist ein sehr „beliebter“ (und fast unsichtbarer) Fehler! TS
. . . und komplett ! Strukturierte Programmierung 33 TS Beachte: Im Gegensatz zu einer Funktion liefert eine Prozedur keinen „Rückgabewert“ zurück, aber sie kann beliebig viele Variablen verändern! Beispiel 1: Die Prozedur tausche(a, b) soll den Wert zweier Variablen vertauschen! a, b Black-Box-Modell: tausche Prozedur: procedure tausche (var a, b: real); var x: real; begin x : = a; a : = b; b : = x; end; {tausche}
Prozedurkopf kart. Nach. Polar 34 Die Prozedur kart. Nach. Polar (x, y, r, phi) soll anhand der kartesischen Koordinaten (x, y) die entsprechenden Polarkoordinaten (r, phi) berechnen! Strukturierte Programmierung Beispiel 2: TS Black-Box-Modell ? kart. Nach. Polar Prozedurkopf ? procedure kart. Nach. Polar
Prozedurkopf kart. Nach. Polar 35 Die Prozedur kart. Nach. Polar (x, y, r, phi) soll anhand der kartesischen Koordinaten (x, y) die entsprechenden Polarkoordinaten (r, phi) berechnen! Strukturierte Programmierung Beispiel 2: Black-Box-Modell: x, y r, phi kart. Nach. Polar Prozedurkopf: procedure kart. Nach. Polar (x, y: real; var r, phi: real); Tipp zur Programmierung: Nutzen Sie die Pascal-Funktion arctan(x) ! TS
36 Aufruf und Parameter-Übergabe: Strukturierte Programmierung program procdemo; TS var x, y: real; procedure tausche (var a, b: real); var x: real; begin x : = a; a : = b; b : = x; end; {tausche} begin {HP} readln(x, y); tausche(x, y); writeln(x, y); end.
37 Aktuelle und formale Variablen Strukturierte Programmierung program procdemo; TS var x, y: real; dieses x ist nur innerhalb von globale Variable tausche procedure tausche (var a, b: real); var x: real; begin Definition der Prozedur x : = a; tausche(a, b) incl. a : = b; lokale Variable x b : = x; end; {tausche} begin {HP} readln(x, y); tausche(x, y); writeln(x, y); end. Aufruf von gültig, d. h. völlig unabhängig vom (gleichnamigen) globalen x ! tausche(x, y) , d. h. Übergabe der aktuellen Variablen(x, y) an die formalen Variablen(a, b)
38 Noch ein Aufruf-Beispiel und „Gegen-Beispiel“ Strukturierte Programmierung program procdemo; TS Also: gleiche Variablennamen var a, b: real; sind möglich, aber ziemlich irritierend ! procedure tausche (var a, b: real); . . . (wie gehabt) end; {tausche} Aufruf von tausche(a, b) , d. h. begin {HP} a : = 1; b : = 8; tausche(a, b); Übergabe der aktuellen Variablen(a, b) an die formalen Variablen(a, b) writeln(a, b); tausche(2, 7); writeln(a, b); end. sinnloser Aufruf, da die Prozedur tausche hier Variablen verlangt!
Strukturierte Programmierung 39 TS Exkurs: Der Datentyp record (Strukturierung der Daten) In der realen Welt gibt es oft Datenobjekte, die aus mehreren Einzeldaten zusammengesetzt sind. Beispiel: Schüler 1 Name: Fred Meier Klasse: 8 c Alter: 14 Modellierung in Pascal ?
Strukturierte Programmierung 40 TS In der realen Welt gibt es oft Datenobjekte, die aus mehreren Einzeldaten zusammengesetzt sind. Definition eines eigenen Datentyps. . . Beispiel: Schüler 1 . . . als Sammlung (Verbund) von Einzeldaten type TSchueler = record Name: Fred Meier Name: Klasse: 8 c Klasse: string; Alter: 14 Alter: end; string; integer;
Strukturierte Programmierung 41 TS In der realen Welt gibt es oft Datenobjekte, die aus mehreren Einzeldaten zusammengesetzt sind. Definition eines eigenen Datentyps. . . Beispiel: Schüler 1 . . . als Sammlung (Verbund) von Einzeldaten type TSchueler = record Name: Fred Meier Name: string; Klasse: 8 c Klasse: string; Alter: 14 Alter: integer; end; Deklaration einer entsprechenden Variable var Schueler 1: TSchueler;
Zugriff auf Records Strukturierte Programmierung 42 TS Zugriff auf die Einzeldaten (Komponenten) eines Records: Variablenname Punkt Komponentenname Schueler 1. Name : = 'Fred Meier'; Schueler 1. Alter : = 14; inc(Schueler 1. Alter); write(Schueler 1. Alter); Beachte: Ein Records kann immer nur komponentenweise bearbeitet werden. So ist z. B. write(Schueler 1) nicht möglich!
Aufgabe: TBruch mit Prozeduren 43 Strukturierte Programmierung Aufgaben: TS Definieren Sie. . . a) einen Datentyp TBruch zur Modellierung von Bruchzahlen (d. h. Angabe von Zähler und Nenner)! b) eine Prozedur setze(bruch, z, n), die einen Bruch auf die angegebenen Werte setzt! c) eine Prozedur schreibe(bruch), die einen Bruch mit Bruchstrich ausgibt! d) eine Prozedur multipliziere(b 1, b 2, erg), die in der Variable erg das Produkt von b 1 und b 2 berechnet! e) Schreiben Sie ein Programm Bruch. Demo mit zwei Bruch. Variablen Bruch 1 und Bruch 2 zum Testen Ihrer Prozeduren! f) Öffnen Sie das Programm Bruchtrainer und ergänzen Sie die fehlenden Prozeduren!
Aufgabe: Musik. Manager Strukturierte Programmierung 44 TS Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel: 1 Vivaldi: Vier Jahreszeiten 2 J. S. Bach: Goldberg-Variationen 3 Grieg: Peer Gynt Suite 4 Mozart: Eine kleine Nachtmusik
Aufgabe: Musik. Manager Strukturierte Programmierung 45 Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel: Vivaldi: Vier Jahreszeiten 2 J. S. Bach: Goldberg-Variationen 3 Grieg: Peer Gynt Suite 4 Mozart: Eine kleine Nachtmusik Die CD-Liste kann durch folgenden Datentyp modelliert werden: type TListe = record Element: array[1. . 10] of string; Anzahl: integer; end; var TS 1 CDs: TListe;
Aufgabe: Musik. Manager Strukturierte Programmierung 46 Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel: letzte Nummer: CDs. Anzahl TS 1 Vivaldi: Vier Jahreszeiten 2 J. S. Bach: Goldberg-Variationen 3 Grieg: Peer Gynt Suite 4 Mozart: Eine kleine Nachtmusik CDs. Element[3] Die CD-Liste kann durch folgenden Datentyp modelliert werden: type TListe = record Element: array[1. . 10] of string; Anzahl: integer; Datenfeld für end; 10 CD-Namen Zähler für die var CDs: TListe; aktuelle Anzahl
Strukturierte Programmierung 47 TS Aufgabe: Schreiben Sie für das Pascal-Programm folgende Prozeduren: Musi. Man a) zeige(Liste) zeigt die gesamte Liste b) fuege. Hinzu(Liste, Element) fügt ein Element hinzu c) loesche(Liste) löscht die ganze Liste d) loesche. Nr(Liste, Nummer) löscht das Element an der angegebenen Position
Strukturierte Programmierung 48 Aufgabe: Schreiben Sie für das Pascal-Programm folgende Prozeduren: a) zeige(Liste) zeigt die gesamte Liste b) fuege. Hinzu(Liste, Element) fügt ein Element hinzu c) loesche(Liste) löscht die ganze Liste d) loesche. Nr(Liste, Nummer) löscht das Element an der angegebenen Position e) Zur Anregung: procedure fuege. Hinzu (var liste: TListe; eintrag: string); begin if liste. Anzahl < 10 then begin inc(liste. Anzahl); liste. Element[liste. Anzahl] : = eintrag; TS Musi. Man end;
- Slides: 48