[Frage] int main Code erneut ausführen?

10/17/2013 10:13 Psycho Bär :D#1
Hey Leute bin gerade am c++ lernen und hab mich als anfangs Aufgabe mal an einen Taschenrechner probiert, funktioniert auch eigentlich so wie er soll, jedoch hab ich das problem das er nur eine Aufgabe berechnet und denn beim erneuten "Enter" drücken beendet wird bzw wenn man versucht eine neue Aufgabe einzugeben wird nichts eingegeben.

Meine Frage ist nun wie bekomm ich das hin das der Code erneut anfängt, sodass man nach einander neue Aufgaben eingeben kann?

Code:
#include <iostream>

using namespace std;

int main(){
    
    
    
    double zahl1, zahl2, ergebnis;                // variablen für zahlen
    char rechenzeichen;                           // variable für das rechenzeichen

    cout << "Geben Sie eine Rechenaufgabe ein:\n"; 
    cin >> zahl1 >> rechenzeichen >> zahl2;       // Aufgabe einlesen

    switch(rechenzeichen){                        // wert ermitteln
        case '+': ergebnis = zahl1+zahl2; break;  // entsprechend des
        case '-': ergebnis = zahl1-zahl2; break;  // rechenzeichen
        case '*': ergebnis = zahl1*zahl2; break;  // das Ergebnis
        case '/': ergebnis = zahl1/zahl2; break;  // berechnen
        // Programmende falls falsches zeichen benutzt wird 
        default: cout << "ungueltige Eingabe...\n"; return 1;
    }

    // Aufgabe noch mal komplett ausgeben
    cout << zahl1 << ' ' << rechenzeichen << ' ' << zahl2 << " = " << ergebnis << '\n';
    
    
    
    cin.sync();
    cin.get();
    return 0;
}

Schon mal danke im vorraus :)

mfg Psychobär :)
10/17/2013 11:25 Schlüsselbein#2
Warten bis das Thema Schleifen kommt und dann umstrukturieren.
Selber die Einstiegsprozedur zu callen ruft undefinierten Verhalten auf.
10/17/2013 11:36 Psycho Bär :D#3
Also so wie ich mich jetzt weiter gearbeitet habe müsste ich theoretisch den halben code neuschreiben und mit einen Menü anfangen in einer schleife
sprich
Auswählen was man rechnen möchte + - * /
Switch -> case zB mit 'a' 'A' für addition 's' 'S' für subtration usw
Aufgabe rechnen
Ergebnis ausgeben
Schleife wiederholen bis zB 'b' 'B' zum beenden gedrückt wird

also das man jedes mal auswählen muss was man rechnen will.


Korregiert mich falls es nicht der fall ist bin wie gesagt noch so ziemlich am anfang.

Also würde man mit meinen Code gar nicht weiter kommen, sodass der sich wiederholt und man immer neue Aufgaben untereinander ein tippen kann?
10/17/2013 11:51 Schlüsselbein#4
Doch, nur muss die Schleife einfach um das ganze Konstrukt.
Quote:
Schleife wiederholen bis zB 'b' 'B' zum beenden gedrückt wird
Korrekt.
10/17/2013 11:58 Psycho Bär :D#5
Ich denk schleifen sollte ich doch nochmal ein wenig mehr in angriff nehmen ist in mein Augen als Anfänger doch ein etwas komplexeres gebiet wie man sie richtig anwendet.
So wie ich versucht hatte die Schleife einzubauen hat am Ende nichts mehr geklappt und auf der Konsole wurde nur noch der _ angezeigt und nicht der eigentliche Text.

Danke für deine Antwort werde mich denn mal mit Schleifen beschäftigen und nochmal später posten obs geklappt hat oder wenn es noch harpert :)

mfg Psychobär :)

Sorry für Doppeltpost...

Habe das ganze jetzt in eine While-Schleife gehaun ist ja doch nicht ganz so kompliziert wie es am anfang schien :p
Naja soweit klappt auch alles zusätzlich noch wurzeln eingebaut jetzt hab ich nur noch das problem das er beim drücken von b oder B nicht beendet wird sondern zahl1 von letzten ergebnis 0 ist zahl2 von letzten ergebnis das gleiche und ergebnis ist gleich 0 = zahl2(aus dem letzten ergebnis) und diese aufgabe läuft denn in gefühlten millisekunden takt runter und das programm bleibt offen. Wie kann ich das "spammen" verhindern und den Code so schreiben das er beim drücken von b oder B beendet wird ohne das ein zusätzliches Enter erforderlich ist?

Bitte um mir das lernen zu vereinfachen keine Code lösungen schreiben sondern nur ein Tipp mit welcher funktion es möglich wäre. :)

mfg Psychobär :)
10/17/2013 18:00 MrSm!th#6
Wie sieht der neue Code aus?
10/18/2013 10:55 Psycho Bär :D#7
Code:
#include <iostream>
#include <windows.h> // für beep
#include <math.h>   // für wurzel


using namespace std;

