Проверить правильность ввода числа - C (СИ)
Формулировка задачи:
Помогите пожалуйста!Срочно нужно
Дано число в троичной системе счисления.Проверить правильность ввода этого числа(в его записи должны быть только символы 0,1,2).Если число введено неверно, повторить ввод.При правильном вводе перевести числов в шестеричную систему счисления.
Заранее спасибо!
Решение задачи: «Проверить правильность ввода числа»
textual
Листинг программы
#include <stdio.h> #if defined(_MSC_VER) && (_MSC_VER <= 1200) typedef unsigned __int64 uint64_t; #else #include <stdint.h> #endif int geti3_to_hex(FILE* _in, char* d){ uint64_t j, v; char* p, t; int c, i; i = 0; v = 0; while(((c = fgetc(_in)) != EOF) && !ferror(_in)){ if((c == '\n') || (c == '\r')){ if(! i) continue; else break; } else if(c >= '0' && c <= '2'){ v = v*10 + (uint64_t)(c - '0'); i = 1; } else { i = 0; break; } } if(! i) return 0; p = d; do { j = v & 0xF; *d++ = (j < 10) ? (char)(j + '0') : (char)(j - 10 + 'A'); } while((v /= 16) != 0); *d = '\0'; for(--d; p < d; ++p, --d){ t = *p; *p = *d; *d = t; } return 1; } int main(void){ char h[32]; int k; do { printf("enter num3: "); k = geti3_to_hex(stdin, h); if(k){ printf("hex: 0x%s\n", h); break; } puts("error input!"); #if defined(_MSC_VER) || defined(__BORLANDC__) fflush(stdin); #endif } while(! k); getchar(); return 0; }
Объяснение кода листинга программы
- Включение необходимых заголовочных файлов для работы с файлами и типами данных.
- Определение функции
geti3_to_hex
, которая принимает два аргумента: файл, из которого считываются данные, и указатель на строку, в которую записывается результат. - Внутри функции объявлены необходимые переменные:
uint64_t j, v;
- для хранения чисел, которые будут использоваться в вычислениях.char* p, t;
- для работы со строками.int c
- для считывания символов из файла.int i
- для контроля правильности ввода.
- Переменная
i
инициализируется значением 0, аv
- значением 0. - В цикле
while
считываются символы из файла до тех пор, пока не будет достигнут конец файла или не будет допущена ошибка при чтении. - Если считанный символ является переносом строки или возвратом каретки, и переменная
i
равна 0, то цикл продолжает работу. - Если считанный символ является числом от '0' до '2', то к
v
добавляется значение этого числа, а переменнаяi
устанавливается в 1. - Если считанный символ не является числом от '0' до '2', то переменная
i
устанавливается в 0, и цикл прерывается. - После окончания цикла, если переменная
i
равна 0, то функция возвращает 0. - Если ввод корректен, то начинается процесс преобразования числа в шестнадцатеричную систему счисления.
- В цикле
do...while
создается строка, в которую записывается шестнадцатеричное представление числа. - Последний символ в строке устанавливается в 0.
- Строка инвертируется, чтобы младшие биты были в начале строки.
- В цикле
for
происходит перестановка символов в строке, чтобы получить правильное представление числа. - Функция возвращает 1, если ввод корректен, и 0 в противном случае.
- В функции
main
создается пустая строкаh
и переменнаяk
для контроля ввода. - В цикле
do...while
происходит запрос ввода числа, проверка корректности ввода и вывод сообщения об ошибке в случае неправильного ввода. - В конце программы выводится сообщение, сигнализирующее о завершении работы программы.
- Если определенный препроцессорный директив
_MSC_VER
или__BORLANDC__
, то вызывается функцияfflush(stdin)
, чтобы очистить буфер ввода. - Программа завершается возвратом 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д