Logikproblem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
qcaine
User
Beiträge: 18
Registriert: Samstag 25. Dezember 2021, 10:05

Hi zusammen
hab ein kleines Programmchen zur Übung geschrieben.
Bin noch Anfänger.
Das Programm ist für ein Lagerhaus. Es soll kontrollieren ob eine Warensendung angenommen werden kann oder nicht.
Es werden 2 Sachen überprüft einmal die Kapazität des Lagers und der Bestand des gleichen und Anzahl der verfügbaren Mitarbeiter die zum ausladen benötigt werden.
Hier nun das Programm :


lagerkapazität = 1000
bestand = 500
anzahl_mitarbeiter = 10

print ("Wie groß ist die Lieferung")
lieferung = int(input("Bitte geben Sie die Größe der Lieferung an:"))
benoetigt = int(input("Bitte geben Sie die Anzahl der benötigten Mitarbeitern an:"))
if lieferung + bestand <= lagerkapazität and anzahl_mitarbeiter >= benoetigt:
print ("Die Ware kann geliefert werden.")
bestand += lieferung
anzahl_mitarbeiter -= benoetigt
print (bestand)
print (anzahl_mitarbeiter)
else: print ("Die Ware kann nicht angenommen werden.")

Mein Problem ist nun dass falls die Ware nicht angenommen werden kann , der Benutzer nicht weis warum. Liegt es an der Größe der
Ware oder liegt das Problem an zu wenig Mitarbeitern.
Ich komme nicht dahinter wie ich den Code schreiben soll das bei Nichtlieferung der Benutzer genau weis warum die Ware nicht geliefert werden kann.
Im Voraus danke für eure Unterstützung.
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du weißt, wie Du eine if-Abfrage mit zwei Bedingungen schreiben kannst, wo ist das Problem, nur eine Bedingung abzufragen?
qcaine
User
Beiträge: 18
Registriert: Samstag 25. Dezember 2021, 10:05

hehe hast Recht ...hing auf dem Schlauch :) ist klarrrr :-)))
thx Sirius :-)
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei es Sinn machen würde das dann anders zu strukturieren, also statt im ``else``-Fall jetzt die beiden Teilbedingungen noch mal einzeln zu prüfen, erst einen ``if`` und einen ``elif``-Teil zum Ablehnen mit Begründung zuschreiben und dazu dann ein ``else`` in dem der Code steht, der ausgeführt wird, wenn die Lieferung nicht abgelehnt wird. Dann muss man die Teilbedingungen nur einmal prüfen, und hat nicht die Gefahr dass man bei einer zweiten Prüfung einen Fehler macht, oder das bei Änderungen am Code irgendwann mal vergisst, dass man die gleiche Prüfung an zwei Stellen im Code ändern muss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
qcaine
User
Beiträge: 18
Registriert: Samstag 25. Dezember 2021, 10:05

Hi blackjack....
da komme ich jetzt bei Dir nicht mit :-)
qcaine
User
Beiträge: 18
Registriert: Samstag 25. Dezember 2021, 10:05

Hi blackjack....
da komme ich jetzt bei Dir nicht mit :-)
qcaine
User
Beiträge: 18
Registriert: Samstag 25. Dezember 2021, 10:05

Habe das jetzt so gemacht :

lagerkapazität = 1000
bestand = 500
anzahl_mitarbeiter = 10

print ("Wie groß ist die Lieferung")
lieferung = int(input("Bitte geben Sie die Größe der Lieferung an:"))
benoetigt = int(input("Bitte geben Sie die Anzahl der benötigten Mitarbeitern an:"))
if lieferung + bestand <= lagerkapazität and anzahl_mitarbeiter >= benoetigt:
print ("Die Ware kann geliefert werden.")
bestand += lieferung
anzahl_mitarbeiter -= benoetigt
print (bestand)
print (anzahl_mitarbeiter)
elif lagerkapazität < lieferung + bestand:
print ("Die Lagerkapazität reicht leider nicht aus!")
elif anzahl_mitarbeiter < benoetigt:
print ("Zu wenig Mitarbeiter")

