Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Не выполняется рекурсия

Имеется код:
char field[3][3]; void enterX() { cout << "Enter X on vertical: "; int i; cin >> i; if (cin.good() && i < 3 && i >= 0) {
} else { cout << "Please, enter the number 0-2!"; cin.clear(); cin.ignore(INT_MAX); enterX(); }
cout << "Enter X on horizontal: "; int j; cin >> j; if (cin.good() && j < 3 && j >= 0) {
} else { cout << "Please, enter the number 0-2!"; cin.clear(); cin.ignore(INT_MAX); enterX(); } field[i][j] = 'x';
}
Задача - считывание номера элемента массива с консоли и вставке в это место символа 'x'. Однако при неверном вводе не происходит рекурсия. В чём проблема?


Ответ

Вообще-то это - cin.ignore(INT_MAX); - игнорировать все (ну ладно, INT_MAX символов) до конца файла - т.е. пока какое-то ^Z не закроет поток...
input.ignore(std::numeric_limits::max(), '
');
И вообще, я бы делал так (если уж приспичила именно рекурсия):
char field[3][3]; void enterX() { cout << "Enter X && Y: "; unsigned int i, j; cin >> i >> j; if (cin.fail() || i > 2 || j > 2) { cin.clear(); cin.ignore(INT_MAX,'
'); cout << "Wrong values!
"; enterX(); } else { field[i][j] = 'x'; } }
Update
Имея типичную оконечную рекурсию, лучше переделать ее в итерацию:
char field[3][3]; void enterX() { for(;;) { cout << "Enter X && Y: "; unsigned int i, j; cin >> i >> j; if (!(cin.fail() || i > 2 || j > 2)) { field[i][j] = 'x'; break; } cin.clear(); cin.ignore(INT_MAX,'
'); cout << "Wrong values!
"; } }

Комментариев нет:

Отправить комментарий