Probleme mit if-Schleifen und booleans

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
Valle
User
Beiträge: 2
Registriert: Donnerstag 27. August 2020, 11:52

Sehr geehrte Forumsmitglieder,

ich soll folgende Lüftersteuerung programmieren (siehe Link).
Realisieren wollte ich das über if-Schleifen und booleans. Ich packe mal einen Link zum Screenshot meines Codes und der Aufgabe mit rein.

Leider ist die Ausgabe immer die Selbe und zwar das beide Lüfter laufen, egal was ich da eingebe. Wo liegt mein Fehler, kann mir jemand helfen?

https://drive.google.com/file/d/1MUXgZ4 ... sp=sharing

Danke und beste Grüße

Valentin
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

http://if-schleife.de/

Und bitte den Code hier als Text posten, mit den Code Tags versehen, dem </>-Knopf im vollständigen Editor.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Habe den Code mal abgetippt. Der ist so gar nicht lauffähig.

Code: Alles auswählen

Rauchmelder1=str(input('Läuft der Rauchmelder 1? Geben Sie w (wahr) oder f (falsch) ein: '))
if Rauchmelder1=='f': Rauchmelder1=False
elif Rauchmelder1=='w': Rauchmelder1=True

Rauchmelder2=str(input('Läuft der Rauchmelder 1? Geben Sie w (wahr) oder f (falsch) ein: '))
if Rauchmelder2=='f': Rauchmelder2=False
elif Rauchmelder2=='w': Rauchmelder2=True

if Rauchmelder1==True or Rauchmelder2==True: Lüfter1==True
elif Rauchmelder1==True and Rauchmelder2==True: Lüfter1==True and Lüfter2==True
elif Rauchmelder1==False and Rauchmelder2==False: Lüfter1==False and Lüfter2==False

if Lüfter2==True: print ('Lüfter 2 läuft')
if Lüfter2==False: print ('Lüfter 2 läuft nicht')
if Lüfter1==True: print ('Lüfter 1 läuft')
if Lüfter1==False: print ('Lüfter 2 läuft nicht')
Hast du mal ein Grundlagentutorial durchgearbeitet? Dir fehlen nämlich grundliegende Kenntnisse.
Zuletzt geändert von Jankie am Donnerstag 27. August 2020, 12:58, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Valle: Bei dem Code bekommst Du gar keine Ausgabe von dem Code sondern eine Fehlermeldung weil weder `Lüfter1` noch `Lüfter2` irgendwo definiert werden.

Weitere Anmerkungen: Man quetscht den Code von ``if`` und Co nicht in eine Zeile. Nach einem Doppelpunkt wo syntaktisch ein eingerückter Block folgen kann, da folgt auch einer. Auch wenn der nur aus einer Zeile besteht. Alles andere ist unübersichtlich und schwer zu lesen.

`input()` liefert schon eine Zeichenkette als Ergebnis. Ein `str()`-Aufruf ist da überflüssig.

Wenn man weder "f" noch "w" eingibt ist die entsprechende Variable undefiniert und es kommt zu einem Fehler.

Man vergleicht keine Wahrheitswerte mit literalen `True` oder `False` denn da kommt ja nur wieder ein Wahrheitswert bei heraus. Entweder der, den man sowieso schon hatte — dann kann man den auch gleich verwenden — oder das Gegenteil. Darauf testet man mit ``not``.

Der Ansatz mit den Vergleichen/Verknüpfungen von Wahrheitswerten kann funktionieren, aber ich würde da eher zählen wie oft wahr eingegeben wurde und die Lüfter anhand dieser Anzahl schalten.

Edit: Der Code für die Benutzereingabe ist im Grunde zweimal das gleiche — da würde man eine Funktion für definieren wo der Code nur einmal drin steht, mit dem einen kleinen Unterschied als Argument.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen werden immer komplett klein geschrieben. Um Leerzeichen = oder == oder sonstige Operatoren werden Leerzeichen zur besseren Lesbarkeit gesetzt.
`input` liefert schon einen String, den nochmal in einen String umzuwandeln ist unsinnig.
Es fehlt eine Abfrage, was denn passieren soll, wenn die Eingabe werder f noch w ist. Da Du Rauchmelder1 für diesen Zweck recyclest ist das ein schwer zu findender Fehler.
Explizit auf True oder False prüft man nicht, es reicht `Rauchmelder1` bzw. `not Rauchmelder1`.
Lüfter1 und Lüfter2 werden niemals definiert, es sollte also ein NameError kommen und nicht eine Ausgabe.
Das ist das Problem, dass Du anscheinend mit Notebooks arbeitest, aber nicht sauber alte Daten verwirfst.
Zuweisungen sind mit einfachem =, das and macht bei den Lüftern keinen Sinn. Nach einem : fängt immer eine neue Zeile an.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das ganze als Bash-Skript:

