Doppelte Ausgabe in else if Abfragen wegen Objekt?



  • Hallo Leute,
    Ich bin gerade dabei C++ zu lernen und hab mich heute an der Objektorientierung versucht.
    Alles klappt eigentlich, bis auf den Fall, dass in der Funktion calc eine doppelte Abfrage der Nachricht in cout kommt bis das Ergebnis ausgegeben wird.

    #include <iostream>
    #include "badgeCalc.h"
    using namespace std;
    
    int main()
    {
    
    BadgeCalc b;
    
    b.dialog();
    b.eingabe(b);
    b.calc(b);
    b.result(b);
    
    cout <<"jahre: " << b.getYears() << "\n";
    cout << "Ausbildung: " << b.getAusbildung() << '\n';
    
    }
    
    #include <iostream>
    #include "badgeCalc.h"
    
    using namespace std;
    
    const int BadgeCalc::getYears()const{
        return years;
        }
    
    const int BadgeCalc::getAusbildung()const{
        return ausbildung;
        }
    
    void BadgeCalc::dialog ()const{
    
        cout << "Bitte geben Sie die Dienstjahre ein: \n";
        cout << "Bitte wählen Sie die passende Zahl zum höchsten Ausbildungsstand: \n";
        cout << "0:Keine Ausbildung \n" << "1: Grundausbildung \n" << "2: Sprechfunker,Atemschutz,Maschinist \n"<< "3: Truppfuehrer \n" << "4: Gruppenfuehrer \n"
             << "5: Ausbilder \n" << "6: Zugfuehrer \n"<< "7: Verbandsfuehrer \n";
    
    }
    
    void BadgeCalc::setYears(int y){
    
    years = y;
    }
    
    void BadgeCalc::setAusbildung(int c){
    
    ausbildung = c;
    
    }
    
    const int BadgeCalc::eingabe(BadgeCalc& b){
    
        int years;
        int c;
    
        cin >> years;
        cin >> c;
        b.setYears(years);
        b.setAusbildung(c);
    
    }
    
    int BadgeCalc::calc(BadgeCalc& b){
        int gf;
        int y = b.years;
        char c = b.ausbildung;
    
        if(y == 0){
            return 0;
            }
        else if(y>0  && (c == 1) && y < 11){
            return 1;
    
            }
    
        else if(y >= 11 && c < 4|| (y >= 4 && c == 2)){
            return 2;
    
            }
    
        else if(y >= 21 && c < 4 || (y >= 16 && c == 3) || (y >= 9 && c == 3)){
            return 3;
    
            }
        else if(y >= 1 && c == 4){
            int gf;
            cout << "Seit wann ist die die Person GF?: \n"; // Diese Abfrage erscheint dppelt
            cin >> gf;
            if(gf <10 ){
                return 4;
                }
            else if(gf >= 15){
                return 6;
                }
            else{
                return 5;
            }
            }
        else if(y >= 1 && c == 5){
    
            cout << "Seit wann ist die Person GF?: "; // Diese Abfrage erscheint dppelt
            cin >> gf;
            if(gf <5 ){
                return 4;
                }
            else if(gf >= 10){
                return 6;
                }
            else {
                return 5;
                }
            }
        else if(y >= 1 && c == 6){
            int zf;
            cout << "Seit wann ist die Person ZF: "; // Diese Abfrage erscheint dppelt
            cin >> zf;
            if(zf < 10){
                return 7; }
    
            else if(zf >= 20){
                return 9;
                }
            else {
            return 8;
            }
          }
        else if(y >= 1 && c == 7){
            int zf;
            cout << "Seit wann ist die Person ZF: ";
            cin >> zf;
            if(zf < 5){
                return 7;
                }
            else if(zf >= 15){
                return 9;
                }
            else{
                return 8;
                }
            }
        else {cout << "Fehlerhafte Eingabe!";
            }
    
    }
    
    const void BadgeCalc::result(BadgeCalc& b){
        int res = b.calc(b);
        cout << "Abzeichen Nummer: " << res << '\n';
    
    }
    
    #ifndef BADGECALC_H_INCLUDED
    #define BADGECALC_H_INCLUDED
    
    class BadgeCalc{
    
    public:
    
        const int getYears()const;
        const int getAusbildung()const;
        void setYears(int years);
        void setAusbildung(int ausbildung);
        void dialog()const;
        int calc(BadgeCalc& b);
        const int eingabe(BadgeCalc& b);
        const void result(BadgeCalc& b);
    
    private:
    
    int years;
    int ausbildung;
    
    };
    
    #endif
    

    Falls mir jemand weiterhelfen kann würde ich mich sehr über eine Rückmeldung freuen 🙂

    LG
    Marci



  • Mal abgesehen von der Qualität deines Codes, rufst du zwei mal calc auf:

    //in main
    b.calc(b);
    
    const void BadgeCalc::result(BadgeCalc& b){
        int res = b.calc(b);
        cout << "Abzeichen Nummer: " << res << '\n';
    
    }
    


  • Ich bin gerade dabei C++ zu lernen und hab mich heute an der Objektorientierung versucht.

    Das sieht eher nach gemurkse aus. Besorg dir ordentliches Lehrmaterial, sonst wird das nichts.



  • Vielen Dank für eure Antworten!
    Jetzt macht er was er soll...

    Ich weiß, dass der Code nicht gerade toll ist aber was ist denn jetzt genau das Problem daran.
    Ist es das Aussehen oder die Art der OOP?

    Über ein paar Informationen dazu würd ich mich sehr freuen

    LG



  • b4shyou schrieb:

    Ich weiß, dass der Code nicht gerade toll ist aber was ist denn jetzt genau das Problem daran.
    Ist es das Aussehen oder die Art der OOP?

    Über ein paar Informationen dazu würd ich mich sehr freuen

    Wie schon gesagt, besorg dir ordentliches Lehrmaterial. Beispielhaft zwei Kritikpunkte:

    OOP ist nicht, ein C Programm nehmen und einmal class drumstricken. Warum sind all die Funktionen Member der einen Klasse?

    b.eingabe(b);
    

    Wozu wird b übergeben? eingabe kennt sein b schon.


Log in to reply