Prozeduren und bedingte Ausdrücke

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SchemeJS</language>
[[Programmierparadigmen_-_Computerübungen|Zur Übungsübersicht]]
==Define and Set!==
===Definition von Variablen===
Definieren Sie die folgenden Variablen und beachten Sie die zugehörigen Ausgaben von Scheme.Machen Sie sich noch einmal klar, warum define eine Sonderform (special form) ist. Verweilen Sie bei den Fehlermeldungen solange, bis Sie sie vollständig interpretieren können.

{| cellspacing=10 cellpadding=3
|-
|<run id="5d9c8284e16fd">(define number1 553344)</run> || <run id="5d9c8284e17df">(define number2 0.006) </run>||<run id="5d9c8284e1885">(define tier ’maus) </run> 
|-
|<run id="5d9c8284e192b">(define number3 number2)</run>||<run id="5d9c8284e19d0">(define number4 number1)</run>
|}

Geben die folgenden Ausdrücke ein und interpretieren Sie die Schemeantworten. Versuchen Sie diese Antworten vorherzusagen. Machen Sie sich an passender Stelle auch mit dem Datentyp “String” (Zeichenkette) im Manual vertraut.

{| cellspacing=10 cellpadding=3
|-
|<run id="5d9c8284e1a76">number1</run> || <run id="5d9c8284e1b3a">number2</run> || <run id="5d9c8284e1be7">number3</run>
|-
|<run id="5d9c8284e1c85">"number3"</run> || <run id="5d9c8284e1d22">tier</run> || <run id="5d9c8284e1dbf">number4</run>
|-
|<run id="5d9c8284e1e62">"number1"</run>
|}


===Experimentieren Sie mit <tt>define</tt> und <tt>set!</tt>===

Erproben Sie die Verwendung von <tt>define</tt> und <tt>set!</tt> anhand selbst gewählter Beispiele (z.B. pi). Überprüfen Sie anschließend, ob die neuen Variablenbindungen in der globalen Umgebung eingetragen wurden.

<eval rows=10 cols=30>;define und set!</run>

==Gebundene Variablen==

Der folgende Ausdruck beschreibt eine Prozedur zur Ermittlung einer Quadratzahl.
<run id="5d9c8284e1f44">((lambda (n) (* n n)) 17)</run>

Ersetzen Sie die gebundene Variable n mit dem Symbol basis und wiederholen Sie den Aufruf. Modifizieren Sie den Ausdruck so, dass die Kubikzahl berechnet wird.
<eval rows=5 cols=30>;Kubikzahl </run>

==Flächeninhalt Kreis==
Geben Sie einen Ausdruck ein, der den Flächeninhalt eines Kreises mit dem Radius <tt>r</tt> berechnet. Machen Sie dabei Gebrauch von dem Symbol <tt>pi</tt>, dessen Variablenbindung Sie nach dem Muster von Aufgabe 2 herstellen. 
<run id="5d9c8284e200c">;Kreisberechnung mit PI</run>

==Listen==

===cons und list===

Verwenden Sie <tt>cons</tt> und <tt>list</tt> um die nachstehenden Listen zu erzeugen.

Beispiel: 
<run id="4ad6d2f9d0e6b">(cons 1 (cons (cons 2 ()) ()))</run>

'''Hinweis:''' Beachten Sie, dass <tt>cons</tt> ein Paar erzeugt, wenn Sie als zweites Argument
keine Liste übergeben.

{|cellspacing=10 cellpadding=3
|- valign="top"
| ||'''cons'''||'''list'''
|- valign="top"
|align="right"| <tt>(5 4 3)</tt>||<run id="4ad6d2f9d1644">;cons1</run>||<run id="4ad6d2f9d1e86">;list1</run>              ̈
|- valign="top"
|align="right"|<tt>(5 (4 (3)))</tt>||<run id="4ad6d2f9d2643">;cons2</run>||<run id="4ad6d2f9d2e44">;list2</run>  
|- valign="top"
|align="right"|<tt>((1 3) (4) 5)</tt>||<run id="4ad6d2f9d3607">;cons3</run>||<run id="4ad6d2f9d3ddd">;list3</run>  
|- valign="top"
|align="right"|<tt>((1 2) (3 4) (5))</tt>||<run id="4ad6d2f9d45d8">;cons4</run>||<run id="4ad6d2f9d4cea">;list4</run>  
|}

===car und cdr===                                        
Verwenden Sie die Prozeduren car und cdr, um auf die jeweils geforderten Elemente zuzugreifen. '''Hinweis:''' Vergessen Sie nicht die Evaluation der Liste als Schemeausdruck zu unterdrücken.

Zugriff auf:
{|cellspacing=10 cellpadding=3
|-
|die Zahl 1 in (+ 1 2 3 4 5)||<run id="5d9c8284e20cd">;Zahl 1</run>
|-
|die Zahl 5 in (+ 1 2 3 4 5)||<run id="5d9c8284e2175">;Zahl 5</run>
|-
|das Symbol für die Addition in (* 3 (+ 8 9))||<run id="5d9c8284e221a">;Symbol +</run>   
|-
|die 9 in (* 3 (+ 8 9))||<run id="5d9c8284e22c0">;Zahl 5</run>   
|-
|das Ausrufezeichen (als Scheme-Zeichen) #\!<br />  in (string-append "Hallo " (string #\O #\t #\t #\o #\!))||<run id="5d9c8284e23cd">;Symbol "!"</run>  
|}



