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