использование исключения для хранения ввода пользователя в виде двойного или строкового

Хорошо, я очень новичок, чтобы попробовать — кроме. Я не знаю, возможно ли то, что я пытаюсь сделать, но все равно подумал, что попрошу об этом.

Предполагается, что моя программа усредняет x количество пользовательских входов, пока он не введет q.

Вот функция, которая доставляет мне больше всего проблем.

вектор user_input ()
{

    vector<double> scores;
string user_command;
do{
double user_input;
cout << "Enter the scores to be averaged (range 0-100) or enter q to quit: " << endl;
cin >> user_command;
if (is_number(user_command))
{
user_input = atof(user_command.c_str());
if (user_input < 0 || user_input > 100)
cout << "This is not within range!" << endl;
else{
scores.push_back(user_input);}
}

}
while (user_command != "q" && user_command != "Q");
return scores;

}

Мне нужно понять, почему эта программа не компилируется. Любая помощь будет оценена

1

Решение

Вы не четко определили свои требования, что затрудняет понимание того, как ответить на вопрос. Я предполагаю, что вы хотите что-то вроде этого:

#include <string>
#include <vector>
#include <iostream>
#include <sstream>

typedef double score_type;  //so we don't need to write 'double' everywhere, makes it easy to change the type

void user_input(std::vector<score_type>& scores)
{
std::string command;

for (;;)
{
score_type score;

std::cout << "Enter the scores to be averaged (range 0-100) or enter q to quit: " << std::endl;

std::cin >> command;

if (command == "q" || command == "Q")
{
//works better than a do-while in this case
break;
}

try
{
//stod to throw std::invalid_argument and std::out_of_range, check documentation (http://en.cppreference.com/w/cpp/string/basic_string/stof)
score = std::stod(command.c_str());
}
catch (std::exception e)
{
//build exception string
std::ostringstream oss;
oss << "bad input: " << command;

//throw new exception to be handled elsewhere
throw std::exception(oss.str().c_str());
}

if (score < 0 || score > 100)
{
std::cerr << "Input  is not within range (0-100)!" << std::endl;
}

scores.push_back(score);
}
}

int main()
{
for (;;)
{
std::vector<score_type> scores;

try
{
user_input(scores);
}
catch (std::exception e)
{
std::cout << "input exception: " << e.what() << std::endl;
}

score_type score_sum = 0;

for (auto score : scores)
{
score_sum += score;
}

score_type average_score = 0;

if (!scores.empty())
{
average_score = score_sum / scores.size();
}

std::cout << "average score: " << average_score << std::endl;
std::cout << "go again? (y/n): " << std::endl;

std::string command;

std::cin >> command;

if (command == "y")
{
continue;
}
else if (command == "n")
{
break;
}
}
}

В будущем убедитесь, что весь код, который вы публикуете в будущих вопросах, может быть скомпилирован и запущен любым пользователем, особенно для таких простых вещей, как этот. Ты можешь использовать http://ideone.com/ проверить ваши образцы кода перед публикацией.

0

Другие решения


По вопросам рекламы [email protected]