Дана строка. Если она представляет собой запись целого числа, то вывести 1 - C (СИ) (73547)
Формулировка задачи:
под словом "текст" понимается строка символов,
слова в которой, разделены пробелами, " , "," . "," !
"," ? "," ; "," : " (одним или несколькими).
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если
вещественного (с дробной частью), то вывести 2; если строку нельзя
преобразовать в число, то вывести 0.
Решение задачи: «Дана строка. Если она представляет собой запись целого числа, то вывести 1»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
typedef enum NUMBERTYPE { NT_NAN = 0, NT_INTEGRAL = 1, NT_REAL = 2 } numbertype_t;
numbertype_t test_number(const char * data) {
long integral;
double real;
char * tail;
errno = 0;
integral = strtol(data, &tail, 10);
if ( ! ( errno || *tail ) )
return NT_INTEGRAL;
errno = 0;
real = strtod(data, &tail);
if ( ! ( errno || *tail ) )
return NT_REAL;
return NT_NAN;
}
typedef char shortstring_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
int main(void) {
shortstring_t str;
while ( printf("Data: ") && get_string(str) ) {
switch(test_number(str)) {
case NT_NAN :
printf("Not a number.\n");
break;
case NT_INTEGRAL :
printf("Integral type.\n");
break;
case NT_REAL :
printf("Real type.\n");
break;
default :
printf("Unknown error!\n");
break;
}
}
return 0;
}
Объяснение кода листинга программы
- Объединение всех исходных файлов в один исполняемый файл.
- Заголовочный файл
используется для ввода и вывода данных в консоль. - Заголовочный файл
используется для использования функций для работы с числами и строками. - Заголовочный файл
используется для работы с ошибками. - Создание перечисления (enum) с именем NUMBERTYPE и значениями NT_NAN, NT_INTEGRAL и NT_REAL.
- Функция test_number принимает строку в качестве входного параметра и возвращает тип числа (NT_NAN, NT_INTEGRAL или NT_REAL).
- Внутри функции test_number определяется переменная integral типа long, которая будет использоваться для хранения целого числа.
- Внутри функции test_number определяется переменная real типа double, которая будет использоваться для хранения числа с плавающей точкой.
- Внутри функции test_number определяется переменная tail типа char*, которая будет использоваться для хранения указателя на последнюю симво в строке.
- Внутри функции test_number выполняется преобразование строки в целое число с помощью функции strtol.
- Внутри функции test_number выполняется преобразование строки в число с плавающей точкой с помощью функции strtod.
- Внутри функции test_number возвращается значение NT_NAN, если не удалось преобразовать строку ни в целое число, ни в число с плавающей точкой.
- Создание массива символов (char array) с именем str, который будет использоваться для хранения строки, введенной пользователем.
- Функция get_string используется для ввода строки с помощью сканера.
- В цикле while пользователю предлагается ввести строку.
- Если пользователь вводит строку, то выполняется проверка ее типа с помощью функции test_number.
- В зависимости от типа числа выводится соответствующее сообщение на экран.
- Если произошла ошибка при вводе строки, то цикл while прекращается.
- Программа возвращает 0, если все введено корректно, иначе возвращается 1.
- Код программы не содержит компонентов, которые могут работать с файлами.