Jump to content

Foto

Conversor de bases numéricas em C



Existem 3 respostas neste tópico

#1 Mc Fly    

Mc Fly
  • Participante
  • 438 mensagens

Publicado 05 June 2006 - 12:36 PM

Gostaria de algumas dicas sobre um conversor de bases numéricas em linguagem C, obrigado.

#2 Hua    

Hua
  • Participante
  • 1050 mensagens

Publicado 05 June 2006 - 10:29 PM

Bom, sou iniciante em programação, mas já fiz um algoritimo para converter números decimais em binários e binários em decimais, além de um conversor de números hexadecimais para binário e de binário para hexadecimal. Na época em que eu fiz eles (a cerca de um mês atrás) não conhecia o "%" por isso inventei uma gambiarra para fazer a conversão decimal > binário. Ai vai os códigos:


http://www.babooforum.com.br/idealbb/images/smilies/55.gif Conversor Binário > Decimal, Decimal > Binário

 

 

#include <iostream.h>
#include <conio.h>
#include <math.h>


int n,v,x=1,y=1,d,z,w=1,r,cont,cont2,cont3,c=2;


void binario(){
  clrscr();
  cout<<"Numer";
  cin>>n;
  if(n!=0){
  if(n!=1){
  v=n;
while(v>x){
x=pow(2,y)-1;
y=y+1;
}
y=y-1;
d=y-1;
z=n;
w=1;
for(cont=y;cont>0;cont--){
if(w==1){
for(cont2=d;cont2>0;cont2--)
  z=z/2;
gotoxy(1,5);
cout<<z;
d=d-1;
w=w-1;
}
else{
r=n;
for(cont3=d;cont3>0;cont3--)
  r=r/2;
if(r==1){
gotoxy(c,5);
cout<<r;
}
else{
  if(r==0){
gotoxy(c,5);
cout<<r;
  }
  else{
  while((r!=1)&&(r!=0))
  r=r-2;
  gotoxy(c,5);
  cout<<r;
  d=d-1;
  c=c+1;
  }
  }
}
}
  }

  else{
  gotoxy(1,5);
  cout<<"1";
 }
 }
 else{
  gotoxy(1,5);
  cout<<"0";
 }
}

void decimal(){
  clrscr();
  cout<<"Numero de Bits:";
  cin>>n;
  z=n-1;
  r=0;
  for(cont=n;cont>0;cont--){
  cout<<"Digito Binari";
  cin>>v;
  r=r+(pow(2,z)*v);
  z=z-1;
  }
  cout<<"n"<<r;
}


void main(){
  int o;
  char a;
  do{
  clrscr();
  cout<<"1 - Conversao Decimal Binario";
  cout<<"n2- Conversao Binario Decimal";
  cout<<"nEscolha uma opca";
  cin>>o;
  switch Conversor Hexadecimal > Binário, Binário > Hexadecimal


 

 

#include <iostream.h>
#include <conio.h>
#include <ctype.h>


int o,n,d,cont,x=1;
char l,o2;


void binario(){
  gotoxy(1,7);
  cout<<"Numero de Digitos: ";
  cin>>n;
  for(cont=n;cont>0;cont--){
  gotoxy(1,8);
  cout<<"   ";
  gotoxy(1,8);
  cout<<"[N] Numero [Outra Tecla] Letra ";
  cin>>o2;
  if((o2==''n'')||(o2==''N'')){
  gotoxy(1,9);
  cout<<"   ";
  gotoxy(1,9);
  cout<<"Digit ";
  cin>>d;
  switch'http://www.babooforum.com.br/idealbb/images/smilies/38.gif{
 case 0: gotoxy(x,11);
cout<<"0000";
break;
 case 1: gotoxy(x,11);
cout<<"0001";
break;
 case 2: gotoxy(x,11);
cout<<"0010";
break;
 case 3: gotoxy(x,11);
cout<<"0011";
break;
 case 4: gotoxy(x,11);
cout<<"0100";
break;
 case 5: gotoxy(x,11);
cout<<"0101";
break;
 case 6: gotoxy(x,11);
cout<<"0110";
break;
 case 7: gotoxy(x,11);
cout<<"0111";
break;
 case 8: gotoxy(x,11);
cout<<"1000";
break;
 case 9: gotoxy(x,11);
cout<<"1001";
break;
 default: gotoxy(1,13);
cout<<"Opcao Invalida";
break;
  }
  x=x+5;
  }//fim do if
  else{
  gotoxy(1,9);
  cout<<"   ";
  gotoxy(1,9);
  cout<<"Digit ";
  cin>>l;
  l=toupper'http://www.babooforum.com.br/idealbb/images/smilies/24.gif;
  switch'http://www.babooforum.com.br/idealbb/images/smilies/24.gif{
 case ''A'': gotoxy(x,11);
  cout<<"1010";
  break;
 case ''B'': gotoxy(x,11);
  cout<<"1011";
  break;
 case ''C'': gotoxy(x,11);
  cout<<"1100";
  break;
 case ''D'': gotoxy(x,11);
  cout<<"1101";
  break;
 case ''E'': gotoxy(x,11);
  cout<<"1110";
  break;
 case ''F'': gotoxy(x,11);
  cout<<"1111";
  break;
 default: gotoxy(1,13);
cout<<"Opcao Invalida";
break;
  }
  x=x+5;
  }//fim else
  }//fim for
}


