If-Anweisung mit Tastendruck



  • 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


Anmelden zum Antworten