Ввод любого типа данных и его определение - C (СИ)
Формулировка задачи:
Приветствую уважаемые программисты! Я только начал изучать СИ, с нуля. Мне нужно написать следующую программу:
Ввод = все что угодно.
Вывод = "Вы ввели ... , это - (целое число, символ, массив, с плавающей запятой и т.д.)"
Как это вообще возможно сделать, если в операторе объявления переменной я обязан указать ее тип? Более того я догадываюсь, что есть несколько способов решить данную задачу. подскажите что - нибудь?
З.Ы.
Приношу извинения, если вопрос уже поднимался. Я вроде не нашел ответа, но вдруг он уже где-то был...
Решение задачи: «Ввод любого типа данных и его определение»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
char *dgt, *flt, *alp, s[256];
int i = 0, j, flag_dgt = 0, flag_alp = 0, flag_flt = 0, n = 0;
puts("Enter something:");
while((s[i] = getchar()) != EOF)
i++;
s[i] = '\0';
for(j = 0; j < i; j++){
if(isdigit(s[j])){
if(!flag_dgt && !flag_flt)
dgt = &s[j];
flag_dgt = 1;
}
else{
if(flag_flt){
puts("You entered real number:");
for(; flt < &s[j]; flt++)
printf("%c", *flt);
putchar('\n');
flag_flt = 0;
flag_dgt = 0;
}
if(flag_dgt && s[j] == '.'){
flag_flt = 1;
flt = dgt;
flag_dgt = 0;
}
if(flag_dgt && s[j] != '.'){
puts("You entered integer:");
for(; dgt < &s[j]; dgt++)
printf("%c", *dgt);
putchar('\n');
flag_dgt = 0;
}
if(isalpha(s[j])){
if(!flag_alp){
alp = &s[j];
flag_alp = 1;
}
n++;
}
else{
if(flag_alp){
if(n == 1){
printf("You entered letter %c.\n", *alp);
n = 0;
flag_alp = 0;
}
if(n > 1){
puts("You entered line:");
for(; alp < &s[j]; alp++)
printf("%c", *alp);
putchar('\n');
flag_alp = 0;
}
}
printf("You entered symbol\n %c\n", s[j]);
}
}
}
return 0;
}
Объяснение кода листинга программы
Ввод данных:
- Вводится строка, представляющая собой ввод пользователя.
- Строка сохраняется в буфере, представленном массивом символов s.
- Цикл while считывает каждый символ из ввода пользователя и сохраняет его в массиве s.
- Когда достигается конец файла (EOF), цикл завершается.
- В массиве s последний символ устанавливается в нулевой символ, обозначающий конец строки.
- Затем начинается цикл for, который проходит через каждый символ в массиве s.
- Внутри цикла проверяется, является ли текущий символ цифрой.
- Если да, то проверяется, была ли уже обнаружена цифра или десятичная дробь.
- Если это первая цифра, то она сохраняется в переменной dgt для обработки десятичной дроби.
- Если обнаружена десятичная дробь, то она выводится на экран как десятичная дробь.
- Если обнаружена буква, то она выводится на экран как буква.
- Если обнаружен символ, отличный от буквы или цифры, то он выводится на экран как символ.
- Если обнаружено несколько букв, то они выводятся на экран как строка.
- Если обнаружено несколько цифр, то они выводятся на экран как число.
- Если обнаружена десятичная дробь, то она выводится на экран как десятичная дробь.
- Если обнаружен символ, отличный от буквы или цифры, то он выводится на экран как символ.
- После обработки всех входных данных программа завершается.
- Ввод и вывод программы осуществляется с помощью функций puts и printf из библиотеки stdio.h.
- Библиотека ctype.h используется для проверки, является ли символ буквой, цифрой или символом.
- Библиотека stdlib.h используется для считывания символов из ввода пользователя и для работы с памятью.