Zwei gleiche Wörter



  • Schreibe ein Programm das string einliest und die ausgibt, wenn es aber ein "quit" eingegeben wird dann soll sich das Programm beenden. Das funktioniert alles gut, nun will ich dass wenn man zweimal "quit" eingibt dann soll sich das Programm beenden. Und genau hier komm ich nicht weiter. Soviel wurde gemacht.

    void print_until_s(vector <string> &v, const string quit, string name)
    {
    	cout << "Please write a string! To Exit write \"quit\"! " << endl;
    	while (cin >> name){ 
    	v.push_back(name);
    
            sort(v.begin(),v.end());
    
    	for(int i = 0;i<v.size();++i){
    		if(v[i] == quit && name == quit){ 
    		cout << "Exit " << endl;
    		return;}
    		if(v[i] != quit && name != quit){
    		cout << v[i] << endl;}
    	}
      }
    }
    
    int main()
    try{
        vector <string> v;
        const string quit = "quit";
        string name;
    
        print_until_s(v,quit,name);
    
        keep_window_open();
        return 0;
    }
    catch (runtime_error e) {	
    	cout << e.what() << '\n';
    	keep_window_open("~");	
    }
    catch (...) {	
    	cout << "exiting\n";
    	keep_window_open("~");	
    }
    


  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char *argv[]) 
    { 
    	const string c = "quit";
    
    	string a;
    	string b;
    
    	do
    	{
    		cin >> a;
    		cin >> b;
    	}while(b != c && a != c);
    
        return 0; 
    }
    


  • Also ich würde mich als Benutzer ärgern, wenn ich immer zwei mal quit eingeben müsste. Diese 4 Buchstaben und ein abschließendes Return zeigen doch recht eindeutig, was ich möchte. Einen Irrtum kann man da quasi ausschließen.

    P.S.: Du solltest vielleicht Fälle wie "Quit" oder "QUIT" beachten (also am besten vor dem Vergleich den String 'lowern' und dann mit "quit" vergleichen).



  • Mit string ist es einfacher

    string eingabe;
    cin >> eingabe;
    if(eingabe.find("quit"))
    {
        cout << "Wirklich beenden(quit)?" << endl;
        cin >> eingabe;
        if(eingabe.find("quit"))
        {
            return 0;
        }
    }
    else
    {
        cout << "Falsche eingabe" << endl;
    }
    


  • Das ist die Lösung:

    void print_until_s(vector <string> &v, const string quit, string name, string name2)
    {
    	cout << "Please write a string! To Exit write \"quit\"! " << endl;
    	while (cin >> name >> name2){ 
    	v.push_back(name);
        v.push_back(name2);
    
        sort(v.begin(),v.end());
    
    	for(int i = 0;i<v.size();++i){
    		if(v[i] == quit && name == quit && name2 == quit){ 
    		cout << "Exit " << endl;
    		return;}
    		if(v[i] != quit && name != quit && name2 != quit){
    			cout << v[i] << endl;}
    		if(v[i] != quit && name != quit && name2 == quit){
    			cout << v[i] << endl;}
    		if(v[i] == quit && name == quit && name2 != quit){
    			cout << v[i] << endl;}
    	}
      }
    }
    
    int main()
    try{
        vector <string> v;
        const string quit = "quit";
        string name;
        string name2;
    
        print_until_s(v,quit,name,name2);
    
        keep_window_open();
        return 0;
    }
    catch (runtime_error e) {	
    	cout << e.what() << '\n';
    	keep_window_open("~");	
    }
    catch (...) {	
    	cout << "exiting\n";
    	keep_window_open("~");	
    }
    


  • Gratulation für diese Lösung... 😮 Es schaudert mir.



  • Es soll die string in einen vector Container werfen. Und wenn es im vector zweimal quit findet dann soll sich das Programm beenden. Das habe ich vergesse zu schreiben.



  • Dann doch bitte lieber sowas:

    const string quit = "quit";
    
    void print_until_s(vector <string> &v) 
    { 
    	cout << "Please write a string! To Exit write \"quit\"! " << endl; 
    
    	int quitcount = 0;
    	do
    	{
    		string name;
    		cin >> name
    
    		if(name == quit)
    			++quitcount;
            else
            {
                v.push_back(name);
                quitcount = 0;
            }
    	}while(quitcount < 2);
    
    	sort(v.begin(),v.end()); 
    }
    

    Edit: Mach dir doch mal Gedanken, was die funktion machen, soll: Warum musst du jedesmal den Vector durchlaufen? Warum muss er permanent sinnlos sortiert werden? Kann man das nicht einfach lösen? Warum müssen Strings als Parameter übergeben werden, die keinen Wert enthalten? Warum muss eine Konstante übergeben werden?



  • Ganz einfach das ist eine Übung, und darum muss ich das so machen.



  • Das Programm funktioniert jetzt, danke an alle für die Hilfe.

    void print_until_s(vector <string> &v, const string quit, string name)
    {
    	 cout << "Please write a string! To Exit write \"quit\"! " << endl; 
    
        int quitcount = 0; 
        do 
        {  
            cin >> name; 
    
            if(name == quit) 
                ++quitcount; 
            else 
            { 
                v.push_back(name); 
                quitcount = 0; 
            } 
        }while(quitcount < 2); 
    
        sort(v.begin(),v.end());
        for(int i = 0;i<v.size();++i){
    	cout << v[i] << endl;}
    }
    
    int main()
    try{
        vector <string> v; 
        const string quit = "quit"; 
        string name; 
    
        print_until_s(v,quit,name); 
    
        keep_window_open();
        return 0;
    }
    catch (runtime_error e) {    
        cout << e.what() << '\n'; 
        keep_window_open("~");    
    } 
    catch (...) {    
        cout << "exiting\n"; 
        keep_window_open("~");    
    }
    

Anmelden zum Antworten