int main(){
    
    
    double zahl1, zahl2, ergebnis;                // variablen für Zahlen
    char rechenzeichen;                           // variable für das Rechenzeichen
    char Schleife;                                // variable für die schleife
    
     while (Schleife != 'b' || Schleife != 'B') {  // schleife zum wiederholen
        
        cout << "\nGeben Sie eine Rechenaufgabe ein:\n"; 
        cout << "Zahl + - / * w (wurzel) Zahl2 zum rechnen\n";
        cin >> zahl1 >> rechenzeichen >> zahl2;       // Aufgabe einlesen

    
    
    switch(rechenzeichen){                          // wert von rechenzeichen ermitteln
        case '+': {ergebnis = zahl1+zahl2; break;}  // entsprechend dem
        case '-': {ergebnis = zahl1-zahl2; break;}  // rechenzeichen
        case '*': {ergebnis = zahl1*zahl2; break;}  // das Ergebnis
        case '/': {ergebnis = zahl1/zahl2; break;}  // berechnen
        case 'w': {ergebnis = sqrt(zahl1); break;}  // wurzel berechnen
        case 'b': {return 0; break;}                // beenden klein b
        case 'B': {return 0; break;}                // beenden groß B
       // Programmende mit Piep-Ton falls ein falsches zeichen benutzt wird
        default: Beep (500, 500); return 0;

}  // switch 
   

    // gibt aufgabe + ergebnis aus
    cout << zahl1 << ' ' << rechenzeichen << ' ' << zahl2 << " = " << ergebnis << '\n';
    
    
    
    }  // while schleife
    
    
    
    cin.sync();
    cin.get();
    return 0;
}

Sorry ganz vergessen den neuen Code zu Posten :3
hoffe ihr könnt mir helfen :P

Edit: Wenn ich es ohne davor gerechnet zu haben versuche beendet er statt über 'b' / 'B' über das default mit Beep ton und wenn bereits gerechnet wurde läuft er wie gesagt 0 + die zahl2 von der alten aufgabe durch in millisekunden takt.

mfg Psychobär :)
10/18/2013 11:06 snow#8
Die Variable "Schleife" wird gar nicht genutzt. Du initialisierst sie nicht mit einem Wert, also wird das verwendet, was da im Speicher steht. Das kann in seltenen Fällen rein theoretisch zu einem 'b' oder 'B' führen und somit ist dein Programm direkt beendet.

Persönlich würde ich wohl eine do while Schleife verwenden mit der abschließenden Eingabe für "Schleife". So kannst du am Ende entscheiden, ob du noch einen Durchlauf willst. :)
10/19/2013 15:56 Tyrar#9
Quote:
Originally Posted by Schlüsselbein View Post
Selber die Einstiegsprozedur zu callen ruft undefinierten Verhalten auf.
Würde irgendwann einen Stackoverflow verursachen.

Quote:
Originally Posted by Psycho Bär :D View Post
Code:
#include <iostream>
#include <windows.h> // für beep
#include <math.h>   // für wurzel


using namespace std;

int main(){
    
    
    double zahl1, zahl2, ergebnis;                // variablen für Zahlen
    char rechenzeichen;                           // variable für das Rechenzeichen
    char Schleife;                                // variable für die schleife
    
     while (Schleife != 'b' || Schleife != 'B') {  // schleife zum wiederholen
        
        cout << "\nGeben Sie eine Rechenaufgabe ein:\n"; 
        cout << "Zahl + - / * w (wurzel) Zahl2 zum rechnen\n";
        cin >> zahl1 >> rechenzeichen >> zahl2;       // Aufgabe einlesen

    
    
    switch(rechenzeichen){                          // wert von rechenzeichen ermitteln
        case '+': {ergebnis = zahl1+zahl2; break;}  // entsprechend dem
        case '-': {ergebnis = zahl1-zahl2; break;}  // rechenzeichen
        case '*': {ergebnis = zahl1*zahl2; break;}  // das Ergebnis
        case '/': {ergebnis = zahl1/zahl2; break;}  // berechnen
        case 'w': {ergebnis = sqrt(zahl1); break;}  // wurzel berechnen
        case 'b': {return 0; break;}                // beenden klein b
        case 'B': {return 0; break;}                // beenden groß B
       // Programmende mit Piep-Ton falls ein falsches zeichen benutzt wird
        default: Beep (500, 500); return 0;

}  // switch 
   

    // gibt aufgabe + ergebnis aus
    cout << zahl1 << ' ' << rechenzeichen << ' ' << zahl2 << " = " << ergebnis << '\n';
    
    
    
    }  // while schleife
    
    
    
    cin.sync();
    cin.get();
    return 0;
}

Sorry ganz vergessen den neuen Code zu Posten :3
hoffe ihr könnt mir helfen :P

Edit: Wenn ich es ohne davor gerechnet zu haben versuche beendet er statt über 'b' / 'B' über das default mit Beep ton und wenn bereits gerechnet wurde läuft er wie gesagt 0 + die zahl2 von der alten aufgabe durch in millisekunden takt.

mfg Psychobär :)
Was mir ziemlich übel ins Auge sticht ist folgende Zeile
Code:
using namespace std;
Warum wurde in dem Thread schon gut beschrieben.
[Only registered and activated users can see links. Click Here To Register...]
10/19/2013 18:13 Tasiro#10
Quote:
Originally Posted by HeavyHacker View Post
Würde irgendwann einen Stackoverflow verursachen.
Und noch viel schlimmer: es ist undefiniertes Verhalten.
Quote:
Originally Posted by §3.6.1.1
The function main shall not be used within a program. The linkage (3.5) of main is implementation-defined. A program that defines main as deleted or that declares main to be inline, static, or constexpr is illformed. The name main is not otherwise reserved.