Wo liegt der Fehler?

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
Nik98
User
Beiträge: 6
Registriert: Freitag 19. Juni 2015, 16:26

Guten Tag,
ich arbeite gerade an einem Code, der erarbeiten soll, ob man das Schuljahr schafft oder nicht.
Nun habe ich zwei Fehler.
1. Wenn man ein Nebenfach mit zwei Fächern zu je 7 Punkten ausgleichen will, so endet das Programm nicht.
2. Am Ende soll ausgegeben werden, Welche Fächer mit welchen ausgeglichen werden konnten. Wenn es sich um Fächer mit unterschiedlichen Noten handelt, dann geht alles, wenn die Noten gleich sind, dann wird zweimal das selbe Fach ausgegeben

Es würde mich sehr freuen, wenn mir jemand helfen könnte, wo meine Fehler liegen.

Code: Alles auswählen

# Noch gucken: 0 im freiwilligen Fach
# keine falschen Werte eingeben

# Variable

ausgang=0
hauptfaecherunter5=0
nebenfaecherunter5=0
hauptfaecherzehn=0
funktionende=1
gesamtzehn=0
exit=0
gesamtsieben=0
exitzwo = 0
poshaupt = 0
hauptausgleichen = ""
hauptaus = ""
hauptaus2 = ""
nebenausgleichen = ""
nebenaus = ""
nebenaus2 = ""
tt = 1
              



#Start

print          ("==================== VERSETZUNGSRECHNER ====================")

print ("")

# Eingabe
mathe=int(input("Bitte geben sie ihre Mathematik-Note ein:                 "))
deutsch=int(input("Bitte geben sie ihre Deutsch-Note ein:                    "))
fremdsprache1=int(input("Bitte geben sie die Note ihrer ersten Fremdsprache ein:   "))
fremdsprache2=int(input("Bitte geben sie die Note ihrer zweiten Fremdsprache ein:  "))

biologie=int(input("Bitte geben sie ihre Biologie-Note ein:                   "))
chemie=int(input("Bitte geben sie ihre Chemie-Note ein:                     "))
religion=int(input("Bitte geben sie ihre Religions/ Ethik-Note ein:           "))
geschichte=int(input("Bitte geben sie ihre Geschichts-Note ein:                 "))
musischesfach=int(input("Bitte geben sie die Note ihres musischen Faches ein:      "))
physik=int(input("Bitte geben sie ihre Physik-Note ein:                     "))
politik=int(input("Bitte geben sie ihre Politik-Note ein:                    "))
sport=int(input("Bitte geben sie ihre Sport-Note ein:                      "))

freiwilligesfach=int(input("Bitte geben die Note ihres Wahlfaches ein:                "))

#alle richtig?
richtig=[]
richtig.append(mathe)
richtig.append(deutsch)
richtig.append(fremdsprache1)
richtig.append(fremdsprache2)
richtig.append(biologie)
richtig.append(chemie)
richtig.append(religion)
richtig.append(geschichte)
richtig.append(musischesfach)
richtig.append(physik)
richtig.append(politik)
richtig.append(sport)
richtig.append(freiwilligesfach)

for p in richtig:
    if p>15 or p<0:
        print ("")
        print ("Bitte geben sie ihre Punktzahlen aus der E-Phase ein!")
        import sys
        sys.exit()
        

# Ein Fach unter 0 Punkten?

pruefer0=[]
pruefer0.append(mathe)
pruefer0.append(deutsch)
pruefer0.append(fremdsprache1)
pruefer0.append(fremdsprache2)
pruefer0.append(biologie)
pruefer0.append(chemie)
pruefer0.append(religion)
pruefer0.append(geschichte)
pruefer0.append(musischesfach)
pruefer0.append(physik)
pruefer0.append(politik)
pruefer0.append(sport)

for x in pruefer0:
    if x==0:
        print ("")
        print ("Sie sind nicht zu Q-Phase zugelassen.")
        tt = 0
        ausgang=1


        
