Listen in Racket

  • Moin allerseits,


    ich bin jetzt ersti und studiere u.a. Info.


    Bis jetzt komme ich auch wunderbar voran und es macht auch alles Spaß.


    Nun haben wir eine neue Hausübung bekommen, auf die ich nicht klar komme.
    Die erste Teilaufgabe ist folgende:


    Es ist ein Template vorgegeben, dort ist eine Einkaufsliste gegeben (die schon definiert ist).
    Das sieht so aus:
    (define some-products
    (list
    (make-product 'produktname preis 'marke) ;;preis ist hierbei eine zahl


    die Liste besteht aus mehreren Produkten logischerweise und die Aufgabe ist es, ein Programm zu entwickeln, dass bei Eingabe den geringsten Wert (Preis) ausspuckt.


    Ich habe mir bisher gedacht, es in folgende Schritte einzuteilen:
    -extrahieren der Preise (also der Nummern) aus der gegeben Liste und eine neue Liste zu erstellen nur mit den Nummern
    -die neue Liste einfach sortieren
    -aus der sortierten Liste den geringsten Wert ausspucken lassen.


    Außerdem gilt es während dieser Aufgabe 1 folgende Tests mit dem Programm zu bestehen:


    (check-expect (= (lowest-price empty) +inf.0) true) ;;Das ist mir klar, ich weiß nur nicht, wie es schreiben soll, damit ich darauf komme
    (check-expect (lowest-price (list (make-product 'P1 2 'S1) (make-product 'P1 5 'S2))) 2) ;;Das ist mir klar


    Mein Hauptproblem ist eigentlich schon direkt der erste Schritt.
    Wie extrahiere ich die Nummern aus der Liste?


    Weiter als
    (define (pricelist some-products)
    (cond
    [(empty? (...))


    Bin ich noch nicht :D


  • Achja, ich weiß, dass um den ersten Test zu bestehen, es so aussehen muss:
    (...) [(empty? (...) +inf.0)] (...) ;;Also, wenn empty? erfüllt ist, soll es eben +inf.0 ausspucken. Das Problem ist eben, dass ich nicht weiß, was ich hinter dem empty? schreiben soll


    Danke für jede Hilfe!

  • Hi,
    hast du schon einen Ansatz?
    Ich weiss nicht wie ich vorgehen soll.
    Ich glaube die Produktliste (some-products) soll übergeben werden und dann der niedrigste Preis ausgegeben werden.
    Da fängt das erste Problem schon an: wie kann ich eine Produktliste übergeben?
    Um die Preise aus der Produktliste (some-products) müsste doch eigentlich der "Befehl" product-price geltet. Damit sollte man doch zugriff auf die Preise haben bei
    einer Struktur um die Preise zu extrahieren.


    Da die Struktur product (define-struct (name price supermarket) aus den feldern ´name price `supermarket (bei mir) besteht,
    kann man doch folgendes benutzen:


    product? liefert truefür einen Wert zurück, der durch make-product erzeugt wurde
    z.B. (bei meiner Aufgabenstellung) product?'chocolate 4.99 'always-fresh ->true


    product-price liefert für das Feld einen Selektor, der eine Struktur als Argument bekommt und den Wert des Feldes (hier den Preis) extrahiert
    z.B. (product-price ('chocolate 4.99 'always-fresh)) -> 4.99

  • Hi,
    habe leider bisher keine Lösung gefunden. Habe sonst auch keinen, den ich fragen könnte. Kenne an der Uni auch keinen.
    Zerbreche mir schon seit Tagen den kopf darüber. Falls ich was finden sollte werde ich selbstverständlich posten.

  • Wie sieht´s den damit aus?


    (define (lowest-price a-product-price )
    (cond
    [(empty? a-product-price) +inf.0]))
    [else
    ......(first a-produc-price) ...
    ......(rest a-product-price) ...


    weiss noch nicht wie die ... auszufüllen sind. Hilft dir das vielleicht weiter? Ist das überhaupt richtig?
    Was denkst du?

  • Ich bin noch ne Weile da. Mein Ansatz sieht so aus:


    (define (lowest-price lop)
    (cond
    [(empty? lop) +inf.0]
    [else (< (product-price (first lop))
    (product-price (rest lop)))]
    )
    )


    Wobei er mir dann einen Fehler auswirft:


    product-price: expects a product, given (list (make-product 'P1 5 'S2))

  • lop steht für listofproducts und bezieht sich einfach auf die angegebene liste die bearbeitet werden soll bzw von der wir den niedrigsten preis wollen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!