510 likes | 739 Views
Strukturierte Programmierung. IFB 2002 Tobias Selinger. Strategie ?. Welt Computer. große Aufgabe. großes Programm. ? ?. Arbeitskräfte. Unterprogramme. Strategie: Teile und herrsche. Welt Computer. große Aufgabe. großes Programm. Manager. Hauptprogramm. A. A. A. A. UP. UP.
E N D
Strukturierte Programmierung IFB 2002 Tobias Selinger
Strategie ? WeltComputer große Aufgabe großes Programm ??
Arbeitskräfte Unterprogramme Strategie: Teile und herrsche WeltComputer große Aufgabe großes Programm Manager Hauptprogramm A A A A UP UP UP UP A A A UP UP UP
zeichne Punkt (x,y) zeichne Strecke AB berechne Abstand (P,Q) berechne Schnitt (g,h) ... Beispiel: Geometrie-Programm Geometrie-Programm
zeige Medienliste füge Daten hinzu lösche Daten speichere Medienliste ... Beispiel: Medienmanagementsystem Medienmanagementsystem für CDs, MCs, MP3s, ...
Vorteile von Unterprogrammen • Spracherweiterung: Die UPe können aussagekräftig benannt werden. • Baustein-Prinzip: UPe können aufeinander aufbauen. • Ökonomie: UPe müssen nur einmal programmiert werden und sind dann beliebig oft benutzbar. • Teamarbeit: UPe können unabhängig voneinander programmiert und getestet werden. • Klarheit: HP ist kurz und verständlich, Details werden ausgeblendet.
Strukturierung des Ablaufs Unterprogramme für Teilaufgaben der Daten eigene Datentypen für spezielle Daten
Funktionen und Prozeduren • 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 • Einige nützliche Funktionen sind bereits vordefiniert, z.B. • round(x)liefert den gerundeten Wert • sqr(x),sqrt(x) liefern x2 bzw. x • exp(x),ln(x),sin(x),cos(x),arctan(x) • random(x) liefert eine Zufallszahl • odd(x) liefert true , falls x ungerade ist, ansonsten false • length(text) liefert die Länge eines Textes, d.h. die Anzahl seiner Zeichen • readkey wartet auf einen Tastendruck und liefert das entsprechende Zeichen
Vordefinierte Prozeduren • Ebenso gibt es vordefinierte Prozeduren: • write(text) gibt einen Text aus • readln(x) setzt x auf den eingegebenen Wert • clrscr löscht den Bildschirm • inc(n),dec(n) erhöht bzw. erniedrigt n (um 1) • delay(n) erzeugt eine Pause von n msec • textcolor(farbe) ändert die Textfarbe • str(zahl,text) erzeugt zu einer gegebenen Zahl den entsprechenden Text-String
system für Standard-aufgaben writesinrandom... crt für spezielle Ein-/Ausgaben readkeydelaytextcolor... graph für Grafik-aufgaben putPixellineTocircle... graph3 für Turtle-grafik showTurtleturnLeftforwd... Übersicht: Units • Diese vordefinierten Prozeduren und Funktionenwerden in Bibliotheken („Units“) zusammengefasst. • Turbo Pascal stellt u.a. die folgenden Units zur Verfügung:
Deklarieren von Units • Bei der Verwendung einer Unit muss sieim Programmkopf mittels uses deklariert werden. • (Ausnahme: Die Unit system wird automatisch deklariert!) • Beispiel: • program demo; • uses crt, graph3; • var ... • begin • ... Deklaration von crt und graph3
Definieren eigener Funktionen • Eine Funktion kann als Black-Box betrachtet werden: Eingabe- daten Rückgabe- wert Funktion
Beispiel: kubik(x) • Eine Funktion kann als Black-Box betrachtet werden: Eingabe- daten Rückgabe- wert Beispiel: kubik(x) x: real real kubik
Funktions-Kopf • Eine Funktion kann als Black-Box betrachtet werden: Eingabe- daten Rückgabe- wert Beispiel: kubik(x) x: real real kubik Definition: function kubik (x:real):real; Eingabe-variable und Typ Funktions-name Rückgabe-typ
Funktions-Definition • Eine Funktion kann als Black-Box betrachtet werden: Eingabe- daten Rückgabe- wert Beispiel: kubik(x) x: real real kubik Definition: function kubik (x:real):real; begin kubik := x*x*x; end; {kubik} Berechnung undZuweisung des Funktionswertes
Gesamtprogramm KubikDemo • program KubikDemo; • var Zahl: real; • function kubik (x:real):real;begin kubik := x*x*x;end; {kubik}begin {HP} writeln(kubik(7)); write('Ihre Zahl: '); readln(Zahl); writeln(' hoch 3 ist ',kubik(Zahl)); readln;end. Definition der Funktion kubik(x) Funktionsaufruf mit Eingabewert7 Funktionsaufruf mit Eingabe-variableZahl d.h. innerhalb der Funktion wird für x der Wert von Zahl eingesetzt
Beispiel: Harmonische Reihe • Ein weiteres Beispiel: • Der Wert der harmonischen Reihe 1 + ½ + 1/3 + ¼ + ... + 1/nsoll mit einer Funktion harmReihe berechnet werden! • Black-Box-Modell ?
Beispiel: Harmonische Reihe • Ein weiteres Beispiel: • Der Wert der harmonischen Reihe 1 + ½ + 1/3 + ¼ + ... + 1/nsoll mit einer Funktion harmReihe berechnet werden! • Black-Box-Modell: n:integer real harmReihe
Funktion mit lokalen Variablen • Definition: function harmReihe (n:integer): real; var i: integer; summe: real; begin summe := 0; for i:=1 to n do summe := summe + 1/i; harmReihe := summe; end; {harmReihe} Deklaration vonlokalen Variablen(nur innerhalb dieser Funktion gültig) Hilfsvariable summe erforderlich(weil die Funktionsvariable harmReihe nur als Zuweisungsziel erlaubt ist)
Gesamtprogramm Deklaration vonglobalen Variablen • program HarmonischeReihe; • var nMax: integer; • function harmReihe (n:integer): real; • ... • end; {harmReihe} • begin {HP} writeln(harmReihe(100)); readln(nMax); writeln(harmReihe(nMax)); readln; • end. Definition der Funktion incl. lokalen Variablen Funktionsaufruf mit Eingabewert 100 Funktionsaufruf mit Eingabevariable nMax
Funktionsdefinition • Allgemeine Funktionsdefinition: function<Fktname>(<Eingabedaten>):<Rückgabetyp>; <Deklaration der lokalen Variablen> begin <Anweisungen incl. Zuweisung an den Fktnamen> end;{<Fktname>}
Übungen zu Funktionen Übungen zu Funktionen (ohne lokale Variable): Schreiben Sie ein Programm Funk1 mit wenigstens dreien der folgenden Funktionen. Testen Sie Ihren Code! • hyp(a,b) berechnet die Hypotenusenlänge zu a und b. • potenz(x,y) berechnet xy (mittels exp und ln). • Vzyl(radius,hoehe) berechnet das Zylindervolumen. • max(a,b) berechnet das Maximum von zwei Zahlen. • Augenzahl liefert die zufällige Augenzahl eines Würfels. • teilbar(zahl,teiler) prüft, ob die Zahl durch den Teiler teilbar ist. (Tipp: Nutze Modulo-Funktion a mod b ) • Schaltjahr(n) prüft, ob das Jahr n ein Schaltjahr ist. • 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 • Vertiefende Übungen (z.T. mit lokalen Variablen): • Definieren und testen Sie folgende Funktionen: • fak(n) berechnet die Fakultät von n. • binko(n,k) berechnet den Binomialkoeffizient „n über k“. (Tipp: Verwenden Sie hierzu die Funktion fak) • ggT(a,b) berechnet den größten gemeinsamen Teiler • primzahl(n) prüft, ob n eine Primzahl ist. • Informieren Sie Sich über den Datentyp string (siehe folgende Folie), dann programmieren Sie: • anzahl_e(text) zählt, wie oft der Buchstabe „e“ im Text auftritt. • palindrom(wort) prüft, ob das Wort ein Palindrom ist. (Bsp.: ANNA, RADAR)
Exkurs: Der Datentyp string • 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 • 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)); Zugriffe auf das 2. bzw. 1. Zeichen des Strings s liefert die Länge von s
Prozeduren im Black-Box-Modell • Auch Prozeduren können als Black-Box dargestellt werden, z.B.: • gotoXY(x,y) • readln(a) • inc(n) x,y gotoXY a readln n inc
Arten der Parameter-Übergabe • Auch Prozeduren können als Black-Box dargestellt werden, z.B.: • gotoXY(x,y) • readln(a) • inc(n) x,y Eingabeparameterdie Werte gehen nur in die Prozedur hinein call by value gotoXY a readln n inc
Arten der Parameter-Übergabe (ff.) • Auch Prozeduren können als Black-Box dargestellt werden, z.B.: • gotoXY(x,y) • readln(a) • inc(n) x,y Eingabeparameterdie Werte gehen nur in die Prozedur hinein call by value gotoXY a Ausgabeparameter die Variable awird mit einem Wert „gefüllt“ readln call by refe- rence n Übergabeparameterdie Variablenwird übergeben und verändert inc
Prozedur-Köpfe • Übersetzung in entsprechende Prozedurköpfe: x,y gotoXY procedure gotoXY (x,y: integer); a readln procedure readln (var a: real); Referenz- bzw. „Variablen“-Parameter n inc procedure inc (var n: integer);
Prozedur tausche (a,b) ... • Beachte: Im Gegensatz zu einer Funktion liefert eine Prozedur keinen „Rückgabewert“ zurück, aber sie kann beliebig vieleVariablen verändern! • Beispiel 1: Die Prozedur tausche(a,b) soll den Wert zweier Variablen vertauschen! • Black-Box-Modell ? • Prozedurkopf ?
a,b tausche ... mit Prozedurkopf ... • Beachte: Im Gegensatz zu einer Funktion liefert eine Prozedur keinen „Rückgabewert“ zurück, aber sie kann beliebig vieleVariablen verändern! • Beispiel 1: Die Prozedur tausche(a,b) soll den Wert zweier Variablen vertauschen! • Black-Box-Modell: • Prozedurkopf: procedure tausche (var a,b: real); Ein vergessenes var ist ein sehr „beliebter“ (und fast unsichtbarer) Fehler!
a,b tausche ... und komplett ! • Beachte: Im Gegensatz zu einer Funktion liefert eine Prozedur keinen „Rückgabewert“ zurück, aber sie kann beliebig vieleVariablen verändern! • Beispiel 1: Die Prozedur tausche(a,b) soll den Wert zweier Variablen vertauschen! • Black-Box-Modell: • Prozedur: procedure tausche (var a,b: real);var x: real;begin x := a; a := b; b := x;end; {tausche}
Prozedurkopf kartNachPolar • Beispiel 2: Die Prozedur kartNachPolar (x,y,r,phi) soll anhand der kartesischen Koordinaten (x, y) die entsprechenden Polarkoordinaten (r, phi) berechnen! • Black-Box-Modell ? • Prozedurkopf ? kartNachPolar procedure kartNachPolar
x,y r,phi kartNachPolar Prozedurkopf kartNachPolar • Beispiel 2: Die Prozedur kartNachPolar (x,y,r,phi) soll anhand der kartesischen Koordinaten (x, y) die entsprechenden Polarkoordinaten (r, phi) berechnen! • Black-Box-Modell: • Prozedurkopf: • Tipp zur Programmierung: Nutzen Sie die Pascal-Funktion arctan(x) ! procedure kartNachPolar (x,y:real; var r,phi:real);
Aufruf und Parameter-Übergabe: program procdemo; 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.
Aktuelle und formale Variablen program procdemo; 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. dieses x ist nur innerhalb von tauschegültig, d.h. völlig unabhängig vom (gleichnamigen) globalen x ! globale Variable Definition der Prozedurtausche(a,b)incl. lokale Variable x Aufruf von tausche(x,y), d.h. Übergabe der aktuellen Variablen(x,y) an die formalen Variablen(a,b)
Noch ein Aufruf-Beispiel und „Gegen-Beispiel“ program procdemo; var a,b: real; procedure tausche (var a,b: real);... (wie gehabt)end; {tausche} begin {HP} a := 1; b := 8;tausche(a,b); writeln(a,b);tausche(2,7); writeln(a,b);end. Also: gleiche Variablennamen sind möglich, aber ziemlich irritierend ! Aufruf von tausche(a,b), d.h. Übergabe der aktuellen Variablen(a,b) an die formalen Variablen(a,b) sinnloser Aufruf, da die Prozedur tausche hier Variablen verlangt!
Schüler 1 Name: Fred Meier Klasse: 8c Alter: 14 Exkurs: Der Datentyp record (Strukturierung der Daten) • In der realen Welt gibt es oft Datenobjekte, dieaus mehreren Einzeldaten zusammengesetzt sind. • Beispiel: Modellierung in Pascal ?
Schüler 1 Name: Fred Meier Klasse: 8c Alter: 14 • In der realen Welt gibt es oft Datenobjekte, dieaus mehreren Einzeldaten zusammengesetzt sind. • Beispiel: Definition eines eigenen Datentyps ... ... als Sammlung (Verbund) von Einzeldaten type TSchueler = record Name: string; Klasse: string; Alter: integer; end;
Schüler 1 Name: Fred Meier Klasse: 8c Alter: 14 • In der realen Welt gibt es oft Datenobjekte, dieaus mehreren Einzeldaten zusammengesetzt sind. • Beispiel: Definition eines eigenen Datentyps ... ... als Sammlung (Verbund) von Einzeldaten type TSchueler = record Name: string; Klasse: string; Alter: integer; end; Deklaration einer entsprechenden Variable var Schueler1: TSchueler;
Zugriff auf Records • Zugriff auf die Einzeldaten (Komponenten) eines Records: Variablen-name Komponenten-name Punkt Schueler1.Name := 'Fred Meier'; Schueler1.Alter := 14; inc(Schueler1.Alter); write(Schueler1.Alter); Beachte: Ein Records kann immer nur komponentenweise bearbeitet werden. So ist z.B. write(Schueler1) nicht möglich!
Aufgabe: TBruch mit Prozeduren • Aufgaben: Definieren Sie ... • einen Datentyp TBruch zur Modellierung von Bruchzahlen(d.h. Angabe von Zähler und Nenner)! • eine Prozedur setze(bruch,z,n),die einen Bruch auf die angegebenen Werte setzt! • eine Prozedur schreibe(bruch),die einen Bruch mit Bruchstrich ausgibt! • eine Prozedur multipliziere(b1,b2,erg),die in der Variable erg das Produkt von b1 und b2 berechnet! • Schreiben Sie ein Programm BruchDemo mit zwei Bruch-Variablen Bruch1 und Bruch2 zum Testen Ihrer Prozeduren! • Öffnen Sie das Programm Bruchtrainerund ergänzen Sie die fehlenden Prozeduren!
1 Vivaldi: Vier Jahreszeiten 2 J.S.Bach: Goldberg-Variationen 3 Grieg: Peer Gynt Suite 4 Mozart: Eine kleine Nachtmusik Aufgabe: MusikManager • 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: MusikManager • Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel: • Die CD-Liste kann durch folgenden Datentyp modelliert werden: type TListe = record Element: array[1..10] of string; Anzahl: integer; end; var CDs: TListe;
1 Vivaldi: Vier Jahreszeiten 2 J.S.Bach: Goldberg-Variationen 3 Grieg: Peer Gynt Suite 4 Mozart: Eine kleine Nachtmusik Aufgabe: MusikManager • Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel: • Die CD-Liste kann durch folgenden Datentyp modelliert werden: letzte Nummer:CDs.Anzahl CDs.Element[3] type TListe = record Element: array[1..10] of string; Anzahl: integer; end; var CDs: TListe; Datenfeld für 10 CD-Namen Zähler für die aktuelle Anzahl
Aufgabe: Schreiben Sie für das Pascal-Programm MusiMan folgende Prozeduren: • zeige(Liste) zeigt die gesamte Liste • fuegeHinzu(Liste,Element) fügt ein Element hinzu • loesche(Liste) löscht die ganze Liste • loescheNr(Liste,Nummer) löscht das Element an der angegebenen Position
Aufgabe: Schreiben Sie für das Pascal-Programm MusiMan folgende Prozeduren: • zeige(Liste) zeigt die gesamte Liste • fuegeHinzu(Liste,Element) fügt ein Element hinzu • loesche(Liste) löscht die ganze Liste • loescheNr(Liste,Nummer) löscht das Element an der angegebenen Position • Zur Anregung: procedure fuegeHinzu (var liste: TListe; eintrag: string); begin if liste.Anzahl < 10 then begin inc(liste.Anzahl); liste.Element[liste.Anzahl] := eintrag; end;