Transformação decimal para binário em c
Entrada:
Enter a decimal number: 101
Resultado:
The binary number is : 1100101
Eu resolvi desta forma->
#include <stdio.h>
int main(void){
int input=get_input();
long long complete_integer=binary_conversion(input);
reverse_digits(complete_integer);
}
int get_input() {
int number = 0;
printf("Enter a decimal number: ");
scanf("%d",&number);
return number;
}
int binary_conversion(int number) {
long long complete_integer = 0;
int base=2;
while (number != 0) {
//Take the last digit from the integer and push the digit back of complete integer
complete_integer = complete_integer * 10 + number%base;
number /= base;
}
printf("Completed integer number : %d\n",complete_integer);
return complete_integer;
}
int reverse_digits(long long complete_integer) {
int binary = complete_integer;
int last_digit = 0;
while(binary != 0) {
last_digit = last_digit * 10 + binary % 10;
binary /= 10;
}
printf("The binary number is: %d",last_digit);
}
Estou aqui para: E quanto aos meus comentários e indentações? Vou enfrentar algum problema para algumas condições? Você proporia uma simplificação melhor usando meu programa?
Respostas
Recue seu código!
A maior parte do seu código está completamente sem indentação, o que o torna muito difícil de ler.
Enquanto o compilador pode facilmente escanear seu código e contar {e }sinais para dizer onde cada função e bloco de código começa e termina, para humanos isso é muito mais difícil e sujeito a erros. É por isso que é uma boa ideia recuar as linhas dentro de cada função e bloco, para que a estrutura do código seja aparente ao olho humano.
Seu código realmente se parece com algo que você gostaria de ler em seis meses, depois de esquecer como ele se parece? Caso contrário, deixe-o mais limpo. (Se você acha que sim, tente esta experiência!)
Ative os avisos do compilador!
Compilar seu código com avisos habilitados (Clang com -Weverythinge --std=c17) alertaria você sobre vários problemas sérios que você deve corrigir. Esses incluem:
- a falta de protótipos para suas funções auxiliares,
- o
valueparâmetro não utilizado parabinary_conversion, - o uso incorreto do
%despecificador de formato em vez de%lldimprimir umlong long intvalor, - o fato de que o valor de retorno de
binary_conversioné truncado de along long intpara umint, e - o fato de que
reverse_digitsé definido para retornar umint, embora na verdade não o faça.
Na verdade, é bastante surpreendente que seu código até compile e (mais ou menos) funcione com todos esses bugs nele.
Saída incorreta:
Você deixou na linha:
printf("Completed integer number : %d\n",complete_integer);
que faz com que seu código imprima algo que não deveria. Um problema simples e menor, na verdade, mas possivelmente o suficiente para falhar em sua tarefa.
Um problema maior é que, como você se esqueceu de alterar o tipo de retorno de binary_conversionpara long long int, seu código produzirá uma saída incorreta para entradas maiores que 1023 (= 1111111111 em binário). Por exemplo, a entrada 1025 faz com que seu código gere uma saída sem sentido :
The binary number is: 455665549
(Mesmo se você corrigisse esse bug, seu código ainda falharia para entradas maiores do que cerca de 2 19 - 1, já que um sinal de 64 bits long long intnão pode armazenar um número decimal com mais de 19 dígitos.)
Um problema ainda maior é que seu algoritmo não funciona para números pares ! Por exemplo, a entrada 1024 (ou qualquer outra potência de 2) faz com que seu programa imprima :
The binary number is: 1
Honestamente, você testou o código?
Uma solução melhor:
O computador já armazena o número de entrada lido scanfem binário. Em vez de converter esse número binário em um número decimal que pareça o mesmo quando impresso com printf(e invertendo seus dígitos decimais duas vezes no processo), você deve tentar encontrar alguma maneira de imprimir os bits do número binário um a um diretamente.
Aqui está um rápido esboço de algo que deve funcionar :
#include <stdio.h>
#include <stdint.h>
void print_binary(uint32_t number) {
uint32_t bit = (uint32_t)1 << 31;
while (bit > number && bit > 1) {
bit /= 2; // skip leading zeros
}
while (bit > 0) {
putchar(bit & number ? '1' : '0');
bit /= 2;
}
}
(Observe o uso do tipo inteiro não assinado de comprimento fixo uint32_tpara evitar fazer suposições desnecessárias sobre o número de bits que um intpode armazenar - que pode ser apenas 16 em alguns sistemas não POSIX de baixo custo - e o usuário do operador bit shift << para calcule facilmente a constante 2 31. Além disso, se você não estiver familiarizado com o operador AND bit a bit& ou o operador condicional ternário ? ... :, este pode ser um bom momento para aprender sobre eles.)
Não há recuo, exceto na função revers_digits(). O recuo dentro dessa função é bom, você deve corrigir o resto do programa porque é basicamente ilegível.
Embora isso possa ser compilado em um compilador online gratuito, o código está corrompido por 2 motivos. A primeira é que em um programa de arquivo como este para a linguagem de programação C main()deve ser a última função no arquivo para que todas as outras funções sejam definidas anteriormente. Há uma solução alternativa para isso usando protótipos de função.
A segunda razão pela qual o código está quebrado é que binary_conversion(int number,int value)é declarado com 2 variáveis, mas só é chamado com uma (remova o valor, pois não parece ser necessário).
Repetindo curtas vindas
O recuo da sua postagem é muito ruim (e outros) do post anterior com poucas melhorias aqui.
Omitindo # 1 etapa de produtividade
Ligue todos os avisos.
O código abaixo sofre de incompatibilidade de especificador e tipo. Uma boa compilação bem habilitada irá alertar. Meu compilador forneceu cerca de 10 avisos. Exemplo:
long long complete_integer = 0;
...
printf("Completed integer number : %d\n",complete_integer);
// warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]
Omitindo # 2 etapa de produtividade
Use a formatação automática para formatar o código.
Soluções não completas
Ambos binary_conversion()e reverse_digits()não conseguem lidar com grandes int valores. A arquitetura de código precisa de uma nova abordagem. Eu recomendo formar o resultado em uma string ou array.
O código deve detalhar os resultados esperados quando nfor negativo.
Cheque ausente
Um código robusto verificaria o resultado de scanf("%d",&number)e somente converteria quando 1.
Saída estranha
A saída relatada é "O número binário é: 1100101". Recebo 2 linhas de saída. Publique a saída verdadeira.
printf("Completed integer number : %d\n",complete_integer); faz mais sentido porque o "binário"
printf("The binary number is: %d",last_digit); faz mais sentido como o "número invertido".
Para imprimir não negativos em binário, uma simplificação candidata:
#include <stdio.h>
void print_binary(int n) {
if (n > 1) print_binary(n/2);
printf("%d", n % 2);
}
int main(void) {
print_binary(101);
puts("");
}