Seite 1 von 1

Hilfe bei Aufgabe: return von int() und Formatierung

Verfasst: Montag 19. April 2021, 20:57
von r95m
Hallo zusammen,
ich bin noch Anfänger und arbeite gerade an einem fortgeschrittenem Skript mit ein paar Schwierigkeiten mit Input und Output, return von einem int() und sekundär auch mit Formatierungsproblemen.
Die Aufgabenstellung ist:

https://210309ww6uxcynlnxts.nextcloud.h ... Jkgn2wqyqN

Mein Code sieht bisher so aus:

Code: Alles auswählen

print(format("Backshop BACK WELT", "^15"))

vorname = str(input("Geben sie ihren Vornamen ein: "))
nachname = str(input("Geben sie ihren Nachname ein: "))

#vorname = print(input("Geben sie ihren Vorname ein:" " "))
#nachname = print(input("Geben sie ihren Nachnamen ein:" " "))

print(str("Geben sie die Anzahl der jeweils gekauften Artikel ein."))

breze = print(int(input("Breze: ")))
semmel = print(int(input("Semmel: ")))
baguette = print(int(input("Baguette: ")))
dineklvolkornbrot = print(int(input("Dinekl Volkornbrot: ")))

print("Der Kassenbon von", vorname, nachname)

print("-" * 62)

print(format("Artikel", "15"),
      format("Euro/Stück", "15"),
      format("Anzahl", "15"),
      format("Zwischensumme", "15"))

print("-" * 62)

brezeP = int(0.75)
semmelP = int(0.50)
baguetteP = int(2.10)
dineklvolkornbrotP = int(3.70)

print(format("Breze", "15"), format(breze, "15"), format(brezeP, "15"), format(breze * brezeP, "15"))
print(format("Semmel", "15"), format(semmel, "15"), format(semmelP, "15"), format(semmel * semmelP, "15")) 
print(format("Baguette", "15"), format(baguette, "15"), format(baguetteP, "15"), format(baguette * baguetteP, "15"))
print(format("Dinekl Volkornbrot", "15"),format(dineklvolkornbrot, "15"), format(dineklvolkornbrotP, "15"), format(dineklvolkornbrot * dineklvolkornbrotP, "15")) 
Meine Probleme sind, das Thonny meint:

Shall:
Traceback (most recent call last):
File "/Users/admin/Documents/05 - Coding/04 - Thonny/Backshop.py", line 11
breze = print(int(input("Breze: ")), return)
^
SyntaxError: invalid syntax

Assistant:
TypeError: unsupported format string passed to NoneType.__format__
Backshop.py, line 32
Python was asked to do an operation with an object which doesn't support it.

Warnings
May help you find the cause of the error.
Backshop.py
Line 11 : "print" does not return a value
Line 12 : "print" does not return a value
Line 13 : "print" does not return a value
Line 14 : "print" does not return a value


Das Problem ist, das ich die Zahl auf den Integern von breze, semmel, baguette, dineklvolkornbrot brauche. Wenn die gleich mit print() anfange, weiss ich nicht, wie ich den Wert auslesen kann.

Ich hoffe dazu hat jemand eine Ahnung.

Herzlichen Dank!
Richard

Re: Hilfe bei Aufgabe: return von int() und Formatierung

Verfasst: Dienstag 20. April 2021, 06:29
von Sirius3
Deine Fehlermeldung passt nicht zum Code. Was hast Du also wirklich ausgeführt?
Alle `str`-Aufrufe sind überflüssig, weil das schon Strings sind.
`print` liefert None zurück, so dass die Variablen `breze`, `semmel`, `baguette` und `dineklvolkornbrot` nicht sehr sinnvoll sind.
Wenn Du etwas mit dem input machen willst, dann mußt Du auch dessen Rückgabewert an irgendeine Variable binden.
Breze und Semmel werden sehr günstig sein, wenn Du den Preis in ein int umwandelst.
Die Spaltenüberschriften passen nicht zum Spalteninhalt.

Variablennamen werden immer komplett klein geschrieben und enthalten keine Abkürzungen: breze_preis.
Die Funktion `format` verwende ich eigentlich nie, oft werden heutzutage Format-Strings verwendet, oder die `format`-Methode von str.

Code: Alles auswählen

