Die Unterprogrammtechnik - lehrer
Die Unterprogrammtechnik - lehrer
Die Unterprogrammtechnik - lehrer
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Einleitung:<br />
<strong>Die</strong> <strong>Unterprogrammtechnik</strong><br />
Es gibt mindestes zwei Gründe, weshalb ein Programmierer Unterprogramme verwenden sollte:<br />
1) Mit Hilfe von Unterprogrammen kann ein Programm strukturiert werden. Das bedeutet, daß<br />
ein Programm in mehrere kleine Abschnitte (= Unterprogramme) aufgeteilt wird, wodurch die<br />
Übersichtlichkeit enorm steigt. Davon profitiert vor allem die Lesbarkeit des Programms, außerdem<br />
können Fehler leichter entdeckt und beseitigt werden. Gezielte Programmänderungen<br />
sind ebenfalls leichter möglich.<br />
Unterprogramm 1<br />
HAUPTPROGRAMM<br />
Unterprogramm 2<br />
Unterprogramm 3 Unterprogramm 3.1<br />
Das Diagramm dokumentiert die Vorteile der <strong>Unterprogrammtechnik</strong>. Statt eines sehr unübersichtlichen<br />
Gesamtprogramms entstehen Unterprogramme, die jeweils ein (kleineres)<br />
Teilproblem lösen. Durch die Aufteilung in einzelne Module entsteht auch die Möglichkeit der<br />
Zusammenarbeit mehrerer Programmierer bzw. die Arbeitsteilung zur Erstellung von<br />
komplizierten und umfangreichen Programmen wird erst möglich.<br />
2) Immer wieder gebrauchte Programmabschnitte (= Unterprogramme) werden zusammengefaßt<br />
und können auf eine einfache Art und Weise beliebig oft (eventuell mit verschiedenen<br />
Ausgangsdaten) aufgerufen werden. Jedes Unterprogramm erhält einen Namen und wird mit<br />
diesem vom Hauptprogramm aus aktiviert.<br />
In Turbo Pascal stellt jedes Unterprogramm eine selbständige Einheit dar und wird als<br />
PROZEDUR oder FUNKTION vereinbart. Wir haben bereits einige Prozeduren und Funktionen<br />
verwendet, die in Turbo Pascal implementiert (d.h. schon vorhanden) sind. Das sind zum Beispiel<br />
die Prozeduren WRITELN und READLN und die Standardfunktionen SQR und SQRT. Jeder<br />
Programmierer hat die Möglichkeit, eigene Prozeduren und Funktionen zu schreiben, die dann<br />
vom Hauptprogramm wie die bereits in Turbo Pascal vorhandenen Prozeduren und Funktionen<br />
verwendet werden können.<br />
Prozeduren:<br />
Aufbau und Handhabung von Prozeduren lassen sich am besten mit einfachen Beispielen<br />
zeigen. Zwei INTEGER-Zahlen werden eingelesen, addiert und das Ergebnis der Addition auf<br />
dem Bildschirm ausgegeben. Zunächst das Beispielprogramm ohne Prozeduren.<br />
program add;<br />
uses crt;<br />
var a,b,summe : integer;<br />
begin<br />
clrscr;<br />
writeln ('Addition von zwei ganzen Zahlen:');<br />
writeln;<br />
write ('<strong>Die</strong> erste Zahl eingeben: ');<br />
readln(a);<br />
write ('<strong>Die</strong> zweite Zahl eingeben: ');<br />
readln(b);<br />
summe:=a+b;<br />
writeln;<br />
writeln('<strong>Die</strong> Summe der Zahlen beträgt: ', summe);<br />
readln;<br />
end.<br />
Mit der Verwendung der <strong>Unterprogrammtechnik</strong>:<br />
program proz_1;<br />
uses crt;<br />
var a,b,summe : integer;<br />
Wolfgang Demel | TP Upro Skriptum Querformat.doc | Seite 1<br />
procedure eingabe; Prozedur EINGABE<br />
begin<br />
writeln ('Addition von zwei ganzen Zahlen:');<br />
writeln;<br />
write ('<strong>Die</strong> erste Zahl eingeben: ');<br />
readln (a);<br />
write ('<strong>Die</strong> zweite Zahl eingeben: ');<br />
readln (b);<br />
end;<br />
procedure addition; Prozedur ADDITION<br />
begin<br />
summe:=a+b;<br />
end;<br />
procedure ausgabe; Prozedur AUSGABE<br />
begin<br />
writeln;<br />
writeln('<strong>Die</strong> Summe der Zahlen beträgt: ',summe);<br />
end;<br />
begin {Hier beginnt das Hauptprogramm}<br />
clrscr;<br />
eingabe; {Aufruf der Prozedur EINGABE}<br />
addition; {Aufruf der Prozedur ADDITION}<br />
ausgabe; {Aufruf der Prozedur AUSGABE}<br />
readln;<br />
end.
Der Aufbau von Prozeduren:<br />
Der Aufbau einer Prozedur entspricht größtenteils dem eines Turbo Pascal Programms. Einem<br />
Unterprogrammkopf (mit dem Prozedurnamen) folgt ein Anweisungsteil (zwischen den beiden<br />
Schlüsselwörtern BEGIN und END).<br />
procedure Prozedurname; Statt PROGRAM steht PROCEDURE !!<br />
begin<br />
Anweisung 1;<br />
Anweisung 2;<br />
...<br />
Anweisung n;<br />
end; Kein PUNKT sondern STRICHPUNKT !!<br />
In einem Turbo Pascal Programm folgt nach dem Programmkopf der Vereinbarungsteil und erst<br />
dann der Anweisungsteil. Auch bei Unterprogrammen kann dem Unterprogrammkopf ein Vereinbarungsteil<br />
folgen. Alle Variablen, die im Vereinbarungsteil des Unterprogramms stehen, sind<br />
allerdings nur für das Unterprogramm verwendbar. In Zusammenhang mit Unterprogrammen<br />
müssen deshalb verschiedene Arten von Variablen und Konstanten unterschieden werden.<br />
Lokale und globale Variable (Konstante, Datentypen):<br />
globale Variable (Konstanten):<br />
Unter globalen Variablen (global = gesamt) werden Variablen verstanden, die dem gesamten<br />
Programm (also dem Hauptprogramm und allen Unterprogrammen) bekannt<br />
sind. Sie werden im Vereinbarungsteil des Hauptprogramms wie üblich vereinbart. Jedes<br />
Turbo Pascal Programm besitzt einen globalen Datenraum, in dem alle globalen Variablen<br />
abgelegt sind. Im vorigen Beispiel sind a, b und summe globale Variablen. Sie<br />
sind allen Unterprogrammen und dem Hauptprogramm bekannt.<br />
lokale Variable (Konstanten):<br />
Lokale Variablen (lokal = örtlich) hingegen sind Variablen, die nur jenem Unterprogramm<br />
bekannt sind, in dessen Vereinbarungsteil sie deklariert worden sind. Sie sind den<br />
anderen Unterprogrammen und dem Hauptprogramm unbekannt und können dort nicht<br />
verwendet werden. Jedes Unterprogramm hat seinen eigenen lokalen Datenraum, in dem<br />
die lokalen Variablen abgelegt sind. <strong>Die</strong>ser existiert jedoch nur zur Laufzeit des<br />
Unterprogramms.<br />
Machen Sie möglichst oft Gebrauch von lokalen Variablen. Dadurch ist die Prozedur<br />
nicht mehr so stark abhängig von Gegebenheiten des Hauptprogramms und kann leichter<br />
in anderen Programmen eingesetzt werden.<br />
Beispiel: Das Programm soll nach der Eingabe der beiden Radien den Umfang und den Flächeninhalt<br />
eines Kreisrings berechnen.<br />
program proz_2;<br />
uses crt;<br />
var r1,r2 : real; <br />
procedure eingabe; <br />
begin<br />
write ('Außenradius eingeben: ');<br />
readln (r1);<br />
write ('Innenradius eingeben: ');<br />
readln (r2);<br />
end;<br />
procedure berechnung;<br />
const pi=3.14; <br />
var u,a : real; <br />
begin<br />
writeln;<br />
u:=2*pi*(r1+r2);<br />
a:=pi*(sqr(r1)-sqr(r2));<br />
writeln ('Umfang = ',u:1:2);<br />
writeln ('Fläche = ',a:1:2);<br />
end;<br />
begin<br />
clrscr;<br />
writeln ('Berechnung des Kreisrings');<br />
eingabe; <br />
berechnung;<br />
readln;<br />
end.<br />
Wolfgang Demel | TP Upro Skriptum Querformat.doc | Seite 2<br />
Im Vereinbarungsteil des Hauptprogramms stehen r1 u. r2. Sie sind daher globale<br />
Variablen.<br />
<strong>Die</strong> Prozedur eingabe hat keinen eigenen Vereinbarungsteil und kennt daher nur die globalen<br />
Variablen.<br />
In berechnung wird π durch die lokale Konstante pi auf den Wert 3.14 festgelegt.<br />
Für den Umfang und die Fläche werden die lokalen Variablen u und a vereinbart.<br />
Im Hauptprogramm werden die Unterprogramme mit ihren Namen aufgerufen<br />
Übungen 1:<br />
(1) Schreibe HERON.PAS mit den Unterprogrammen EINGABE und BERECHNUING<br />
(speichern als HERON_2.PAS).<br />
(2) Schreibe das Programm TRAPEZ_1.PAS, das nach Eingabe der Seitenlängen Umfang,<br />
Höhe, Fläche und die Diagonale e eines gleichschenkligen Trapezes berechnet. Verwende<br />
die Unterprogramme EINGABE, UMFANG, HOEHE, FLAECHE und DIAGONALE.<br />
Anleitung:<br />
a + c<br />
m =<br />
2<br />
A = m ⋅h<br />
2<br />
2 2 ⎛ a − c ⎞ 2 2 ⎛ a + c⎞<br />
h = b − ⎜ ⎟ e = h + ⎜ ⎟<br />
⎝ 2 ⎠<br />
⎝ 2 ⎠<br />
2<br />
D<br />
A a<br />
B<br />
Kontrolle: a = 32 | b = 18 | c = 25 ⇒ U = 93,00 | h = 17,66 | FL = 503,21 | e = 33,53<br />
Prozeduren mit Parameterübergabe:<br />
Um die Verwendung von Unterprogrammen noch flexibler zu gestalten, erlaubt es Turbo Pascal,<br />
Werte (die sogenannten Parameter) an die Unterprogramme zu übergeben. Dadurch wird ein<br />
gezielter Datenaustausch mit dem Hauptprogramm ermöglicht. Auch bei den in Turbo Pascal<br />
bereits definierten Standardprozeduren gibt es solche mit und solche ohne Parameterübergabe.<br />
So wird zum Beispiel die Prozedur für das Bildschirmlöschen CLRSCR ohne Parameter aufgerufen.<br />
Um hingegen mit der Prozedur WRITELN einen Wert x am Bildschirm auszugeben, muß der<br />
Prozedur auch der Wert als Parameter übergeben werden, was durch den Aufruf WRITELN(X)<br />
geschieht. Der zu übergebende Wert steht dabei in Klammern nach dem Namen der Prozedur.<br />
b<br />
m<br />
c<br />
e<br />
h<br />
C<br />
b
Von der Möglichkeit der Parameterübergabe sollte der Programmierer immer Gebrauch machen.<br />
Ein sauberer Programmierstil zeichnet sich dadurch aus, daß alle Variablen, die durch das Unterprogramm<br />
bearbeitet werden, als Parameter an das Unterprogramm übergeben werden. Wird<br />
in einem Unterprogramm der Wert einer globalen Variablen geändert, dann spricht man von<br />
einem Nebeneffekt des Unterprogramms. <strong>Die</strong>se Effekte sind schwer zu überblicken und deshalb<br />
fehlerträchtig und unerwünscht.<br />
Es muß zwischen zwei verschiedenen Arten von Parametern, den Wertparametern und den Variablenparametern<br />
unterschieden werden.<br />
Wertparameter<br />
Genügt ein einseitiger Datenaustausch vom Hauptprogramm ins Unterprogramm, so wird dies<br />
durch die Übergabe von Wertparametern an ein Unterprogramm erreicht. Dadurch wird es möglich,<br />
innerhalb eines Programms ein Unterprogramm öfters mit verschiedenen Parametern aufzurufen.<br />
Zur Übergabe der Parameter muß lediglich der Prozedurkopf um die Parameterliste erweitert<br />
werden. <strong>Die</strong>se Art des einseitigen Datenaustauschs heißt 'call by value'.<br />
Beispiel:<br />
program proz_3;<br />
uses crt;<br />
var a,b : integer;<br />
procedure kubik (zahl: integer); <br />
var k : integer;<br />
begin<br />
k:=zahl*zahl*zahl;<br />
writeln;<br />
writeln ('<strong>Die</strong> Kubikzahl ist: ',k);<br />
writeln;<br />
end;<br />
begin<br />
clrscr;<br />
writeln ('1. Berechnung');<br />
kubik (3); <br />
write ('Zahl für die 2.Berechnung? ');<br />
readln (a);<br />
kubik (a); <br />
write ('Zahl für die 3. Berechnung? ');<br />
readln (b);<br />
kubik (b); <br />
readln;<br />
end.<br />
Im Prozedurkopf steht zusätzlich der zu übergebende Parameter mit seinem Datentyp in<br />
einer runden Klammer. Das bedeutet, daß vom Hauptprogramm an das Unterprogramm<br />
kubik genau ein INTEGER-Wert übergeben werden muß.<br />
<strong>Die</strong> Übergabe geschieht, indem beim Aufruf der Prozedur zusätzlich der Parameter in Klammern<br />
angegeben wird. In dieser Zeile wird kubik mit dem Wert 3 aufgerufen.<br />
Prozeduraufruf mit der Variablen a.<br />
Prozeduraufruf mit der Variablen b.<br />
Wolfgang Demel | TP Upro Skriptum Querformat.doc | Seite 3<br />
<strong>Die</strong> Parameter im Prozedurkopf (im Beispiel: zahl) werden als Formalparameter bezeichnet,<br />
weil mit ihnen nicht direkt gerechnet wird. Beim Aufruf der Prozedur im Hauptprogramm werden<br />
die Formalparameter durch die Aktualparameter (im Beispiel: 3,a und b), die die tatsächlichen<br />
Rechenwerte darstellen, ersetzt.<br />
<strong>Die</strong> Formalparameter stehen immer in der Prozedurvereinbarung (im Vereinbarungsteil des<br />
Hauptprogramms), die Aktualparameter im Prozeduraufruf (im Anweisungsteil des Hauptprogramm).<br />
Für Formalparameter und Aktualparameter sollten unterschiedliche Bezeichner<br />
verwendet werden.<br />
Sollen mehrere Parameter übergeben werden, so werden jene gleichen Typs durch Beistriche<br />
voneinander getrennt. Parameter unterschiedlichen Typs müssen durch Strichpunkte voneinander<br />
unterschieden werden:<br />
procedure Prozedurname (ParA1, ParA2, ... : TypA;<br />
ParB1, ParB2, ... : TypB;<br />
...<br />
ParZ1, ParZ2, ... : TypZ);<br />
Beispiel:<br />
procedure probe (a,b:real; i:integer; frage:char);<br />
Der Aufruf der Prozedur probe muß dann<br />
beispielsweise folgendermaßen aussehen:<br />
...;<br />
probe (3.2,4.7,5,'Y');<br />
...,<br />
Dann erfolgt die Zuordnung:<br />
a 3.2<br />
b 4.7<br />
i 5<br />
frage 'Y'<br />
Auf die richtige Reihenfolge und auf den richtigen Datentyp ist bei der Übergabe<br />
unbedingt zu achten!<br />
Auf Wertparameter kann jede Prozedur nur lesend zugreifen, die Parameter können von der Prozedur<br />
nicht verändert werden, d.h. der Informationsfluß führt nur vom Hauptprogramm zum Unterprogramm<br />
und nicht umgekehrt.<br />
Beim Eintritt in das Unterprogramm wird eine Kopie der Variablen im lokalen Datenraum des<br />
Unterprogramms angelegt. <strong>Die</strong>ses Duplikat wird verwendet, solange das Unterprogramm aktiv<br />
ist. Nach der Beendigung des Unterprogramms wird der lokale Datenraum - und damit dessen<br />
Inhalt - vernichtet. Eine Veränderung der Variablen im Hauptprogramm ist daher nicht möglich.<br />
Variablenparameter<br />
Soll der Informationsfluß in beide Richtungen, also vom Hauptprogramm ins Unterprogramm und<br />
vom Unterprogramm wieder zurück ins Hauptprogramm führen, so müssen in der Prozedur Variablenparameter<br />
vereinbart werden. <strong>Die</strong>s geschieht, indem in der Parameterliste vor die Variablennamen<br />
das reservierte Wort VAR geschrieben wird. Der Vorgang des Datenaustausches mit<br />
Variablenparametern heißt auch 'call by reference'.<br />
procedure Prozedurname (var ParA1, ParA2, ... : TypA;<br />
var ParB1, ParB2, ... : TypB;<br />
...<br />
var ParZ1, ParZ2, ... : TypZ);
Beispiel:<br />
program proz_4;<br />
uses crt;<br />
var a,b,i : integer;<br />
procedure eingabe (var x,y : integer); <br />
begin<br />
write ('<strong>Die</strong> erste Zahl eingeben: ');<br />
readln (x);<br />
write ('<strong>Die</strong> zweite Zahl eingeben: ');<br />
readln (y);<br />
end;<br />
procedure addition (x,y : integer); <br />
var summe : integer;<br />
begin<br />
summe:=x+y;<br />
writeln ('<strong>Die</strong> Summe von ',x,' und ',y,' beträgt ',summe,'.');<br />
writeln;<br />
end;<br />
begin<br />
clrscr;<br />
for i:=1 to 2 do<br />
begin<br />
writeln (i,'-te Berechnung:');<br />
eingabe (a,b);<br />
writeln ('a = ',a,' b = ',b); <br />
addition (a,b);<br />
end;<br />
readln;<br />
end.<br />
<strong>Die</strong> Formalparameter x und y der Prozedur eingabe werden durch die Voranstellung des<br />
Schlüsselwortes VAR als Variablenparameter deklariert. Dadurch wird eine Veränderung der<br />
Aktualparameter a und b auch im Hauptprogramm wirksam.<br />
Der Prozedur addition genügt eine Übergabe als Wertparameter, da keine Änderung der Aktualparameter<br />
notwendig ist (die Ausgabe der Summe erfolgt innerhalb der Prozedur).<br />
<strong>Die</strong> Bildschirmausgabe dokumentiert, daß die eingegebenen Werte dem Hauptprogramm<br />
übergeben wurden.<br />
Gib als Übung das Programm ein und überprüfe, was geschieht, wenn Du an die Prozedur<br />
eingabe Wertparameter übergibst.<br />
Natürlich können in einer Prozedur auch Wertparameter und Variablenparameter gemeinsam<br />
vorkommen, die Kopfzeile könnte dann folgendermaßen aussehen:<br />
procedure probe (var a,b:real; i:integer; frage:char);<br />
In diesem Fall sind a und b Variablenparameter, i und frage hingegen Wertparameter.<br />
Im Gegensatz zum 'call by value' wird beim 'call by reference' keine Kopie der Variablen im lokalen<br />
Datenraum des Unterprogramms angelegt. Stattdessen wird nur die Adresse des Speicherplatzes<br />
der Variablen im globalen Datenraum an das Unterprogramm übergeben.<br />
Eine Wertänderung im Unterprogramm hat deshalb gleichzeitig eine Wertänderung im Hauptprogramm<br />
zur Folge, da ein und derselbe Speicherplatz angesprochen wird. Beim Verlassen des<br />
Unterprogramms werden die entsprechenden Adressreferenzen aufgehoben.<br />
Aufbau einer Prozedur: (reservierte TP - Wörter in Großbuchstaben)<br />
Wolfgang Demel | TP Upro Skriptum Querformat.doc | Seite 4<br />
PROCEDURE Prozedurname (Parameterliste); {Prozedurkopf}<br />
{Vereinbarungsteil}<br />
CONST ... {Vereinbarung von lokalen Konstanten}<br />
VAR ... {Vereinbarung von lokalen Variablen}<br />
BEGIN {Anweisungsteil}<br />
Anweisung 1;<br />
Anweisung 2;<br />
...<br />
Anweisung x;<br />
END; {Ende der Prozedur}<br />
Übungen 2:<br />
(1) Ergänze in PROZ_1.PAS die Parameterübergabe (speichern als SUMME.PAS).<br />
(2) Ergänze in PROZ_2.PAS die Parameterübergabe (speichern als KREIS.PAS).<br />
(3) Ergänze in HERON_2.PAS die Parameterübergabe (speichern als HERON_3.PAS).<br />
(4) Ergänze in TRAPEZ_1.PAS die Parameterübergabe (speichern als TRAPEZ_2.PAS).<br />
(5) Schreibe TETRA_1.PAS mit Unterprogrammen und Parameterübergabe (speichern als<br />
TETRA_2A.PAS).<br />
(6) Schreibe das Programm KEGEL_1.PAS, das den Durchmesser und die Höhe eines Kegels<br />
einliest und die Seitenlänge, die Mantelfläche und das Volumen des Kegels berechnet.<br />
Anleitung: Kontrolle:<br />
s =<br />
d<br />
h<br />
d s<br />
M<br />
d h<br />
V<br />
⎛<br />
2<br />
⎞<br />
⎜ ⎟ +<br />
2<br />
⎝ 2⎠<br />
π ⋅ ⋅<br />
=<br />
2<br />
π ⋅<br />
2<br />
⋅<br />
=<br />
12<br />
d = 6 cm<br />
h = 4 cm<br />
s = 5,00 cm<br />
M = 47,12 cm²<br />
V = 37,70 cm³<br />
Funktionen:<br />
<strong>Die</strong> zweite Möglichkeit in Turbo Pascal Unterprogramme zu schreiben ist die Vereinbarung als<br />
Funktion, wobei der Aufbau von Funktionen dem von Prozeduren sehr ähnlich ist. Alle Aussagen<br />
über lokale und globale Variablen bzw. über Wert- und Variablenparameter behalten voll inhaltlich<br />
ihre Gültigkeit.<br />
Der Unterschied zwischen Prozeduren und Funktionen besteht darin, daß jede Funktion genau<br />
ein Funktionsergebnis (=Funktionswert) zurückliefert. Funktionen werden deshalb im<br />
weitesten Sinne zur Berechnung von Werten verwendet (wie z.B.: die in Turbo Pascal bereits<br />
enthaltenen Standardfunktionen Sinus und Cosinus y:=sin(alpha), z:=cos(alpha)).<br />
Beispiel:<br />
Es soll ein Programm mit einer Funktion geschrieben werden, die das Maximum von drei<br />
INTEGER-Zahlen bestimmt.
program funkt_1;<br />
uses crt;<br />
var a,b,c : integer;<br />
frage : char;<br />
procedure eingabe (ch:char;var x:integer);<br />
begin<br />
write ('<strong>Die</strong> ',ch,'. Zahl eingeben: ');<br />
readln (x);<br />
end;<br />
function max(x,y,z:integer):integer; <br />
var m : integer; <br />
begin<br />
m:=x;<br />
if y>m then m:=y;<br />
if z>m then m:=z;<br />
max:=m; <br />
end;<br />
begin<br />
repeat<br />
clrscr;<br />
eingabe('1',a);<br />
eingabe('2',b);<br />
eingabe('3',c);<br />
writeln ('Maximum der drei Zahlen = ',max(a,b,c)); <br />
write ('Noch eine Berechnung (j/n)?');<br />
readln (frage);<br />
until upcase(frage)='N'<br />
end.<br />
<strong>Die</strong> Vereinbarung einer Funktion wird mit dem Schlüsselwort FUNCTION eingeleitet, dem der<br />
Name der Funktion folgt. Danach folgt optional die Parameterliste mit Wertparametern (in<br />
unserem Beispiel die drei INTEGER-Zahlen) und Variablenparametern (wieder mit VAR). Zusätzlich<br />
muß in der FUNCTION-Vereinbarung der Typ der Funktion festgelegt werden. <strong>Die</strong>ser<br />
entspricht dem Datentyp des Funktionsergebnisses und kann jeder einfache Datentyp<br />
(INTEGER, REAL, CHAR, BOOLEAN, STRING) sein. Der Typ der Funktion wird nach der<br />
Parameterliste, getrennt durch einen Doppelpunkt, angegeben.<br />
Für lokale und globale Variablen gelten alle Aussagen wie bei den Prozeduren.<br />
Wichtig ist, daß im Anweisungsteil der Funktion dem Funktionsnamen das Funktionsergebnis<br />
in einer Wertzuweisung zugeordnet wird.<br />
funktionsname:=funktionsergebnis;<br />
Aufruf der Funktion direkt in der WRITELN-Zeile. Der Ausdruck max(a,b,c) wird dann<br />
durch den Funktionswert ersetzt. Ebenso möglich ist auch die Zuweisung des<br />
Funktionswertes an eine Variable:<br />
...<br />
var a,b,c,ergebnis : integer;<br />
...<br />
ergebnis:=max(a,b,c);<br />
writeln ('Maximum der drei Zahlen = ',ergebnis);<br />
...<br />
Funktionsaufrufe können in Ausdrücken direkt verwendet werden, wie z.B.:<br />
ergebnis:=3*(max(a,b,c)+15);<br />
Aufbau einer Funktion (reservierte TP - Wörter in Großbuchstaben):<br />
Wolfgang Demel | TP Upro Skriptum Querformat.doc | Seite 5<br />
FUNCTION Funktionsname (Parameterliste):Ergebnistyp; {Funktionskopf}<br />
{Vereinbarungsteil}<br />
CONST ... {Vereinbarung von lokalen Konstanten}<br />
VAR ... {Vereinbarung von lokalen Variablen}<br />
BEGIN {Anweisungsteil}<br />
Anweisung 1;<br />
Anweisung 2;<br />
...<br />
Anweisung x;<br />
Funktionsname:=Funktionsergebnis; {Zuordnung des Funktionswertes}<br />
END; {Ende der Funktion}<br />
Wie wichtig benutzerdefinierte Funktionen sind, erkennen wir, wenn wir uns den Vorrat an Funktionen<br />
ansehen, den uns Turbo Pascal standardmäßig zur Verfügung stellt.<br />
Turbo Pascal Standardfunktionen:<br />
Ergebnis- Ergebnis der Funktion Beispiel<br />
typ Argument Ergebnis<br />
ABS(x) REAL Absolutbetrag von x -3.25 3.25<br />
SQR(x) REAL Quadrat von x 5.0 25.0<br />
SQRT(x) REAL Quadratwurzel von x (x ≥ 0) 25.0 5.0<br />
SIN(x) REAL Sinus von x (in Radiant) PI/2 1.0<br />
COS(x) REAL Cosinus von x (in Radiant) PI -1.0<br />
ARCTAN(x) REAL Arcustangens von x (in Radiant) PI 1.262...<br />
PI REAL die Konstante π ----- 3.141...<br />
LN(x) REAL Natürl. Logarithmus von x (positiv) 100 4.605...<br />
EXP(x) REAL Exponentialfunktion von x (e x ) 1.0 2.718...<br />
TRUNC(x) INTEGER Umwandlung in INTEGER durch abschneiden<br />
der Dezimalstellen<br />
11.8 11<br />
ROUND(x) INTEGER Rundung auf ganzzahligen Wert 11.8 12<br />
INT(x) REAL ganzzahliger Anteil von x 11.234 11.0<br />
FRAC(x) REAL nicht-ganzzahliger Anteil von x 11.234 0.234<br />
Es fehlen viele oft gebrauchte Funktionen. Als Beispiele sollen die Winkelfunktion Tangens und<br />
die Berechnung von Potenzen herausgegriffen werden.
Tangensfunktion:<br />
Für die Winkelfunktion Tangens verwenden wir: tan(x) =<br />
sin(x)<br />
cos(x)<br />
function tan (winkel:real):real;<br />
const eps=1E-10; <br />
nichtdef=1E+37; <br />
begin<br />
if abs(cos(winkel))=0 then pot:=p<br />
else pot:=1/p;<br />
end;<br />
Potenz mit reellem Exponenten:<br />
Für den Entwurf einer Funktion zur Berechnung von Potenzen mit reellem Exponenten und<br />
positiver Basis verwenden wir den mathematischen Zusammenhang:<br />
x y = e y.ln(x)<br />
Zahl)<br />
function pot (basis,exponent:real):real;<br />
begin<br />
if basis>0 then pot:=exp(exponent*ln(basis))<br />
else pot:=0;<br />
end;<br />
wobei: x ... Basis (positive reelle Zahl)<br />
y ... Exponent (beliebige reelle<br />
e ... Exponentialfunktion<br />
ln ... natürlicher Logarithmus<br />
Übungen 3:<br />
Wolfgang Demel | TP Upro Skriptum Querformat.doc | Seite 6<br />
(1) Schreibe TETRA_2A.PAS mit einer Funktion zur Dreiecksflächenberechnung (speichern als<br />
TETRA_2B.PAS).<br />
(2) Schreibe TRAPEZ_2.PAS mit Funktionen (speichern als TRAPEZ_3.PAS).<br />
(3) Schreibe KEGEL_1.PAS mit Funktionen (speichern als KEGEL_2.PAS.)<br />
(4) Schreibe das Programm WINKEL.PAS, das Funktionen BOGEN und GRAD enthält, die es<br />
erlauben, einen Winkel vom Bogenmaß ins Gradmaß umzurechnen und umgekehrt.<br />
Anleitung: Bogenmaß = Gradmaß . π<br />
180<br />
Kontrolle: 127° = 2,22 rad 249° = 4,35 rad<br />
(5) Schreibe das Programm WERTETAB.PAS, das eine Tabelle der Funktionswerte von SINUS,<br />
COSINUS und TANGENS eines Winkels zwischen 0° und 360° mit der Schrittweite 20<br />
berechnet.<br />
Wertetabelle<br />
============<br />
Winkel Sinus Cosinus Tangens<br />
0 0.00000 1.00000 0.00000<br />
20 0.34202 0.93969 0.36397<br />
40 0.64279 0.76604 0.83910<br />
60 0.86603 0.50000 1.73205<br />
: : : :<br />
360 0.00000 1.00000 0.00000<br />
(6) Schreibe das Programm KAPITAL2.PAS zur Berechnung des Endkapitals nach der<br />
Zinseszinsformel.<br />
Anleitung:<br />
n<br />
⎛ p ⎞<br />
Kn = K0<br />
⋅ ⎜ + ⎟<br />
⎝ ⎠<br />
1 100<br />
Kontrolle: K 0 = 1234,-<br />
n= 5 Jahre ⇒<br />
p = 4,75 %<br />
K n ... Kapital nach n Jahren<br />
K 0 ... Anfangskapital<br />
p ... Zinssatz<br />
K n = 1556,27