Иначе, если оператор игнорируется

Я программирую калькулятор суммы и вычитания только на С++. Я использую 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==("2"||"2.")) делает не то, что вы думаете.
Raymond Chen 10.04.2023 04:55
if (userInterfaceChoice==("1"||"1.")) -- Если вы просмотрите книгу по C++, которую вы используете, где вы увидите if операторы, структурированные таким образом? Вы их не найдете, потому что это не то, как составить оператор if, который должен проверять оба значения. Если вы догадываетесь, как работает C++, это опасно - вы получите код для компиляции, но то, что скомпилировано, делает нечто совершенно отличное от того, что вы ожидали.
PaulMcKenzie 10.04.2023 04:59

Примечание: userInterface и conditionals обращение друг к другу более или менее безоговорочно закончится катастрофой, от которой этот сайт получил свое название..

user4581301 10.04.2023 05:28

Быстрый урок по построению минимального воспроизводимого примера: продемонстрируйте ошибку; не демонстрируйте «калькулятор суммирования и вычитания». У вас есть оператор if, который ведет себя неправильно для определенного значения. Продемонстрируйте это. Только то. Удалите все остальное, особенно пользовательский ввод (если только это не устранит ошибку). int main() { float userInterfaceChoice = 2; if (userInterfaceChoice==("2"||"2.")) { std::cout << "Expected result\n"; } else { std::cout << "This should not happen!\n"; } } (После вашего вопроса и кода вы можете описать свой проект для фона, что может объяснить условное выражение.)

JaMiT 10.04.2023 08:18
if (userInterfaceChoice==("1"||"1.")) должно быть if (userInterfaceChoice==1). А float userInterfaceChoice; должно быть int userInterfaceChoice;.
john 10.04.2023 08:30

@JaMiT Хороший пример, но, к сожалению, шансы новичка на самом деле сделать это равны нулю.

john 10.04.2023 08:33

@john «шансы новичка на самом деле сделать это равны нулю» - отсюда «урок», а не «требование к публикации». Мой комментарий содержит указания и пример для выделения проблемы. (Кроме того, я бы не стал заходить так далеко, как «ноль».)

JaMiT 10.04.2023 09:07

@john На самом деле, я понял код, и я новичок.

Elrichiz 10.04.2023 16:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Булевы значения так не работают. Вы сравниваете значения float с логическими значениями, которые всегда оцениваются как true, но эти сравнения не делают того, что вы ожидаете.

userInterfaceChoice==("1"||"1.")

Становится:

userInterfaceChoice == 1

Но остерегайтесь == на поплавках, так как они могут быть неточными.

Так же:

userInterfaceChoice!=("1"&&"1."&&"2"&&"2.")

Скорее всего, это:

userInterfaceChoice != 1 && userInterfaceChoice != 2)

Кроме того, настоятельно рекомендуется избегать использования глобальных переменных. Данные должны передаваться в функции и из них через их аргументы и возвращаемые значения.

Другие вопросы по теме