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
Probleme mit if-Schleifen und booleans
http://if-schleife.de/
Und bitte den Code hier als Text posten, mit den Code Tags versehen, dem </>-Knopf im vollständigen Editor.
Und bitte den Code hier als Text posten, mit den Code Tags versehen, dem </>-Knopf im vollständigen Editor.
Habe den Code mal abgetippt. Der ist so gar nicht lauffähig.
Hast du mal ein Grundlagentutorial durchgearbeitet? Dir fehlen nämlich grundliegende Kenntnisse.
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')
Zuletzt geändert von Jankie am Donnerstag 27. August 2020, 12:58, insgesamt 1-mal geändert.
- __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.
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
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.
`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.
- __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
Erstmal danke für deine Mühe. Ich bin momentan dabei einen Grundlagenkurs zu belegen.Jankie hat geschrieben: Donnerstag 27. August 2020, 12:56 Habe den Code mal abgetippt. Der ist so gar nicht lauffähig.
Hast du mal ein Grundlagentutorial durchgearbeitet? Dir fehlen nämlich grundliegende Kenntnisse.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')
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.
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()