Unbekannter Fehler (Schaltjahreszählung)
-
Bisher funktionierte alles einwandfrei:
Jetz habe ich einen Schaltjahreszähler eingebaut, und plötzlich zählt er die Monate mit 30 Tagen doppelt.
#include <iostream> using namespace std; int tz=1; //tageszähler int mo=1; //Monatszähler int gtz=0; //durchgehender Tageszähler int kjz; // Kleiner Jahreszähler (Tetraeteris) int main () { for (int kjz=1; kjz<5; kjz=kjz+1) { for(int mo=1; mo<13; mo=mo+1) //Monatszählerschleife { if (mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12) //Tageszählerschleife für 31 Tage MONATE { for(int tz=1; tz<32; tz=tz+1) { gtz=gtz+1; int Tag=Tag+ 1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"MonatSENDE \n \n"; } else { if (mo==4||mo==6||mo==9||mo==11) { for(int tz=1; tz<31; tz=tz+1)//Tageszählerschleife für 30 Tage MONATE { gtz=gtz+1; int Tag=Tag+1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"Monatende \n \n"; } if (mo==2&&kjz==4) { for(int tz=1; tz<30; tz=tz+1)//Tageszählerschleife für 29 Tage Schaltjahr { gtz=gtz+1; int Tag=Tag+1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"Februar \n \n"; } else { for(int tz=1; tz<29; tz=tz+1)//Tageszählerschleife für 28 Tage NichtSchaltjahr { gtz=gtz+1; int Tag=Tag+1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"Februar \n \n"; } } } cout<<"JAHRESENDE JAHR = " <<kjz<< "\n \n"; } }
-
Erstmal ordentlich eingerückt:
#include <iostream> using namespace std; int tz=1; //tageszähler int mo=1; //Monatszähler int gtz=0; //durchgehender Tageszähler int kjz; // Kleiner Jahreszähler (Tetraeteris) int main () { for (int kjz=1; kjz<5; kjz=kjz+1) { for(int mo=1; mo<13; mo=mo+1) //Monatszählerschleife { if (mo==1||mo==3||mo==5||mo==7||mo==8||mo==10||mo==12) //Tageszählerschleife für 31 Tage MONATE { for(int tz=1; tz<32; tz=tz+1) { gtz=gtz+1; int Tag=Tag+ 1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"MonatSENDE \n \n"; } else { if (mo==4||mo==6||mo==9||mo==11) { for(int tz=1; tz<31; tz=tz+1)//Tageszählerschleife für 30 Tage MONATE { gtz=gtz+1; int Tag=Tag+1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"Monatende \n \n"; } if (mo==2&&kjz==4) { for(int tz=1; tz<30; tz=tz+1)//Tageszählerschleife für 29 Tage Schaltjahr { gtz=gtz+1; int Tag=Tag+1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"Februar \n \n"; } else { for(int tz=1; tz<29; tz=tz+1)//Tageszählerschleife für 28 Tage NichtSchaltjahr { gtz=gtz+1; int Tag=Tag+1; cout<<"TN = "<<gtz<<" Tag " <<tz<<" Monat "<<mo<< " \n"; } cout<<"Februar \n \n"; } } } cout<<"JAHRESENDE JAHR = " <<kjz<< "\n \n"; } }if (mo==4||mo==6||mo==9||mo==11) { } if (mo==2&&kjz==4) { } else { }Na? Was denkst du?
if( mo==2 && kjz==4) startet eine neues if! Das hat mit dem ersten nichts zu tun! Wenn du dann in den else-Zweig springst, ist auch die erste (mit den 30-Tage-Monaten) wieder true.Im übrigen hast du wahnsinnig viel Code-Duplizierungen. Solltest dir überlegen ob das nicht einfacher geht.
-
Du solltest dir überlegen, ob es nicht sinnvoller wäre, Variablennamen zu wählen, die man ohne den Kommentar bei der Definition versteht, auch wenn diese dann mal mehr als drei Buchstaben haben.
-
Danke, jetzt funktioniert es. Bin leider blutiger Anfänger. Wie kann man denn die Duplizierungen kürzen?
Ich habe übrigens nur das Els mit
if (mo==2&&kjz<4)ausgerüstet.
Übrigens macht Programmieren Spaß.... wenn es flutscht.
-
Quelltext wird durch die Verwendung von Funktionen übersichtlicher und verhindert Code Duplizierungen. Du solltest über die Verwendung einer Funktion nachdenken, die überprüft, ob ein Jahr ein Schaltjahr ist.
-
Was denkst du - ist 2100 ein Schaltjahr?
-
Also ich könnte mir so eine Funktion vorstellen, die den cout-Befehl auslagert, dann muß ich ihn nicht immer in allen Schleifen verändern.
int Print(int, int); //Deklaration der Funktion for ()// Schleife { Ich weiß nicht, wie ich den Befehl hier aufrufe! } int Print() //Definition einer Funktion { cout<<"TN = "<<gtz<<" TT "<<gtz%7<<" WN "<<1+gtz/7<<" Tag " <<tz<<" Monat "<<mo<< " \n"; }