Я пытаюсь построить простой калькулятор с одной операцией, чтобы практиковать такие методы, как while
и for
, и я пытаюсь изучить и понять способы «меню» в консоли.Взять отфильтрованный пользовательский ввод и сделать его соответствующим опции меню
У меня есть программа, которая дает вам список (записи от map
, функция, которую я мог использовать, но почти ничего не знаю) о действиях, из которых вы должны выбрать.
Если вы вводите недопустимый ввод (не целое или целое число вне диапазона), он предлагает вам действительный ответ. Теперь я хочу, чтобы программа взяла записи (1-4) и сделала их соответствующими операции.
В моем коде вы увидите, что каждая операция имеет свой собственный метод (я думал, что это будет хороший способ сделать что-то, особенно для практики работы между методами). Я хочу, чтобы main
взял operatorSelection
и использовал это, чтобы выбрать, к какому методу перейти. Затем он вычислит result
и вернет его на main
.
Я думал, что я мог бы достичь, используя map
, имеющие operatorSelection
соответствуют записи в map
, и имеющие соответствующую строку в этой записи будет использоваться для вызова метода (где каждый метод называется так же, как и в map
).
Примечание Прежде чем ответить
Я новичок в этом, и я хочу знать, оптимизированный путь об этом. Я хочу, чтобы это было просто, но эффективно; Я не знаю некоторых функций, которые я использую, особенно map
. Я кратко прочитал о vector
и array
, но я не знал, как их использовать. Я понимаю, что map
в моей функции, кажется, печатается в алфавитном порядке, и я хотел бы иметь возможность сортировать записи полностью по своему усмотрению. Есть ли лучший способ сделать это, чем с помощью map
?
Вот мой код (методы эксплуатации являются неполными, я знаю):
// OneOpCalc.cpp : Defines the entry pofloat for the console application.
#include "stdafx.h"
using namespace std;
int operatorSelection;
float firstNumber,secondNumber,result;
int main(float argc, char* argv[])
{
bool validInput = false;
map<string,int> Operations;
Operations.insert(pair<string, int>("Addition", 1));
Operations.insert(pair<string, int>("Division", 2));
Operations.insert(pair<string, int>("Multiplication", 3));
Operations.insert(pair<string, int>("Subtraction", 4));
cout << "Welcome to OneOpCalc. ";
while (!validInput)
{
cout << "Please select an operation by its number: ";
cin >> operatorSelection;
if (!cin || operatorSelection > 5 || operatorSelection < 1)
{
cout << "Error: Invalid entry. Try again." << endl << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else
{
validInput = true;
}
}
system("pause");
return 0;
}
float Addition (float firstNumber, float secondNumber)
{
result=firstNumber+secondNumber;
return (result);
}
float Subtraction (float firstNumber, float secondNumber)
{
result=firstNumber-secondNumber;
return (result);
}
float Multiplication (float firstNumber, float secondNumber)
{
result=firstNumber*secondNumber;
return (result);
}
float Division (float firstNumber, float secondNumber)
{
result=firstNumber/secondNumber;
return (result);
}
Чтобы поставить вопрос просто:
Что такое хороший способ для вызова метода в зависимости от пользовательского ввода?
Вы так много написаны, и все это так полезно, но я все это время тратил на то, чтобы обвести вокруг себя голову. Я заменил 'system (" pause ")' на 'cin.get()', и он не работает. Теперь программа закрывается, как только выполняется 'while'. '! CIN.good() 'работает, хотя и с этим, и с!! cin. Я пытался выяснить, как заставить OneOpCalc обрабатывать пустую запись как ошибочный ввод. – jwarner112
Принятие пяти входных данных было случайным - я строю эту программу, чтобы я мог взять понятия, которые я изучил, и применить их к предыдущему проекту, где мне нужна эта концепция, и там у меня есть 5 вариантов, поэтому я должен иметь забыл изменить это. Наконец, ** спасибо ** за указание на концепцию прямого возврата - это избавляет меня от множества хлопот и, надеюсь, я запомню это на будущее. – jwarner112
Кроме того, я не понимаю «для NaN. ВНИМАНИЕ: для gcc вам нужно скомпилировать с -lm». А именно, термины «gcc» и «-lm». И, наконец, я не очень хорошо понимаю «переключатель». Вы говорите ему, чтобы перейти к любому из этих пяти случаев (включая 'default'), но я не могу понять, как он знает, какой случай использовать. Где это условие? Или числа, следующие за «случайными» номерами по совпадению, и мы фактически используем мой вход для выбора случая? (Извините, что у вас больше вопросов, которые пристают) – jwarner112