Seite 1 von 1

Wo liegt der Fehler?

Verfasst: Sonntag 21. Juni 2015, 17:14
von Nik98
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")



Re: Wo liegt der Fehler?

Verfasst: Sonntag 21. Juni 2015, 18:29
von pixewakb
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

Re: Wo liegt der Fehler?

Verfasst: Sonntag 21. Juni 2015, 21:42
von darktrym
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.

Re: Wo liegt der Fehler?

Verfasst: Sonntag 21. Juni 2015, 22:01
von pixewakb
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.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 08:55
von Sirius3
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.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 09:29
von Kebap
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.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 09:58
von AxXel001
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

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 15:23
von darktrym
Wieso verwenden eigentlich hier alle Listen statt Tupel? Hier wird doch nie etwas verändert. Bezieht sich auf die Fächer.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 15:58
von 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.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 16:46
von darktrym
Gut, eine Geschmacksfrage, denn deine Definition ist exakt die von Tupel.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 16:53
von 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.

Re: Wo liegt der Fehler?

Verfasst: Montag 22. Juni 2015, 16:55
von DasIch
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.