FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 759.307 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 18-04-2004, 23:31   #1 (permalink)
Ricardo Arnoud
Novo Membro
 
Registrado em: May 2003
Localização: Porto Alegre/RS
Mensagens: 105
Reputação: 19 Ricardo Arnoud está indo no caminho certo
Enviar mensagem via ICQ para Ricardo Arnoud
Padrão Ajuda em C++, convertendo numero binario em decimal..

Ae galera ,
tô passando sufoco pra fazer um código fonte que
calcule a conversão de um numero binário de 8 bits para decimal.
Além do valor numérico o programa, quando executado, deve retornar o numero por extenso!

Por exemplo:

Entre com um nro em binario (até 8 bits): /
/solicita ao usuário a entrada
11111111
Resultado:
//saída do programa
255 (duzentos e cinquenta e cinco)

eu jah fiz uma parte aqui , mas tá incompleto
e no minimo errado ops:

Citação:
#include <string.h>
#include <stdio.h>
#include <math.h>

int i,dec,nbinario[8];
main(){
i=0;
dec=0;
printf("\nDigite um numero binario de 8 bits ");
scanf("%d",&nbinario);
/* faz a conversao de binario para
decimal , usando multi. e eleva a potencia,
e depois joga o resultado da soma de todas
as casas numa string..*/
for (i=7;i<0;i--)
{
nbinario[i] = nbinario[i] * 2;
nbinario[i] = pow(nbinario[i],i);
dec=dec + nbinario[i];
}
printf("%i",dec);
scanf(" ");}
ele está sempre me retornando ZERO , o que eu fiz errado??? 8O
__________________
|Athlon XP 1700+@2255MHz(2800+)|K7VTA3 v5.0 8)|512DDR400|INNO 3D FX5200 128Mb|PixelViewTV+FM|Cirrus 56K|LG 24x10x40|ADSL*1,5Mb*|DVD LG 16x|200Gb
Ricardo Arnoud está offline   Responder com Quote
Antigo 19-04-2004, 11:00   #2 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 937
Reputação: 23 Lgub está indo no caminho certo
Padrão

Da uma olhada(se tiver usando o linux tira o conio.h eo clrscr()):
Código:
#include <stdio.h> #include<string.h> #include <conio.h> #include <math.h> void main() { char bin[50]; int num_bits; double decimal=0; clrscr(); gets(bin); num_bits=strlen(bin); if(num_bits>8){ printf("Digite menos digitos");return; } for(int cont=0,i=num_bits-1;cont<num_bits;cont++,i--) if(bin[i]=='1')decimal+=pow(2,cont); }
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 19-04-2004, 11:21   #3 (permalink)
#pragma
Membro Senior
 
Registrado em: Apr 2003
Localização: Dpto. de Informática
Mensagens: 219
Reputação: 19 #pragma está indo no caminho certo
Padrão

Código:
int main(int argc, char *argv[]) { int i = 0; int dec = 0; int p = 0; int nbinario[8]; printf("\nDigite um numero binario de 8 bits "); scanf("%d",&nbinario); int binario = *nbinario; while(binario>0) { i = binario % 10; dec += i * (int)pow(i * 2, p++); binario /= 10; } printf("%i \n",dec); system("PAUSE"); return 0; }
#pragma está offline   Responder com Quote
Antigo 19-04-2004, 15:23   #4 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Já posto minha versão em C++. Só tô resolvendo um pequeno grande problema que eu tô tendo aqui :P
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 17:43   #5 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Código:
#include <iostream> #include <iomanip> #include <string> #include <sstream> #include <cmath> using namespace std; bool binario_valido(const string &binario) { int ok = 0; if(binario.length() < 1){ cout << "Digite pelo menos um numero...\n" << endl; return false; } for(int i = 0; i < binario.length(); i++){ if((binario[i] == '0') || (binario[i] == '1')) ok++; } if(ok == binario.length()) return true; else{ cout << "O numero digitado nao e um numero binario...\n" << endl; return false; } } int main() { int digito; int tamanho; int loop = 0; int decimal = 0; int binario_como_inteiro; string binario; do{ cout << "Digite um numero binario: "; getline(cin, binario); }while(!binario_valido(binario)); stringstream ss(binario); ss >> binario_como_inteiro; tamanho = binario.length(); do{ digito = binario_como_inteiro % 10; binario_como_inteiro /= 10; decimal += digito * pow(2, loop++); }while(loop != tamanho); cout << "\nBinario" << setw(20) << "Decimal" << endl; cout << setw(20) << left << binario << decimal << endl; cout << "\nPressione enter para sair..." << endl; cin.get(); return 0; }
Tá aí. Eu não consegui resolver o pequeno grande problema though. Se a pessoa digitar um número binário com mais de 10 dígitos, o programa mostra o resultado errado. Se alguém conseguir descobrir pq, me avisa blz? Falow!
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 18:42   #6 (permalink)
Ricardo Arnoud
Novo Membro
 
