Трудности прототипа функции

У меня возникли трудности с правильной работой моей программы. Для той части проекта, с которой у меня возникли трудности, мне нужно создать функцию, которая проверяет два разных числа, введенных пользователем. Однако всякий раз, когда я запускаю программу, я получаю две ошибки.

Во-первых, ввод сначала читается как ввод 0 (хотя я этого не делал).

А во-вторых, он обрабатывает первый ввод через тест проверки второго ввода.

Прототипы функций:

int validate(int , int);

Главный:

do
{       
    //display the menu
    displayMenu();
    cin >> choice; 
    validate(choice, months);

    // process the user's choice
    if (choice != QUIT_CHOICE)
    {
        // get the number of months
        cout << over3 << "For how many months? ";
        cin >> months; 
        validate(choice, months);
}

И рассматриваемый прототип функции:

int validate(int choice, int months)
{
while (choice < 1 || choice > 4)
{
    cout << over3 << choice << " is not between 1 and 4! Try again: ";  
    cin >> choice;
}

while (months < 1 || months > 12)
{
    cout << over3 << months << " is not between 1 and 12! Try again: "; 
    cin >> months;
}

}

person Tyler Kelly    schedule 09.04.2014    source источник


Ответы (2)


Поскольку обе они независимы друг от друга, вам нужно разделить их на две функции для вашей цели: validateChoice, которая состоит из первого цикла while, и validateMonths, которая состоит из второго цикла while.

Если вам нужна одна функция, вам нужно передать соответствующий параметр

int validate(int value, int lowLimit, int HighLimit)
{
    while(value < lowLimit || value > HighLimit)
    {
        //print error message here
        cin>> value;
    }
    return value;
}

В основном делай

cin >> choice;
choice = validate(choice, 1, 4);

Аналогично для months.

person GoldRoger    schedule 09.04.2014
comment
Правильный способ использования потока std для чтения — if(cin >> value) { /* do something with value */ } else { /* failure to read */ }. Вы по-прежнему выполняете чтение форматирования, не проверяя его успешность. - person pmr; 09.04.2014
comment
Хорошо, это то, что я думаю, что мне придется сделать.. мой профессор говорит использовать функцию с именем validate для проверки обоих этих значений, но я действительно понятия не имею, как это сделать - person Tyler Kelly; 09.04.2014
comment
@user3470987 user3470987 Разве мой ответ не показывает вам то же самое? Функция с именем validate, которая проверяет оба значения. Вам просто нужно передавать разные аргументы во время разных вызовов функций. - person GoldRoger; 09.04.2014
comment
о, ладно, ладно, понял, в этом есть смысл. Вы знаете, что означает пмр? - person Tyler Kelly; 09.04.2014
comment
Он просит вас проверить успешность чтения. Проверьте это. - person GoldRoger; 09.04.2014

Вы не показали, как (если вообще) вы инициализируете choice и months перед циклом do, но я предполагаю, что вы этого не сделали. Поэтому здесь:

cin >> choice; 
validate(choice, months);

Вы передаете неинициализированное значение в качестве второго аргумента validate. Неинициализированное значение может быть любым; в вашем случае вроде бы ноль.

person Oktalist    schedule 09.04.2014