Brauch mal jemand der Ahnung hat. Funktionen auslagern



  • Wir sollten die Funktion Schaltjahr auslagern.
    Das wäre meine ausgelagerte Funktion.

    bool istSchaltjahr(int jahr){
    if (jahr % 4 == 0)
    {
    jahr = false;

        if(jahr % 100== 0){
            
            if (jahr % 400 == 0)
            {
                jahr = true;
            }
        else {
            jahr = false;
        }
            
        }else {jahr = true;}
    
    }else { jahr = false;}
    
    
    return jahr;
    

    }

    Und so sieht meine Main Funktion aus?
    //Eingabe//
    cout << endl;
    cout << ("Jahreszahl ");
    cin >> jahr;
    jahr = istSchaltjahr(jahr);
    if (jahr == true){
    cout << jahr << " ist ein Schaltjahr" << endl;}
    else{
    cout << jahr << " ist kein Schaltjahr" << endl;}

    Mein Prof meinte ich hab irgendwas mit dem Datentyp verkackt?
    muss ich bool jahr; also Variable definieren??



  • Zumindest hast du die Quelltext-Formatierung verkackt.
    Funktioniert deine istSchaltjahr Funktion? Wenn nein, was sagt der Debugger?



  • habs auch aus einem großen Projekt raus kopiert. sry
    Es funktioniert alles ohne Probleme, dass ist ja das lustige…

    hier nochmal die Main :

    do
    {
    	Menu = menu() ;
    	
    	switch (Menu)
    	{
    	case 'a': //Berechnung Kreis und Kugel 
    
    		cout << endl;
    		cout << "Radius: ";
    		cin >> radius;
    		kreis_kugel(radius);
    
    
    		break;
    	case 'b':  // Bauernmultiplikation 
    	  // Eingabe
    		erg = 0;
    			cout << endl;
    		cout << "Russische Bauernmultiplikation" << endl << endl;
    		cout << "In jedem Rechenschritt wird..." << endl;
    		cout << "  -der erste Faktor durch 2 dividiert." << endl;
    		cout << "  -der zweite Faktor verdoppelt" << endl << endl;
    		cout << "Geben Sie den ersten Faktor ein: ";
    		cin >> a;
    		cout << "Geben Sie den zweiten Faktor ein: ";
    		cin >> b;
    	bauernmultiplikation(a,b);
    		
    
    		break;
    	case 'c': // Schaltjahr
    			
                //Eingabe
    		cout << endl;
    		cout << ("Jahreszahl ");
    		cin >> jahr;
               jahr = istSchaltjahr(jahr);
                if (jahr == true){
                    cout << jahr << " ist ein Schaltjahr" << endl;}
                else{
                    cout << jahr << " ist kein Schaltjahr" << endl;}
    		break;
    
    	case 'd'://  Berechnung pq-Formel
    
                cout << endl << "Eingabe p ";
    		cin >> p;
    		cout << endl << "Eingabe q ";
    		cin >> q;
              Diskriminante = quad_gl( p, q, x1, x2);
                if(Diskriminante<0){
                    cout << "Keine Loesung" << endl;
                    
                }
                else{
                
                cout <<  "Nullstelle 1: " <<x1 << endl;
                    cout <<  "Nullstelle 2: " <<x2 << endl;}
    		if (x1 == x2) {
    			cout << endl << "Doppelnullstelle " << endl;
    		}
    	
    		break;
    
            case 'e':{ //Nachbarn tauschen
                int daten [MAXANZAHL];
                daten [] = nachbarn_tauschen(daten, MAXANZAHL);
                    
                feldausgeben(daten,MAXANZAHL); // Ausgelagerte Feldausgabe
                
              
                
                break;}
            case 'x': // Programmende
    		programmende = true;
    		break;
                
    
            default: cout << "Der eingegebene Wert " << Menu
    		<< " ist nicht gueltig!" << endl;
    		break;
            }
                
    }// Ende switch
    while (programmende == false);
    
    system ("Pause");
    return 0;
    }


  • Warum soll jahr gleichzeitig 2018 und true darstelllen?



  • @BW82 sagte in Brauch mal jemand der Ahnung hat. Funktionen auslagern:

    Es funktioniert alles ohne Probleme, dass ist ja das lustige…

    Soso... ist 1900 ein Schaltjahr?

    Edit: Eigene Dummheit 😕



  • @manni66 sagte in Brauch mal jemand der Ahnung hat. Funktionen auslagern:

    Warum soll jahr gleichzeitig 2018 und true darstelllen?

    heißt also ich muss dem boolschen wert noch zu ordnen??

    Mein Gott Leute, wenn ich nicht Hilfe bräuchte würde ich nicht fragen, also spart euch doch dumme Kommentare und gebt lieber konstruktive KRITIK , die einem hilft.
    Danke!!!



  • @BW82 sagte in Brauch mal jemand der Ahnung hat. Funktionen auslagern:

    @manni66 sagte in Brauch mal jemand der Ahnung hat. Funktionen auslagern:

    Warum soll jahr gleichzeitig 2018 und true darstelllen?

    heißt also ich muss dem boolschen wert noch zu ordnen??

    Keine Ahnung wie du das meinst. Es sollten zwei Variablen sein.



  • @BW82 sagte in Brauch mal jemand der Ahnung hat. Funktionen auslagern:

    Mein Gott Leute, wenn ich nicht Hilfe bräuchte würde ich nicht fragen, also spart euch doch dumme Kommentare und gebt lieber konstruktive KRITIK , die einem hilft.

    Mannis Kommentar war konstruktiv.
    Du sollst darüber nachdenken ob das gut ist, wenn jahr den Wert false hat.
    Den hat es, wenn if(jahr % 100== 0) ausgeführt wird.



  • @manni66 also eine variable für true und false, und eine separate für Jahr.
    also sowas in der art?

    if(jahr % 100== 0){
           if (jahr % 400 == 0)
            {
                annahme = true;
            }
        else {
           annahme = false;
        }
            
        }else {annahme = true;}
    
    }else { annahme = false;}
    
    
    return annahme;
    }
    
    


  • So funktioniert es.
    hier in main:

      bool annahme;
                    //Eingabe
    			cout << endl;
    			cout << ("Jahreszahl ");
    			cin >> jahr;
                   annahme = istSchaltjahr(jahr);
                    if (annahme == true){
                        cout << jahr << " ist ein Schaltjahr" << endl;}
                    else{
                        cout << jahr << " ist kein Schaltjahr" << endl;}
    
    bool istSchaltjahr(int jahr){
        bool annahme;
    
        if (jahr % 4 == 0)
        {
            annahme= false;
            
            if(jahr % 100== 0){
                
                if (jahr % 400 == 0)
                {
                    annahme = true;
                }
            else {
                annahme = false;
            }
                
            }else {annahme = true;}
        
        }else { annahme = false;}
        
    
        return annahme;
        
    }
    


  • @BW82
    Das ganze lässt sich auch noch kompakter schreiben

    bool check_leap_year (int year) {
        if ((year % 400) == 0) return true;
        if ((year % 100) == 0) return false;
        if ((year % 4)   == 0) return true;
        return false;
    }
    

    Weil man hier über die Abfolge der Prüfungen das gewünschte Ziel erreichen kann.



  • @john-0 Dank dir!


  • |  Mod

    @john-0 sagte in Brauch mal jemand der Ahnung hat. Funktionen auslagern:

    @BW82
    Das ganze lässt sich auch noch kompakter schreiben

    bool check_leap_year (int year) {
        if ((year % 400) == 0) return true;
        if ((year % 100) == 0) return false;
        if ((year % 4)   == 0) return true;
        return false;
    }
    

    Weil man hier über die Abfolge der Prüfungen das gewünschte Ziel erreichen kann.

    Man kann sich noch zusätzlich um Effizienz bemühen, die nötigen Division sind ja u.U. vergleichsweise aufwändig, also ist es wahrscheinlich günstig, die im Durchschnitt nötige Anzahl von Bedigungen zu minimieren. Die gezeigte Variante ist dabei am ungünstigsten, hier werden durchschnittlich 2.9875 if-Bedigungen pro Funktionsaufruf geprüft.

    Besser ist es, die Sequenz herumzudrehen:

    bool is_leap_year (int year) {
        // return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
        if ((year % 4) != 0) return false;
        if ((year % 100) != 0) return true;
        if ((year % 400) != 0) return false;
        return true;
    }
    

    mit nur durchschnittlich 1.26 zu prüfenden Bedigungen je Funktionsaufruf.