Komplexe Anwendungen: Numerische Listen

Aus ProgrammingWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

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:
Letztes1.gif

Aufgaben

  1. Länge einer Liste

    Es soll die Länge einer Liste, d.h. die Anzahl aller Listenelemente bestimmt werden.

     

    Quelltext überprüfen:

  2. Elementprüfer

    Mit einem Prädikat soll geprüft werden, ob ein vorgegebenes Element in einer Liste enthalten ist.

     

    Quelltext überprüfen:

  3. Zählen eines Listenelements

    In einer Liste soll die Häufigkeit ermittelt werden, mit der ein ausgewähltes Listenelement vorkommt.

     

    Quelltext überprüfen:

  4. 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:

  5. 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:

  6. 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:

  7. 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:

  8. 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:

  9. 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:

  10. 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:

  11. 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:

  12. 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.

Persönliche Werkzeuge