==Briefporto==        

===Briefporto 1===    
Erproben Sie die Prozedur <tt>briefporto</tt> für verschiedene Briefgewichte. Die Prozedur nimmt eine natürliche Zahl für das Gewicht (in Gramm) eines Briefes und gibt einen Preis (in Euro) als Dezimalzahl zurück. Falls ein Brief schwerer als 1000g ist, übernimmt unser fiktives Postunternehmen die Zustellung für 12345 Euro.

<code id="4ad6d3c6702d1">
(define briefporto
   (lambda (gewicht )
      (cond
         [(<= gewicht 20) 1.10]
         [(<= gewicht 50) 2.20]
         [(<= gewicht 500) 3.00]
         [(<= gewicht 1000) 4.40]
         [ else
           12345])))
</code>

<run id="4ad6d3c671277">(briefporto 2222)</run>

<run id="4ad6d3c671a3f">(briefporto 13)</run>

<run id="4ad6d3c67220d">(briefporto 130)</run>

===Briefporto 2===
Entwickeln Sie nach dem Vorbild von <tt>briefporto</tt> eine Prozedur <tt>briefporto2</tt>, die zusätzlich zum Gewicht der Briefe deren Abmessungen auswertet. Dabei sollen folgende Vorgaben gelten:
{|
|-
|Bezeichnung||Gewicht||Länge||Breite||Höhe||Preis
|-
|Standardbrief||20g||235mm||125mm||5mm||1.10
|-
|Kompaktbrief||50g||235mm||125mm||10mm||2.20
|-
|Großbrief||500g||353mm||250mm||20mm||3.00
|-
|Maxibrief||1000g||353mm||250mm||50mm||4.40
|}
Die Prozedur soll den Preis des jeweiligen Briefes als Zahl ohne Währungseinheit zurückgeben.
<code id="4ad6d3c670acd" rows=12 cols=80>
;(briefporto2 gewicht laenge breite hoehe)
</code>
<run id="4ad6d3c6729df">(briefporto2 37 220 110 4)</run>
<check>(and (= (briefporto2 49 300 300 21) 12345) (= (briefporto2 49 300 150 21) 4.4) (= (briefporto2 19 230 124 4) 1.1))</check>

==Zuzahlungsbeitrag==
Für bestimmte Medikamente müssen von Patienten gesetzlich festgelegte Zuzahlungsbeiträge entrichtet werden. Schreiben Sie eine Prozedur <tt>abzug</tt>, die als Argument einen Preis nimmt und den entsprechenden Zuzahlungbetrag als natürliche Zahl ausgibt. Verwenden Sie dafür cond!
{|
|-
| ||Preis||Zuzahlung
|-
|≤||30||8,-
|-
|≤||50||9,-
|-
|>||50||10,-
|}                               
<code id="5d9c8284e1297">;(abzug betrag)</code>                           
<run id="5d9c8284e247e">(abzug 37)</run>
<check>(and (= (abzug 30) 8) (= (abzug 50) 9) (= (abzug 51) 10))</check>


==Würfeln==
Denken Sie sich ein Spiel aus, das mit zwei Würfeln (random) arbeitet. Diese werden unabhängig voneinander und gleichzeitig geworfen. Wenn die Augensumme einen Wert aus einer Vorgabemenge annimmt soll der Spieler einen Gewinn erhalten.'''Hinweis''': Verwenden Sie case und schlagen Sie random im Manual (Help Desk) nach.
<code id="5d9c8284e1351">;Würfelspiel</code>

<run id="5d9c8284e2529">;Testen Sie hier Ihr Würfelspiel</run>

==Signum==
Schreiben Sie eine einstellige Prozedur signum, mit der sich das Vorzeichen einer Zahl bestimmen lässt. (Funktionswerte: -1, 1 oder 0)
<code id="5d9c8284e14ec">;(signum wert)</code>
<run id="5d9c8284e25d2">(signum -50)</run>
<check>(and (= (signum -5) -1) (= (signum 0) 0) (= (signum 5) 1))</check>

==Absolutbetrag==
Schreiben Sie eine einstellige Prozedur zur Ermittlung des Absolutbetrags einer ganzen Zahl.
<code id="5d9c8284e1569">;(abs zahl)</code>
<run id="5d9c8284e267c">(abs -10)</run>
<check>(and (= (abs -5) 5) (= (abs 0) 0) (= (abs 5) 5))</check>

==Even and Odd==
Schreiben Sie eine Prozedur my-odd? (und my-even?), die eine natürliche Zahl n nimmt und #t bzw. #f zurückgibt, wenn n ungerade bzw. gerade ist. '''Achtung:''' Die geforderten Prozedurdefinitionen dürfen die eingebauten Prozeduren odd? und even? nicht verwenden!'''Hinweis:''' Verwenden Sie die erstellte Prozedur my-odd? zur Definition von my-even?
<code id="5d9c8284e1603">;my-odd? und my-even?</code>
<run id="5d9c8284e274d">(my-odd? 10)</run>
<run id="5d9c8284e2813">(my-even? 10)</run>
<check>(and (= (my-odd? 10) #f) (= (my-even? 10) #t))</check>

[[Programmierparadigmen_-_Computerübungen|Zur Übungsübersicht]]