Funktionen in Pascal Ein langes Programm kann sehr schnell unübersichtlich werden. Man fasst deshalb Teilprobleme zu Unterprogrammen zusammen. Aus dem Hauptprogramm werden diese Unterprogramme dann entsprechend aufgerufen. Das bringt Vorteile, wenn ein Unterprogramm mehrfach genutzt werden kann. Solche Unterprogramme machen große Programme auch strukturierter und übersichtlicher. Sehr oft liefert ein Algorithmus aus einer oder mehreren Eingangsinformationen genau einen neuen Ausgangswert, den Funktionswert der Eingangsgrößen. Aus der Mathematik ist das Beispiel der reellen Funktion f: x f(x) bekannt. In Pascal sind bereits viele Funktionen vordefiniert. • y := Sqr ( n ); Quadratfunktion • y := Sqrt ( n ); Wurzelfunktion ( square root ) • y := Sin( n ); Sinusfunktion ( Ergebnisse liegen im Bogenmaß vor ! ) • y := Cos( n ); Cosinusfunktion .. ebenfalls im Bogenmaß • y := ArcTan( n ); Umkehrfunktion des Tangens ( n in rad ! ) • y := Trunc( n ); Nachkommastellen abschneiden • y := Round( n ); Wert runden • y := Abs( n ); Absolutbetrag ( Vorzeichen spielen keine Rolle mehr ) • y := UpCase ( n ); Buchstaben in Großbuchstaben umwandeln • y := Random( n ); ergibt eine Zufallszahl zwischen 0 und n (n:integer) Es lassen sich aber beliebige neue Funktionen definieren. Beispiel 1: Berechnung des Umfangs von Rechtecken Eine Funktion mit dem Namen Rechteckumfang soll aus Länge und Breite den Umfang des zugehörigen Rechtecks als Funktionswert liefern. So wird diese Funktion vereinbart. function Rechteckumfang(l,b: real): real; {ermittelt den Umfang eines Rechtecks} begin Rechteckumfang := 2*l + 2*b; end; {function} Wichtig für die Anwendung ist der sog. Funktionskopf. Er hat stets den Aufbau function Funktionsname (Eingabewerte : Typ der Eingabewerte) : Typ des Funktionswertes Die Eingabewerte heißen auch Eingabeparameter; sie werden nicht direkt über die Tastatur eingelesen, sondern z.B. als Zahlen oder Variablen beim Aufruf der Funktion übergeben. Innerhalb der Funktionsvereinbarung muss dem Namen der Funktion der Funktionswert zugewiesen werde. Funktionen können im Hauptprogramm wie eine Variable behandelt werden; sie können also in Ausdrücken oder Ausgabeanweisungen vorkommen. Funktionen in Pascal – Seite 1 Das folgende Programm zeigt die Verwendung der Funktion Rechteckumfang. program funk1; {Zweck: Rechteckumfang mit einer Funktion ermitteln Autor: W. Steffen Datum: 29.12.2015} uses crt; var a,b,U : real; function Rechteckumfang(l,b: real): real; {ermittelt den Umfang eines Rechtecks} begin Rechteckumfang := 2*l + 2*b; end; {function} begin clrscr; writeln(' Umfang eines Rechtecks'); writeln; write(' Laenge: '); readln(a); write(' Breite: '); readln(b); U := Rechteckumfang(a,b); writeln(' Umfang = ',U:12:2); readln; end. Beispiel 2: Ermittlung der Teileranzahl einer natürlichen Zahl Diese Funktion ist vor allem bei der Suche nach Primzahlen hilfreich, denn eine Primzahl ist genau dann Primzahl, wenn sie zwei Teiler hat. function teilerzahl(zahl:integer):integer; var t,anzahl: integer; begin anzahl := 0; for t := 1 to zahl do if zahl mod t = 0 then anzahl := anzahl + 1; teilerzahl := anzahl; end; {function} Diese Funktion erhält eine natürliche Zahl als (virtuelle) Eingabe und liefert als Funktionswert die Anzahl der Teiler dieser Zahl. Die Hilfsvariablen t und anzahl sind nur lokal in der Funktion definiert, der Nutzer braucht davon im Hauptprogramm nichts zu wissen. Mögliche Aufrufe dieser Funktion sind: Writeln( teilerzahl(26) ); T := teilerzahl( n ) If teilerzahl( z ) = 2 then writeln(' Primzahl '); Die formale Variable „zahl“ in der Funktionsdefinition wird also durch eine aktuelle Zahl oder Variable beim Aufruf ersetzt. Funktionen in Pascal – Seite 2 program funk2; {Zweck: Teileranzahl einer natuerlichen Zahl Autor: W. Steffen Datum: 29.12.2015} uses crt; var n : integer; function teilerzahl(zahl:integer):integer; var t,anzahl: integer; begin anzahl := 0; for t := 1 to zahl do if zahl mod t = 0 then anzahl := anzahl + 1; teilerzahl := anzahl; end; {function} begin clrscr; writeln(' Anzahl der Teiler einer natuerlichen Zahl'); writeln; write(' Gib eine nat. Zahl ein: '); readln(n); writeln(' Die Zahl ',n,' hat ', teilerzahl(n),' Teiler.'); if teilerzahl(n) = 2 then writeln(' Die Zahl ',n,' ist eine Primzahl.'); readln; end. Aufgaben: Schreibe jeweils ein kleines Hauptprogramm, um die Funktionen zu testen. Aufg. 1: a) Die Funktion Kreisflaeche( ) ermittelt aus dem Kreisradius als Eingangsvariable den Flächeninhalt des Kreises. b) Schreibe analog dazu eine Funktion Kreisumfang( ). Aufg. 2: Die Funktion max( ) ermittelt aus zwei reellen Zahlen a und b die größere der beiden Zahlen. Aufg. 3: Die Funktion Gesamtpreis( ) ermittelt aus der Stückzahl und dem Artikelpreis den Gesamtpreis. Zusätzlich gilt: Wenn die Stückzahl mindestens 10 ist, wird ein Rabatt von 10 Prozent gewährt. Aufg. 4: Eine Funktion f( ) ermittelt aus einer reellen Zahl den Funktionswert einer reellen Funktion f, z.B. f(x) = x*x*x-3*x. a) Teste das Programm mit einer einzugebenden reellen Zahl x. b) Erweitere das Programm, so dass eine Wertetabelle für das Intervall von a bis b mit einer einzugebenden Schrittweite sw am Monitor angezeigt wird. Auf. 5: Die Funktion ggt(a,b) ermittelt von zwei natürlichen Zahlen als Funktionswert den größten gemeinsamen Teiler. Verwende in der Funktion den Euklid’schen Algorithmus. Funktionen in Pascal – Seite 3