print("{'Breze':15} {breze:15} {breze_preis:15.2} {breze_preis * breze:15.2}")
oder

Code: Alles auswählen

print("{:15} {:15} {:15.2} {:15.2}".format("Breze", breze, breze_preis, breze * breze_preis))

Re: Hilfe bei Aufgabe: return von int() und Formatierung

Verfasst: Dienstag 20. April 2021, 12:06
von __blackjack__
@r95m: Ein Grundsätzliches Herangehensproblem scheint mir auch zu sein, dass Du diese Menge an Code geschrieben hast, ohne das zwischendurch mal ausprobiert zu haben. Man sollte eigentlich nie so viel Code mit so vielen Fehlern drin haben, weil man Code nicht erst komplett runterschreibt und dann erst laufen lässt wenn er ”fertig” ist, sondern den Schritt für Schritt entwickelt, und zwischendurch testet ob das was man bisher geschrieben hat, das tut was es soll.

Texte als Bilder zu posten ist immer ein bisschen unpraktisch, deshalb hier noch mal der Aufgabentext:
Aufgabe hat geschrieben:1. Aufgabenstellung Backshop:

In einem Backshop werden folgende Artikel angeboten:

Code: Alles auswählen

Artikel               Bruttopreis

Breze                   75 Eurocent
Semmel                  50 Eurocent
Baguette              2,10 Euro
Dinkel Vollkornbrot   3,70 Euro
Schreiben Sie ein Python- Skript dass die jeweilige Anzahl der gekauften Artikel abträgt und einen Kassenbon auf der Konsole ausgibt. Der Kassenbon schlüsselt den Bruttopreis in Nettopreis und 7% Mehrwertsteuer auf. Die Mengenangaben sind dabei natürlich nur Beispiele. Um eine korrekte Formatierung zu gewährleisten können Sie davon ausgehen dass die Anzahl der gekauften Artikel maximal 3 stellig ist und der Zahlbetrag 999.99 Euro nicht übersteigt. Haften Sie sich an den folgenden Beispieldialog. Nutzereingaben sind blau eingefärbt.

Code: Alles auswählen

          Backshop BACK WELT

Geben Sie Ihren Vornamen ein: Max
Geben Sie Ihren Nachnamen ein: Mustermann 

Geben Sie die Anzahl der jeweils gekauften Artikel ein.

Breze: 4
Semmel: 3
Baguette: 2
Dinkel Vollkornbrot: 1


Der Kassenbon von Max Mustermann


Artikel               Stk.-Preis/Euro    Anzahl      Preis/Euro
Breze                        0.75           4          3.00
Semmel                       0.50           3          1.50
Baguette                     2.10           2          4.20
Dinkel Vollkornbrot          3.70           1          3.70


                                   Zahlbetrag         12.40 

7% MWST      0.81 
Netto       11.59
Entgegen dem Aufgabentext sind die Nutzereingaben nicht blau eingefärbt, weil das die BBCode-Grundausstattung nicht hergibt.

Anstatt nahezu identischen Code für jedes Produkt zu kopieren und leicht anzupassen, würden sich hier auch Datenstrukturen und Schleifen anbieten. Dann lässt sich der Code auch einfacher für mehr Produkte erweitern, und/oder das Auslagern von Produkten und Preisen in eine Datendatei.

Edit: Es ist Datenschutzrechtlich etwas bedenklich das der Backshop den Kundennamen wissen will. Das geht den überhaupt nichts an, und ist nicht notwendig um Backwaren zu kaufen.

Re: Hilfe bei Aufgabe: return von int() und Formatierung

Verfasst: Dienstag 20. April 2021, 17:55
von __blackjack__
Mal DOS angeworfen und die Aufgabe in der Programmiersprache Euphoria umgesetzt. Die hat ein interessantes Typkonzept. Eigentlich gibt es nur Zahlen (Typ `atom`) und Listen (Typ `sequence`). Typen werden als Funktionen implementiert, die einen Wert prüfen und entweder 1 zurück geben, falls der Wert alle Anfoderungen an den Typen erfüllen, oder 0 falls nicht. Die Funktion wird dann aufgerufen wenn man einen Wert einer Variablen zuweist, oder an eine Funktion oder Prozedur übergibt. So bekommt man zur Laufzeit Typsicherheit (im Sinne von „duck typing“). Man kann, wenn man alles getestet hat, diese Aufrufe auch abschalten um mehr Performance zu gewinnen.

