Post on 10-Jan-2016
description
transcript
Strukturierte ProgrammierungStrukturierte Programmierung
IFB 2002
Tobias Selinger
2
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gStrategie ?Strategie ?
große Aufgabegroßes
Programm
Welt Computer
? ?
3
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gStrategie: Teile und herrscheStrategie: Teile und herrsche
große Aufgabegroßes
Programm
Manager
A
Hauptprogramm
Welt Computer
UP
Unterprogramme
A A A UP UP UP
Arbeitskräfte
AAA UPUPUP
4
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gBeispiel: Geometrie-ProgrammBeispiel: Geometrie-Programm
Geometrie-Programm
zeichnePunkt (x,y)
zeichneStrecke
AB
berechneAbstand
(P,Q)
berechneSchnitt (g,h) ...
5
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gBeispiel: MedienmanagementsystemBeispiel: Medienmanagementsystem
Medienmanagementsystem
für CDs, MCs, MP3s, ...
zeige Medienliste
füge Datenhinzu
löscheDaten
speichereMedienliste ...
6
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gVorteile von UnterprogrammenVorteile 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 programmiertund getestet werden.
Klarheit: HP ist kurz und verständlich, Details werden ausgeblendet.
7
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
Strukturierung
des Ablaufs
Unterprogrammefür Teilaufgaben
der Daten
eigene Datentypenfür spezielle Daten
8
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gFunktionen und ProzedurenFunktionen und Prozeduren
In Pascal gibt es zwei Arten von Unterprogrammen:
Funktionen: berechnen einen Ergebniswert undliefern diesen Wert zurück (an das HP).
Beispiel: sin(x)
Prozeduren: tun „irgend etwas“.
Beispiel: clrscr
9
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gVordefinierte FunktionenVordefinierte 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 undliefert das entsprechende Zeichen
10
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gVordefinierte ProzedurenVordefinierte 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 Zahlden entsprechenden Text-String
11
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gÜbersicht: UnitsÜbersicht: Units
Diese vordefinierten Prozeduren und Funktionenwerden in Bibliotheken („Units“) zusammengefasst.
Turbo Pascal stellt u.a. die folgenden Units zur Verfügung:
crt
für spezielle Ein-/Ausgaben
readkeydelay
textcolor...
system
für Standard-aufgaben
writesin
random...
graph
für Grafik-aufgaben
putPixellineTocircle...
graph3
für Turtle-grafik
showTurtleturnLeftforwd...
12
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gDeklarieren von UnitsDeklarieren 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
13
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gDefinieren eigener FunktionenDefinieren eigener Funktionen
Eine Funktion kann als Black-Box betrachtet werden:
Funktion
Eingabe- daten
Rückgabe- wert
14
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
Eingabe- daten
Beispiel: kubik(x)Beispiel: kubik(x)
Eine Funktion kann als Black-Box betrachtet werden:
kubik
Rückgabe- wert
x: real real
Beispiel:
kubik(x)
15
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gFunktions-KopfFunktions-Kopf
Eine Funktion kann als Black-Box betrachtet werden:
kubik
Eingabe- daten
Rückgabe- wert
x: real real
Beispiel:
kubik(x)
Definition: function kubik (x:real):real;
Funktions-name
Eingabe-variable
und Typ
Rückgabe-typ
16
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gFunktions-DefinitionFunktions-Definition
Eine Funktion kann als Black-Box betrachtet werden:
kubik
Eingabe- daten
Rückgabe- wert
x: real real
Beispiel:
kubik(x)
Definition: function kubik (x:real):real; begin kubik := x*x*x; end; {kubik}
Berechnung und Zuweisung des Funktionswertes
17
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
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.
Gesamtprogramm KubikDemoGesamtprogramm KubikDemo
Definition der Funktion
kubik(x)
Funktionsaufruf mit Eingabe-
variable Zahl
Funktionsaufruf mit
Eingabewert 7
d.h. innerhalb der Funktion wird für x
der Wert von Zahl eingesetzt
18
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gBeispiel: Harmonische ReiheBeispiel: Harmonische Reihe
Ein weiteres Beispiel:
Der Wert der harmonischen Reihe
1 + ½ + 1/3 + ¼ + ... + 1/n
soll mit einer Funktion harmReihe berechnet werden!
Black-Box-Modell ?
19
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gBeispiel: Harmonische ReiheBeispiel: Harmonische Reihe
Ein weiteres Beispiel:
Der Wert der harmonischen Reihe
1 + ½ + 1/3 + ¼ + ... + 1/n
soll mit einer Funktion harmReihe berechnet werden!
Black-Box-Modell:
harmReihe
n:integer real
20
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gFunktion mit lokalen VariablenFunktion 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 von
lokalen Variablen(nur innerhalb dieser
Funktion gültig)
Hilfsvariable summe erforderlich
(weil die Funktionsvariable
harmReihe nur als
Zuweisungsziel erlaubt ist)
21
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gGesamtprogrammGesamtprogramm
program HarmonischeReihe;
var nMax: integer;
function harmReihe (n:integer): real;...end; {harmReihe}
begin {HP} writeln(harmReihe(100)); readln(nMax); writeln(harmReihe(nMax)); readln;end.
Deklaration vonglobalen Variablen
Definition der Funktion incl.
lokalen Variablen
Funktionsaufruf mit Eingabewert
100
Funktionsaufruf mit Eingabevariable
nMax
22
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gFunktionsdefinitionFunktionsdefinition
function <Fktname>(<Eingabedaten>):<Rückgabetyp>;
<Deklaration der lokalen Variablen>
begin
<Anweisungen incl. Zuweisung an den Fktnamen>
end; {<Fktname>}
Allgemeine Funktionsdefinition:
23
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gÜbungen zu FunktionenÜbungen zu Funktionen
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) prüft, ob das Jahr n ein Schaltjahr ist.
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)
Übungen zu Funktionen (ohne lokale Variable):
Schreiben Sie ein Programm Funk1 mit wenigstens dreien der folgenden Funktionen. Testen Sie Ihren Code!
24
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gVertiefende ÜbungenVertiefende Übungen
Vertiefende Übungen (z.T. mit lokalen Variablen):
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) ggT(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) zählt, wie oft der Buchstabe „e“ im Text auftritt.
e) palindrom(wort) prüft, ob das Wort ein Palindrom ist. (Bsp.: ANNA, RADAR)
25
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
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));
Exkurs: Der Datentyp Exkurs: Der Datentyp stringstring
26
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gBeispiel mit ErklärungenBeispiel 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
'H' 'u' 'n' 'd' '?'
1. 2. 3. 4. 5.
liefert die Länge von s
27
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gProzeduren im Black-Box-ModellProzeduren im Black-Box-Modell
Auch Prozeduren können als Black-Box dargestellt werden, z.B.:
gotoXY(x,y)
readln(a)
inc(n)
gotoXY
x,y
readln
a
inc
n
28
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gArten der Parameter-ÜbergabeArten der Parameter-Übergabe
Auch Prozeduren können als Black-Box dargestellt werden, z.B.:
gotoXY(x,y)
readln(a)
inc(n)
gotoXY
x,y
readln
a
inc
n
Eingabeparameterdie Werte gehen nur in
die Prozedur hinein
callby
value
29
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gArten der Parameter-Übergabe (ff.)Arten der Parameter-Übergabe (ff.)
Auch Prozeduren können als Black-Box dargestellt werden, z.B.:
gotoXY(x,y)
readln(a)
inc(n)
gotoXY
x,y
readln
a
inc
n
Eingabeparameterdie Werte gehen nur in
die Prozedur hinein
Ausgabeparameter die Variable a wird mit
einem Wert „gefüllt“
Übergabeparameterdie Variable n wird
übergeben und verändert
callby
value
callby
refe-rence
30
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gProzedur-KöpfeProzedur-Köpfe
gotoXY
x,y
readln
a
inc
n
Übersetzung in entsprechende Prozedurköpfe:
procedure gotoXY (x,y: integer);
procedure readln (var a: real);
procedure inc (var n: integer);
Referenz- bzw. „Variablen“-Parameter
31
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g 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) sollden Wert zweier Variablen vertauschen!
Black-Box-Modell ?
Prozedurkopf ?
Prozedur tausche (a,b) ...Prozedur tausche (a,b) ...
32
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g... mit Prozedurkopf ...... mit Prozedurkopf ...
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) sollden Wert zweier Variablen vertauschen!
Black-Box-Modell:
Prozedurkopf:
tausche
a,b
procedure tausche (var a,b: real);
Ein vergessenes var ist ein sehr „beliebter“ (und fast unsichtbarer) Fehler!
33
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g... und komplett !... und komplett !
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) sollden Wert zweier Variablen vertauschen!
Black-Box-Modell:
Prozedur:
tausche
a,b
procedure tausche (var a,b: real);var x: real;begin x := a; a := b; b := x;end; {tausche}
34
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gProzedurkopf kartNachPolarProzedurkopf 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
35
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gProzedurkopf kartNachPolarProzedurkopf 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) !
kartNachPolar
x,y r,phi
procedure kartNachPolar (x,y:real; var r,phi:real);
36
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gAufruf und Parameter-Übergabe: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.
37
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gAktuelle und formale VariablenAktuelle 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.
globale Variable
Definition der Prozedur
tausche(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)
dieses x ist nur innerhalb von
tausche gültig, d.h. völlig unabhängig vom (gleichnamigen)
globalen x !
38
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gNoch ein Aufruf-Beispiel und „Gegen-Beispiel“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.
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!
Also: gleiche Variablennamen
sind möglich, aber ziemlich irritierend !
39
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gExkurs: Der Datentyp Exkurs: Der Datentyp record record (Strukturierung der Daten)(Strukturierung der Daten)
In der realen Welt gibt es oft Datenobjekte, dieaus mehreren Einzeldaten zusammengesetzt sind.
Beispiel:
Schüler 1
Name: Fred Meier
Klasse: 8c
Alter: 14
Modellierung in Pascal ?
40
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g In der realen Welt gibt es oft Datenobjekte, dieaus mehreren Einzeldaten zusammengesetzt sind.
Beispiel:
Schüler 1
Name: Fred Meier
Klasse: 8c
Alter: 14
type TSchueler = record
Name: string;
Klasse: string;
Alter: integer;
end;
Definition eines eigenen
Datentyps ...
... als Sammlung (Verbund) von
Einzeldaten
41
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g In der realen Welt gibt es oft Datenobjekte, dieaus mehreren Einzeldaten zusammengesetzt sind.
Beispiel:
Schüler 1
Name: Fred Meier
Klasse: 8c
Alter: 14
type TSchueler = record
Name: string;
Klasse: string;
Alter: integer;
end;
Definition eines eigenen
Datentyps ...
... als Sammlung (Verbund) von
Einzeldaten
var Schueler1: TSchueler;Deklaration einer entsprechenden
Variable
42
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gZugriff auf RecordsZugriff auf Records
Zugriff auf die Einzeldaten (Komponenten) eines Records:
Schueler1.Name := 'Fred Meier';
Schueler1.Alter := 14;
inc(Schueler1.Alter);
write(Schueler1.Alter);
Variablen-name Punkt
Komponenten-name
Beachte: Ein Records kann immer nur komponentenweise bearbeitet werden.So ist z.B. write(Schueler1) nicht möglich!
43
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gAufgabe: TBruch mit ProzedurenAufgabe: TBruch mit Prozeduren
Aufgaben: 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(b1,b2,erg),die in der Variable erg das Produkt von b1 und b2 berechnet!
e) Schreiben Sie ein Programm BruchDemo mit zwei Bruch-Variablen Bruch1 und Bruch2 zum Testen Ihrer Prozeduren!
f) Öffnen Sie das Programm Bruchtrainer und ergänzen Sie die fehlenden Prozeduren!
44
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel:
Aufgabe: MusikManagerAufgabe: MusikManager
1 Vivaldi: Vier Jahreszeiten
2 J.S.Bach: Goldberg-Variationen
3 Grieg: Peer Gynt Suite
4 Mozart: Eine kleine Nachtmusik
45
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gAufgabe: MusikManagerAufgabe: MusikManager
Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel:
Die CD-Liste kann durch folgenden Datentyp modelliert werden:
1 Vivaldi: Vier Jahreszeiten
2 J.S.Bach: Goldberg-Variationen
3 Grieg: Peer Gynt Suite
4 Mozart: Eine kleine Nachtmusik
type TListe = recordElement: array[1..10] of string;Anzahl: integer;
end;
var CDs: TListe;
46
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
gAufgabe: MusikManagerAufgabe: MusikManager
Auftrag: Frau Karajan möchte eine Liste ihrer CDs per EDV verwalten. Beispiel:
Die CD-Liste kann durch folgenden Datentyp modelliert werden:
1 Vivaldi: Vier Jahreszeiten
2 J.S.Bach: Goldberg-Variationen
3 Grieg: Peer Gynt Suite
4 Mozart: Eine kleine Nachtmusik
type TListe = recordElement: array[1..10] of string;Anzahl: integer;
end;
var CDs: TListe;
CDs.Element[3]letzte Nummer:CDs.Anzahl
Datenfeld für 10 CD-NamenZähler für die
aktuelle Anzahl
47
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
Aufgabe: Schreiben Sie für das Pascal-Programm MusiManfolgende Prozeduren:
a) zeige(Liste) zeigt die gesamte Liste
b) fuegeHinzu(Liste,Element) fügt ein Element hinzu
c) loesche(Liste) löscht die ganze Liste
d) loescheNr(Liste,Nummer) löscht das Elementan der angegebenen
Position
48
TS
Str
ukt
uri
ert
e P
rog
ram
mie
run
g
Aufgabe: Schreiben Sie für das Pascal-Programm MusiManfolgende Prozeduren:
a) zeige(Liste) zeigt die gesamte Liste
b) fuegeHinzu(Liste,Element) fügt ein Element hinzu
c) loesche(Liste) löscht die ganze Liste
d) loescheNr(Liste,Nummer) löscht das Elementan 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;