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";    
         }
    

Anmelden zum Antworten