Преобразование чисел (кол-во разрядов>64) в двоичный формат - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Условие задачи: На планете Роботов очень не любят десятичную систему счисления, поэтому они попросили Вас написать программу, которая заменяет все встречающиеся в тексте числа на эти же числа, но в двоичной системе счисления. Входные данные Единственная строка, состоящая из любых символов. Длина строки не превышает 255 символов. Гарантируется, что во всех числах нет ведущих нулей. Выходные данные Выведите преобразованную строку. Примеры входные данные 6^&678JKjdkdl;?.,lk879Pk1kdfl4839 выходные данные 110^&1010100110JKjdkdl;?.,lk1101101111Pk1kdfl1001011100111 Мой код:
//http://informatics.mccme.ru/mod/statements/view3.php?id=248&chapterid=2805#1 (сайт с задачей)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void dectobin(int n){//Рекурсивная функция перевода числа из десятичной системы счисления в двоичную
    if (n>=2){
        dectobin( n/2 );
    }
    printf("%d", n % 2);
}
int main(void){
    system("chcp 1251>nul");
    int i,l,r,t;
    char str[1111],temp[1111];
    scanf("%[^\n]",str);
    i=0;
    while(i<strlen(str)){
        if ((str[i]>='0') && (str[i]<='9')){//Пытаемся найти число в строке
            l=i;//Левый край числа
            r=i;//Предположительный правый край числа
            while((str[r]>='0') && (str[r]<='9') && (r<strlen(str))){
                r++;
            }
            r--;//Правый край числа
            memset(temp,0,1111);//Обнуление строки temp
            //Нужная часть (число) из строки str (с определенных позиций)
                        //копируется в строку temp:
                        strncpy(temp,str+l,r-l+1);
            t=atoi(temp);//Строка->число
            dectobin(t);//Вызов функции перевода
            i=r+1;
        }
        else{
            printf("%c",str[i]);//Иначе печатаем символ и идем дальше
            i++;
        }
    }
    system("pause>nul");
    return 0;
}

Решение задачи: «Преобразование чисел (кол-во разрядов>64) в двоичный формат»

textual
Листинг программы
#include <stdio.h>
static void to_bin(FILE* _out, unsigned int n);
void out_dec_to_bin(FILE* _out, FILE* _in);
 
int main(void){
    printf("Enter: ");
    out_dec_to_bin(stdout, stdin);
    getchar();
    return 0;
}
 
void out_dec_to_bin(FILE* _out, FILE* _in){
    unsigned int n = 0;
    int c, b, g = 0;
    do {
        c = fgetc(_in);
        b = (c != EOF) && (c != '\n');
 
        if(c >= '0' && c <= '9'){
            n = n*10U + (unsigned int)(c - '0');
            g = 1;
        } else {
            if(g){
                to_bin(_out, n);
                n = 0;
                g = 0;
            }
 
            if(b)
                fputc(c, _out);
        }
    } while(b);
}
 
static void to_bin(FILE* _out, unsigned int n){
    char c, *i;
    char s[(sizeof(n) << 3) + 1], *p = &s[0];
 
    do {
        *p++ = (char)(n & 1) + '0';
    } while((n >>= 1) != 0);
    *p = '\0';
 
    for(i = &s[0], --p; i < p; ++i, --p){
        c  = *i;
        *i = *p;
        *p = c;
    }
    fprintf(_out, "%s", s);
}

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

  1. Преобразование чисел в двоичный формат.
  2. Входные данные вводятся с клавиатуры.
  3. Вывод результатов происходит в файл или на экран.
  4. В коде используется статическое связывание (static void to_bin(FILE* _out, unsigned int n)).
  5. В функции out_dec_to_bin() используется неявное преобразование ввода в число типа unsigned int.
  6. Цикл do-while считывает символ ввода до тех пор, пока не встретит символ новой строки или конец файла.
  7. Если считанный символ является числом от '0' до '9', он добавляется к числу n.
  8. Если считанный символ не является числом от '0' до '9', он выводится на выход, а число n обнуляется и флаг g сбрасывается.
  9. Если считанный символ является числом от '0' до '9', он добавляется к числу n, а флаг g устанавливается в 1.
  10. Функция to_bin() преобразует число в двоичную строку, используя массив символов.
  11. Число разбивается на разряды, начиная с старшего, и записывается в двоичную строку.
  12. Двоичная строка инвертируется, чтобы получить правильный порядок разрядов.
  13. Функция fprintf() используется для вывода двоичной строки на экран или в файл.
  14. В функции main() используется функция out_dec_to_bin() для преобразования ввода с клавиатуры в двоичный формат.
  15. В функции main() используется функция fgetc() для считывания символа ввода.
  16. В функции main() используется функция fputc() для вывода символа на экран или в файл.
  17. В функции main() используется функция getchar() для считывания символа с клавиатуры.
  18. В функции main() используется функция printf() для вывода сообщения на экран.
  19. В функции main() используется функция fprintf() для вывода сообщения на экран или в файл.
  20. В функции main() используется функция exit() для завершения программы.

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


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

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

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