If-Anweisung mit Tastendruck



  • Hey Leute,

    ich habe ein Programm geschrieben, dass das Alter von 3 Personen vergleicht. Nun möchte ich am Ende einstellen, das man gefragt wird ob man den Vorgang wiederholen möchte, also eine Schleife. Möchte, das wenn der Anwender Ja sagen möchte, er "y" eingeben muss und für Nein "n" um das Programm zu beenden, bei Nein dann mit. Und das mit goto und return 0.
    Habe mir das ungefähr so vorgestellt:

    if (press 'y')
    {
    
    goto start:
    
    }
    
    if (press 'n')
    {
    
    return 0;
    
    }
    

    Ich weiß das das so nicht funktioniert, aber damit ihr wisst, was ich meine
    Danke im Voraus!

    lg Logiaa

    EDIT: Hier ist der samte Code bisher :http://pastebin.com/xWfRF4iZ
    Habe das "string" mittlerweile wieder weggemacht.



  • Mal abgesehen davon, dass es viel zu umständlich ist und du globale Variablen und goto verwendest:

    #include <iostream>
    
    using namespace std;
    
    int a, b, c;
    string y, n;
    char choice;
    
    int main()
    {
        start:;
        cout << "Gib das Alter von Person 1 an." << endl;
        cin  >> a;
        cout << "Gib das Alter von Person 2 an." << endl;
        cin  >> b;
        cout << "Gib das Alter von Person 3 an." << endl;
        cin  >> c;
    
        if ((a>b)&&(a>c)&&(b>c))
        {
           cout << "Person 1 ist aelter als Person 2 und 3.\nPerson 2 ist aelter als Person 3.\nPerson 3 ist der juengste.\nPerson 1 ist der aelteste." << endl;
        }
    
        if ((a>b)&&(a>c)&&(b<c))
        {
            cout << "Person 1 ist aelter als Person 2 und 3.\nPerson 3 ist aelter als Person 2.\nPerson 2 ist der juengste.\nPerson 1 ist der aelteste." << endl;
        }
    
        if ((a<b)&&(a<c)&&(b<c))
        {
            cout << "Person 1 ist juenger als Person 2 und 3.\nPerson 3 ist aelter als Person 1 und 2.\nPerson 1 ist der juengste.\nPerson 3 ist der aelteste." << endl;
        }
    
        if ((a<b)&&(a>c)&&(b>c))
        {
            cout << "Person 2 ist aelter als Person 1 und 3.\nPerson 1 ist aelter als Person 3.\nPerson 2 ist der aelteste.\nPerson 3 ist der juengste." << endl;
        }
    
        if ((a<b)&&(a<c)&&(b>c))
        {
            cout << "Person 2 ist aelter als Person 1 und 3.\nPerson 3 ist aelter als Person 1.\nPerson 2 ist der aelteste.\nPerson 1 ist der juengste." << endl;
        }
    
        if ((a>b)&&(a<c)&&(b<c))
        {
            cout << "Person 3 ist aelter als Person 1 und 2.\nPerson 1 ist aelter als Person 2.\nPerson 3 ist der aelteste.\nPerson 2 ist der juengste." << endl;
        }
        //Ab hier mit gleichalt.
    
        if ((a==b)&&(a==c)&&(b==c))
        {
            cout << "Alle Personen sind gleichalt." << endl;
        }
    
        if ((a==b)&&(b<c))
        {
            cout << "Person 1 und 2 sind gleichalt.\nPerson 3 ist der aelteste." << endl;
        }
    
        if ((a==b)&&(b>c))
        {
            cout << "Person 1 und 2 sind gleichalt.\nPerson 3 ist der juengste." << endl;
        }
    
        if ((a>b)&&(b==c))
        {
            cout << "Person 2 und 3 sind gleichalt.\nPerson 1 ist der aelteste." << endl;
        }
    
        if ((a<b)&&(b==c))
        {
            cout << "Person 2 und 3 sind gleichalt.\nPerson 1 ist der juengste." << endl;
        }
    
        if ((a==c)&&(b>c))
        {
            cout << "Person 1 und 3 sind gleichalt.\nPerson 2 ist der aelteste." << endl;
        }
    
        if ((a==c)&&(b<c))
        {
            cout << "Person 1 und 3 sind gleichalt.\nPerson 2 ist der juengste." << endl;
        }
    
        nochmal:;
        cout << "Nochmal?" << endl;
    
        cin >> choice;
        if (choice == 'y')
            goto start;
        else
            if (choice == 'n')
                return 0;
            else
            {
                cout << "Ungueltige Eingabe!" << endl;
                goto nochmal;
            }
    }
    


  • eingabe kannst du mit dem befehl std::cin einlesen.
    den string vergleich mach ich immer mit strcmp().
    so in etwa müsste das dann aussehen:

    #include <iostream>
    #include <cstring>
    
    main()
    {
      std::string eingabe;
      std::cout << "Taste drücken y-weiter -- n-ende oder iwas... \n";
      std::cin >> eingabe;
    
      if(strcmp(eingabe,"y") == 0)
      {
        cout << "Startet .... \n";
    
        //goto wenn möglich vermeiden
        startfunktion();
    
      }else
      {
        return 0;
      }
    }
    

    hoff das funktioniert so, kann es leider gerade nicht testen.

    lg



  • Dankeschön 😃 Wir lernen es gerade in der Schule und ich weiß nicht wie man es einfacher machen könnte, aber ich finde das zur Übung eigentlich ganz gut. Und was ist denn so schlecht an den globalen Variablen? Müsste doch dann bei jeder Funktion alle Variablen neu deklarieren oder? Und was ist so schlecht an goto? Goto sieht für mich ganz einfach aus und erfüllt seinen Zweck^^



  • googleplayer schrieb:

    Dankeschön 😃 Wir lernen es gerade in der Schule und ich weiß nicht wie man es einfacher machen könnte, aber ich finde das zur Übung eigentlich ganz gut. Und was ist denn so schlecht an den globalen Variablen? Müsste doch dann bei jeder Funktion alle Variablen neu deklarieren oder? Und was ist so schlecht an goto? Goto sieht für mich ganz einfach aus und erfüllt seinen Zweck^^

    goto vemeidet man wenn möglich, da es zu Spaghetticode führen kann: https://de.wikipedia.org/wiki/Spaghetticode



  • Verstehe zwar nicht so viel was in dem Artikel steht, aber werde es ab jetzt versuchen zu vermeiden^^



  • HelperR schrieb:

    hoff das funktioniert so, kann es leider gerade nicht testen.

    Nö.

    main.cpp:1:2: error: invalid preprocessing directive #i
    main.cpp:4:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
    main.cpp:6:15: error: expected ';' before 'eingabe'
    

    Ausserdem ist strcmp C und nimmt deswegen C-Strings.

    @googleplayer
    Globale Variablen sind schlecht für die Übersicht, ebenso goto.
    Außerdem ist es in C++ üblich Variablen dort zu definieren wo sie auch benötigt werden.



  • [quote="Bitmapper"]

    HelperR schrieb:

    @googleplayer
    Globale Variablen sind schlecht für die Übersicht, ebenso goto.
    Außerdem ist es in C++ üblich Variablen dort zu definieren wo sie auch benötigt werden.

    Ja aber die Variablen werden doch im ganzen Programm gebraucht, oder verstehe ich da was falsch?



  • googleplayer schrieb:

    Bitmapper schrieb:

    @googleplayer
    Globale Variablen sind schlecht für die Übersicht, ebenso goto.
    Außerdem ist es in C++ üblich Variablen dort zu definieren wo sie auch benötigt werden.

    Ja aber die Variablen werden doch im ganzen Programm gebraucht, oder verstehe ich da was falsch?

    Wenn du sie in der main Funktion definierst, dann sind sie auch in der main Funktion verfügbar.
    Wenn du mit mehreren Funktionen arbeitest, dann übergibst du sie als Funktionsparameter.
    Aber global ist in fast jedem Fall unnötig.



  • Bitmapper schrieb:

    HelperR schrieb:

    hoff das funktioniert so, kann es leider gerade nicht testen.

    Nö.

    main.cpp:1:2: error: invalid preprocessing directive #i
    main.cpp:4:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
    main.cpp:6:15: error: expected ';' before 'eingabe'
    

    Ausserdem ist strcmp C und nimmt deswegen C-Strings.

    strcmp funktioniert nicht, du hast vollkommen recht, mein fehler.
    danke für den hinweis. 🙂

    so wie du es gezeigt hast funktioniert es aber auch nur für c-strings 🙄 ... (zumindest ohne überladung des ==-Operators)

    == funktioniert nur da choice ein char ist...
    (also wie strcmp nur für char(oder c-strings?...) 🙄 )

    ich hatte das nur so verstanden das er gerne std::string nutzen möchte, wozu ich auch rate... (zumindest wenn es keinen grund dagegen gibt... 😉 )

    naja dann eben hier nochmal richtig - bzw mit C++ Stringvergleich(std::string-c++strings? 😃 ) :
    (dieses mal auch getestet... 🙄)

    #include <iostream>
    #include <cstring>
    
    int main()
    {
    	std::string eingabe;
    	std::cout << "Eingabe y oder n machen: \n";
    	std::cin >> eingabe;
    
    	if(eingabe.compare("y") == 0)
    	{
    		std::cout << "Starte... \n";
    		//startfunktion();
    
    	}else
    	{
    		std::cout << "Alles außer \"y\" ... \n";
    		return 0;
    	}
    }
    

    lg



  • Was ärgert dich am direkten ==?



  • Ein char ist was anderes als ein String, in dem Beispiel wäre ein String doch total unnötig.

    HelperR schrieb:

    so wie du es gezeigt hast funktioniert es aber auch nur für c-strings 🙄 ... (zumindest ohne überladung des ==-Operators)

    ?
    Seit wann ist 'y' ein String?



  • roflo schrieb:

    Was ärgert dich am direkten ==?

    nichts
    ich hab nur string::compare benutzt 🙂 ...

    Bitmapper schrieb:

    Ein char ist was anderes als ein String, in dem Beispiel wäre ein String doch total unnötig.

    HelperR schrieb:

    so wie du es gezeigt hast funktioniert es aber auch nur für c-strings 🙄 ... (zumindest ohne überladung des ==-Operators)

    ?
    Seit wann ist 'y' ein String?

    ok, war undeutlich ausgedrückt ich meinte damit den datentyp "char" ... 🙄

    warum willst du keine std::string nutzen? was spricht denn nur dagegen?
    ein std::string ist letzlich auch nur ein char[] ? 😉

    in c++ ist ein std::string meiner meinung nach zu bevorzugen solange es keine gründe dagegen gibt...
    was spricht denn gegen ein std::string?

    lg



  • Gegen einen String spricht in dem Fall, dass 'y' und 'n' jeweils nur ein Zeichen sind und das auch so bleibt.
    Anders wäre es bei einer Eingabe von "yes" und "no".
    Es ist wie ich schrieb einfach unnötig.
    Anderes Beispiel: Wenn du ein Array von exakt 20 Elementen benötigst, nimmst du ja auch keinen vector.

    HelperR schrieb:

    ein std::string ist letzlich auch nur ein char[] ?

    Nein



  • Bitmapper schrieb:

    Gegen einen String spricht in dem Fall, dass 'y' und 'n' jeweils nur ein Zeichen sind und das auch so bleibt.
    Anders wäre es bei einer Eingabe von "yes" und "no".
    Es ist wie ich schrieb einfach unnötig.
    Anderes Beispiel: Wenn du ein Array von exakt 20 Elementen benötigst, nimmst du ja auch keinen vector.

    es geht hier gerade aber nicht um einen vektor.

    Um Bjarne Stroustrup zu zitieren: "Prefer string operations to C-style string functions".

    ich bevorzuge wenn es keine gründe dagegen gibt(meiner erfahrung nach eher selten...), immer eine dynamische speicherverwaltung -- raii.
    https://de.wikipedia.org/wiki/Ressourcenbelegung_ist_Initialisierung

    da es einfach fehlerunanfälliger ist ... 🙄

    HelperR schrieb:

    "

    HelperR schrieb:

    ein std::string ist letzlich auch nur ein char[] ?

    Nein

    doch, die klasse std::string basiert intern auf char-arrays schaust du dort: 🕶
    http://www.cplusplus.com/reference/string/string/

    lg



  • Langsam nervst du aber, ich habe weder einen C-String noch C-style string functions verwendet.

    HelperR schrieb:

    doch, die klasse std::string basiert intern auf char-arrays schaust du dort: 🕶

    Das hast du aber nicht gesagt:

    HelperR schrieb:

    ein std::string ist letzlich auch nur ein char[] ? 😉

    HelperR schrieb:

    ich bevorzuge wenn es keine gründe dagegen gibt(meiner erfahrung nach eher selten...), immer eine dynamische speicherverwaltung -- raii.

    Wieso dynamische Speicherverwaltung wenn die Anzahl der verwendeten Elemente feststeht?
    Speicher auf dem Heap zu reservieren ist langsamer, das ist ein Grund dagegen.

    Du widersprichst dir außerdem selber:

    HelperR schrieb:

    den string vergleich mach ich immer mit strcmp().



  • Bitmapper schrieb:

    Langsam nervst du aber, ich habe weder einen C-String noch C-style string functions verwendet.

    ok war nicht mein ziel, ganz im gegenteil ich wollte helfen.

    ich schreibe jetzt nicht mehr, wenn es dir darum geht, du hast recht nimm char, mach was du willst, ist mir sowie so egal.

    schönen abend noch, 🙂
    lg


Log in to reply