Дана строка. Если она представляет собой запись целого числа, то вывести 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.