Mehrmalige Eingabe mit while



  • Hallo Freunde von Bit und Byte,

    ich muss folgende Aufgabe lösen:
    Schreibe ein Programm, das immer wieder die Eingabe eines Wortes mit 5
    Buchstaben fordert und erst Ruhe gibt, wenn es eine Eingabe aus 5 Zeichen
    bekommen hat.

    Folgendes habe ich probiert:

    #include <iostream>
    using namespace std;
    
    bool eingabe_wort_5(char wort[]){
    int zaehler = 0;
    	for (int i = 0; wort[i] != '\0'; i++){
    		zaehler += 1;
    	}
    	if (zaehler != 5){
    		cout << "Das Wort " << wort << " besteht aus " << zaehler <<
    			 " Buchstaben. Nochmal." << endl;
    		return true;	
    	}
    	else{
    		cout << "Das Wort hat " << zaehler << 
    			" Buchstaben. Das Programm wird beendet." << endl;
    		return false;
    	}
    }
    
    int main(int argc, char** argv) {
    	char wort[100];
    do{
    	cout << "Wort eingeben: ";
    	cin >> wort;
    	eingabe_wort_5(wort);
    }while(true);
    
    	return 0;
    }
    

    Problem ist:

    Wenn ich genau 5 Buchstaben eingebe, bricht die Schleife nicht ab.

    Was habe ich falsch gemacht ?

    Ich bedanke mich im Voraus.



  • Zeile 27.



  • SG1 schrieb:

    Zeile 27.

    Ging ja schnell.
    Jetzt weiß ich wo der Fehler liegt, aber komme nicht drauf was genau falsch ist.

    Es sollte solange wiederholt werden, solange die Bedingung true ( Eingabe ungleich 5) erfüllt ist.


  • Mod

    Denkfehler schrieb:

    Es sollte solange wiederholt werden, solange die Bedingung true ( Eingabe ungleich 5) erfüllt ist.

    Die Bedingung kommt zwischen die Klammern. while(true) hat quasi gar keine Bedingung - die Schleife wird solange wiederholt bis sie anderweitig abgebrochen wird (e.g. durch break ).

    Kleiner Tipp, falls du Clang oder GCC verwendest: Siehst du eine Warnung wenn du die Definition zu

    [[gnu::warn_unused_result]]  bool eingabe_wort_5(char wort[]){
    int zaehler = 0;
        for (int i = 0; wort[i] != '\0'; i++){
            zaehler += 1;
        }
        if (zaehler != 5){
            cout << "Das Wort " << wort << " besteht aus " << zaehler <<
                 " Buchstaben. Nochmal." << endl;
            return true;    
        }
        else{
            cout << "Das Wort hat " << zaehler << 
                " Buchstaben. Das Programm wird beendet." << endl;
            return false;
        }
    }
    

    abänderst? Bei VC++ kommt statt dem [[..]] -Attribut ein _Check_return_ hin.



  • Deine Schleife läuft halt so lange, wie true true ist... also für immer. Trag 'ne andere Bedingung ein, und die Schleife bricht vielleicht auch ab.



  • Hmmm, hört sich alles so plausibel an, wenn man das von den anderen hört ( bzw. liest)... Vielen dank an der Stelle.

    Arcoth schrieb:

    Die Bedingung kommt zwischen die Klammern. while(true) hat quasi gar keine Bedingung - die Schleife wird solange wiederholt bis sie anderweitig abgebrochen wird (e.g. durch break ).

    SG1 schrieb:

    Deine Schleife läuft halt so lange, wie true true ist... also für immer. Trag 'ne andere Bedingung ein, und die Schleife bricht vielleicht auch ab.

    Hört sich logisch an.

    Arcoth schrieb:

    Kleiner Tipp, falls du Clang oder GCC verwendest: Siehst du eine Warnung wenn du die Definition zu

    [[gnu::warn_unused_result]] ...
    

    abänderst? Bei VC++ kommt statt dem [[..]]-Attribut ein _Check_return_ hin.

    Jawohl, der Compiler beschwert sich:

    [Error] expected unqualified-id before '[' token
    

    Habe den Code folgendermaßen geändert:

    #include <iostream>
    using namespace std;
    
    /*[[gnu::warn_unused_result]]*/ int eingabe_wort_5(char wort[]){
    	int zaehler = 0;
    	for (int i = 0; wort[i] != '\0'; i++){
    		zaehler += 1;
    	}
    
    	return zaehler;
    }
    
    int main(int argc, char** argv) {
    	char wort[100];
    	int zaehler;
    
    do{
    	cout << "Wort eingeben: ";
    	cin >> wort;
    	eingabe_wort_5(wort);
    	if (eingabe_wort_5(wort) != 5){
    		cout << "Das Wort " << wort << " besteht aus " << eingabe_wort_5(wort) <<
    			 " Buchstaben. Nochmal." << endl;	
    	}
    	else{
    		cout << "Das Wort hat " << eingabe_wort_5(wort) << 
    			" Buchstaben. Das Programm wird beendet." << endl;
    	}
    }while( eingabe_wort_5(wort) != 5);
    
    return 0;
    }
    

    Nicht gerade die elegenteste Lösung, aber das funktioniert schonmal.


  • Mod

    Hast du -std=c++11 angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.



  • Arcoth schrieb:

    Hast du -std=c++11 angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.

    In CodeBlocks ( mit TDM-GCC compiler, version 4.8.1) ist das Häkchen bei -std = c++11 da.

    Visual Studio 2013 mit

    _Check_return_
    

    meckert nicht.


  • Mod

    Denkfehler schrieb:

    Arcoth schrieb:

    Hast du -std=c++11 angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.

    In CodeBlocks ( mit TDM-GCC compiler, version 4.8.1) ist das Häkchen bei -std = c++11 da.

    Merkwürdig.

    Kompiliert der Code im Link auch nicht, der minimale?



  • Arcoth schrieb:

    Denkfehler schrieb:

    Arcoth schrieb:

    Hast du -std=c++11 angegeben? Welche GCC Version verwendest du? Attribute dieser Art gibt es seit GCC 4.8.

    In CodeBlocks ( mit TDM-GCC compiler, version 4.8.1) ist das Häkchen bei -std = c++11 da.

    Merkwürdig.

    Kompiliert der Code im Link auch nicht, der minimale?

    Nope. Compiler gibt folgende Fehlermeldung aus:

    ||=== Build: Debug in Test_Forum_GCC (compiler: GNU GCC Compiler) ===|
    ...\main.cpp|4|error: expected unqualified-id before '[' token|
    ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    

Anmelden zum Antworten