1

Решил сделать калькулятор (да, крайне странный), попрактиковаться в написании кода. Вот сам код:

#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main()
{
    setlocale(LC_ALL, "russian");
    char op;
    string answer;
    double x1 = 0, x2 = 0, Xr = 0;
    cout << "Введите два числа" << endl;;
    cout << "X[1] = "; cin >> x1;
    cout << "X[2] = "; cin >> x2;
    cout << "Выберите операцию(+,-,*,/,%): "; cin >> op;
    if (op == '+') {
        Xr = x1 + x2;
        cout << "Результат: " << Xr;
    }
    else if (op == '-') {
        cout << "Желаете получить отрицательное число? "; 
        cin >> answer;
        getline(cin, answer);
    if (answer == &quot;Да&quot; || answer == &quot;да&quot; || answer == &quot;Yes&quot; || answer == &quot;yes&quot; || answer == &quot;y&quot;)
    {
        if (x1 &lt; x2) {
            Xr = x1 - x2;
        }

        else if (x1 &gt; x2) {
            Xr = x2 - x1;
        }
        else {
            Xr = x1 - x2;
        }
        cout &lt;&lt; &quot;Результат: &quot; &lt;&lt; Xr &lt;&lt; endl;
    }

    else if (answer == &quot;Нет&quot; || answer == &quot;нет&quot; || answer == &quot;No&quot; || answer == &quot;no&quot; || answer == &quot;n&quot;)
    {
        if (x1 &lt; x2) {
            Xr = x2 - x1;
        }

        else if (x1 &gt; x2) {
            Xr = x1 - x2;
        }

        else {
            Xr = x1 - x2;
        }
        cout &lt;&lt; &quot;Результат: &quot; &lt;&lt; Xr &lt;&lt; endl;
    }
}
    else if (op == '*') {
        Xr = x1 * x2;
        cout &lt;&lt; &quot;Результат: &quot; &lt;&lt; Xr;
}
else if (op == '/') {
    cout &lt;&lt; &quot;Делить меньшее на большее число(Без остатка)?  &quot;;
    cin &gt;&gt; answer;
    getline(cin, answer);
    if (answer == &quot;Да&quot; || answer == &quot;да&quot; || answer == &quot;Yes&quot; || answer == &quot;yes&quot; || answer == &quot;y&quot;) {
        if (x1 &lt; x2) {
            Xr = x1 / x2;
        }
    }

    else if (answer == &quot;Нет&quot; || answer == &quot;нет&quot; || answer == &quot;No&quot; || answer == &quot;no&quot; || answer == &quot;n&quot;) {
        if (x1 &lt; x2) {
            Xr = x2 / x1;
        }
        cout &lt;&lt; &quot;Результат: &quot; &lt;&lt; Xr &lt;&lt; endl;
    }
}
else if (op == '%') {
    cout &lt;&lt; &quot;Делить меньшее на большее число(С остатком)?  &quot;;
    cin &gt;&gt; answer;
    getline(cin, answer);
    if (answer == &quot;Да&quot; || answer == &quot;да&quot; || answer == &quot;Yes&quot; || answer == &quot;yes&quot; || answer == &quot;y&quot;) {
        if (x1 &lt; x2) {
            Xr = fmod(x1, x2);
        }
        cout &lt;&lt; &quot;Результат: &quot; &lt;&lt; Xr &lt;&lt; endl;
    }
    else if (answer == &quot;Нет&quot; || answer == &quot;нет&quot; || answer == &quot;No&quot; || answer == &quot;no&quot; || answer == &quot;n&quot;) {
        if (x1 &lt; x2) {
            Xr = fmod(x2, x1);
        }
        cout &lt;&lt; &quot;Результат: &quot; &lt;&lt; Xr &lt;&lt; endl;
    }
}

return 0; }

Проблема в том, что переменная answer не считывает ответ, а консоль выдаёт пустую строку и завершает работу. Пробовал читать документацию по работе с string и char, искал ответы на похожие проблемы, но так и не понял, как решить именно свою проблему. Поэтому пишу здесь, дабы хоть кто-нибудь помог дураку.

Harry
  • 221,325
mfy
  • 11

2 Answers2

1

Вы сначала инициализируете из потока ввода ваш answer до символа разделителя, оператором cin >> answer; потом пытаетесь читать в тот же answer всю оставшуюся строку( getline(cin, answer), а там что осталось, известно только тому, кто вводит... Для вашего случая вам нужен ввод только одного слова, поэтому просто избавьтесь от лишней попытки читать еще и функцией getline.

В качестве замечания: старайтесь не повторять код каждый раз . Это приводит к разбуханию вашего кода и отнимает у вас и у читателей(в том числе и компилятора/компановщика) лишней времени. И если еще попытаетесь избавляться от лишних условий, ваша программа будет более читабельной и качественней в плане скорости. Кусок вашего кода может выглядеть (как минимум ) следующим образом:

cout << "Результат: ";
if (op == '+') {        
    Xr = x1 + x2;
}
else if (op == '-') {       
    cin >> answer;        
    Xr = abs(x1 - x2);
    cout << "Желаете получить отрицательное число? ";
    if (answer == "yes"/*...*/ )
        Xr *= -1; 
    //все остальные проверки сводятся на нет                    
}
//те же поправки  и для других случаев

//только после проверки всех условий выводим результат cout << Xr;

Также не забывайте, что нельзя быть уверенным, что ввод всегда будет верным, и предусмотреть соответствующие сообщения о неверном вводе. И не забывайте про оператора switch

AR Hovsepyan
  • 15,934
0

Зачем вы читаете 2 раза?

cin >> answer;
getline(cin, answer);

Закомментируйте строку с getline(), и все получится.

И вообще, смешивать >> и getlineне есть здорово. Поэтому закомментируйте именно getline. Иначе все равно работать не будет, будете читать остающийся в буфере ввода \n...

Harry
  • 221,325