Komplexe Anwendungen: Numerische Listen
Aus ProgrammingWiki
Einführung
Wir wollen ausgewählte Prozeduren erstellen, die auf numerische Listen anzuwenden sind. Die Elemente dieser Listen sollen ausschließlich ganze Zahlen sein.
Beispiel:
Zu allen Aufgaben sind, sofern nicht anders formuliert,
- eine verbale Beschreibung,
- das vereinfachte Trichtermodell sowie
- die vollständige Implementation
anzugeben.
Als Musterlösung soll das letzte Element einer numerischen Liste ermittelt werden:
Letztes Listenelement
Beschreibung:
Das letzte Element ist
- das erste Listenelement, wenn die Liste einelementig ist oder
- das letzte Element der Restliste.
Hinweis: Unter der Restliste wollen wir stets die Liste ohne das erste Listenelement verstehen.
Trichtermodell: | Implementation: | ||
---|---|---|---|
Aufgaben
-
Länge einer Liste
Es soll die Länge einer Liste, d.h. die Anzahl aller Listenelemente bestimmt werden.
Quelltext überprüfen:
-
Elementprüfer
Mit einem Prädikat soll geprüft werden, ob ein vorgegebenes Element in einer Liste enthalten ist.
Quelltext überprüfen:
-
Zählen eines Listenelements
In einer Liste soll die Häufigkeit ermittelt werden, mit der ein ausgewähltes Listenelement vorkommt.
Quelltext überprüfen:
-
n-tes Listenelement
Die Selektoren car und cdr können nur beschränkt zur Elementauswahl in beliebig langen numerischen Listen herangezogen werden. Deshalb soll eine Prozedur dabei helfen, das n-te Listenelement zurückzugeben.
Beispiel:
(n-tes '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) 17) --> 7
Quelltext überprüfen:
-
Zufallselement
Ermitteln Sie mit der Prozedur n-tes ein zufälliges Element aus einer nichtleeren numerischen Liste. Benutzen Sie dazu die bereits bekannte Prozedur (random <max>) mit $0 \le z < max$.
Quelltext überprüfen:
-
Listenelement an n-ter Stelle einfügen
Natürlich muss es auch möglich sein, ein Element an einer beliebigen Stelle in eine Liste einzufügen. Vervollständigen Sie die entsprechende Prozedur. Achten Sie darauf , dass das Element ggf. an letzter Stelle angefügt wird, falls die gewünschte Position die Listenlänge überschreitet.
Beispiele:
(n-tes-einfuegen 100 '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) 3) --> (2 3 100 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) (n-tes-einfuegen 100 '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) 433) --> (2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1 100)
Quelltext überprüfen:
-
Listenelement an n-ter Stelle streichen
In Umkehrung der letzten Prozedur soll nun ein Element an einer beliebigen Stelle gestrichen werden. Ergänzen Sie die entsprechende Prozedur n-tes-streichen. Falls hier die gewünschte Position die Listenlänge überschreitet, ist die Liste unverändert zurückzugeben.
Beispiele:
(n-tes-streichen '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) 3) --> (2 3 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) (n-tes-streichen '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1) 433) --> (2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)
Quelltext überprüfen:
-
Streichen eines Listenelements beim ersten Auftreten
Ein Listenelement soll bei seinem ersten Auftreten gestrichen werden. Jedes weitere Auftreten dieses Elements bleibt unberücksichtigt.
Beispiel:
(streiche-erstes 3 '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)) --> (2 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)
Quelltext überprüfen:
-
Streichen eines Listenelements bei jedem Auftreten
Nun soll ein Listenelement bei jedem Auftreten gestrichen werden.
Beispiel:
(streiche-alle 3 '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)) --> (2 5 -1 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)
Quelltext überprüfen:
-
Kleinstes Listenelement
Mit einem geeigneten Suchalgorithmus soll das kleinste Element einer numerischen Liste ermittelt werden.
Beispiel:
(minimum '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)) --> -33
Quelltext überprüfen:
-
Häufigstes Listenelement
Im Gegensatz zur Aufgabe 3 soll nun das Listenelement ermittelt werden, das am häufigsten auftritt. Trifft das auf mehrere Listenelemente zu, so ist nur eins dieser Elemente auszugeben.
Beispiele:
(maxelement '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)) --> 3 (maxelement '(2 3 5 -1 3 5 1 5 3)) --> 3 oder 5
Hinweis: Die Prozedur anzahl aus Aufgabe 3 eignet sich zur Problemlösung als Hilfsprozedur.
Quelltext überprüfen:
-
ZA: Schnapszahlen
Aus einer vorgegebenen numerischen Liste sollen alle Schnapszahlen herausgesucht werden.
Beispiel:
(schnapszahlen '(2 3 5 -1 3 6 11 18 15 0 19 27 -33 -2 55 31 7 39 22 1)) --> (11 55 22)
Zunächst sollten wir uns klarmachen, was wir unter einer Schnapszahl verstehen wollen:
Beschreibung:
- Eine einstellige oder negative Zahl ist keine Schnapszahl.
- Eine zweistellige Zahl ist eine Schnapszahl, wenn beide Ziffern gleich sind.
- Eine mehrstellige Zahl ist eine Schnapszahl, wenn ihre letzten beiden Ziffern gleich sind und die Zahl ohne die letzte Ziffer eine Schnapszahl ist.
Es empfiehlt sich, ein separates Prädikat zur Schnapszahlprüfung zu implementieren.
Hinweise:
-
Mit der Prozedur quotient kann eine ganzzahlige Division ohne Rest ausgeführt werden:
(quotient 35 10) --> 3 (quotient 7 10) --> 0
-
Mit der Prozedur modulo kann der Rest einer ganzzahlige Division ermittelt werden:
(modulo 35 10) --> 5 (modulo 7 10) --> 7
Implementation:
Quelltext überprüfen:
Zum Weiterarbeiten
Vergleichsoperatoren
Wir haben bereits die Syntax der Vergleichsoperatoren einfacher Datentypen kennen gelernt.
Wie lassen sich nun Daten komplexerer Datenstrukturen vergleichen?
Eine Übersicht der darauf anzuwendenden Vergleichsoperatoren equal?, eqv?, eq? finden Sie hier.
Minimum-Sortieren
Mit den Prozeduren streiche-erstes und minimum ist es möglich, einen ersten Sortieralgorithmus zu beschreiben, den wir als Minimum-Sortieren oder kurz als MinSort bezeichnen wollen:
Beschreibung:
- Suche aus einer numerischen Liste das Minimum heraus,
- streiche es an seiner ursprünglichen Stelle und
- stelle es der Minimum-sortierten Restliste voran.
Implementieren Sie diesen Algorithmus.
Zur Problemlösung.