Как сделать проверку на 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
. - Проверяется, было ли успешно считано значение. Если нет, программа выводит сообщение об ошибке и завершается.
- Если введенное количество игроков меньше минимального или больше максимального допустимого значения, программа просит ввести корректное количество игроков.
- Если количество игроков больше нуля, то программа переходит к следующему этапу.
- Для каждого игрока запрашивается его ранг.
- Если введенный ранг меньше нуля, программа выводит сообщение об ошибке и уменьшает счетчик игроков.
- Выводится таблица с разностями рангов.
- Программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д