if ausgang!=1:
   
    # Einteilen in Haupt- und Nebenfächer
    
    hauptfaecher=[]
    nebenfaecher=[]
    freiwilligefaecher=[]
    zusatz=[]

    hauptfaecher.append(mathe)
    hauptfaecher.append(deutsch)
    hauptfaecher.append(fremdsprache1)
    hauptfaecher.append(fremdsprache2)

    nebenfaecher.append(biologie)
    nebenfaecher.append(chemie)
    nebenfaecher.append(religion)
    nebenfaecher.append(geschichte)
    nebenfaecher.append(musischesfach)
    nebenfaecher.append(physik)
    nebenfaecher.append(politik)
    nebenfaecher.append(sport)

    freiwilligefaecher.append(freiwilligesfach)


    zusatz.append(mathe)
    zusatz.append(deutsch)
    zusatz.append(fremdsprache1)
    zusatz.append(fremdsprache2)
    zusatz.append(biologie)
    zusatz.append(chemie)
    zusatz.append(religion)
    zusatz.append(geschichte)
    zusatz.append(musischesfach)
    zusatz.append(physik)
    zusatz.append(politik)
    zusatz.append(sport)
    zusatz.append(freiwilligesfach)

    
   
    # Mehr als zwei Hauptfaecher unter 5 Punkten?

    for y in hauptfaecher:
        if y < 5:
            hauptfaecherunter5=hauptfaecherunter5+1
            

           
    if hauptfaecherunter5 > 1:
        ausgang=1
        print ("Du hast in 2 oder mehr hauptfaechern keine 5 Punkte erreicht")
        tt = 0

        
# Mehr als drei Nebenfaecher unter 5 Punkten?

if ausgang!=1:
    for z in nebenfaecher:
        if z < 5:
            nebenfaecherunter5=nebenfaecherunter5+1
            
    if nebenfaecherunter5 > 2:
        ausgang=1
        print ("Du hast in 3 oder mehr Nebenfaechern keine 5 Punkte erreicht")
        tt = 0
        

       
# Ausgleich Hauptfaecher


