Anfänge des Programmierens

Code-Stücke können hier veröffentlicht werden.
Antworten
DomenikR.
User
Beiträge: 5
Registriert: Sonntag 25. August 2019, 10:47

Hallo ich bin neu hier und möchte euch meinen ersten code vorstellen den ich noch ziemlich lang finde.
Ich wollte ein Quiz machen zum lernen für meine Ausbildung aber ich finde ihn ein bisschen lang.
Wäre nett wenn mir jemand sagen könnte wie ich das ein bisschen abspecken könnte oder besser machen könnte.
MFG
Domenik

Code: Alles auswählen

richtig = "Das war die richtige Antwort."
falsch = "Das war leider die falsche Antwort."
punkteinfo = "Dein Punktestand ist:"


print("Das ist ein Fragebogen für die Elektrotechnik \n")

# Frage 1
print("Welche Einheit ist für Spannung? \n")
spannungV = input("1: A \n2: V \n3: Ω \n4: U \n")

if spannungV == "2" or "v" or "V":
    print(richtig)
    punktestand = 1
    print(punkteinfo, punktestand)
else:
    print(falsch, " Die Einheit von Spannung ist Volt (V)")
    punktestand = 0

#Fage 2
print("2. Frage: Was ist das Forlmezeichen für Spannung? \n")
spannungU = input("1: P \n2: I \n3: R \n4: U  \n")

if spannungU == "4" or "u" or "U":
    print(richtig)
    punktestand1 = 1
    print(punkteinfo, punktestand + punktestand1)
else:
    print(falsch, "Das Formelzeichen für Spannung ist U")
    punktestand1 = 0
    print(punkteinfo, punktestand + punktestand1)

A = (punktestand + punktestand1)

# Frage 3
print("3. Frage: Welche Einheit ist für Strom? \n")
stromA = input("1: U  \n2: P  \n3: A  \n4: I \n")

if stromA == "3" or "a" or "A":
    print(richtig)
    punktestand2 = 1
    print(punkteinfo, A + punktestand2)
else:
    print(falsch, "Die Einheit von Strom ist Ampere (A)")
    punktestand2 = 0
    print(punkteinfo, A + punktestand2)
    
#Frage 4

print("4. Frage: Was ist das Formelzeichnen für Strom? \n")
stromI = input("1: I  \n2: P  \n3: Ω  \n4: U \n")

if stromI == "1" or "i" or "I":
    print(richtig)
    punktestand3 = 1
    print(punkteinfo, A + punktestand2 + punktestand3)
else:
    print(falsch, "Das Formelzeichen für Strom ist I ")
    punktestand3 = 0
    print(punkteinfo, A + punktestand2 + punktestand3)

B = (punktestand2 + punktestand3)
AB = (A + B)

#Frage 5
print("5. Frage: Was ist die Einheit für Leistung? \n")
leistungW = input("1: I  \n2: A  \n3: W  \n4: P  \n")

if leistungW == "3" or "w" or "W":
    print(richtig)
    punktestand4 = 1
    print(punkteinfo, AB + punktestand4)
else:
    print(falsch, "Die Einheit für Leistung ist Watt (W)")
    punktestand4 = 0
    print(punkteinfo, AB + punktestand4)

# Frage 5
print("5. Frage: Was ist das Formelzeichen für Leistung? \n ")
leistungP = input("1: U  \n2: P  \n3: I  \n 4: Ω")

if leistungP == "2" or "p" or "P":
    print(richtig)
    punktestand5 = 1
    print(punkteinfo, AB + punktestand4 + punktestand5)
else:
    print(falsch, "Das Formelzeichen von Leistung ist P ")

C = (punktestand4 + punktestand5)
ABC = (AB + C)

if ABC == "6":
    print("Herzlichen Glückwunsch du hast alle Fragen richtig beantwortet.")
else:
    print("Tja da musst du wohl noch ein bisschen lernen ;)")

input()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@DomenikR.: in erster Linie sollte ein Programm funktionieren. ›or‹ ist kein umgangssprachliches Oder sondern eine logische Operation; statt dessen ist hier der ›in‹-Operator richtig.
Python ist stark typisiert, man kann keine Zahl mit einem String vergleichen, das wird niemals das selbe sein.

Variablennamen sind wichtig. Du hast für die selben Inhalt verschiedene Namen benutzt, einmal punktestand, punktestand1, punktestand2, ... und gleichzeitig A, B, C, AB, ABC. Dabei hast Du auch übersehen, dass punktestand5 in einem Zweig niemals definiert wird.
Eigentlich brauchst Du maximal zwei Variablen dafür; einmal die Punktzahl für eine Frage und die Gesamtpunktzahl.

