Imperative Programmierung
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
[[Programmierparadigmen_-_Computerübungen|Zur Übungsübersicht]]
Einige der folgenden Aufgaben beziehen sich direkt auf die Vorlesung. Es empfiehlt sich also das Skript durchzuarbeiten, die Beispiele zu erproben und die Aufgaben an den passenden Stellen zu bearbeiten.
==Sprachelement "do"==
Machen Sie sich mit Hilfe des Manuals mit dem Scheme-Sprachelement “do” vertraut und erproben Sie einige Beispielausdrücke.
==Fibonacci-Zahl==
Schreiben Sie ein imperatives Programm zur Berechnung der n-ten Fibonacci-Zahl (n = 0, 1, 2, 3, ...)
<code>;Ihr imperatives Fibonacci-Programm</code>
<eval>(fibonacci 5)</eval>
==Dialog-Interpretation ==
Interpretieren Sie den folgenden Dialog mit Scheme!
{| cellspacing=10 cellpadding=3
|-
| <code>
(define x 0)
(define y 0)
(set! x (cons 1 2))
(set! y x)
</code>
|-
| <eval>x</eval> || <eval>y</eval>
|}
{| cellspacing=10 cellpadding=3
|-
| <code>
(define x 140)
</code>
|-
| <eval>x</eval> || <eval>y</eval>
|}
{| cellspacing=10 cellpadding=3
|-
| <code>
(set! x y)
</code>
|-
| <eval>x</eval> || <eval>y</eval>
|}
==Vektoraddition==
===Warum kommt es zur Wertveränderung?===
Erläutern Sie wieso es nach (v-add v1 v2) zur Wertveränderung von v1 kommt.
{| cellspacing=10 cellpadding=3
|-
|colspan="2"|<code>(define v1 ( vector 1 2 3 4))
(define v2 ( vector 5 6 7 8))
(define v-add
(lambda (a b)
(let ([ n (vector−length a)])
(do ((i 0 (+ i 1 )))
((= i n) a )
(vector−set! a i(+ (vector−ref a i) (vector−ref b i)))))))</code>
|-
| <eval>(v-add v1 v2)</eval> ||<eval>v1</eval> || <eval>v2</eval>
|}
===v-add-c zur Abschaffung des Problems===
Verwenden Sie vector-copy zur Erzeugung einer Kopie des ersten Summanden in v-add, sodass der betrachtete Nebeneffekt unterbleibt. Nennen Sie die veränderte Prozedur '''v-add-c''' und spielen Sie den folgenden Dialog nach.
{| cellspacing=10 cellpadding=3
|-
|colspan=3|<code>(define v1 ( vector 1 2 3 4))
(define v2 ( vector 5 6 7 8))
;Ihre Prozedur v-add:
</code>
|-
| <eval>(v-add-c v1 v2)</eval> || <eval>v1</eval> || <eval>v2</eval>
|}
==pass-by-value==
Wenden Sie die Prozedur pass-by-value nacheinander auf n2, n3 und n4 an und skizzieren Sie das zugehörige Umgebungsmodell.
{| cellspacing=10 cellpadding=3
|-
|<code>(define n1 100)
(define n2 (list 1 2 3))
(define n3 (vector 1 2 3))
(define n4 (string #\a #\b))
(define pass−by−value
(lambda ( x )
(set! x 4)
x))
</code>
|-
| <eval>(pass−by−value n1)</eval> || <eval>(pass−by−value n2)</eval> || <eval>(pass−by−value n3)</eval> || <eval>(pass−by−value n4)</eval>
|}
==Erweiterung von modify!==
Erweitern Sie die Prozedur modify! für Zeichenketten. Verwenden Sie string-set!.Beurteilen Sie das Ergebnis.
<code>;Ihre Prozedur modify!</code>
[[Programmierparadigmen_-_Computerübungen|Zur Übungsübersicht]]