if ausgang!=1:
    if hauptfaecherunter5 > 0:
       

        # Welches Hauptfach muss ausgeglichen werden
        for g in hauptfaecher:
            if g < 5:
                poshaupt = hauptfaecher.index(g)
                
                if poshaupt == 0:
                    hauptausgleichen = "Mahthe"
                if poshaupt == 1:
                    hauptausgleichen = "Deutsch" 
                if poshaupt == 2:
                    hauptausgleichen = "Fremdsprache 1"
                if poshaupt == 3:
                    hauptausgleichen = "Fremdsprache 2"

                   

        
        for j in hauptfaecher:
            if j > 9:
                hauptfaecherzehn=hauptfaecherzehn+1
        if hauptfaecherzehn > 0:

            # Womit wird ausgeglichen
            wert1=[]
            for zui in hauptfaecher:
                wert1.append(zui)
                
            wert1.sort()
            groesster=hauptfaecher.index(wert1.pop())
            
            if groesster == 0:
                hauptaus = "Mahthe"
            if groesster == 1:
                hauptaus = "Deutsch" 
            if groesster == 2:
                hauptaus = "Fremdsprache 1"
            if groesster == 3:
                hauptaus = "Fremdsprache 2"

          
                        
                    
            
            
            hauptfaecher.sort()
            hauptfaecher.pop()
            hauptfaecherunter5 = hauptfaecherunter5-1
          
        
            funktionende = 0


    # Ausgleich mit 7 Punkten        
    hauptfaechersiebenn=[]
    hauptfaechersieben=0
    
    if funktionende == 1:
    
        for sieben in hauptfaecher:
            if sieben > 6:
                hauptfaechersieben=hauptfaechersieben+1
        if hauptfaechersieben > 1:

            
            # Womit wird ausgeglichen
            wert2=[]
            for zuu in hauptfaecher:
                wert2.append(zuu)
                
            wert2.sort()
            groesster1=hauptfaecher.index(wert2.pop())
            if groesster1 == 0:
                hauptaus = "Mahthe"
            if groesster1 == 1:
                hauptaus = "Deutsch" 
            if groesster1 == 2:
                hauptaus = "Fremdsprache 1"
            if groesster1 == 3:
                hauptaus = "Fremdsprache 2"
                
            wert2.sort()
            print (wert2)
            groesster2=hauptfaecher.index(wert2.pop())
            if groesster2 == 0:
                hauptaus2 = "Mahthe"
            if groesster2 == 1:
                hauptaus2 = "Deutsch" 
            if groesster2 == 2:
                hauptaus2 = "Fremdsprache 1"
            if groesster2 == 3:
                hauptaus2 = "Fremdsprache 2"

            hauptausgleichen= hauptaus
            hauptausgleichen2= hauptaus2
            


            
            hauptfaecher.sort()
            hauptfaecher.pop()
            hauptfaecher.pop()
            hauptfaecherunter5 = hauptfaecherunter5-1
        


    # Schreibe neue Gesamt-List
    
    gesamtliste=[]
    for werte in hauptfaecher:
       gesamtliste.append(werte)
    for w in nebenfaecher:
        gesamtliste.append(w)
    for domi in freiwilligefaecher:
        gesamtliste.append(domi)




    # Gleiche Nebenfaecher aus
    nebenausliste=[]
    if nebenfaecherunter5 < 4:

        s = nebenfaecherunter5

        # Welches Nebenfach muss ausgeglichen werden
        for u in nebenfaecher:
            if u < 5:
                posneben=nebenfaecher.index(u)
                if posneben == 0:
                    nebenausgleichen += "Biologie "
                if posneben == 1:
                    nebenausgleichen += "Chemie "
                if posneben == 2:
                    nebenausgleichen += "Religion "
                if posneben == 3:
                    nebenausgleichen += "Geschichte "
                if posneben == 4:
                    nebenausgleichen += "musisches Fach " 
                if posneben == 5:
                    nebenausgleichen += "Physik "
                if posneben == 6:
                    nebenausgleichen += "Politik "
                if posneben == 7:
                    nebenausgleichen += "Sport "

        for c in gesamtliste:
                if c > 9:
                    gesamtzehn=gesamtzehn+1
                
        while( s > 0 and exit == 0):
            if gesamtzehn > 0:
                gesamtliste.sort()
                stelle1=zusatz.index(gesamtliste.pop())
                

                if stelle1 == 0:
                    nebenaus += "Mathe "
                if stelle1 == 1:
                    nebenaus += "Deutsch "
                if stelle1 == 2:
                    nebenaus += "1. Fremdsprache "
                if stelle1 == 3:
                    nebenaus += "2. Fremdsprache "
                if stelle1 == 4:
                    nebenaus += "Biologie " 
                if stelle1 == 5:
                    nebenaus += "Chemie "
                if stelle1 == 6:
                    nebenaus += "Religion "
                if stelle1 == 7:
                    nebenaus += "Geschichte "
                if stelle1 == 8:
                    nebenaus += "musisches Fach "
                if stelle1 == 9:
                    nebenaus += "Pysik "
                if stelle1 == 10:
                    nebenaus += "Politik "
                if stelle1 == 11:
                    nebenaus += "Sport "
                if stelle1 == 12:
                    nebenaus += "freiwilliges Fach "
                
            
                nebenfaecherunter5 = nebenfaecherunter5-1
                s = s-1
                
        while (s > 0 and exitzwo==0):
            if nebenfaecherunter5 > 0:
      

                for p in gesamtliste:
                    if p > 6:
                        gesamtsieben=gesamtsieben+1

                if gesamtsieben > 1:
                    gesamtsieben.sort()
                    stelle2=zusatz.index(gesamtsieben.pop())
                    if stelle2 == 0:
                        nebenaus += "Mathe "
                    if stelle2 == 1:
                        nebenaus += "Deutsch "
                    if stelle2 == 2:
                        nebenaus += "1. Fremdsprache "
                    if stelle2 == 3:
                        nebenaus += "2. Fremdsprache "
                    if stelle2 == 4:
                        nebenaus += "Biologie " 
                    if stelle2 == 5:
                        nebenaus += "Chemie "
                    if stelle2 == 6:
                        nebenaus += "Religion "
                    if stelle2 == 7:
                        nebenaus += "Geschichte "
                    if stelle2 == 8:
                        nebenaus += "musisches Fach "
                    if stelle2 == 9:
                        nebenaus += "Pysik "
                    if stelle2 == 10:
                        nebenaus += "Politik "
                    if stelle2 == 11:
                        nebenaus += "Sport "
                    if stelle2 == 12:
                        nebenaus += "freiwilliges Fach "
             
                    stelle3=zusatz.index(gesamtsieben.pop())
                    if stelle3 == 0:
                        nebenaus += "Mathe "
                    if stelle3 == 1:
                        nebenaus += "Deutsch "
                    if stelle3 == 2:
                        nebenaus += "1. Fremdsprache "
                    if stelle3 == 3:
                        nebenaus += "2. Fremdsprache "
                    if stelle3 == 4:
                        nebenaus += "Biologie " 
                    if stelle3 == 5:
                        nebenaus += "Chemie "
                    if stelle3 == 6:
                        nebenaus += "Religion "
                    if stelle3 == 7:
                        nebenaus += "Geschichte "
                    if stelle3 == 8:
                        nebenaus += "musisches Fach "
                    if stelle3 == 9:
                        nebenaus += "Pysik "
                    if stelle3 == 10:
                        nebenaus += "Politik "
                    if stelle3 == 11:
                        nebenaus += "Sport "
                    if stelle3 == 12:
                        nebenaus += "freiwilliges Fach "
                             

                    if gesamtsieben < 1:
                        exitzwo = 1