Wenn man 6 mal quasi den selben Code hat, ist das ein Zeichen dafür, eine Funktion zu definieren, die man jeweils mit den passenden Parametern aufrufen kann.
DomenikR.
User
Beiträge: 5
Registriert: Sonntag 25. August 2019, 10:47

Hallo siruis3
Danke für die schnelle Antwort
Bei den punkteständen habe ich das so oft gemacht weil ich nicht wusste wie ich das sonst zusammen rechnen soll
Was wäre denn deine Vorgehensweise mit den punkteständen

Also in dem Fall lieber "in" anstatt "or" nehmen?

Mfg
Domenik
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Du zählst einfach die Gesamtpunktzahl:

Code: Alles auswählen

richtig = "Das war die richtige Antwort."
falsch = "Das war leider die falsche Antwort."
punkteinfo = "Dein Punktestand ist:"

gesamtpunktzahl = 0
print("Das ist ein Fragebogen für die Elektrotechnik \n")

# Frage 1
print("Welche Einheit ist für Spannung? \n")
antwort = input("1: A \n2: V \n3: Ω \n4: U \n")

if antwort in ("2", "v", "V"):
    print(richtig)
    punkte = 1
else:
    print(falsch, " Die Einheit von Spannung ist Volt (V)")
    punkte = 0
gesamtpunktzahl += punkte
print(punkteinfo, gesamtpunktzahl)

#Fage 2
print("2. Frage: Was ist das Forlmezeichen für Spannung? \n")
antwort = input("1: P \n2: I \n3: R \n4: U  \n")

if antwort in ("4", "u", "U"):
    print(richtig)
    punkte = 1
else:
    print(falsch, "Das Formelzeichen für Spannung ist U")
    punkte = 0
gesamtpunktzahl += 1
print(punkteinfo, gesamtpunktzahl)
Achja, die Groß-/Kleinschreibung ist bei Einheiten relevant.
DomenikR.
User
Beiträge: 5
Registriert: Sonntag 25. August 2019, 10:47

Ah okay jetz hab ich das verstanden
Danke schön 🤘
DomenikR.
User
Beiträge: 5
Registriert: Sonntag 25. August 2019, 10:47

So habe das nun alles angewendet.

Code: Alles auswählen

while True:
    richtig = "Das war die richtige Antwort."
    falsch = "Das war leider die falsche Antwort."
    punkteinfo = "Dein Punktestand ist:"
    
    
    print("Das ist ein Fragebogen für die Elektrotechnik \n")
    
    # Frage 1
    print("Welche Einheit ist für Spannung? \n")
    antwort = input("1: A \n2: V \n3: Ω \n4: U \n")
    
    if antwort in ("2", "v", "V"):
        print(richtig)
        punkte = 1
        gesamtpunktzahl = punkte
        print(punkteinfo, gesamtpunktzahl)
    else:
        print(falsch, " Die Einheit von Spannung ist Volt (V)")
        punkte = 0
        gesamtpunktzahl += punkte
    
    #Fage 2
    print("2. Frage: Was ist das Forlmezeichen für Spannung? \n")
    antwort = input("1: P \n2: I \n3: R \n4: U  \n")
    
    if antwort in ("4", "u", "U"):
        print(richtig)
        punkte = 1
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    else:
        print(falsch, "Das Formelzeichen für Spannung ist U")
        punkte = 0
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    
    
    
    # Frage 3
    print("3. Frage: Welche Einheit ist für Strom? \n")
    antwort = input("1: U  \n2: P  \n3: A  \n4: I \n")
    
    if antwort in ("3", "a", "A"):
        print(richtig)
        punkte = 1
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    else:
        print(falsch, "Die Einheit von Strom ist Ampere (A)")
        punkte = 0
        gesamtpunktzahl += punkte 
        print(punkteinfo, gesamtpunktzahl)
        
    #Frage 4
    
    print("4. Frage: Was ist das Formelzeichnen für Strom? \n")
    antwort = input("1: I  \n2: P  \n3: Ω  \n4: U \n")
    
    if antwort in ("1", "i", "I"):
        print(richtig)
        punkte = 1
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    else:
        print(falsch, "Das Formelzeichen für Strom ist I ")
        punkte = 0
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    
    #Frage 5
    print("5. Frage: Was ist die Einheit für Leistung? \n")
    antwort = input("1: I  \n2: A  \n3: W  \n4: P  \n")
    
    if antwort in ("3", "w", "W"):
        print(richtig)
        punkte = 1
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    else:
        print(falsch, "Die Einheit für Leistung ist Watt (W)")
        punkte = 0
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    
    # Frage 5
    print("5. Frage: Was ist das Formelzeichen für Leistung? \n ")
    antwort = input("1: U  \n2: P  \n3: I  \n 4: Ω")
    
    if antwort in ("2", "p", "P"):
        print(richtig)
        punkte = 1
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    else:
        print(falsch, "Das Formelzeichen von Leistung ist P ")
        punkte = 0
        gesamtpunktzahl += punkte
        print(punkteinfo, gesamtpunktzahl)
    
    if gesamtpunktzahl == "6":
        print("Herzlichen Glückwunsch du hast alle Fragen richtig beantwortet.")
    else:
        print("Tja da musst du wohl noch ein bisschen lernen ;)")
    
    print("Möchtest du nochmal Üben? J/N")
    a = input()
    if a.upper() == "J":
        break
    
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn die letzten Zeilen im else-Zweig exakt gleich sind, wie im if-Zweig, dann kann man sie einfach auch danach einmal schreiben. Dass man Zahlen nicht mit Strings vergleichen sollte, gilt immer noch. Fang an, eine Funktion zu schreiben und als nächsten Schritt alle Fragen und Antworten in eine Datenstruktur zu packen.
DomenikR.
User
Beiträge: 5
Registriert: Sonntag 25. August 2019, 10:47

