Prozeduren

Aus ProgrammingWiki
Archivierte Version vom 2011-01-10T19:05:29+00:00. Aktuelle Version

Inhaltsverzeichnis

Definition von Prozeduren

Um Kreisflächen beliebiger Radien zu bestimmen, war bisher immer die Neudefinition des Radiuses notwendig.
Wie kann der Radius als Argument übergeben werden?

Lösungsidee:

Definiere eine Prozedur, die ähnlich einer mathematischen Funktion einen Funktionswert zurückgibt.

Mathematik:

flaeche: r \longrightarrow \pi \cdot r^2
oder:
flaeche(r) = \pi \cdot r^2

 
Funktionsorientierte Programmierung:

Flaechenberechnung.gif

Implementation:

Wir überzeugen uns zunächst davon, dass wir tatsächlich eine Prozedur definiert haben:

<eval id="4c72e4c7723b0"> flaeche </eval>

Nun können wir Berechnungen mit beliebigen Radien vornehmen:

<eval id="4c72e4c7724d2"> (flaeche 10) </eval>

Interpretation:

  • Die Prozedur (lambda (r) (* pi r r)) wird an den Namen flaeche gebunden.
  • Der Parameter r heißt gebundene Variable.
  • Die Variablen * und pi sind dagegen ungebunden oder frei.

Beachte:
Die Bindung einer Prozedur an einen Namen heißt Prozedurabstraktion. Sie ist aber nicht notwendig!
In Scheme können auch unbenannte Prozeduren verwendet werden:

<eval id="4c72e4c7725db"> (lambda (x) (* x x)) </eval>

<eval id="4c72e4c7726ec"> ((lambda (x) (* x x)) 12) </eval>

Zusammenfassung

  • Benutzerdefinierte Prozeduren werden mit λ-Ausdrücken definiert.
  • Allgemeine Syntax: (lambda (<parameter>) <body>).<li>Die Anzahl der Parameter kennzeichnet die <em>Stelligkeit</em> einer Prozedur. Ist die Parameterliste leer, spricht man von <em>nullstelligen</em> Prozeduren,</li><li>Die Parameter sind gebundene Variablen, die beliebig bezeichnet werden können, sofern sie nicht mit freien Variablen im Körper übereinstimmen.</li><li>λ-Ausdrücke können an Prozedurnamen gebunden werden (<em>Prozedurabstraktion</em>).</li><h2 id="Aufgaben">Aufgaben</h2> <ol> <li> <h3 id="Sinnvolles_Runden">Sinnvolles Runden</h3><p>Für alle nachfolgenden Berechnungen ist es sinnvoll, über eine Prozedur zu verfügen, die auf eine <em>beliebige</em> Anzahl von Nachkommastellen rundet.<br> <strong>Beispiele:</strong></p>
    (runden 12.3456 2)  --> 12.35
    (runden 0.005712 3) --> 0.006
    
    <p>Nutzen Sie zur Implementation die Standard-Prozedur <tt>round</tt>, die lediglich ganzzahlig rundet.</p>
    <p><eval id="4c7eb87d682c5"> (runden 12.3456 2) </eval></p></li> <li> <h3 id="Vollzylinder">Vollzylinder</h3><p>Schreiben Sie eine Prozedur zur Volumenberechnung eines geraden Vollzylinders.</p>
    <p><eval id="4c736c6335f54"> (volumen-vollzylinder 7 28) </eval></p></li> <li> <h3 id="Hohlzylinder">Hohlzylinder</h3><p>Implementieren Sie nun eine Prozedur zur Volumenberechnung eines geraden Hohlzylinders.</p>
    <p><eval id="4c7eb922c0443"> (volumen-hohlzylinder 7 6 28) </eval></p></li> <li> <h3 id="Pyramide_und_Pyramidenstumpf">Pyramide und Pyramidenstumpf</h3><p>Definieren Sie zunächst die Prozedur zur Berechnung des Volumens und der Oberfläche gerader quadratischer Pyramiden.</p>
    <p><eval id="4c7eb922c058d"> (volumen-quadpyramide 5.5 17.5) </eval></p>
    <p><eval id="4c7eb922c06c1"> (oberflaeche-quadpyramide 5.5 17.5) </eval></p><table border="0" cellspacing="0" cellpadding="0"> <tr> <td width="250" align="center"> <p>Pyramide1.gif</p></td> <td width="350" valign="top"> <p>In einer nun geringeren Höhe wird die Spitze der quadratischen Pyramide abgeschnitten.<br> Zurück bleibt ein Pyramidenstumpf.<br> Schreiben Sie eine Prozedur, die entsprechend dieser Vorstellung das Volumen des Pyramidenstumpfes ermittelt.</p></td> </tr> </table>
    <p><eval id="4c7eb922c07fd"> (volumen-quadpyramidenstumpf 5.5 17.5 9.0) </eval></p>
    <p><eval id="4c7eb922c0937"> (oberflaeche-quadpyramidenstumpf 5.5 17.5 9.0) </eval></p></li> </ol> </body></parameter>