# Konnte alles erforderliche ausgeglichen werden?


if tt==1:
    print ("Du hast bestanden - Wir sehen uns in der Q1")
    print ("Du konntest")
    print (hauptausgleichen)
    print ("mit")
    print (hauptaus)
    print (hauptaus2)
    print ("ausgleichen")
    print ("")
    print ("Du konntest")
    print (nebenausgleichen)
    print ("mit")
    print (nebenaus)
    print ("ausgleichen")


Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Das sieht nicht schön aus, wenn ich das mal anmerken darf. Da verging mir gerade schon die Lust es überhaupt zu lesen.

Mal eine ganz einfache Frage: Was genau muss für eine Versetzung in der Stufe erfüllt sein!?

Meine Frage zielt darauf, dass ich diese Prüfung gerne auslagern möchte und mir nicht denken kann, dass dafür so viele Codezeilen erforderlich sind. Ich habe andere Programme, die komplexere Sachen berechnen und mit weniger Zeilen auskommen, deutlich weniger Zeilen.

Schon erste Anmerkungen:
- Importe ganz nach oben (import sys)
- Trenne sauber zwischen Eingabe, Verarbeitung und Ausgabe
- Arbeite mit Funktionen
- Versuch Redundanz (Code smell) zu vermeiden
-- Code-Duplizierung bekommst du raus, wenn du die Listen-append-Sachen in eine Schleife packst
-- Du hast nirgendwo Fächer definiert, d. h. du arbeitest sehr konkret und abstrahierst nicht gut, d. h. bei einer Änderung der Situation ergeben sich erhebliche Anpassungserfordernisse
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Sollte dir wirklich jemand helfen, dann gib doch mal genau an, welche Eingaben fehlerhaft sind, was du erwartest und was rauskommt. Hier ist vermutlich die Mehrheit aus dem Schulalter heraus und keiner hat die Lust sich durch über 400LOC fiesesten Stück Code zu wühlen.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich stimme meinem Vorredner zu.

Nur mal als Beispiel, wie man die Eingabe auch lösen könnte:

Code: Alles auswählen

faecher = ["Mathe", "Deutsch", "Fremdsprache1", "Fremdsprache2", "Biologie", "Chemie", "Religion", "Geschichte", "Musisches Fach", "Physik", "Politik", "Sport", "Häkeln"]
punkte  = []

# Eingabe
for fach in faecher:
    ergebnis = input("Punkte im Fach {}: ".format(fach))
    punkte.append(int(ergebnis))

# Verarbeitung
print(punkte)
Mal einige Hinweise: Beim obigen (deinem) Code ist, dass man eigentlich dynamisch codieren sollte, was Haupt- und Nebenfächer sind und d. h., meine Datenstruktur bildet das nicht ab. Der Quelltext passt daher für deine Situation, nicht aber auf eine andere, wo z. B. jemand nur eine Fremdsprache hat. Neben einem Wörterbuch wäre m. E. auch eine Klasse mit dem Stundenplan denkbar.