Okay und wie mache ich diese datenstruktur
bin noch nicht so gut dadrin
kenne mich nur mit paar basics aus
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DomenikR.: Schreib am besten erst einmal eine Funktion die genau eine Frage stellt, dann siehst Du ja was Du dieser Funktion an Argumenten übergeben musst für jede der 6 Fragen. Wenn Du dann im Hauptprogramm statt 6 mal fast gleichen Code nur noch die sechs Aufrufe der einen Funktion hast, dann siehst Du leichter welche Daten pro Frage benötigt werden.

Im nächsten Schritt kannst Du diese Daten dann in eine Datenstruktur stecken und darüber dann mit einer Schleife laufen in der dann nur noch *einmal* der Funktionsaufruf für die Abarbeitung einer Frage steht.

Edit: Ach so: *Allererster* Schritt: Das bisherige in eine Funktion stecken die `main()` heisst.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sarapheus
User
Beiträge: 7
Registriert: Montag 20. August 2018, 22:13

Hey, habe auch vor kurzem wieder mit Python angefangen und habe mir dein Programm mal als Übung genommen.
Ich habe es ein wenig abgeändert, so das man es leichter mit Fragen erweitern kann und habe es auch geschafft es auf knapp 30 Zeilen Code runter zu brechen.
Hier mal mein Lösungsvorschlag, Kritik ist gerne erwünscht:

Code: Alles auswählen

punktestand = 0
fragen = ("1. Welche Einheit ist für Spannung?\n\n1: A\n2: V\n3: Ω\n4: U",
          "2. Was ist das Formelzeichen für Spannung ?\n\n1: P\n2: I\n3: R\n4: U",
          "3. Welche Einheit ist für Strom ?\n\n1: U\n2: P\n3: A\n4: I\n",
          "4. Was ist das Formelzeichen für Strom ?\n\n1: I\n2: P\n3: Ω\n4: U",
          "5. Was ist die Einheit für Leistung ?\n\n1: I\n2: A\n3: W\n4: P",
          "6. Was ist das Formelzeichen für Leistung ?\n\n1: U\n2: P\n3: I\n4: Ω")
antworten = (2 , 4 , 3 , 1, 3, 2)
print ("Antworte mit den Zahlen.")

for frage in fragen:
    print (frage)
    while True:
        try:
            antwort = int(input())
            break
        except ValueError:
            print("Falsche Eingabe, es wurde keine Zahl eingegeben.\nAntwort erneut eingeben.\n")
    if antwort == antworten[fragen.index(frage)]:
        punktestand +=1
        print ("Richtige Antwort")
        print ("Punktestand: " + str(punktestand))
    else:
        print ("Falsche antwort")

print ("Ende\n Du solltest immer weiter Lernen!")
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

›fragen‹ sollte eine Liste sein, kein Tuple, weil in einem Tuple jedes Element eine bestimmte Bedeutung hat und nicht aus gleichartigen Elementen besteht.
Es ist schlecht, dass ›fragen‹ von den ›antworten‹ getrennt sind; nicht nur, weil Du später den Index der Frage mit `index` ermitteln mußt. Es ist einfach nur sehr schwierig, auf anhieb die Antwort auf die vierte Frage zu finden. Üblich ist es, Frage und Antwort in ein Tuple zu packen und diese Paar dann in eine Liste. Zwischen Funktionsname und öffnende Klammer kommt kein Leerzeichen.
Statt + und str benutzt man Stringformatierung.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eine weitere Möglichkeit die Fragen und dazugehörigen Antworten zusammen zu fassen wäre auch eine Frage und eine Liste mit Antworten jeweils in einem Tupel zusammen zu fassen. Die erste Antwort ist dabei immer die richtige. Und wenn man die dem Benutzer präsentiert, zeigt man sie ihm in randomisierter Reihenfolge.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten