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

Объяснение кода листинга программы

  1. Включение необходимых заголовочных файлов для работы с файлами и типами данных.
  2. Определение функции geti3_to_hex, которая принимает два аргумента: файл, из которого считываются данные, и указатель на строку, в которую записывается результат.
  3. Внутри функции объявлены необходимые переменные:
    • uint64_t j, v; - для хранения чисел, которые будут использоваться в вычислениях.
    • char* p, t; - для работы со строками.
    • int c - для считывания символов из файла.
    • int i - для контроля правильности ввода.
  4. Переменная i инициализируется значением 0, а v - значением 0.
  5. В цикле while считываются символы из файла до тех пор, пока не будет достигнут конец файла или не будет допущена ошибка при чтении.
  6. Если считанный символ является переносом строки или возвратом каретки, и переменная i равна 0, то цикл продолжает работу.
  7. Если считанный символ является числом от '0' до '2', то к v добавляется значение этого числа, а переменная i устанавливается в 1.
  8. Если считанный символ не является числом от '0' до '2', то переменная i устанавливается в 0, и цикл прерывается.
  9. После окончания цикла, если переменная i равна 0, то функция возвращает 0.
  10. Если ввод корректен, то начинается процесс преобразования числа в шестнадцатеричную систему счисления.
  11. В цикле do...while создается строка, в которую записывается шестнадцатеричное представление числа.
  12. Последний символ в строке устанавливается в 0.
  13. Строка инвертируется, чтобы младшие биты были в начале строки.
  14. В цикле for происходит перестановка символов в строке, чтобы получить правильное представление числа.
  15. Функция возвращает 1, если ввод корректен, и 0 в противном случае.
  16. В функции main создается пустая строка h и переменная k для контроля ввода.
  17. В цикле do...while происходит запрос ввода числа, проверка корректности ввода и вывод сообщения об ошибке в случае неправильного ввода.
  18. В конце программы выводится сообщение, сигнализирующее о завершении работы программы.
  19. Если определенный препроцессорный директив _MSC_VER или __BORLANDC__, то вызывается функция fflush(stdin), чтобы очистить буфер ввода.
  20. Программа завершается возвратом 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы