Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного - 2 - C (СИ)
Формулировка задачи:
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0.
Простите, я уже постила эту задачу. И мне ее решили. Но там все очень сложно. Все , что там было - мы не проходили в универе. Я все же надеюсь, что кто-то сможет помочь мне ее написать простым понятным кодом, иначе я просто свихнусь((((
Приложу коды, как ее делали, но(еще раз повторюсь) меня препод на части разорвет , если это увидит.
за этот код благодарю @schdub
за этот спасибо @easybudda
помогите мне, пожалуйста
#include <stdio.h> #include <stdlib.h> int GetNumType(const char * p) { if (*p == '\0') return 0; int float_sep = 0; for (;*p; ++p) { if (!isdigit(*p)) { if (*p == '.') ++float_sep; else return 0; } } if (float_sep == 0) return 1; return ((float_sep == 1 && p[-1] != '.') ? 2 : 0); } void test(const char * num) { printf("%d '%s'\n", GetNumType(num), num); } int main() { test("1"); test("1.0"); test("1abc"); test("0.0"); test(".0"); test("0."); return 0; }
#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; }
Решение задачи: «Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного - 2»
textual
Листинг программы
#include <stdio.h> #include <string.h> int main() { char str[256]; scnaf("%s", str); int length = strlen(str); int type = 1; for (int i=0; i < length; ++i) { if (str[i] == '.') { if (type == 2) { type = 0; break; } else { type = 2; } } else { if (str[i] < '0' || str[i] > '9') { type = 0; break; } } } printf("type = %d\n", type); }
Объяснение кода листинга программы
В этом коде:
- Объявлены две переменные: строка
str
и целочисленная переменнаяlength
. - Вводится строка с помощью функции
scanf
. - Вычисляется длина строки с помощью функции
strlen
. - Инициализируется переменная
type
значением 1. - В цикле
for
перебираются все символы строки. - Если текущий символ равен точке (
str[i] == '.'
), то проверяется значение переменнойtype
. - Если
type
равно 2, то значение переменнойtype
сбрасывается в 0 и цикл прерывается. - Если
type
равно 1, то значение переменнойtype
меняется на 2. - Если текущий символ не равен точке (
str[i] != '.'
), то проверяется, является ли он цифрой. - Если текущий символ не является цифрой (
str[i] < '0' || str[i] > '9'
), то значение переменнойtype
сбрасывается в 0 и цикл прерывается. - После завершения цикла выводится значение переменной
type
. Этот код проверяет, является ли введенная строка числом с плавающей точкой или числом с фиксированной точкой. Если это число с плавающей точкой, выводится 2, если число с фиксированной точкой, выводится 1. Если строка не является числом, выводится 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д