Fragen - Fehler!

12/21/2011 19:38 Ackhold#1
Tag,

ich bin ziemlich neu in C++ - ich hab' hier 'nen kleinen, erweiterten, Taschenrechner, - der eigentlich funktioniert, im Moment ist's nur nen Klammer-Problem, welches ich aber noch selber gelöst bekomm'.

Mir geht's aber um folgendes:

Ich lern' gerade Switch, Case etc. - ich würde gerne wissen, ob man "verschachtelte" Switch Anweisungen machen kann - mein Code sieht so aus:

PHP Code:
# include <iostream>
# include <windows.h>
 
 
using namespace std;
 
 
int main()
{

    
double zahl1 0zahl2 0erg 0;
    
char opchAuswahlchBeenden;

    
cout << "Dies ist ein Taschenrechner, der Plus, Minus, Mal, Geteilt und Fakultät rechnen kann!" <<endl;
    
cout << "Wenn Sie Hilfe beim bedienen benötigen, drücken Sie bitte [H]!" <<endl;
    
cout << "Wenn Sie den Taschenrechner starten wollen, drücken Sie bitte [S]!" <<endl;
    
cout << "Aushwal bitte jetzt treffen!" <<endl;
    
cin >> chAuswahl;
 
 
        
/*
        switch (chAuswahl) 
        {
        case 's':
        case 'S':
        */

    
do
    {

    
system ("cls");

    
cout << "Bitte geben Sie Ihre Rechnung ein!" <<endl;
    
cout << "Rechnung: " <<endl;
    
cin >> zahl1 >> op >> zahl2;

    switch (
op)
    {
//{
    
case '+':
        {
    
cout <<"Einen Moment, ich rechne..." <<endl;
    
Sleep (1000);
    
cout <<"Das Ergebnis lautet: " << zahl1+zahl2 <<endl;
        }break;

     case 
'-':
        {
    
cout <<"Einen Moment, ich rechne..." <<endl;
    
Sleep (1000);
    
cout <<"Das Ergebnis lautet: " << zahl1-zahl2 <<endl;
        }break;

    case 
'*':
        {
    
cout <<"Einen Moment, ich rechne..." <<endl;
    
Sleep (1000);
    
cout <<"Das Ergebnis lautet: " << zahl1*zahl2 <<endl;
        }break;

    case 
'/':
        {
    
cout <<"Einen Moment, ich rechne..." <<endl;
    
Sleep (1000);
    
cout <<"Das Ergebnis lautet: " << zahl1/zahl2 <<endl;
        }break;
    case 
'!':

        {
            
erg=zahl1;
            do {
                
zahl1--;
                
erg=erg*zahl1;
                
cout << "Einen Moment, ich rechne..."<<endl;
                
Sleep (1000);
                
cout << "Das Ergebnis lautet: << Zahl1: "<< zahl1 <<endl;
            }
            while(
zahl1!=1);
        }break;
        default: 
cout<<"Falsches Rechenzeichen!"<<endl;
                 {
                    
Sleep (10000);
                    
system("cls");
                 }
              }
                 while (
erg >= 0);
                
//}break;
    
}

Wär' nett wenn mir wer helfen kann - danke!

Gruß,

Ackhold
12/21/2011 19:51 MoepMeep#2
Natürlich kannst du eine switch-case anweisung verschachteln, wieso auch nicht?

Übrigens, das * könnte probleme machen, bin mir grade nicht ganz sicher.
12/21/2011 20:06 Ackhold#3
Meinst Du das '*' zum auskommentieren? Ist doch ganz normales auskommentieren...

Wie stell' ich das denn am besten an?
Will z.B eine Art Menu einbauen:

Als erstes kann man:
- Taschenrechner auswählen
- Hilfe Menu auswählen
- Beenden

Und wenn man dann z.B Hilfe ausgewählt hat, soll man in dieser Anweisung wiederum Spiel starten und Beenden auswählen könn' - steh' da aber 'nen bisschen auf'm Schlauch...
12/21/2011 20:27 jacky919#4
Grundgerüst:

Code:
bool closed = false;

while(!closed)
{
cout << "Auswahl: ";
int auswahl;
cin >> auswahl;

switch(auswahl)
{
case 1:
{Taschenrechner();}
break;
case 2:
{closed = true;}
break;
}




void Taschenrechner()
{

}
12/21/2011 20:38 Ackhold#5
Danke Dir, werd' mich mal probieren!
12/21/2011 20:45 MoepMeep#6
Ich meinte das:
Code:
case '*':
Bin mir grad nicht mehr sicher, aber hab da was im hinterkopf ^^
12/21/2011 20:49 Ackhold#7
Achso, ne - das klappt soweit, hatte da noch keine Probleme mit!
12/22/2011 15:14 Muddy Waters#8
Nur mal so am Rande:
Du brauchst keine Blockklammern in den einzelnen cases verwenden, das ist so eigentlich auch nicht üblich. Eine switch-Anweisung ist prinzipiell eine bedingte Sprunganweisung. Sprich sofern dein case mit der zu prüfenden Konstanten identisch ist, findet ein Sprung zum entsprechenden case statt und sämtlicher nachfolgender Code im Anweisungsblock der switch-Anweisung wird ausgeführt - also auch alle nachfolgenden cases. Letzteres ist auch der Grund, warum am Ende eines cases oft eine break-Anweisung verwendet wird.
Eine Blockklammer macht daher keinen Sinn, weil sowieso sämtlicher Code bis zur break-Anweisung ausgeführt wird.

Stattdessen solltest du lieber darauf achten, dass du stets sauber einrückst. Das passt nämlich in deinem Beispiel noch nicht so ganz und führt zu unleserlichem Code, mit dem du dir selber das Leben unnötig schwer machst. ;)
Ich weiß, dass das anfangs alles etwas schwierig und ungewohnt ist, mein Professor hat mich damit auch ziemlich genervt, als ich C++ lernen durfte. Aber spätestens wenn du deinen eigenen Code nach einigen Wochen selber liest, wirst du für alles dankbar sein, was die Lesbarkeit irgendwie erhöht.
12/22/2011 15:19 Dr. Coxxy#9
blockklammern in cases sind durchaus üblich.
richtige einrückung allerdings auch^^
12/22/2011 15:49 MoepMeep#10
Die Klammern können dort durchaus einen Sinn haben, in den meisten Fällen sind sie allerdins unnötig.
12/23/2011 17:09 Ackhold#11
Ich hab' es mit den Blockklammern so gelernt...da legt mein Professor eigentlich auch wert drauf.