Wenn du meinen Eingabe-Quelltext in einer Funktion kapselst, dann kannst du dort auch eine Routine implementieren, die die Eingaben des Benutzers prüft. BTW: Aktuell sollte dir der Code zeigen, dass die Eingabe in 3 Zeilen möglich ist, dafür die Verarbeitungszeile. Wahrscheinlich kommt man nicht umhin dich auf das Tutorial zu verweisen.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Um es nochmal deutlicher zu sagen, was pixewakb schon angedeutet hat: Jedes Fach sollte maximal einmal konkret im Quelltext stehen, und zwar, z.B. wenn es in eine Liste geschrieben wird, dort kannst Du dann auch in Haupt- und Nebenfächer unterscheiden:

Code: Alles auswählen

hauptfaecher = ["Mathe", "Deutsch", "Fremdsprache1", "Fremdsprache2"]
nebenfaecher = ["Biologie", "Chemie", "Religion", "Geschichte", "Musisches Fach", "Physik", "Politik", "Sport"]
freiwilligenfaecher = ["Häkeln"]
Aller weiterer Code baut auf diese Listen auf:

Code: Alles auswählen

punkte = {}
for fach in hauptfaecher + nebenfaecher + freiwilligenfaecher:
    ergebnis = input("Punkte im Fach {}: ".format(fach))
    punkte[fach] = int(ergebnis)
Hier verwende ich ein Wörterbuch, weil mehrere Listen, die man synchron halten muß, viel zu fehleranfällig sind. Bei drei Listen gibt es ja auch keinen eindeutigen Index mehr, über den man auf eine punkte-Liste zugreifen könnte. Methoden wie "pop" oder "index" braucht man normalerweise nicht und für Dein Programm erst recht nicht.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

pixewakb hat geschrieben: Mal eine ganz einfache Frage: Was genau muss für eine Versetzung in der Stufe erfüllt sein!?
* Kein Fach darf 0 Punkte haben
* Es dürfen nicht 2 oder mehr Hauptfächer unter 5 Punkte liegen, ohne dass das ausgeglichen werden kann. Ausgeglichen wird ein Hauptfach, indem ein Nebenfach über mindestens 10 Punkte verfügt. Alternativ wenn 2 Nebenfächer mindestens 7 Punkte haben. Das ist solange zu wiederholen, bis genug Hauptfächer ausgeglichen sind.
* Es dürfen nicht 3 oder mehr Nebenfächer unter 5 Punkte liegen, ohne dass das ausgeglichen werden kann. Wie ausgeglichen werden kann, hab ich nicht verstanden.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
AxXel001
User
Beiträge: 29
Registriert: Sonntag 7. Juni 2015, 22:22

Du könntest folgenden Ansatz verfolgen:

Code: Alles auswählen

punktverteilung = {
    "mathe" : 8,
    "deutsch" : 11,
    ...
}
hauptfaecher = [ "mathe", "deutsch", ... ]
nebenfaecher = [ "bio", ... ]

# Kein Fach 0 Punkte
if [ punktverteilung[name] for name in hauptfaecher+nebenfaecher].count(0) > 0:
    print "Nicht versetzt"
Die anderen Bedingungen sind etwas komplexer aber prinzipiell auch so machbar
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Wieso verwenden eigentlich hier alle Listen statt Tupel? Hier wird doch nie etwas verändert. Bezieht sich auf die Fächer.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Ich würde trotzdem Listen verwenden da semantisch alle Elemente die gleiche Bedeutung haben, zum Beispiel Namen von Schulfächern. Tupel eher für Daten bei denen jeder Index eine unterschiedliche Bedeutung hat. Also beispielsweise wenn man einen Schüler als (Name, Vorname, Klasse) repräsentieren möchte.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Gut, eine Geschmacksfrage, denn deine Definition ist exakt die von Tupel.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Meine Definition von was? Ich habe doch recht deutlich unterschieden wann Liste und wann Tupel für mich semantisch die bevorzugte Wahl ist. Ja, das ist Geschmackssache und ich habe mich da dem ausdrücklichen Geschmack von Guido van Rossum und anderen Regulars aus `comp.lang.python` angeschlossen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Geschmacksfrage ist dass nicht wirklich. Das ist schon eine recht populäre Konvention und guter Code hält die auch ein. Wenn man heterogene Daten hat und die verändern will sollte man zu einer Klasse aber nicht zu einer Liste greifen.
Antworten