Registrado em: May 2003
Localização: Porto Alegre/RS
Mensagens: 105
Reputação: 19 Ricardo Arnoud está indo no caminho certo
Enviar mensagem via ICQ para Ricardo Arnoud
Padrão

Citação:
Postado Originalmente por #pragma
int main(int argc, char *argv[])
{
int i = 0;
int dec = 0;
int p = 0;
int nbinario[8];
printf("\nDigite um numero binario de 8 bits ");
scanf("%d",&nbinario);

int binario = *nbinario;
while(binario>0)
{
i = binario % 10;
dec += i * (int)pow(i * 2, p++);
binario /= 10;
}
printf("%i \n",dec);

system("PAUSE");
return 0;
}
dá erro durante a execução(linux):

Citação:
digite um numero de 8 bits: 11111111
sh: line 1: PAUSE: command not found
__________________
|Athlon XP 1700+@2255MHz(2800+)|K7VTA3 v5.0 8)|512DDR400|INNO 3D FX5200 128Mb|PixelViewTV+FM|Cirrus 56K|LG 24x10x40|ADSL*1,5Mb*|DVD LG 16x|200Gb
Ricardo Arnoud está offline   Responder com Quote
Antigo 19-04-2004, 18:47   #7 (permalink)
Ricardo Arnoud
Novo Membro
 
Registrado em: May 2003
Localização: Porto Alegre/RS
Mensagens: 105
Reputação: 19 Ricardo Arnoud está indo no caminho certo
Enviar mensagem via ICQ para Ricardo Arnoud
Padrão

kao00 , o seu nem chega a compilar aqui :roll: ops: (linux e win)
__________________
|Athlon XP 1700+@2255MHz(2800+)|K7VTA3 v5.0 8)|512DDR400|INNO 3D FX5200 128Mb|PixelViewTV+FM|Cirrus 56K|LG 24x10x40|ADSL*1,5Mb*|DVD LG 16x|200Gb
Ricardo Arnoud está offline   Responder com Quote
Antigo 19-04-2004, 19:07   #8 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Aqui compilou blz. Tem como vc colocar os erros que o compilador mostra aqui?
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 19:24   #9 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

De primeira eu tava usando o Microsoft Visual C++.NET pra compilar e não deu erro nenhum, mas como vc falou que aí não compilou, decidi tentar compilar ele no Dev-C++ e tava dando um erro na função pow() falando que ela não pode ter inteiros como parâmetros. Fiz umas pequenas mudanças e daí compilou. Vê se compila aí tb!
Código:
#include <iostream> #include <iomanip> #include <string> #include <sstream> #include <cmath> using namespace std; bool binario_valido(const string &binario) { int ok = 0; if(binario.length() < 1){ cout << "Digite pelo menos um numero...\n" << endl; return false; } for(int i = 0; i < binario.length(); i++){ if((binario[i] == '0') || (binario[i] == '1')) ok++; } if(ok == binario.length()) return true; else{ cout << "O numero digitado nao e um numero binario...\n" << endl; return false; } } int main() { int tamanho; int digito; double loop = 0.0; // mudei de int pra double double decimal = 0.0; // fiz o mesmo aqui int binario_como_inteiro; string binario; do{ cout << "Digite um numero binario: "; getline(cin, binario); }while(!binario_valido(binario)); stringstream ss(binario); ss >> binario_como_inteiro; tamanho = binario.length(); do{ digito = binario_como_inteiro % 10; binario_como_inteiro /= 10; decimal += digito * pow(2, loop++); }while(loop != tamanho); cout << "\nBinario" << setw(20) << "Decimal" << endl; cout << setw(20) << left << binario << decimal << endl; cout << "\nPressione enter para sair..." << endl; cin.get(); return 0; }
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 19:31   #10 (permalink)
pulsar
Membro Senior
 
