2017-10-19 21 views
1

Maintenant, j'ai la boucle while qui marche, mais maintenant elle boucle la réponse de la première opération au lieu de demander d'entrer un autre nombre pour plus opérations et quand j'appuie sur x pour sortir, il ne sort pas. Je me demandais juste où placer la ligne de code pour demander de saisir une autre série de chiffres. Alors pour l'entrée de Y ou X oui pour continuer et x pour sortir où je pourrais mettre la ligne de code pour cela. J'ai juste besoin de savoir où c'est tout cela grâce :)Je n'arrive pas à faire fonctionner la boucle et quand j'appuie sur le bouton pour quitter mon commutateur, ça ne marche pas

#include <iostream> 
using namespace std; 
char op, x, y; 





double scanNumber() { 
    double d; 

    cin >> d; 

    return d; 
} 

bool readOperator(string s, char &operation) { 
    char c; 
    cout << "\nEnter Operator: "; 
    cin >> c; 
    if (s.find(c) != -1) { 
     operation = c; 
     return true; 
    } 
    return false; 
} 

double add(double d1, double d2) { 
    return d1 + d2; 
} 

double sub(double d1, double d2) { 
    return d1 - d2; 
} 

double mul(double d1, double d2) { 
    return d1*d2; 
} 


double division(double d1, double d2) { 
    return d1/d2; 
} 
int main() 

{ 

    double d1, d2; 


    cout << "Enter 1st Number: "; 
    d1 = scanNumber(); 

    cout << "Enter 2nd Number: "; 
    d2 = scanNumber(); 

    char operation; 
    while (!readOperator("+-*/", operation)) { 
     cout << "Invalid Operator Please Pick Another One" << endl; 


    } 

    bool valid; 
    double result; 



    do{ 
     switch (operation) 
     { 

     case '+': 
      result = add(d1, d2); 
      break; 
     case '-': 
      result = sub(d1, d2); 
      break; 
     case '*': 
      result = mul(d1, d2); 
      break; 
     case '/': 
      if (d2 == 0) { 
       cout << "For division, 2nd operator can't be 0." << endl; 

      } 
      else { 
       result = division(d1, d2); 
      } 
      break; 
     case 'c': 
      cout << "Clearing the Calculator " << endl; 
      valid = false; 
      break; 
     case 'x': 
      exit(0); 
     default: 
      cout << "invalid input"; 

     } 

    cout << "\nResult: " << result << endl; 
    cout << "\nDo another?(Enter 'y'for yes or 'x' to exit) "; 

    cin >> y, x; 
}while (op != 'x'); 

return 0; 
} 
+0

Soit utiliser 'getline()' lire vos entrées, ou utilisez 'cin .ignore() 'pour ignorer le retour à la ligne qui reste dans le flux d'entrée après avoir lu' operation'. – Barmar

+0

Tout code suivant une instruction 'return' ne sera pas exécuté. L'exécution quittera la fonction avant l'exécution de l'instruction suivante. –

+0

Il n'y a rien qui vérifie si 'ch' est' y' ou 'x'. – Barmar

Répondre

1

Vous n'avez pas logique de répéter la boucle à nouveau après avoir effectué un calcul. Donc, vous avez besoin d'un do pour jumeler avec le seul while (op != 'x'); vous avez quitté à la fin.

Voici comment vous pouvez le faire:

int main() { 

    double d1, d2; 

    do { //main loop now starts here 
     cout << "Enter 1st Number: "; 
     d1 = scanNumber(); 
     cout << "Enter 2nd Number: "; 
     d2 = scanNumber(); 

     char operation; 

     //since you have a switch on the c and x operator they need to be taken into 
     //consideration in this while loop 
     while (!readOperator("+-*/cCxX", operation)) { 
      cout << "Invalid Operator Please Pick Another One" << endl; 
     } 

     bool valid; 
     double result; 

     switch (operation) { 
     case '+': result = add(d1, d2); break; 
     case '-': result = sub(d1, d2); break; 
     case '*': result = mul(d1, d2); break; 
     case '/': 
      if (d2 == 0) { 
       cout << "For division, 2nd operator can't be 0." << endl; 
      } 
      else { 
       result = division(d1, d2); 
      } 
      break; 
     case 'c': 
     case 'C': 
      cout << "Clearing the Calculator " << endl; 
      valid = false; 
      break; 
     case 'x': 
     case 'X': return 0; 
     default: cout << "invalid input"; 
     } 

     //You need to use the valid as well to know if you show the result 
     if (valid) cout << "\nResult: " << result << endl; 
     cout << "\nDo another(Enter 'y'for yes or 'x' to exit) ? "; 
     cin >> ch; 

    } while (ch != 'x'); //now the } ends here and the condition uses ch 

    return 0; //return is now after the while 
} 

échantillon analysé avec l'entrée proposée:

enter image description here

+0

Merci pour l'aide @Isac mais maintenant je me suis heurté à une autre situation où après avoir fait 2 opérations mathématiques, le troisième opérateur que j'ai mis et appuyez sur Entrée. Il me donne l'opérateur invalide et continue à imprimer les lignes pour l'opérateur invalide aussi quand j'appuie sur c pour effacer il me donne également un opérateur invalide et il devrait effacer la calculatrice à la place. Merci les gars pour tout jusqu'à présent! – Jerry

+0

@Jerry je ne peux pas sembler recréer cette erreur. Pouvez-vous me dire exactement quelle entrée vous avez entré et sa commande exacte? – Isac

+0

Oui merci! J'ai fait 3 + 3 = 6 pour la première opération. 2 * 4 = 8 pour la deuxième opération. La troisième fois est quand après avoir entré les nombres que j'ai mis dans l'opérateur et c'est quand il commence à imprimer l'opérateur invalide s'il vous plaît choisir un autre non-stop. – Jerry