Проверить правильность ввода числа - 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.