void hexadecimal(){
  gotoxy(1,7);
  cout<<"Numero de Grupos de 4 bits (0000): ";
  cin>>n;
  for(cont=n;cont>0;cont--){
  gotoxy(1,8);
  cout<<" ";
  gotoxy(1,8);
  cout<<"Grupo de 4 bits: ";
  cin>>d;
  switch'http://www.babooforum.com.br/idealbb/images/smilies/38.gif{
 case 0000: gotoxy(x,11);
  cout<<"0";
  break;
 case 0001: gotoxy(x,11);
  cout<<"1";
  break;
 case 0010: gotoxy(x,11);
  cout<<"2";
  break;
 case 0011: gotoxy(x,11);
  cout<<"3";
  break;
 case 0100: gotoxy(x,11);
  cout<<"4";
  break;
 case 0101: gotoxy(x,11);
  cout<<"5";
  break;
 case 0110: gotoxy(x,11);
  cout<<"6";
  break;
 case 0111: gotoxy(x,11);
  cout<<"7";
  break;
 case 1000: gotoxy(x,11);
cout<<"8";
break;
 case 1001: gotoxy(x,11);
cout<<"9";
break;
 case 1010: gotoxy(x,11);
cout<<"A";
break;
 case 1011: gotoxy(x,11);
cout<<"B";
break;
 case 1100: gotoxy(x,11);
cout<<"C";
break;
 case 1101: gotoxy(x,11);
cout<<"D";
break;
 case 1110: gotoxy(x,11);
cout<<"E";
break;
 case 1111: gotoxy(x,11);
cout<<"F";
break;
 default: gotoxy(1,13);
cout<<"Opcao Invalida";
break;
  }
  x=x+1;
  }
}


void main(){
  int o3;
  char e;
  do{
  clrscr();
  x=1;
  cout<<"1 - Conversao Hexadecimal Binario";
  cout<<"n2- Conversao Binario Hexadecimal";
  cout<<"nEscolha uma Opca";
  cin>>o3;
  switch(o3){
 case 1: binario();
break;
 case 2: hexadecimal();
break;
 default: cout<<"nOpcao Invalida";
break;
  }
  cout<<"nnDeseja Converter Outro Numero?";
  cout<<" [S] Sim [Outra Tecla] Nao ";
  cin>>e;
  }while((e==''s'')||(e==''S''));
}

 

 

 

Desculpe se o código ficou meio bagunçado (por causa da página da Internet pois o código original está ok) tentei arrumar o máximo que pude.


#3 LINDOMIX    

LINDOMIX
  • Participante
  • 125 mensagens

Publicado 06 June 2006 - 01:52 PM

  Kra meu colega me mandou esse programa ano passado, vê se ajuda !


 


/*-----------------------------------------------------------------------------+
| Programador: Jorge Augusto |
| E-Mail: jorgeaugustofox@bol.com.br |
| Nota: Compilado no Visual C++ 6.0 Introductory Edition |
+-----------------------------------------------------------------------------*/


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



// Prototipo de funções:
char *ConverteBase(int, int, int);
 


// Função principal
int main(int argc, char *argv[])
{
  int iNumM  = 0;
  int iBaseO = 0;
 int iBaseD = 0;
 
  printf("Digite o Numero para convertern");
  scanf("%d", &iNumM);


 printf("Digite a Base de Origemn");
  scanf("%d", &iBaseO);


 printf("Digite a Base de Destinon");
  scanf("%d", &iBaseD);



  printf("%d na Base %d  corresponde a %s na Base %dn", iNumM, iBaseO, ConverteBase(iNumM, iBaseO, iBaseD), iBaseD);
  system("PAUSE");
 
  return 0;
}