Code: Alles auswählen

#!/bin/bash

AskBoolean() {
    local prompt="$1? Geben sie w (wahr) oder f (falsch) ein: "
    local answer
    
    while true; do
        read -r -p "$prompt" answer
        case "$answer" in
            f)
                echo 0
                return;;
            w)
                echo 1
                return;;
        esac
    done
}

PrintFanState() {
    local fan_name=$1
    local fan_state=$2
    
    echo -n "$fan_name "
    [[ $fan_state = 0 ]] && echo "läuft nicht." || echo "läuft."
}

Main() {
    local smoke_detector_a=$(AskBoolean 'Läuft Rauchmelder 1')
    local smoke_detector_b=$(AskBoolean 'Läuft Rauchmelder 2')
    local active_detector_count=$((smoke_detector_a + smoke_detector_b))
    local fan_a=$((active_detector_count > 0))
    local fan_b=$((active_detector_count > 1))
    PrintFanState 'Lüfter 1' $fan_a
    PrintFanState 'Lüfter 2' $fan_b
}

[[ "${BASH_SOURCE[0]}" == "$0" ]] && Main
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Valle
User
Beiträge: 2
Registriert: Donnerstag 27. August 2020, 11:52

Jankie hat geschrieben: Donnerstag 27. August 2020, 12:56 Habe den Code mal abgetippt. Der ist so gar nicht lauffähig.

Code: Alles auswählen

Rauchmelder1=str(input('Läuft der Rauchmelder 1? Geben Sie w (wahr) oder f (falsch) ein: '))
if Rauchmelder1=='f': Rauchmelder1=False
elif Rauchmelder1=='w': Rauchmelder1=True

Rauchmelder2=str(input('Läuft der Rauchmelder 1? Geben Sie w (wahr) oder f (falsch) ein: '))
if Rauchmelder2=='f': Rauchmelder2=False
elif Rauchmelder2=='w': Rauchmelder2=True

if Rauchmelder1==True or Rauchmelder2==True: Lüfter1==True
elif Rauchmelder1==True and Rauchmelder2==True: Lüfter1==True and Lüfter2==True
elif Rauchmelder1==False and Rauchmelder2==False: Lüfter1==False and Lüfter2==False

if Lüfter2==True: print ('Lüfter 2 läuft')
if Lüfter2==False: print ('Lüfter 2 läuft nicht')
if Lüfter1==True: print ('Lüfter 1 läuft')
if Lüfter1==False: print ('Lüfter 2 läuft nicht')
Hast du mal ein Grundlagentutorial durchgearbeitet? Dir fehlen nämlich grundliegende Kenntnisse.
Erstmal danke für deine Mühe. Ich bin momentan dabei einen Grundlagenkurs zu belegen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte nicht den Beitrag davor komplett zitieren. Den kann jeder schon so lesen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Für Lüfter1 ist es eine or Verknüpfung. Für Lüfter2 eine and Verknüpfung. So kannst du dir eine Funktion schreiben, welche den Status der Rauchgasmelder als Boolean entgegen nimmt und ein Tupel zurückliefert, mit dem daraus resultierenden Status der Lüfter.

So brauchst du eigentlich nur die Eingabe des Status der beiden Rauchgasmelder und dann die Umwandlung von der Eingabe in einen Boolean. Diese Werte übergibst du dann an die Funktion und diese liefert mittels return das Tupel mit den beiden Status für die beiden Lüfter zurück.

Code: Alles auswählen

def luefter_status(rauchgasmelder_a, rauchgasmelder_b):
    return rauchgasmelder_a or rauchgasmelder_b, rauchgasmelder_a and rauchgasmelder_b

def main():
    while True:
        rauchmelder1_status = bool(int(input("Läuft Rauchmelder2?(0/1): ")))
        rauchmelder2_status = bool(int(input("Läuft Rauchmelder2?(0/1): ")))
        lüfter1_status, lüfter2_status = luefter_status(rauchmelder1_status, rauchmelder2_status)
        print(f"Lüfter1: {lüfter1_status}, Lüfter2: {lüfter2_status}")

main()
Antworten