2016-10-19 7 views
1

Я начал создавать очень простую версию калькулятора в C++. Идея состоит в том, чтобы выполнять базовые операции только с двумя числами, а затем циклически возвращаться, чтобы пользователь мог выполнить новый расчет.Возникли проблемы с циклом while в C++

Программа выглядит следующим образом:

#include<iostream> 
#include<string> 
#include"mathOperations.h" 
using namespace std; 

int main() 
{ 
    int x, y; 
    string operation; 
    string repeat = "y"; 

    while (repeat == "y" or "Y") 
    { 
    cout << "Welcome! This is a raw version of a calculator - only use two numbers." << endl; 
    cin >> x >> operation >> y; 

    if (operation == "+") 
    { 
     cout << "Result: " << add(x, y) << endl; 
    } 
    else if (operation == "-") 
    { 
     cout << "Result: " << subtract(x, y) << endl; 
    } 
    else if (operation == "*") 
    { 
     cout << "Result: " << multiply(x, y) << endl; 
    } 
    else if (operation == "/") 
    { 
     cout << "Result: " << divide(x, y) << endl; 
    } 
    else 
    { 
     cout << "This is not a valid sign. Please choose another one!" << endl; 
    } 

    cout << "Wanna go again? Type 'y' or 'n'." << endl; 
    cin >> repeat; 

    if (repeat == "n" or "N") 
    { 
     cout << "Alright, have a nice day!" << endl; 
     break; 
    } 
    } 
} 

int add(int x, int y) 
{ 
    return x + y; 
} 

int subtract(int x, int y) 
{ 
    return x - y; 
} 

int multiply(int x, int y) 
{ 
    return x * y; 
} 

int divide(int x, int y) 
{ 
    return x/y; 
} 

ПРИМЕЧАНИЕ: Существует файл «mathOperations.h», в котором я сделал вперед заявления всех функций, используемых.

Проблема заключается в том, что всякий раз, когда я набираю «y», чтобы сделать его циклом, он просто выводит следующее выражение «if» и вырывается из цикла, и программа заканчивается. Я не мог понять, почему это происходит, поскольку оператор «if» должен запускаться только в том случае, если я набираю «n».

+6

'или' не дает выбор возможных значений, это комбинация булевых выражений – stefaanv

+1

if (repeat == "n" или repeat == "N"). То же самое с y –

+2

@JesperJuhl Как вы знаете, что OP не * работает * из книги? Если такие вопросы не являются причиной этого сайта, что такое? Комментарии, подобные этому, убирают людей, которым нужен этот сайт. Прокомментируйте/ответьте, когда у вас есть что-то конструктивное, чтобы сказать. –

ответ

7
repeat == "n" or "N" 

вычисляет

(repeat == "n") || "N" 

см C++ operator precedence.

Первый repeat == "n" вычисляет true или false в зависимости от вашего входа, но второй раздел ИЛИ, т.е. "N", всегда имеет значение true, потому что это строковый литерал, который распадается на ненулевой const char* указатель, и в C или C++ все ненулевые неявно преобразуются в true. Таким образом, ваше предложение OR всегда равно true, что означает, что блок if всегда будет выполнен.

Как уже упоминалось в комментариях, что вам нужно сделать

if(repeat == "n" || repeat == "N") {...} 

Аналогично с первым while состоянии.

1

Хороший код! Я пытаюсь использовать "||" вместо ваших «или» в ваших утверждениях if. Возможно, вы захотите обновить свои знания с помощью C++ короткого замыкания булевых элементов.

Смежные вопросы