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