Registrado em: Apr 2003
Localização: Rio de Janeiro
Mensagens: 343
Reputação: 21 pulsar possui ótimo potencialpulsar possui ótimo potencial
Padrão

Não é mais fácil usando 'bitwise operators' não?

Código:
#include <stdio.h> int main(int argc, char *argv[]) { if ( argc != 2 ) return(1); int i = 0; unsigned int n = 0; while ( (*(argv[1] + i) == '0' || *(argv[1] + i) == '1') && i <= 32 ) { if ( *(argv[1] + i) == '0' ) n <<= 1; else { n ^= 1; n <<= 1; } ++i; } n >>= 1; printf("%u\n", n); return(0); }
Compila e roda com o número binário como argumento, tipo:

Código:
./nomedoprograma 0101011110
Ele irá retornar o valor decimal.
pulsar está offline   Responder com Quote
Antigo 19-04-2004, 20:09   #11 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Cara, eu não entendi nada do seu código, mas achei muito perfeito! Tem como vc explicar parte por parte?
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 20:32   #12 (permalink)
pulsar
Membro Senior
 
Registrado em: Apr 2003
Localização: Rio de Janeiro
Mensagens: 343
Reputação: 21 pulsar possui ótimo potencialpulsar possui ótimo potencial
Padrão

Bem, hehe, rolou um pouco de malandragem no código porque eu não 'converti' o número. Eu traduzi a string dada pelo usuário para um número binário de fato, guardei numa variável 'n' e depois retornei o valor da mesma usando o printf, já que o C vai retornar um valor decimal mesmo (a não ser que eu usasse %x para retornar em hexadecimal)!!!!

O algoritmo, claro, é aquele while. Ele vai de caractere em caractere do segundo argumento testando:

1) Se é 0 ou 1
2) Se o loop ultrapassou 32 "ciclos", pois o tamanho do int numa máquina de 32 bits é....32 bits hehehe. Se o usuário fornecer mais do que 32 caracteres, o valor será truncado exatamente no trigésimo segundo. Então, o código "converte" até o limite da máquina!

Se o caractere detectado foi '0' o programa simplesmente adiciona um 0 à direita.
Código:
n <<= 0
Agora se foi 1 ele faz o seguinte

"Liga" o bit usando '^'
Código:
n ^= 1
e depois adiciona mais um zero para preparar a variável para o próximo ciclo
Código:
n <<= 1
Após o loop tem isso:

Código:
n >>= 1
Isso serve para retirar um bit que "sobra"

Claro que não rolou nenhum conversão, tipo multiplicando as casas binárias por 2 e somando os valores. Por que eu não fiz isso? Primeiro: teria que chamar outras funções para 'ajudar' na conversão, como strlen(), e toda chamada de função é "cara" para o código. Segundo, aritmética com bitwise (<<, >>, ^, &, |) é muito mais rápida!!
pulsar está offline   Responder com Quote
Antigo 19-04-2004, 20:47   #13 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Interessante demais, mas ainda confuso. Eu tô lendo aqui no meu livro de C sobre bitwise operators mas tá mais confuso ainda do que sua explicação. Vc sabe de algum site onde explicam isso bem fácil? Pode ser em inglês tb. Valeu!
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 21:07   #14 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Mais uma coisa: teria como vc modificar o seu código e usar uma string definida no programa já, só pra não ter aquelas coisas de argv pra ficar mais fácil de eu entender. Tentei fazer aqui mas nem tô conseguindo. Obrigado.
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 22:01   #15 (permalink)
pulsar
Membro Senior
 