Sieht besser aus ...bin aber immer noch nicht zufrieden.
Benutzeravatar
__blackjack__
User
Beiträge: 14076
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@qcaine: Was verstehst Du denn an meiner Beschreibung nicht? Erst die beiden Fälle testen bei denen *nicht* ausgeladen werden kann, einzeln, damit man dem Benutzer mitteilen kann woran es liegt, und wenn beide Gründe nicht auszuladen *nicht* zutreffen, dann wird der ``else``-Zweig betreten in dem dann ausgeladen wird. So muss jede Bedingung nur *einmal* im Code stehen. Weniger Code, weniger Wiederholung, weniger Angriffsfläche um Fehler zu machen.

Wenn die wie bei Dir im Moment zweimal im Code stehen, sollte man das mindestens mit einem ``else``-Zweig absichern. Der dürfte ja nie betreten werden. Ausser man hat einen Fehler bei den Bedingungen, so dass die nicht das gleiche Testen und es Fälle geben kann bei denen keine der drei Bedingungen zutrifft. So etwas kann man mit einem ``assert`` absichern, dass so ein Fall wenigstens nicht einfach so durchgeht, ohne das man das merkt. Einfach ein

Code: Alles auswählen

else:
    assert False, "this should never have happened"
anfügen.

Warum sind da Leerzeichen zwischen `print` und der öffnenden Klammer? Zwischen Funktion und öffnender Klammer für den Aufruf kommt kein Leerzeichen. Hast Du bei den anderen Funktionsaufrufen ja auch nicht gemacht.

Die beiden Zeilen in den beiden ``elif``-Zweigen sind ein Leerzeichen zu weit eingerückt.

Die Einrückung würde man im Beitrag übrigens sehen, wenn Du den Code in entsprechende Code-Tags setzt. Im vollständigen Beitragseditor ist das die Schaltfläche die mit </> beschriftet ist, wenn man die Tags nicht manuell eintippen mag.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
qcaine
User
Beiträge: 18
Registriert: Samstag 25. Dezember 2021, 10:05

Hallo
ich habe das jetzt so gemacht, es ist einigermaßen vernünftige Lösung

Code: Alles auswählen

lagerkapazitaet = 1000
bestand = 500
mitarbeiter = 10

lieferung = int(input("Welchen Umfang hat die Lieferung?"))
anzahl_mitarbeiter = int(input("Wie viele Mitarbeiter werden benötigt?"))
if lieferung + bestand <= lagerkapazitaet:
    if anzahl_mitarbeiter <= mitarbeiter:
        print("Die Ware kann geliefert werden")
        bestand += lieferung
        mitarbeiter -=anzahl_mitarbeiter
        print("Neuer Bestand:", bestand)
        print("Verfügbare Mitarbeiter:", mitarbeiter)

    else:
        print("Die Ware kann nicht geliefert werden, zu wenig Mitarbeiter.")
else:
    print("Die Ware kann nicht geliefert werde, Lagerkapazität reicht nicht aus.")
Und das mit "assert" geht bei mir nicht, keine Ahnung warum.
Sirius3
User
Beiträge: 18278
Registriert: Sonntag 21. Oktober 2012, 17:20

Wir haben auch keine Ahnung, warum es bei Dir nicht funktioniert, weil wir Deinen Code nicht kennen und auch nicht die Fehlermeldung, die Du bekommst.
Besser ist sowieso eine Umstellung der Abfragen:

Code: Alles auswählen

lieferung = int(input("Welchen Umfang hat die Lieferung?"))
anzahl_mitarbeiter = int(input("Wie viele Mitarbeiter werden benötigt?"))
if lieferung + bestand > lagerkapazitaet:
    print("Die Ware kann nicht geliefert werde, Lagerkapazität reicht nicht aus.")
elif anzahl_mitarbeiter > mitarbeiter:
    print("Die Ware kann nicht geliefert werden, zu wenig Mitarbeiter.")
else:
    print("Die Ware kann geliefert werden")
    bestand += lieferung
    mitarbeiter -=anzahl_mitarbeiter
    print("Neuer Bestand:", bestand)
    print("Verfügbare Mitarbeiter:", mitarbeiter)
Antworten