C — алгоритм преобразования двоичного кода в десятичный — не работает

#c #binary

#c #двоичный

Вопрос:

 #include <stdio.h>
#include <stdlib.h>

int main()
{
char c1,c2,c3,c4,c5;
int x;

scanf(" %c %c %c %c %c",amp;c1,amp;c2,amp;c3,amp;c4,amp;c5);

if (c1,c2,c3,c4,c5 !='0' amp;amp; c1,c2,c3,c4,c5 !='1'){
    printf("Not a binary number!");

    }

if (c1=='0' amp;amp; c2,c3,c4,c5=='0' || c2,c3,c4,c5 =='1'){

    c5 = c5-48;
    c4 = (c4-48)*2;
    c3 = (c3-48)*4;
    c2 = (c2-48)*8;
    c1 = c1-48;

    x = c5 c4 c3 c2 c1;
    printf("%d",x);
    }

return 0;
}
  

Таким образом, код работает для всех чисел, за исключением случаев, когда в качестве последнего символа (c5) вводится 0 (ноль). Когда это происходит, я получаю «Не двоичное число!». В чем моя ошибка? 🙂

Я только начинаю изучать C и программирование, так что будьте добры ко мне, хехех

Комментарии:

1. if (c1,c2,c3,c4,c5 !='0' amp;amp; c1,c2,c3,c4,c5 !='1'){ не употребляйте наркотики.

2. Условие вашего первого if оператора оценивается как c5 != '1' , а все остальное игнорируется. Я предлагаю включить все предупреждения в вашем компиляторе, внимательно прочитать их, исправить и вернуться, если у вас все еще есть вопросы.

3. Примечание: лучше использовать c3 - '0' etc вместо c3 - 48 . Гораздо понятнее, что такое преобразование.

Ответ №1:

во-первых, вы не можете принимать двоичные цифры сразу, у вас есть c1 — c5, что, если пользователь введет двоичный код для 100, это не сработает. поэтому попробуйте что-то вроде этого. Попробуйте это:

 #include <stdio.h>
#include <stdlib.h>

int main()
{

int val, base = 1,cn, decinum = 0,rest;
int alert = 0;
printf("Please enter a binary number 0's and 1's: ");

scanf("%d",amp;val);

cn = val;   // saving it for printf
while(val > 0){
    rest = val % 10;

    if(rest == 0 || rest == 1) {
        decinum  = rest * base;
        val /= 10;
        base *= 2;

    }else{
        alert = 1;
        break;
    }
}


if(alert){
    printf("Sorry not a binary numbern");
}else{
    printf("binary: %d ist %d",cn,decinum);
}


return 0;
}
  

Пожалуйста, введите двоичное число 0 и 1:
01120100

вывод: Извините, не двоичное число

Пожалуйста, введите двоичное число 0 и 1: 101

Вывод: двоичный код: 101 ist 5

Судя по комментариям cpatricio и Jonathan, вы имеете в виду большое число для двоичного кода, например 8 бит, и максимум 20 бит

 int main()
{

unsigned long  val,cn, decinum = 0;
int rest, base = 1;
int alert = 0;
printf("Please enter a binary number 0's and 1's: ");

scanf("%lu",amp;val);

cn = val;  // save it for printf otherwise after the while loop is val = 0

while(val > 0){
    rest = val % 10;

    if(rest == 0 || rest == 1) {
        decinum  = rest * base;
        val /= 10;
        base *= 2;

    }else{
        alert = 1;
        break;
    }
}


if(alert){
    printf("Sorry not a binary numbern");
}else{
    printf("binary: %lu ist %ld",cn,decinum);
}


return 0;
}
  

проверка
Вывод:
Пожалуйста, введите двоичное число 0 и 1: 010101100001001011000
двоичный файл: 010101100001001011000 ist 705112

Вывод: Пожалуйста, введите двоичное число 0 и 1: 0000001001011000 двоичное число: 0000001001011000 ist 600

Комментарии:

1. Если я введу 24-разрядное двоичное число, scanf() произойдет сбой.

2. int — 10 бит, беззнаковый int — 10 бит, беззнаковый длинный int — 19 бит

3. @cpatricio вы были правы, я обновил свой ответ сейчас. и с unsigned long он может обрабатывать 21 и так далее биты

4. Максимальное значение long int равно 9,223,372,036,854,775,807 (19 чисел), максимальное значение long int без знака равно 18,446,744,073,709,551,615 (20 чисел), как вы можете обрабатывать 21 бит? (я не могу изменить свой последний комментарий, но должно быть 19 бит для long int и 20 бит для unsigned long int)

5. @cpatricio я понял вас, вы правы, я обновляю свои комментарии, спасибо, но с массивами можно справиться с большим количеством, как я уже говорил ранее