Übung Schaltjahr



  • Hallo liebe Gemeinde.

    Ich habe heute erst Übungen für meine Prüfung bekommen.

    Die erste Übung lautet:

    Schreiben sie eine Funktion istSchaltjahr(), die ermittelt, ob es sich bei einem eingegebenen Jahr um ein Schaltjahr handelt oder nicht. Der Funktion wird das Jahr übergeben, handelt es sich um ein Schaltjahr wird ‚true’ zurückgeliefert, wenn nicht ‚false’. Ein Jahr ist ein Schaltjahr, wenn die Jahreszahl durch 4 teilbar ist, aber nicht wenn sie durch 100 teilbar ist, außer wenn sie durch 400 teilbar ist. Der Rückgabedatentyp ist Boolean (bool).
    Lesen die Jahreszahl im Hauptprogramm ein und rufen sie diese Funktion aus dem Hauptprogramm auf. Das Ergebnis, ob es sich um ein Schaltjahr handelt oder nicht wird wieder im Hauptprogramm ausgegeben.
    Beispiel für die Ein- und Ausgabe:
    Zu prüfendes Jahr: 2000
    Das Jahr 2000 ist ein Schaltjahr

    Bin ich mit folgendem Quellcode auf dem richtigen Weg??

    #include <iostream>
    using namespace std;
    
    bool istSchaltjahr(int Jahr)
    {
    	if(Jahr/4)
    		if (Jahr/400)
    		{
    			Jahr = true;
    		}
    		else(Jahr/100)
    		{
    			Jahr = false
    		}
    }
    
    int main()
    {
    	cout << "Pruefung auf Schaltjahr!" << endl;
    	cout << "Zu pruefendes Jahr: ";
    	int Jahr;
    	cin  >> Jahr;
    	Jahr = Schaltjahr(Jahr);
    
    	return 0;
    }
    

    Weil ich komme mir meilenweit davon entfernt vor, den richtigen Quellcode geschrieben zu haben.



  • Ein paar Hinweise:
    Eine Funktion gibt werte mit "return Wert;" zurück. Wobei "Wert" den gleichen Typ haben muss wie der Rückgabetyp der Funktion (in diesem Fall bool) :

    bool istSchaltjahr(int Jahr){
    ...
    return true;
    }
    

    Und du solltest du dir deine verschachtelten Bedingungen in der istSchaltjahr Funktion genauer ansehen. Im Moment ist das Jahr laut deiner Funktion nur ein Schaltjahr, wenn Jahr durch 4 UND durch 400 teilbar ist.

    Außerdem weist du in Main einem Integer (Jahr) einen bool-Wert zu (den Rückgabewert der Funktion istSchaltjahr())

    Und du solltest den Modulo operator ( % ) verwenden, also:

    if(Jahr%4==0)
    


  • Du solltest Modulo verwenden und nicht /.



  • Ist folgender Ansatz richtig?

    bool istSchaltjahr(int Jahr)
    {
    	bool schaltjahr = false;
    
    	if(!(Jahr % 4))
    	{
    		if (!(Jahr % 100))
    		{
    			if (!(Jahr % 400))
    				schaltjahr = true;
    			else
    				schaltjahr = false;
    		}
    		else
    			schaltjahr = true;
    	}
    
    	return schaltjahr;
    }
    


  • Nein... Debuggs halt durch, dann wirst du sehen, an welcher Stelle was falsches passiert.



  • // Ermitteln ob ein Jahr ein Schaltjahr ist
    
    #include <iostream>
    using namespace std;
    
    bool istSchaltjahr(int Jahr)
    {
    	bool schaltjahr = false;
    
    	if(!(Jahr % 4))
    	{
    		if (!(Jahr % 100))
    		{
    			if (!(Jahr % 400))
    				schaltjahr = true;
    			else
    				schaltjahr = false;
    		}
    		else
    			schaltjahr = true;
    	}
    
    	return schaltjahr;
    }
    
    int main()
    {
    	cout << "Zu pruefendes Jahr: ";
    	int Jahr;
    	cin  >> Jahr;
    
    	Jahr = istSchaltjahr(Jahr);
    
    	if (istSchaltjahr)
    		cout << "Das Jahr " << Jahr << " ist ein Schaltjahr!" << endl;
    	else
    		cout << "Das Jahr " << Jahr << " ist kein Schaltjahr!" << endl;
    
    	return 0;
    }
    

    Der Compiler/Debugger mekert zwar nicht, aber egal welches Jahr ich eingebe, es kommt immer ein Schaltjahr raus.
    Habe ich irgendetwas übersehen? Weil mir tut schon der Kopf weh vor lauter hinschauen...



  • deswegen sollst du ja nicht hinschauen sondern mit dem Debugger Zeile für Zeile durch deine Funktion springen und dabei überlegen, ob das was der Code tut, das ist, was wirklich passieren sollte.

    greetz KN4CK3R



  • Das mit dem Debugger solltest du dir ausführlicher ansehen 😉

    Eigentlich merkst du schon bei der Bedienung des Programms wo es klemmt.
    Du gibst fürs Jahr z.B.: 2003 ein.
    Und was zeigen dir Zeile 35 oder 37 als Werte fürs Jahr?

    Überleg mal warum das so ist?



  • silent_max schrieb:

    bool istSchaltjahr(int Jahr)
    {
    	bool schaltjahr = false;
    
    	if(!(Jahr % 4))
    	{
    		if (!(Jahr % 100))
    		{
    			if (!(Jahr % 400))
    				schaltjahr = true;
    			else
    				schaltjahr = false;
    		}
    		else
    			schaltjahr = true;
    	}
    	
    	return schaltjahr;
    }
    

    SESE (single entry, singe exit) und die Bool'sche Flagge mag ich nicht. SESE ist unter C Programmierern beliebt. Es wird wohl eingesetzt, teilweise in Verbindung mit goto, um Resourcen vernünftig zu verwalten und die Freigabe nicht zu vergessen. In C++ brauchen wir das nicht. Ich finde das hier schöner:

    bool istSchaltjahr(int Jahr)
    {
        if ((Jahr %   4)!=0) return false;
        if ((Jahr % 400)==0) return true;
        if ((Jahr % 100)==0) return false;
        return true;
    }
    


  • f.-th. schrieb:

    Das mit dem Debugger solltest du dir ausführlicher ansehen 😉

    Eigentlich merkst du schon bei der Bedienung des Programms wo es klemmt.
    Du gibst fürs Jahr z.B.: 2003 ein.
    Und was zeigen dir Zeile 35 oder 37 als Werte fürs Jahr?

    Überleg mal warum das so ist?

    Ich habe einmal nachgedacht.

    Irgendwie haut das mit der Funktionsübergabe noch nicht hin. Ich sehe einfach den Fehler nicht.

    int main()
    {
    	cout << "Zu pruefendes Jahr: ";
    	int Jahr;
    	cin  >> Jahr;
    
    	int Jahr_ = istSchaltjahr(Jahr);
    
    	if (istSchaltjahr)
    		cout << "Das Jahr " << Jahr_ << " ist ein Schaltjahr!" << endl;
    	else
    		cout << "Das Jahr " << Jahr_ << " ist kein Schaltjahr!" << endl;
    
    	return 0;
    }
    

    Hat einer von euch einen Tipp oder einen Hinweis?



  • Du sollst nicht raten 😉

    Jetzt hast du Zeile 7 noch verschlimmbessert. Lass die weg.
    Auch deine anderen Verbesserungen sind schlecht.

    Ergänze statt dessen Zeile 9 entsprechend.



  • f.-th. schrieb:

    Du sollst nicht raten 😉

    Jetzt hast du Zeile 7 noch verschlimmbessert. Lass die weg.
    Auch deine anderen Verbesserungen sind schlecht.

    Ergänze statt dessen Zeile 9 entsprechend.

    // Ermitteln ob ein Jahr ein Schaltjahr ist
    
    #include <iostream>
    using namespace std;
    
    bool istSchaltjahr(int Jahr)
    {
        bool schaltjahr = false;
    
        if(!(Jahr % 4))
        {
            if (!(Jahr % 100))
            {
                if (!(Jahr % 400))
                    schaltjahr = true;
                else
                    schaltjahr = false;
            }
            else
                schaltjahr = true;
        }
    
        return schaltjahr;
    }
    
    int main()
    {
    	cout << "Zu pruefendes Jahr: ";
    	int Jahr;
    	cin  >> Jahr;
    
    	istSchaltjahr(Jahr);
    
    	if (Jahr)
    		cout << "Das Jahr " << Jahr << " ist ein Schaltjahr!" << endl;
    	else
    		cout << "Das Jahr " << Jahr << " ist kein Schaltjahr!" << endl;
    
    	return 0;
    }
    

    So, jetzt wird wenigstens etwas sinnvolles, aber nicht richtiges ausgegeben.

    Jetzt ist komischerweise jedes Jahr, das ich eingebe, ein Schaltjahr. Dann muss ja doch noch an der Funktion etwas verkehrt sein.

    Ich bitte euch echt um Hilfe, ich bin kurz davor, durchzudrehen, da ich den Fehler einfach nicht sehe.



  • Boa hier:

    #include <iostream>
    
    bool istSchaltjahr(int jahr)
    {
        if((jahr % 4 == 0) && (jahr % 100 != 0))
            return true;
        else if(jahr % 400 == 0)
            return true;
        return false;
    }
    
    int main()
    {
        int einJahr;
        std::cout << "Gebe ein jahr ein: ";
        std::cin >> einJahr;
        if(istSchaltjahr(einJahr))
            std::cout << einJahr << " ist ein Schaltjahr!\n";
        else
            std::cout << einJahr << " ist kein Schaltjahr!\n";
        return 0;
    }
    

    Die Funktion istSchaltjahr(int jahr) ist 1:1 von diesem Satz abgelitten.

    Edit: Naja ok, es sind 2 Sätze. Die ersten beiden.


Anmelden zum Antworten