/*
 Essa função é genérica mais pode ser dividor para executar a tarefa de forma mais específica
 fiz ela desse jeito por que assim se tem tudo de uma única vez... divida se achar necessário
*/
char *ConverteBase(int iNum, int iBaseOrig, int iBaseDest)
{
  char   szBuffer[40]; // buffer maior que 32 para 4 bi em binário
  static char szResult[40]; // idem
  char r   = 0; // resto
  char i   = 0; // iterador
  char c   = 0; // contador
  char cLen = 0; // comprimento da string
 int  iTemp  = 0; // temporário claro!
 int  iIndex = 0; // indece da matriz


  szBuffer[0] = 0;
  szResult[0] = 0;


 
  sprintf(szBuffer, "%d", iNum);
 cLen = strlen(szBuffer);
 
 iIndex = cLen - 1;


 // converte para a base 10
  for(i = 0; i < cLen; i++){
iTemp += (szBuffer[iIndex] - 48) * (pow(iBaseOrig, i));
iIndex--;
 }
 
 iNum = iTemp;
 i ^= i;


 // converte de 10 para a base de destino
  do{
  r = (iNum % iBaseDest);
  iNum = iNum / iBaseDest;
  szBuffer[i] = r + 48;
  i++;
  }while(iNum != 0);
 
 i--;
 
 // inverte a string do resultado... necessário
 for(; i > -1; i--, c++){
  szResult[c] = szBuffer[i];
  }
 
  return szResult;
}  


 



#4 arondk    

arondk
  • Participante
  • 324 mensagens

Publicado 06 June 2006 - 03:00 PM

Bom galerinha, vi aqui varias pessoas mandando seus programas e aceitei o desafio. Fiz um para conversão de decimal para binario e de binario para decimal.


OBS: só aceita conversao de decimal para binário no valor de 65535 e de binário para decimal no valor de 1111111111111111 (16 numeros "1"), isso devido a limitação da variável unsigned int.

 

La vai o programa (ficou um pouco grande): Ah.. foi feito em Turbo C++ 3.0

 

#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>


void binario(unsigned int num)
{
 unsigned int bin[50];
 int 'n' = 0; // está entre aspas porque o corretor troca o "ene" por não


 do
 {
  bin[n++] = num % 2;
  num = num / 2;
 } while (num != 1);
 bin[n] = num;
 printf("nnNumero em binari ");
 for (int i = n; i >= 0; i--)
 {
  printf("%i",bin[i]);
 }
}


void decimal(char *num)
{
 unsigned int t = strlen(num),
dec[20], total = 0,
cont = 1, pot = 2,
teste = 1;


 for (int i = 0; i < t; i++)
 {
  if (num[i] == '1') dec[i] = 1;
  else if (num[i] == '0') dec[i] = 0;
else { teste = 0; break; }
 }
 if (teste)
 {
if (dec[--t]) total = 1;
for (int i = t-1; i >= 0; i--)
{
  pot = pow(2,cont++);
  if (dec[i]) total = total + pot;
}
printf("nnNumero em decimal: %d",total);
 }
 else
 {
  printf("nnVALOR INVALIDO!!!");
 }
}


void main()
{
 unsigned int numd;
 char resp,numb[20];


 do
 {
  clrscr();
  printf("Conversao para decimal ou para binario? (D - decimal, B - binario)n");
  resp = getche();


  switch (toupper(resp))
  {
case 'D': printf("nnDigite o número Binari ");
  gets(numb); fflush(stdin);
  decimal(numb);
  break;


case 'B': printf("nnDigite o número Decimal: ");
  scanf("%d",&numd);
  binario(numd);
  break;


default:  printf("nnOpcao invalida!");
  break;
  }
  printf("nnnDeseja digitar outro número (S para digitar, qualquer outro para sair)? ");
  resp = getche(); fflush(stdin);
 } while (toupper(resp) == 'S');
}

 

é isso aí.. se alguém achar um jeito de melhorar esse programa, por favor, me deixe saber, sempre gosto de aprender mais e melhorar o desempenho dos meus programas, mesmo que os mais simples.

 

EDITADO! mudei as variaveis int para unsigned int, com isso o valor máximo foi para 65535 contra 32767 de antes.