Registrado em: Apr 2003
Localização: Rio de Janeiro
Mensagens: 343
Reputação: 21 pulsar possui ótimo potencialpulsar possui ótimo potencial
Padrão

Cara, tinha feito um texto ENORME explicando os operadores "bitwise". O problema é que eu fiquei tanto tempo digitando que parece que minha conexão "expirou" e perdi tudo, fiquei **** e fui tomar um banho para esfriar a cabeça...

Olha, eu recomendo você pegar no eMule os livros:

"The C Language (ANSI C)" do Kernighan e Ritchie
"Practical C Programming" da editora O'Reilly

Aqui está o código "light":

Código:
#include <stdio.h> int main(void) { int i = 0; unsigned int n = 0; char bin[] = "1010111010"; while ( bin[i] == '0' || bin[i] == '1' ) { if ( bin[i] == '0' ) n <<= 1; else { n ^= 1; n <<= 1; } ++i; } n >>= 1; printf("%u\n", n); return(0); }
pulsar está offline   Responder com Quote
Antigo 19-04-2004, 22:10   #16 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Pow, então depois que vc esfriar a cabeça, não deixa de escrever o textão não :P

Obrigado pelo código. Vou dar uma estudada nele e ver se eu pego a idéia da coisa. Esse livro que vc falou eu tenho, o The C Programming Language (Second Edition). Achei ele no lixo de uma escola, acredita? Brigão aí!
kao00 está offline   Responder com Quote
Antigo 19-04-2004, 23:30   #17 (permalink)
Ricardo Arnoud
Novo Membro
 
Registrado em: May 2003
Localização: Porto Alegre/RS
Mensagens: 105
Reputação: 19 Ricardo Arnoud está indo no caminho certo
Enviar mensagem via ICQ para Ricardo Arnoud
Padrão

ae ta ficando muito bom , mas nao esqueçaum que ele deve retornar o numero por extenso tambem :roll: :roll: pode ser até 255 , nada mais que isso :lol:

pulsar achei sei codigo muito louco , mas d+!!!
voce ta fazendo curso superior ou aprendeu isso em cursinho mesmo? :P

sds ,
__________________
|Athlon XP 1700+@2255MHz(2800+)|K7VTA3 v5.0 8)|512DDR400|INNO 3D FX5200 128Mb|PixelViewTV+FM|Cirrus 56K|LG 24x10x40|ADSL*1,5Mb*|DVD LG 16x|200Gb
Ricardo Arnoud está offline   Responder com Quote
Antigo 19-04-2004, 23:43   #18 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Ahahaha, aí vc já ta querendo montar, Ricardo. Tenta fazer vc essa parte e pergunta pra gente se vc tiver tendo algum problema. Vc que tem que fazer seu homework! :wink:
kao00 está offline   Responder com Quote
Antigo 20-04-2004, 5:29   #19 (permalink)
#pragma
Membro Senior
 
Registrado em: Apr 2003
Localização: Dpto. de Informática
Mensagens: 219
Reputação: 19 #pragma está indo no caminho certo
Padrão

[quote="Ricardo Arnoud"]dá erro durante a execução(linux):

Citação:
digite um numero de 8 bits: 11111111
sh: line 1: PAUSE: command not fou...
Desculpe - utilizei o Dev-C em Windows
Substitua o comando System("PAUSE") por qualquer função que permita manter a consola visível.
#pragma está offline   Responder com Quote
Antigo 20-04-2004, 8:06   #20 (permalink)
kao00
Membro Senior
 
Registrado em: Jan 2004
Localização: Londrina - PR
Mensagens: 352
Reputação: 0 kao00 está indo no caminho certo
Padrão

Deixa eu ver se eu entendi direito. Vamos usar o número 1010 como exemplo:
O programa vai começar achando o número 1 da esquerda. O 0 que está na variável n vai ser transformado em 1 e um zero vai ser adicionado à direita do 1 na variável n. Por enquanto a variável n é igual a 10. Daí o programa acha o outro um, e acontece a mesma coisa, e ao final a variável n é igual a 1010. É mais ou menos isso? A única coisa que eu ainda não consegui entender foi aquele n >>= 1 depois do loop...
kao00 está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 20:39.