2013-10-15 2 views
-1

Хорошо, поэтому я уже давно программировал на C++, но сейчас я в тупике на что-то, что, вероятно, очень очевидно. Я решил написать базовый калькулятор для удовольствия. Сложение, вычитание, умножение, деление, вся партия. Как вы можете видеть ниже, у меня есть переменная int, называемая выбором, которая ищет либо 1, 2, 3, либо 4. После выбора она вызовет соответствующую функцию. Тем не менее, я решил, что хочу, чтобы в любое время, типа "помощь", чтобы показать помощь. Как я могу это сделать? Я знаю, что могу просто выбрать строку, но я чувствую, что просто поставил бы бандад на проблему (не помогло бы для будущих проблем). Я хочу, в любое время, поймать «помощь». Однако использование другого оператора if() для «помощи», очевидно, даст мне ошибку - поскольку выбор является int.C++ - Ищет «помощь»

Пожалуйста, помогите мне, я уверен, что это очень просто, но по какой-то причине я не могу понять это!

#include <iostream> 

int firstnum; 
int secondnum; 

int multiplication(){ 
    std::cout << "Multiplication chosen. Please enter first number." << std::endl; 
    std::cin >> firstnum; 
    std::cout << "Please enter second number." << endl; 
    std::cin >> secondnum; 
    std::cout << "Your answer is: " << firstnum * secondnum << "." << std::endl; 
} 

int division(){ 
    std::cout << "Division chosen. Please enter first number." << std::endl; 
    std::cin >> firstnum; 
    std::cout << "Please enter second number." << std::endl; 
    std::cin >> secondnum; 
    std::cout << "Your answer is: " << firstnum/secondnum << "." << std::endl; 
} 

int addition(){ 
    std::cout << "Addition chosen. Please enter first number." << std::endl; 
    std::cin >> firstnum; 
    std::cout << "Please enter second number." << std::endl; 
    std::cin >> secondnum; 
    std::cout << "Your answer is: " << firstnum + secondnum << "." << std::endl; 
} 

int subtraction(){ 
    std::cout << "Subtraction chosen. Please enter first number." << std::endl; 
    std::cin >> firstnum; 
    std::cout << "Please enter second number." << std::endl; 
    std::cin >> secondnum; 
    std::cout << "Your answer is: " << firstnum - secondnum << "." << std::endl; 
} 

int main(){ 
    int choice; 
    std::cout << "Calculator." << std::endl; 
    std::cout << "Multiplication: 1. Division: 2. Addition: 3. Subtraction: 4. Help: help." << std::endl; 
    std::cin >> choice; 
    if(choice == 1){ 
     multiplication(); 
    } 
    if(choice == 2){ 
     division(); 
    } 
    if(choice == 3){ 
     addition(); 
    } 
    if(choice == 4){ 
     subtraction(); 
    } 

////if the user types "help" it will show help. 

    return 0; 
} 
+0

Да? Что вы имеете в виду? – Crju

+0

О, нет, ты правильно прочитал мой вопрос? Я хочу, чтобы пользователь мог ввести «help». Это не имеет никакого отношения к обходу фильтра stackoverflow. – Crju

+0

Извините, я должен +1 это, если только за ужасный каламбур :) – Leeor

ответ

0

Чтобы сделать это так, как вы описали, вы должны сначала прочитать ваш вход в STRING м чека, если «помощь» была введена, и если нет, если входной сигнал может быть проанализирована как целое. Затем вы проанализируете целое число и вызовите другие функции как обычно.

5

я бы просто изменить выбор на станд :: строка

std::string choice; 
std::cin >> choice; 

if (choice == "1") { .... } 
if (choice == "help") { .... } 

Но я бы также изменить структуру если заявления.
Вместо списка if statements Я бы воспользовался картой. Это отображает команду на вызов функции.

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

int one() 
{ 
    std::cout << "one\n"; 
} 
int two() 
{ 
    std::cout << "two\n"; 
} 

int main() 
{ 
    std::map<std::string, std::function<int()> >  action = {{"one", one}, {"two", two}}; 

    auto act = action.find("one"); 
    act->second(); 

} 
+0

Извините, как я уже сказал, похоже, что это только помещает бандад в проблему. – Crju

+0

Я бы даже покончил с частью «xxx selected» и сохранил 'std :: function', которые в основном заполнены 'std :: plus' и тому подобное. Тогда есть только один набор инструкций, чтобы получить два числа. – chris

+3

@SydZ: Почему так кажется? –

1

Мне нравится использовать Command Pattern для таких вещей. (https://en.wikipedia.org/wiki/Command_pattern)

В основном у вас есть Command класс/интерфейс, такие как:

abstract class Command 
{ 
    virtual void run() = 0; 
} 

, а затем имеют разные команды, которые наследуют от:

class HelpCommand : Command 
{ 
    virtual void run() 
    { 
     // do stuff 
    } 
} 

Тогда в обработчик, который получает команды от пользователь, у вас будет карта string до Command. Поэтому, когда пользователь вводит команду (например, «help»), он получает соответствующую команду с карты, а затем вызывает свой метод run().

unordered_map< string, Command* > commands; 
commands[ "help" ] = new HelpCommand(); 

// ... 

// get input 
commands[ input ]->run(); 
Смежные вопросы