Switch Case всегда идет по умолчанию - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь создать небольшую операционную систему, которая получает ответ от переключателя ... случая, чтобы перейти к миниатюрной игре или простому калькулятору.Тем не менее, независимо от того, какой ввод я даю (даже правильный), вывод всегда по умолчанию.Компилятор, который я использую (Microsoft Visual Studio; это может быть проблемой), не дает мне никаких ошибок, и я не могу найти или подумать о каких-либо ошибках.У кого-нибудь из вас, кто действительно хорош в этом, есть ответы на мою проблему?

#include "stdafx.h"
#include <iostream>
#include <limits>

using namespace std;

int calc() {

char op;
float num1, num2;

cout << "Enter operation:";
cin >> op;

cout << "Enter two numbers:";
cin >> num1 >> num2;

switch (op)
{
case '+':
    cout << num1 + num2;
    break;

case '-':
    cout << num1 - num2;
    break;

case '*':
    cout << num1 * num2;
    break;

case '/':
    cout << num1 / num2;
    break;

default:
    cout << "That is not an operation";
    break;
}

return 0;
};

int main()
{
char answer;

cout << "Welcome to the FR Operating System. \n";
cout << "If you want to go to the calculator, type in 'Calc'. \n";
cout << "If you want to go to the game, type in 'Game'. \n";

cin >> answer;

switch (answer) {
case 'Calc' || 'calc':
    cout << "Welcome to the calculator. \n";
    break;

case 'Game':
    cout << "Welcome to our game, 'A Day in the Life'. \n";
    break;

default:
    cout << "That is an invalid answer. This has caused the system to crash. \n";
    break;
}

atexit([] { system("PAUSE"); });

return 0;

}

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Вы запрашиваете у пользователя string, в то время как ваша переменная answer является char, измените ваши приглашения на символы, такие как c и g, чтобы сделать его более удобным, чтобы вы могли использовать и перечислять символыв вашем switch / case заявлении:

int main()
{
char answer;

cout << "Welcome to the FR Operating System. \n";
cout << "If you want to go to the calculator, type in 'c'. \n";
cout << "If you want to go to the game, type in 'g'. \n";
cin >> answer;
switch (answer) {
case 'c':
case 'C':
    cout << "Welcome to the calculator. \n";
    break;

case 'g':
case 'G':
    cout << "Welcome to our game, 'A Day in the Life'. \n";
    break;
...
0 голосов
/ 07 июня 2018

Использовать обратные вызовы карты к элементу

В идеале было бы лучше сопоставить меню элемента с его соответствующими действиями.std::map<std::string, std::function<void()>> позволяет именно это!Прочитайте встроенные комментарии, чтобы понять смысл остальных:

#include <string>
#include <map>
#include <iostream>
#include <functional>

int main()
{
    std::map<std::string, std::function<void()>> menu_items;
    menu_items.emplace("calc", [](){std::cout << "calculate chosen\n";}); //use lambdas to spare boilerplate
    menu_items.emplace("game", [](){std::cout << "game is chosen\n";});

    std::string chosen_item;
    std::cin >> chosen_item;
    auto item = menu_items.find(chosen_item); //search by the string
    if (item == menu_items.end()) //item was not found in the list
        std::cout << "invalid item is chosen\n";
    else
        item->second(); //execute the stored function
}

Демо .

В зависимости от вашего использования вы можете использовать void*() для std::function<void()>и std::unordered_map для std::map.Для вашего случая использования это, похоже, не имеет значения.

Также вы можете захотеть нормализовать ввод, например, в нижнем регистре или выполнить другую нормализацию.Поскольку это не чувствительная к производительности часть кода, я считаю, что издержки std::function и std::map в этом случае не будут иметь значения.

0 голосов
/ 07 июня 2018
  1. 'Game' не является допустимой строкой
  2. Даже если вы замените ее на "Game", которая является допустимой строкой, switch не работает со строками.

Так что либо используйте одиночные символы в вашем коммутаторе, либо используйте if - else блоки, где вы сравниваете std::string s через ==.

std::string answer;
cin >> answer;
if (answer == "Calc" || answer == "calc")
    //...
else if (answer == "Game")
    //...
else
    // invalid 
...