Datenabstraktion
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
[[Programmierparadigmen_-_Computerübungen|Zur Übersicht]]
Die folgenden Aufgaben beziehen sich direkt auf die in der Vorlesung verwendete Linienführung und die vorgestellten Beispiele. In dieser Übung werden Sie unter anderem den ADT Stack implementieren.
==Get Type==
Schreiben Sie eine Prozedur '''get-type''', die das Typ-Kennzeichen des übergebenen Wertes als Symbol zurückgibt, und wenden Sie sie auf einige Beispiele an.
<code id="4b5036c10ed04">
(define get-type
(lambda (...)
...))
</code>
<eval id="4b5036c11344b">
(define p1 (put-type 'point (vector 2 38 3)))
(get-type p1)
; point
</eval>
==Stack==
Schreiben Sie für alle in der Signatur des ADT stack angegebenen Operationen die
entsprechenden Schemeprozeduren unter Verwendung von Scheme-Listen. Stellen
Sie sicher, dass die im Skript genannten Axiome eingehalten werden!
'''Hinweis:''' Beachten Sie bei der Implementation das 4-Stufen-Modell!!!
===Stufen===
'''1. Stufe:'''
Es stehen alle (eingebauten) Scheme-Sprachelemente (Konstruktoren, Selektoren, Prädikate) für Listen zur Verfügung.
'''2. Stufe'''
<code id="4b5036c10f8bc">
(define create
...)
(define ...
)
</code>
'''3. Stufe'''
<code id="4b5036c110475">(define kellern
(lambda (stack element)
...)
(define entkellern
(define stapel? ...)
(define leererStapel? ...)
</code>
<eval id="4b5036c113fa6">;Testbereich für den Stack Datentyp</eval>
'''4. Stufe'''
<code id="4b5036c11102c">
(define stack2liste
(lambda (stack)
; gesamten Inhalt als Liste ausgeben
</code>
<eval id="4b5036c11475d">
(stack2liste ...)
</eval>
===Vektor===
Ändern Sie nun Ihre Implementation des ADT stack so, dass sie statt Listen Vektoren
verwendet. Stellen Sie sicher, dass die Funktionalität des ADT unverändert bleibt.
Führen Sie die Veränderungen in den obigen Code-Bereichen durch.
'''Hinweis:''' Wenn Sie das 4-Stufen-Modell korrekt angewandt haben, sollten ''keinerlei'' Änderungen der Prozeduren auf Stufe 3 und 4 vorgenommen worden sein.
==Generische Operationen==
===add===
Schreiben Sie eine generische Operation <tt>add</tt>, die je nach Typ der Parameter das
entsprechende leistet. Die möglichen Parametertypen sollen Zahlen, Punkte im
3-dimensionalen Raum sowie Zeichenketten sein. Die Prozedur soll mit explizit etikettierten
Daten arbeiten (siehe Kaptiel 6.1, Daten mit Typetikett)! Erproben Sie
anschließend ihre Prozedur.
'''Aufrufbeispiel:'''
> (define zahl1 (put-type 'number 4))
> (define zahl2 (put-type 'number 9))
> (add zahl1 zahl2)
13
<code id="4b5036c111ca6">;(add zahl1 zahl2)</code>
<eval id="4b5036c114f2a">
(define zahl1 (put-type 'number 4))
(define zahl2 (put-type 'number 9))
(add zahl1 zahl2)</eval>
===Typ Operator Tabelle===
Erweitern Sie die Typ-Operator-Tabelle aus Kapitel 6.5 so, dass die Operationen
add und minus auch für Punkte im zweidimensionalen Raum anwendbar sind.
Dies hat den praktischen Vorteil, dass sämtliche Anwendungsprozeduren, die mit
Punkten arbeiten, unverändert übernommen werden können.
<code id="4b5036c112455"></code>
<eval id="4b5036c1156ec"></eval>
===distance-to===
Ergänzen Sie '''distance-to''' in '''point-maker''' (siehe Kapitel 6.6, Message Passing).Sendet man '''distance-to''' mit einem Punkt p-base an einen beliebigen Punkt p,
so soll der Abstand zwischen p und p-base zurückgegeben werden. Vergessen Sie nicht, vor der Erprobung zwei Punkte mit der dann erweiterten Prozedur
point-maker zu definieren. Der oben definierte Punkt p1 kann nicht genommen werden, da er die Operation distance-to nicht versteht.
'''Aufrufbeispiel:'''
> (define p1 (point-maker 2 38 3))
> (p1 'distance-to (point-maker 4 23 -2))
15.937377450509228
<code id="4b5036c112c80">;distance-to</code>
<eval id="4b5036c115f08">(define p1 (point-maker 2 38 3))
(p1 'distance-to (point-maker 4 23 -2))</eval>
[[Programmierparadigmen_-_Computerübungen|Zur Übersicht]]