Хорошо, я очень новичок, чтобы попробовать — кроме. Я не знаю, возможно ли то, что я пытаюсь сделать, но все равно подумал, что попрошу об этом.
Предполагается, что моя программа усредняет 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;
}
Мне нужно понять, почему эта программа не компилируется. Любая помощь будет оценена
Вы не четко определили свои требования, что затрудняет понимание того, как ответить на вопрос. Я предполагаю, что вы хотите что-то вроде этого:
#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/ проверить ваши образцы кода перед публикацией.