Ir ao conteúdo

Posts recomendados

Postado

alguem pode me ajuda a resolver o problema de conversão ?

 

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

#define SIZE 255
#define ALG 17
int number,opcao;

// Esta função converte um número decimal para a base 2, 8 ou 16.
// Recebe como parâmetro um número decimal (num_dec), e a base (base) cujo número será convertido.
void decToBase(int num_dec, int base) {
   char resto[ALG] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}, num_conv[SIZE];
   int indx = 0;

   // Este loop realiza as operações de divisão. Os restos são guardados no vetor 'num_conv'
   while(num_dec > 0)
    {
       num_conv[indx] = resto[num_dec % base];
       num_dec /= base;
       indx++;
    }


   // Exclui o caractere especial '\0' do final da string
   indx -= 1;

   // Utilizado para identificar a saída do programa
   switch(base)
   {
       case 2 : printf("BINÁŔIO: "); break;
       case 8 : printf("OCTAL: "); break;
       case 16 : printf("HEXADECIMAL: "); break;
   }

   // Inverte a string contida no vetor num_conv
   for(indx; indx >= 0; indx--)
       printf("%c", num_conv[indx]);
   printf("\n");

   switch(base)
   {
       int num_salva;
    case 2: if(base=2)
        {

            for(indx; indx >= 0; indx--)
                {
                    number+=num_conv[indx];
                }
        }
    break;
   case 8: if(base=8)
        {

            for(indx; indx >= 0; indx--)
                {
                   number+=num_conv[indx];
                }
        }
    break;
    case 16: if(base=16)
        {

            for(indx; indx >= 0; indx--)
                {
                    number+=num_conv[indx];
                }
        }
    break;
   }

}

// Esta função permite converter um número na base 2, 8 ou 16 para a base decimal.
// Recebe como parâmetro uma string (representação do número), e um número inteiro que
// determina em qual base está o número do primeiro parâmetro.
void baseToDec(char* num_base, int base) {
    int indx = 0, exp = 0, cont = 0, dec = 0, num = 0;

    // Este loop determina o tamanho da string
    while(num_base[cont] != '\0') {
        cont++;
    }

    // Neste loop, a string é percorrida de trás para frente. Cada caractere é convertido
    // em um número inteiro, multiplicado pela base elevada ao expoente (0..Comprimento da string)
    // e somado ao valor da variável 'dec', que recebe as somas sucessivas.
    for(exp, indx=(cont-1); exp < cont; exp++, indx--)
    {
        if(base == 16)
        {
            switch(num_base[indx]) {
                case 'A' : case 'a' : num = 10; break;
                case 'B' : case 'b' : num = 11; break;
                case 'C' : case 'c' : num = 12; break;
                case 'D' : case 'd' : num = 13; break;
                case 'E' : case 'e' : num = 14; break;
                case 'F' : case 'f' : num = 15; break;
                default : num = (int)num_base[indx] - (int)'0';
            }
        }
        else
            num = (int)num_base[indx] - (int)'0';

        // Aqui avalia se o usuário digitou um número válido ou não!
        if(num > (base-1) || num < 0) {
            printf("Você informou um número inválido!\n");
            exit(0);
        }
        dec += num * pow(base, exp);
    }


    // O número convertido para decimal é exibido
    printf("DECIMAL: %d\n", dec);
}

// Função que imprime o menu da calculadora
void menu(void) {
    printf("\nBEM-VINDO AO CONVERSOR DE BASES NUMÉRICAS\n");
    printf("QUAL OPERAÇÃO DESEJA REALIZAR? \n");
    printf("[ 1 ] DECIMAL     ->  BINARIO, OCTAL e HEXADECIMAL\n");
    printf("[ 2 ] BINARIO     ->  DECIMAL, OCTAL e HEXADECIMAL\n");
    printf("[ 3 ] OCTAL       ->  DECIMAL, BINARIO e HEXADECIMAL\n");
    printf("[ 4 ] HEXADECIMAL ->  DECIMAL, BINARIO, OCTAL\n");
    printf("[ 0 ] SAIR\n");
}

