19.07.2013 Aufrufe

Die Unterprogrammtechnik - lehrer

Die Unterprogrammtechnik - lehrer

Die Unterprogrammtechnik - lehrer

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!