Prozeduren
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 |
|---|---|
| Funktionsorientierte Programmierung: |
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>
<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>(runden 12.3456 2) --> 12.35 (runden 0.005712 3) --> 0.006
</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>