// Função que chama as funções correspondentes à opção escolhida
void process_calc(int opt)
{
    char str[SIZE];
    char calc[SIZE];
    int cont=0,cont1;
    switch(opt) {
        case 0 :
            printf("CALCULADORA ENCERRADA!\n");
            exit(0);

        case 1 :
            printf("DECIMAL: ");
            scanf("%d", &number);
            decToBase(number, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 2 :
            printf("BINÁRIO: ");
            scanf("%s", str);
            baseToDec(str, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 3 :
            printf("OCTAL = ");
            scanf("%s", str,3);
            baseToDec(str, 8);
            decToBase(number, 2);
            decToBase(number, 16);
            break;
        case 4 :
            printf("HEXADECIMAL = ");
            scanf("%s", str);
            baseToDec(str, 16);
            decToBase(number, 2);
            decToBase(number, 8);
            break;
        default :
            printf("OPÇÃO NÃO PERMITIDA!\nTENTE NOVAMENTE\n");
            break;
    }
}

int main(void) {
    menu();
    printf("QUAL OPERAÇÃO DESEJA REALIZAR? ");
    scanf("%d", &opcao);
    process_calc(opcao);
    return 0;
}
>

  • Curtir 1
Postado

@Flávio Pedroza resolvi este problema porém falto outro problema que ele nao converte de binario para hexa e octal 

e nem de hexa para octal e binario e nem de octal para hexa e binario pois nao consigo pega a variavel de la de dentro

adicionado 7 minutos depois

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

#define SIZE 255
#define ALG 17
int number,opcao;

// Esta função converte um número decimal para a base 2, 8 ou 16.
// Recebe como parâmetro um número decimal (num_dec), e a base (base) cujo número será convertido.
void decToBase(int num_dec, int base) {
   char resto[ALG] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}, num_conv[SIZE];
   int indx = 0;

   // Este loop realiza as operações de divisão. Os restos são guardados no vetor 'num_conv'
   while(num_dec > 0)
    {
       num_conv[indx] = resto[num_dec % base];
       num_dec /= base;
       indx++;
    }


   // Exclui o caractere especial '\0' do final da string
   indx -= 1;

   // Utilizado para identificar a saída do programa
   switch(base)
   {
       case 2 : printf("BINÁŔIO: "); break;
       case 8 : printf("OCTAL: "); break;
       case 16 : printf("HEXADECIMAL: "); break;
   }

   // Inverte a string contida no vetor num_conv
   for(indx; indx >= 0; indx--)
       printf("%c", num_conv[indx]);
   printf("\n");

   switch(base)
   {
       int num_salva;
    case 2: if(base=2)
        {

            for(indx; indx >= 0; indx--)
                {
                    number+=num_conv[indx];
                }
        }
    break;
   case 8: if(base=8)
        {

            for(indx; indx >= 0; indx--)
                {
                   number+=num_conv[indx];
                }
        }
    break;
    case 16: if(base=16)
        {

            for(indx; indx >= 0; indx--)
                {
                    number+=num_conv[indx];
                }
        }
    break;
   }

}

// Esta função permite converter um número na base 2, 8 ou 16 para a base decimal.
// Recebe como parâmetro uma string (representação do número), e um número inteiro que
// determina em qual base está o número do primeiro parâmetro.
void baseToDec(char* num_base, int base) {
    int indx = 0, exp = 0, cont = 0, dec = 0, num = 0;

    // Este loop determina o tamanho da string
    while(num_base[cont] != '\0') {
        cont++;
    }

    // Neste loop, a string é percorrida de trás para frente. Cada caractere é convertido
    // em um número inteiro, multiplicado pela base elevada ao expoente (0..Comprimento da string)
    // e somado ao valor da variável 'dec', que recebe as somas sucessivas.
    for(exp, indx=(cont-1); exp < cont; exp++, indx--)
    {
        if(base == 16)
        {
            switch(num_base[indx]) {
                case 'A' : case 'a' : num = 10; break;
                case 'B' : case 'b' : num = 11; break;
                case 'C' : case 'c' : num = 12; break;
                case 'D' : case 'd' : num = 13; break;
                case 'E' : case 'e' : num = 14; break;
                case 'F' : case 'f' : num = 15; break;
                default : num = (int)num_base[indx] - (int)'0';
            }
        }
        else
            num = (int)num_base[indx] - (int)'0';

        // Aqui avalia se o usuário digitou um número válido ou não!
        if(num > (base-1) || num < 0) {
            printf("Você informou um número inválido!\n");
            exit(0);
        }
        dec += num * pow(base, exp);
    }


    // O número convertido para decimal é exibido
    printf("DECIMAL: %d\n", dec);
}

// Função que imprime o menu da calculadora
void menu(void) {
    printf("\nBEM-VINDO AO CONVERSOR DE BASES NUMÉRICAS\n");
    printf("QUAL OPERAÇÃO DESEJA REALIZAR? \n");
    printf("[ 1 ] DECIMAL     ->  BINARIO, OCTAL e HEXADECIMAL\n");
    printf("[ 2 ] BINARIO     ->  DECIMAL, OCTAL e HEXADECIMAL\n");
    printf("[ 3 ] OCTAL       ->  DECIMAL, BINARIO e HEXADECIMAL\n");
    printf("[ 4 ] HEXADECIMAL ->  DECIMAL, BINARIO, OCTAL\n");
    printf("[ 0 ] SAIR\n");
}

// Função que chama as funções correspondentes à opção escolhida
void process_calc(int opt)
{
    char str[SIZE];
    char calc[SIZE];
    int cont=0,cont1;
    switch(opt) {
        case 0 :
            printf("CALCULADORA ENCERRADA!\n");
            exit(0);

        case 1 :
            printf("DECIMAL: ");
            scanf("%d", &number);
            decToBase(number, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 2 :
            printf("BINÁRIO: ");
            scanf("%s", str);
            baseToDec(str, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 3 :
            printf("OCTAL = ");
            scanf("%s", str);
            baseToDec(str, 8);
            decToBase(number, 2);
            decToBase(number, 16);
            break;
        case 4 :
            printf("HEXADECIMAL = ");
            scanf("%s", str);
            baseToDec(str, 16);
            decToBase(number, 2);
            decToBase(number, 8);
            break;
        default :
            printf("OPÇÃO NÃO PERMITIDA!\nTENTE NOVAMENTE\n");
            break;
    }
}

int main(void) {
    menu();
    printf("QUAL OPERAÇÃO DESEJA REALIZAR? ");
    scanf("%d", &opcao);
    process_calc(opcao);
    return 0;
}

  • Curtir 1
Postado

Uma solução seria usar uma função retornando o número em decimal:

// Esta função permite converter um número na base 2, 8 ou 16 para a base decimal.
// Recebe como parâmetro uma string (representação do número), e um número inteiro que
// determina em qual base está o número do primeiro parâmetro.
int baseToDec(char* num_base, int base) { //int no lugar de void
    int indx = 0, exp = 0, cont = 0, dec = 0, num = 0;
    // Este loop determina o tamanho da string
    while(num_base[cont] != '\0') {
        cont++;
    }
    // Neste loop, a string é percorrida de trás para frente. Cada caractere é convertido
    // em um número inteiro, multiplicado pela base elevada ao expoente (0..Comprimento da string)
    // e somado ao valor da variável 'dec', que recebe as somas sucessivas.
    for(exp, indx=(cont-1); exp < cont; exp++, indx--)
    {
        if(base == 16)
        {
            switch(num_base[indx]) {
                case 'A' : case 'a' : num = 10; break;
                case 'B' : case 'b' : num = 11; break;
                case 'C' : case 'c' : num = 12; break;
                case 'D' : case 'd' : num = 13; break;
                case 'E' : case 'e' : num = 14; break;
                case 'F' : case 'f' : num = 15; break;
                default : num = (int)num_base[indx] - (int)'0';
            }
        }
        else
            num = (int)num_base[indx] - (int)'0';
        // Aqui avalia se o usuário digitou um número válido ou não!
        if(num > (base-1) || num < 0) {
            printf("Você informou um número inválido!\n");
            exit(0);
        }
        dec += num * pow(base, exp);
    }

    // O número convertido para decimal é exibido
    printf("DECIMAL: %d\n", dec);
    return dec; //retornar o número em decimal
}
                                     
void process_calc(int opt)
{
    char str[SIZE];
    char calc[SIZE];
    int cont=0,cont1;
    switch(opt) {
        case 0 :
            printf("CALCULADORA ENCERRADA!\n");
            exit(0);
        case 1 :
            printf("DECIMAL: ");
            scanf("%d", &number);
            decToBase(number, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 2 :
            printf("BINÁRIO: ");
            scanf("%s", str);
            number = baseToDec(str, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 3 :
            printf("OCTAL = ");
            scanf("%s", str);
            number = baseToDec(str, 8);
            decToBase(number, 2);
            decToBase(number, 16);
            break;
        case 4 :
            printf("HEXADECIMAL = ");
            scanf("%s", str);
            number = baseToDec(str, 16);
            decToBase(number, 2);
            decToBase(number, 8);
            break;
        default :
            printf("OPÇÃO NÃO PERMITIDA!\nTENTE NOVAMENTE\n");
            break;
    }
}

 

  • Curtir 1
Postado
22 horas atrás, Flávio Pedroza disse:

Uma solução seria usar uma função retornando o número em decimal:


// Esta função permite converter um número na base 2, 8 ou 16 para a base decimal.
// Recebe como parâmetro uma string (representação do número), e um número inteiro que
// determina em qual base está o número do primeiro parâmetro.
int baseToDec(char* num_base, int base) { //int no lugar de void
    int indx = 0, exp = 0, cont = 0, dec = 0, num = 0;
    // Este loop determina o tamanho da string
    while(num_base[cont] != '\0') {
        cont++;
    }
    // Neste loop, a string é percorrida de trás para frente. Cada caractere é convertido
    // em um número inteiro, multiplicado pela base elevada ao expoente (0..Comprimento da string)
    // e somado ao valor da variável 'dec', que recebe as somas sucessivas.
    for(exp, indx=(cont-1); exp < cont; exp++, indx--)
    {
        if(base == 16)
        {
            switch(num_base[indx]) {
                case 'A' : case 'a' : num = 10; break;
                case 'B' : case 'b' : num = 11; break;
                case 'C' : case 'c' : num = 12; break;
                case 'D' : case 'd' : num = 13; break;
                case 'E' : case 'e' : num = 14; break;
                case 'F' : case 'f' : num = 15; break;
                default : num = (int)num_base[indx] - (int)'0';
            }
        }
        else
            num = (int)num_base[indx] - (int)'0';
        // Aqui avalia se o usuário digitou um número válido ou não!
        if(num > (base-1) || num < 0) {
            printf("Você informou um número inválido!\n");
            exit(0);
        }
        dec += num * pow(base, exp);
    }

    // O número convertido para decimal é exibido
    printf("DECIMAL: %d\n", dec);
    return dec; //retornar o número em decimal
}
                                     
void process_calc(int opt)
{
    char str[SIZE];
    char calc[SIZE];
    int cont=0,cont1;
    switch(opt) {
        case 0 :
            printf("CALCULADORA ENCERRADA!\n");
            exit(0);
        case 1 :
            printf("DECIMAL: ");
            scanf("%d", &number);
            decToBase(number, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 2 :
            printf("BINÁRIO: ");
            scanf("%s", str);
            number = baseToDec(str, 2);
            decToBase(number, 8);
            decToBase(number, 16);
            break;
        case 3 :
            printf("OCTAL = ");
            scanf("%s", str);
            number = baseToDec(str, 8);
            decToBase(number, 2);
            decToBase(number, 16);
            break;
        case 4 :
            printf("HEXADECIMAL = ");
            scanf("%s", str);
            number = baseToDec(str, 16);
            decToBase(number, 2);
            decToBase(number, 8);
            break;
        default :
            printf("OPÇÃO NÃO PERMITIDA!\nTENTE NOVAMENTE\n");
            break;
    }
}

obrigado

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!