Как сделать проверку на double в scanf, если ожидается int? - C (СИ)
Формулировка задачи:
Возможно ли как-то средствами scanf отловить ввод десятичной точки, чтобы отловить ввод типа 5.8 или 5.0, то есть когда в числе присутствует десятичная точка, а scanf ожидает целое? Другие функции по условию задачи использовать нельзя, а дополнительную переменную double использовать не хочется. Есть варианты?
Решение задачи: «Как сделать проверку на double в scanf, если ожидается int?»
textual
Листинг программы
/* -------------------------------------------------------------------------- */
#include <stdio.h>
/* -------------------------------------------------------------------------- */
#define MIN_NUMBER_OF_PLAYERS 0
#define MAX_NUMBER_OF_PLAYERS 49
/* -------------------------------------------------------------------------- */
int main()
{
int result = 0;
int number_of_players = 0;
printf("Enter the number of players: \n");
result = scanf ("%d", &number_of_players);
if (result == EOF) {
return 1;
}
if (result == 0) {
printf("Invalid input!\n");
return 1;
}
if ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
(number_of_players > MAX_NUMBER_OF_PLAYERS) ) {
do {
printf("Please enter a valid number of players [0..49]\n");
result = scanf ("%d", &number_of_players);
if (result == EOF) {
return 1;
}
if (result == 0) {
printf("Invalid input!\n");
return 1;
}
} while ( (number_of_players < MIN_NUMBER_OF_PLAYERS) ||
(number_of_players > MAX_NUMBER_OF_PLAYERS) || result != 1);
}
if (number_of_players > 0) {
int ranks[number_of_players];
/* Catching the dot from previous input. */
result = scanf ("%d", &ranks[0]);
if (result == EOF) {
return 1;
}
if (result == 0) {
printf("Invalid input!\n");
return 1;
}
printf("Enter the rank of each player: \n");
for (int i = 1; i < number_of_players; ++i) {
result = scanf ("%d", &ranks[i]);
if (result == EOF) {
return 1;
}
if (result == 0) {
printf("Invalid input!\n");
return 1;
}
if (ranks[i] < 0) {
printf("Please enter a valid rank ( rank >=0 )\n");
--i;
}
}
int rank_difference = 0;
for (int i = 0; i < number_of_players ; ++i) {
for (int k = 0; k < i + 1; ++k) {
printf("| ");
}
for (int j = i + 1; j < number_of_players; ++j) {
rank_difference = ranks[j] - ranks[i];
if (rank_difference < 0) {
rank_difference = -rank_difference;
}
printf("| %4d ",rank_difference);
}
printf("|\n");
}
}
return 0;
}
/* -------------------------------------------------------------------------- */
Объяснение кода листинга программы
В этом коде выполняется следующая последовательность действий:
- Объявляются переменные:
result- результат выполнения функцииscanf;number_of_players- количество игроков;ranks- массив для хранения рангов игроков;rank_difference- разность рангов.
- Выводится сообщение с просьбой ввести количество игроков.
- Результат введения количества игроков сохраняется в переменной
resultпосле вызова функцииscanf. - Проверяется, было ли успешно считано значение. Если нет, программа выводит сообщение об ошибке и завершается.
- Если введенное количество игроков меньше минимального или больше максимального допустимого значения, программа просит ввести корректное количество игроков.
- Если количество игроков больше нуля, то программа переходит к следующему этапу.
- Для каждого игрока запрашивается его ранг.
- Если введенный ранг меньше нуля, программа выводит сообщение об ошибке и уменьшает счетчик игроков.
- Выводится таблица с разностями рангов.
- Программа завершается.