Code: Alles auswählen

include get.e

type count_t(integer n)
    return n >= 0
end type

type price_t(atom x)
    return x >= 0
end type

constant ARTICLE_NAME = 1, ARTICLE_PRICE = 2

type article_t(sequence a)
    return sequence(a[ARTICLE_NAME]) and price_t(a[ARTICLE_PRICE])
end type

type articles_t(sequence as)
    for i=1 to length(as) do
        if not article_t(as[i]) then
            return 0
        end if
    end for
    return 1
end type

constant ITEM_ARTICLE = 1, ITEM_COUNT = 2

type shopping_item_t(sequence item)
    return article_t(item[ITEM_ARTICLE]) and count_t(item[ITEM_COUNT])
end type

type shopping_items_t(sequence items)
    for i=1 to length(items) do
        if not shopping_item_t(items[i]) then
            return 0
        end if
    end for
    return 1
end type

------------------
-- Main program --
------------------

constant VAT = 7  -- in %

articles_t articles
sequence name, surname
article_t article
integer count
shopping_items_t items
shopping_item_t item
atom total, item_price, vat

articles = {
    {"Brezel", 0.75},
    {"Semmel", 0.50},
    {"Baguette", 2.10},
    {"Dinkel-Vollkornbrot", 3.70}
}

------------------------------
-- Gather order information --
------------------------------

puts(1, "Backshop BACK WELT\n\n")

name = prompt_string("Geben Sie Ihren Vornamen ein: ")
surname = prompt_string("Geben Sie Ihren Nachnamen ein: ")

puts(1, "\nGeben Sie die Anzahl der jeweils gekauften Artikel ein:\n\n")
items = {}
for i=1 to length(articles) do
    article = articles[i]
    count = prompt_number(article[ARTICLE_NAME] & ": ", {0, 999})
    if count > 0 then
        items = append(items, {article, count})
    end if
end for

-------------------
-- Print receipt --
-------------------

if length(items) > 0 then
    puts(1, "\n\nDer Kassenbon von " & name & ' ' & surname & "\n\n")
    printf(
        1,
        "%-20s %15s %8s %12s\n",
        {"Artikel", "Stk.-Preis/Euro", "Anzahl", "Preis/Euro"}
    )
    puts(1, repeat('-', 58) & '\n')
    total = 0
    for i=1 to length(items) do
        item = items[i]
        article = item[ITEM_ARTICLE]
        item_price = article[ARTICLE_PRICE] * item[ITEM_COUNT]
        total += item_price
        printf(
            1,
            "%-20s %15.2f %8d %12.2f\n",
            {
                article[ARTICLE_NAME],
                article[ARTICLE_PRICE],
                item[ITEM_COUNT],
                item_price
            }
        )
    end for
    vat = total / 100 * VAT
    printf(1, "\nZahlbetrag %12.2f\n", {total})
    printf(1, " %3d%% MWST %12.2f\n", {VAT, vat})
    printf(1, "     Netto %12.2f\n", {total - vat})
else
    puts(1, "Keine Artikel gekauft.\n")
end if
Ausgabe:

Code: Alles auswählen

Backshop BACK WELT

Geben Sie Ihren Vornamen ein: Max
Geben Sie Ihren Nachnamen ein: Mustermann

Geben Sie die Anzahl der jeweils gekauften Artikel ein:

Brezel: 4                                                  
Semmel: 3
Baguette: 2
Dinkel-Vollkornbrot: 1

                                                          
Der Kassenbon von Max Mustermann
                                                          
Artikel              Stk.-Preis/Euro   Anzahl   Preis/Euro
----------------------------------------------------------
Brezel                          0.75        4         3.00
Semmel                          0.50        3         1.50
Baguette                        2.10        2         4.20
Dinkel-Vollkornbrot             3.70        1         3.70
                                                          
Zahlbetrag        12.40                                   
   7% MWST         0.87                                   
     Netto        11.53             

Re: Hilfe bei Aufgabe: return von int() und Formatierung

Verfasst: Donnerstag 20. Mai 2021, 15:38
von r95m
Alles klar, mein Skript funktioniert jetzt. Danke!