Programm wird nicht beendet



  • Hallo,

    wenn ich ein Programm mittels eingabe beenden will, dann klappt das nicht.
    Ich weiß aber auch nciht, warum.

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
        char entscheidung;
        bool programm_beenden = false;
        while(!programm_beenden)
        {
            cout << "Hallo Welt" << endl;
            cout << "Programm beenden? Ja/Nein" << endl;
            cin >> entscheidung;
            system("cls");
    
            if(entscheidung == 'Ja' || entscheidung == 'ja')
            {
                programm_beenden = true;
            } else if(entscheidung == 'Nein' || entscheidung == 'nein') {
                programm_beenden = false;
                break;
            }
        }
        return 1;
    }
    


  • entscheidung ist ein char, da geht ein Vergleich mit "ja" in die Hose, das ist nämlich ein C-String (const char*).
    Entweder machst du aus entscheidung ein char-Array und verwendest strcmp ("==" geht dann nämlich nimmer, überprüft nur ob die Adressen der Variablen identisch sind), oder du nimmst gleich std::string, da geht es auch wieder mit "==" beim Vergleichen.



  • Aber wenn ich dich richtig verstanden habe, dann ist ja string C.
    Und wie kann ich daraus ein array machen?
    Bei forum.php-einfach.de/ gab es einen ählichen Code:

    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    using namespace std;
    
    int main(){
        int zahl1 = 0;
        int zahl2 = 0;
        char prin;
        char choise;
        bool programm_beenden = false;
        bool eingabe = false;
    
        while(!programm_beenden){
            cout << "GUTEN TAG BEI USEREM OHM RECHNER\n\n";
            cout << "Geben Sie ihre Erste Ohm Zahl ein\n";
            cin >> zahl1;
            system("cls");
    
            cout << "Geben Sie Ihre Zweite Ohm Zahl ein\n";
            cin >> zahl2;
            system("cls");
    
            eingabe = false;
            while(!eingabe){
                cout << "Geben Sie Ihre Rechen art ein P=Parallel R= Reihe\n";
                cin >> prin;
                system("cls");
                if(prin =='P' || prin == 'p' || prin == 'R' || prin == 'r'){
                    eingabe = true;
                }
            }
    
            if(prin == 'P' || prin == 'p'){
                cout << "Ihr Widerstand lautet:" << ((double)1/(zahl1+zahl2));
            }else if(prin == 'R' || prin == 'r') {
                cout << "Ihr Widerstand lautet:" << (zahl1+zahl2);
            }
    
            eingabe = false;
            while(!eingabe){
                cout << "\nProgamm wiederholen? j/n\n";
                cin >> choise;
                system("cls");
    
                if(choise == 'J' || choise == 'j'){
                    eingabe = true;
                }else if(choise == 'N' || choise == 'n'){
                    programm_beenden = true;
                    break;
                }else{
                    cout << "Keine Korrekte eingabe\n\n";
                    system("cls");
                }
            }
        }
    
        return 1;
    }
    


    1. Ich sprach von C-String, und das ist nicht die std::string-Klasse, sondern (wie gesagt) die Bezeichnung für ein "const char*".
    2. Besteht ein großer unterschied: In dem php-einfach-Bsp. vergleichst du 2 chars ('j' ist so einer) und das geht sehr wohl mit "==".
    3. sollte if( entscheidung == 'ja') mindestens ein Warning ausgeben, denn einfache Anführungszeichen sind eigentlich für char reserviert, (const) char* bekommt doppelte.
    4. Wie viel C(++) kannst du denn? Ist das ein erster Versuch was eigenes zu basteln? Hast du irgend ein Buch zur Hand?


  • Char-Array?^^

    char charArray[2];
    char *charArray2 = "Jo";
    

    Dann könntest du die literale per "=="-Operator einzeln überprüfen oder mit strncmp() prüfen.

    Anonsten nimm std::string:

    #include <iostream> 
    // #include <stdio.h> <- brauchste hier nicht
    // #include <stdlib.h>  <- brauchste auch nicht
    // #include <conio.h> <- brauchste auch nicht
    #include <string> // <- das brauchste (: (Stream-Input, "=="-Operator)
    
    using namespace std; 
    
    int main() 
    { 
    	string entscheidung;
        bool programm_beenden = false; 
        while(!programm_beenden) 
        { 
            cout << "Hallo Welt" << endl; 
            cout << "Programm beenden? Ja/Nein" << endl; 
            cin >> entscheidung; 
            system("cls"); 
    
            if(entscheidung == "Ja" || entscheidung == "ja") 
            { 
                programm_beenden = true; 
            } else if(entscheidung == "Nein" || entscheidung == "nein") { 
                programm_beenden = false; 
                break; 
            } 
        } 
    
        return 1; 
    }
    


  • Guest4684131 schrieb:

    if(prin == 'P' || prin == 'p'){
                cout << "Ihr Widerstand lautet:" << ((double)1/(zahl1+zahl2));
            }else if(prin == 'R' || prin == 'r') {
                cout << "Ihr Widerstand lautet:" << (zahl1+zahl2);
            }
    

    Parallelschaltung von zwei Widerständen:

    Rg = R1 * R2 / R1 + R2

    und nicht 1/R1+R2



  • ich habs mit einfachen Buchstaben gemacht, allerdings kommt jetzt, wenn ich J eingebe und mit enter bestätige, irgendetwas mit Process Returned. Und laut Compiler soll es 4 Warnungen geben.

    Compiling: E:\CodeBlocks\...\main.cpp
    E:\CodeBlocks\...\main.cpp:22:35: warning: multi-character character constant
    E:\CodeBlocks\...\main.cpp: In function `int main()':
    E:\CodeBlocks\...\main.cpp:22: warning: comparison is always false due to limited range of data type
    E:\CodeBlocks\...\main.cpp:22:61: warning: multi-character character constant
    E:\CodeBlocks\...\main.cpp:22: warning: comparison is always false due to limited range of data type

    Linking console executable: E:\CodeBlocks\...\main.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 4 warnings

    Checking for existence: E:\CodeBlocks\...\main.exe
    Executing: E:\CodeBlocks/cb_console_runner.exe "E:\CodeBlocks\...\main.exe" (in E:\CodeBlocks\Zugnummer)
    Process terminated with status 1 (0 minutes, 6 seconds)



  • Zeig mal deinen Quellcode und markier dort mal die Fehler

    bb

    edit:
    guck mal, hier kannst du abschreiben
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-253462.html

    ;o)



  • Guest4684131 schrieb:

    ich habs mit einfachen Buchstaben gemacht, allerdings kommt jetzt, wenn ich J eingebe und mit enter bestätige, irgendetwas mit Process Returned. Und laut Compiler soll es 4 Warnungen geben.

    Compiling: E:\CodeBlocks\...\main.cpp
    E:\CodeBlocks\...\main.cpp:22:35: warning: multi-character character constant
    E:\CodeBlocks\...\main.cpp: In function `int main()':
    E:\CodeBlocks\...\main.cpp:22: warning: comparison is always false due to limited range of data type
    E:\CodeBlocks\...\main.cpp:22:61: warning: multi-character character constant
    E:\CodeBlocks\...\main.cpp:22: warning: comparison is always false due to limited range of data type

    Linking console executable: E:\CodeBlocks\...\main.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 4 warnings

    Checking for existence: E:\CodeBlocks\...\main.exe
    Executing: E:\CodeBlocks/cb_console_runner.exe "E:\CodeBlocks\...\main.exe" (in E:\CodeBlocks\Zugnummer)
    Process terminated with status 1 (0 minutes, 6 seconds)

    Schön dass du experimentierst 😉 Nun sollst du nicht mit "J" auf die Frage antworten, sondern im Quelltext das 'Ja' in ein 'J' ändern, dann vergleichst du auch chars.

    E:\CodeBlocks\...\main.cpp:22:61: warning: multi-character character constant
    

    das war das warning das ich angesprochen hatte...
    Liest du dir diese Meldungen eigentlich auch durch?


Anmelden zum Antworten