Я программирую калькулятор суммы и вычитания только на С++. Я использую 2 функции void, одну для пользовательского интерфейса, тогда как пользователь может выбрать, использовать ли функции суммы или вычитания (или выйти из программы). Другой состоит из 3 условных выражений, первые 2 относятся к алгебраической операции, которую калькулятор должен выполнить, чтобы получить результат арифметической операции. Третий предназначен для случаев, когда пользователь не выбрал допустимый вариант, и перенаправляет пользователя туда, где он начался.
Проблема здесь в том, что второе условие игнорируется. Например, если я ввожу «2» или «2.», программа говорит, что выводит «Неверный выбор», как если бы было выполнено третье условие, но это не точно. Как я могу это решить? Вот код:
#include <iostream>
#include <thread>
using namespace std;
float userInterfaceChoice;
float num1;
float num2;
void conditionals();
void userInterface()
{
cout<<"CALCULATOR"<<endl
<<""<<endl
<<"Please choose an option"<<endl
<<"1. Sum"<<endl
<<"2. Subtraction"<<endl
<<"3. Exit"<<endl;
cin>>userInterfaceChoice;
this_thread::sleep_for(1s);
conditionals();
}
void conditionals()
{
// Sum
if (userInterfaceChoice==("1"||"1."))
{
// Input of numbers
cout<<""<<endl
<<"SUM"<<endl
<<"Enter the first number"<<endl;
cin >>num1;
cout<<""<<endl
<<"Enter the second number"<<endl;
cin >>num2;
// Operation & Output
cout<<"The sum equals "<<num1+num2<<endl;
// Wait 2 seconds, then come back to the GUI
this_thread::sleep_for(2s);
userInterface();
}
// Subtracion
else if (userInterfaceChoice==("2"||"2."))
{
// Numbers input
cout<<""<<endl
<<"SUM"<<endl
<<"Enter the first number"<<endl;
cin >>num1;
cout<<""<<endl
<<"Enter the second number"<<endl;
cin >>num2;
// Operation & Output
cout<<"The subtraction equals"<<num1-num2<<endl;
// Wait 2 seconds, come back to the GUI
this_thread::sleep_for(2s);
userInterface();
}
//Invalid choice
else if (userInterfaceChoice!=("1"&&"1."&&"2"&&"2."))
{
cout<<""<<endl
<<"Invalid choice"<<endl;
// Wait 2 seconds, come back to the GUI
this_thread::sleep_for(2s);
userInterface();
}
}
// Execute the void functions
int main()
{
userInterface();
conditionals();
}
Я попытался решить эту проблему, удалив третье условное выражение, но программа завершается с кодом выхода 0, что означает, что условное условие все еще не выполняется или сразу игнорируется.
if (userInterfaceChoice==("1"||"1."))
-- Если вы просмотрите книгу по C++, которую вы используете, где вы увидите if
операторы, структурированные таким образом? Вы их не найдете, потому что это не то, как составить оператор if
, который должен проверять оба значения. Если вы догадываетесь, как работает C++, это опасно - вы получите код для компиляции, но то, что скомпилировано, делает нечто совершенно отличное от того, что вы ожидали.
Примечание: userInterface
и conditionals
обращение друг к другу более или менее безоговорочно закончится катастрофой, от которой этот сайт получил свое название..
Быстрый урок по построению минимального воспроизводимого примера: продемонстрируйте ошибку; не демонстрируйте «калькулятор суммирования и вычитания». У вас есть оператор if
, который ведет себя неправильно для определенного значения. Продемонстрируйте это. Только то. Удалите все остальное, особенно пользовательский ввод (если только это не устранит ошибку). int main() { float userInterfaceChoice = 2; if (userInterfaceChoice==("2"||"2.")) { std::cout << "Expected result\n"; } else { std::cout << "This should not happen!\n"; } }
(После вашего вопроса и кода вы можете описать свой проект для фона, что может объяснить условное выражение.)
if (userInterfaceChoice==("1"||"1."))
должно быть if (userInterfaceChoice==1)
. А float userInterfaceChoice;
должно быть int userInterfaceChoice;
.
@JaMiT Хороший пример, но, к сожалению, шансы новичка на самом деле сделать это равны нулю.
@john «шансы новичка на самом деле сделать это равны нулю» - отсюда «урок», а не «требование к публикации». Мой комментарий содержит указания и пример для выделения проблемы. (Кроме того, я бы не стал заходить так далеко, как «ноль».)
@john На самом деле, я понял код, и я новичок.
Булевы значения так не работают. Вы сравниваете значения float
с логическими значениями, которые всегда оцениваются как true
, но эти сравнения не делают того, что вы ожидаете.
userInterfaceChoice==("1"||"1.")
Становится:
userInterfaceChoice == 1
Но остерегайтесь ==
на поплавках, так как они могут быть неточными.
Так же:
userInterfaceChoice!=("1"&&"1."&&"2"&&"2.")
Скорее всего, это:
userInterfaceChoice != 1 && userInterfaceChoice != 2)
Кроме того, настоятельно рекомендуется избегать использования глобальных переменных. Данные должны передаваться в функции и из них через их аргументы и возвращаемые значения.
if (userInterfaceChoice==("2"||"2."))
делает не то, что вы думаете.