Foros del Web » Programación para mayores de 30 ;) » C/C++ »

binario, decimal, octal, hexadecimal

Estas en el tema de binario, decimal, octal, hexadecimal en el foro de C/C++ en Foros del Web. No se porque esta mal, porfavor ayuda: #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> void decimalb (char n); void decimalo (char n); void decimalh ...
  #1 (permalink)  
Antiguo 27/04/2010, 04:56
 
Fecha de Ingreso: abril-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
binario, decimal, octal, hexadecimal

No se porque esta mal, porfavor ayuda:

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

void decimalb (char n);
void decimalo (char n);
void decimalh (char n);

void main()
{
char a[100];
char i, base, convertir;

gets (a);

printf ("En que base esta?\n");
scanf ("%d", &base);

printf ("A que base la quieres convertir? (binario, octal, decimal o hexadecimal\n");
scanf("%d", &convertir);

if (base=='B')
{
decimalb(a);
}

if (base=='O')
{
decimalo(a);
}

if (base=='H')
{
decimalh(a);
}

getch();
}

void decimalb (char n)
{
int j=0, contador=0, i, decimalb=0;

for (i=99; i>=0; i++)
{
if (n[i]==1)
{
decimalb=decimalb+(n[i]+(2*contador);
contador++;
}

if (n[i]==0)
{
decimalb=decimalb+n[i]+(2*contador);
contador++;
}
}

n[0]=decimalb;
}

void decimalo (char n)
{
int j=0, contador=0, i, decimalo=0;

for (i=99; i>=0; i++)
{
if (n[i]==1)
{
decimalo=decimalo+(n[i]+(8*contador);
contador++;
}

if (n[i]==0)
{
decimalo=decimalo+n[i]+(8*contador);
contador++;
}
}

n[0]=decimalo;
}

void decimalh (char n);
{
int j=0, contador=0, i, decimalh=0;

for (i=99; i>=0; i++)
{
if (n[i]==1)
{
decimalh=decimalh+(n[i]+(16*contador);
contador++;
}

if (n[i]==0)
{
decimalh=decimalh+n[i]+(16*contador);
contador++;
}
}

n[0]=decimalh;
}





Enunciando:

Ejercicio 28: (Trabajar en casa) Diseña un programa que lea números como cadenas de caracteres, la base en la que está el número y la base a la que quiere convertir dicho número. El programa parará al leerse la cadena “***”. Se considerarán las bases 2, 8, 10 y 16. Se usará una función para realizar cada tipo de conversión. El número convertido se escribirá en pantalla desde el programa principal.

No esta hecho completamente pero me gustaria saber porque esta mal por ahora.
  #2 (permalink)  
Antiguo 27/04/2010, 05:33
 
Fecha de Ingreso: abril-2010
Mensajes: 11
Antigüedad: 14 años
Puntos: 0
Respuesta: binario, decimal, octal, hexadecimal

Así, de un vistazo rápido, la condición de varios for (por ej. for (i=99; i>=0; i++) no está bien.

Entran en un bucle infinito porque primero inicializas a 99, luego le dices que lo haga mientras sea mayor o igual que 0 y finalmente, en lugar de decrementar, como sería esperable, incrementas, por lo que siempre será mayor o igual que cero (nunca saldrá del bucle for).
  #3 (permalink)  
Antiguo 27/04/2010, 09:09
 
Fecha de Ingreso: abril-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: binario, decimal, octal, hexadecimal

Ahora he llegado a una parte del programa en el que tengo que pasar de decimal a hexadecimal.
El caso que un numero hexadecimal contiene letras, ya que me quedo sin numeros, alguien sasbe como hacerlo?
  #4 (permalink)  
Antiguo 27/04/2010, 09:55
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: binario, decimal, octal, hexadecimal

Te refieres a algo mas o menos asi:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  
  5.     printf("%x\n", 10);
  6.     printf("%x\n", 11);
  7.     printf("%x\n", 12);
  8.     printf("%x\n", 13);
  9.     return 0;
  10. }
  #5 (permalink)  
Antiguo 28/04/2010, 05:55
 
Fecha de Ingreso: abril-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: binario, decimal, octal, hexadecimal

Mi codigo ha quedado asi:
Código c:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. void decimalb (char *n);
  7. void decimalo (char *n);
  8. void decimalh (char *n);
  9. void convertirb (char *n);
  10. void convertiro (char *o);
  11. void convertirh (char *h);
  12.  
  13. void main()
  14. {
  15.     char a[100];
  16.     char i, base, convertir, fuera=0;
  17.  
  18.     for (i=0; i<=100; i++)
  19.     {
  20.         scanf ("%d", &a[i]);
  21.  
  22.         if (a[i]!='*')
  23.         {
  24.             fuera=0;
  25.         }
  26.  
  27.         if (a[i]=='*')
  28.         {
  29.             fuera++;
  30.         }
  31.     }
  32.  
  33.     printf ("En que base esta?\n");
  34.     scanf ("%c", &base);
  35.  
  36.     printf ("A que base la quieres convertir? (binario, octal, decimal o hexadecimal\n");
  37.     scanf("%c", &convertir);
  38.  
  39.     if (base=='B')
  40.     {
  41.         decimalb(a);
  42.     }
  43.  
  44.     if (base=='O')
  45.     {
  46.         decimalo(a);
  47.     }
  48.  
  49.     if (base=='H')
  50.     {
  51.         decimalh(a);
  52.     }
  53.  
  54.     if (convertirb=='B')
  55.     {
  56.         convertirb(a);
  57.     }
  58.  
  59.     if (convertirb=='O')
  60.     {
  61.         convertiro(a);
  62.     }
  63.  
  64.     if (convertirb=='H')
  65.     {
  66.         convertirh(a);
  67.     }
  68.  
  69.    
  70.  
  71.     getch();
  72. }
  73.  
  74. void decimalb (char *n)
  75. {
  76.     int j=0, contador=0, i, decimalb=0;
  77.  
  78.     for (i=99; i>=0; i--)
  79.     {
  80.         if (n[i]==1)
  81.         {
  82.             decimalb=decimalb+(n[i]+(2*contador));
  83.             contador++;
  84.         }
  85.  
  86.         if (n[i]==0)
  87.         {
  88.             decimalb=decimalb+n[i]+(2*contador);
  89.             contador++;
  90.         }
  91.     }
  92.  
  93.     for (i=0; i<=99; i++)
  94.     {
  95.         n[i]='\0';
  96.     }
  97.  
  98.     n[0]=decimalb;
  99. }
  100.  
  101. void decimalo (char *n)
  102. {
  103.     int j=0, contador=0, i, decimalo=0;
  104.  
  105.     for (i=99; i>=0; i--)
  106.     {
  107.         if (n[i]==1)
  108.         {
  109.             decimalo=decimalo+(n[i]+(8*contador));
  110.             contador++;
  111.         }
  112.  
  113.         if (n[i]==0)
  114.         {
  115.             decimalo=decimalo+n[i]+(8*contador);
  116.             contador++;
  117.         }
  118.     }
  119.  
  120.     for (i=0; i<=99; i++)
  121.     {
  122.         n[i]='\0';
  123.     }
  124.  
  125.     n[0]=decimalo;
  126. }
  127.  
  128. void decimalh (char *n)
  129. {
  130.     int j=0, contador=0, i, decimalh=0;
  131.  
  132.  
  133.     for (i=99; i>=0; i--)
  134.     {
  135.  
  136.         if (n[i]=='A')
  137.         {
  138.             n[i]=10;
  139.         }
  140.         if (n[i]==1)
  141.         {
  142.             decimalh=decimalh+(n[i]+(16*contador));
  143.             contador++;
  144.         }
  145.  
  146.         if (n[i]==0)
  147.         {
  148.             decimalh=decimalh+n[i]+(16*contador);
  149.             contador++;
  150.         }
  151.     }
  152.  
  153.     for (i=0; i<=99; i++)
  154.     {
  155.         n[i]='\0';
  156.     }
  157.  
  158.     n[0]=decimalh;
  159. }
  160.  
  161. void convertirb (char *n)
  162. {
  163.     int i=0, binario=0;
  164.  
  165.     atoi (n);
  166.  
  167.  
  168.     for (i=0; n[i]==1;)
  169.     {
  170.         binario=binario+(n[i]%2);
  171.         n[i]=binario;
  172.     }
  173. }
  174.  
  175. void convertiro (char *n)
  176. {
  177.     int i=0, octal=0;
  178.  
  179.     atoi (n);
  180.  
  181.  
  182.     for (i=0; n[i]==1;)
  183.     {
  184.         octal=octal+(n[i]%8);
  185.         n[i]=octal;
  186.     }
  187. }
  188.  
  189. void convertirh (char *n)
  190. {
  191.     int i=0, hexadecimal=0;
  192.    
  193.     for (i=0; n[i]==1;)
  194.     {
  195.         hexadecimal=hexadecimal+(n[i]%16);
  196.         n[i]=hexadecimal;
  197.     }
  198. }

Los errores son los siguietnes.

1>------ Operación Generar iniciada: proyecto: 5Ejercicio28, configuración: Debug Win32 ------
1>Compilando...
1>5Ejercicio28.cpp
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(20) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : vea la declaración de 'scanf'
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(34) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : vea la declaración de 'scanf'
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(37) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\stdio.h(306) : vea la declaración de 'scanf'
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(54) : error C2446: ==' : no hay conversión de 'int' en 'void (__cdecl *)(char *)'
1> La conversión de un tipo integral a un tipo de puntero requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(54) : error C2040: '== : 'void (__cdecl *)(char *)' se diferencia en los niveles de direccionamiento indirecto de 'int'
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(59) : error C2446: ==' : no hay conversión de 'int' en 'void (__cdecl *)(char *)'
1> La conversión de un tipo integral a un tipo de puntero requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(59) : error C2040: '== : 'void (__cdecl *)(char *)' se diferencia en los niveles de direccionamiento indirecto de 'int'
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(64) : error C2446: ==' : no hay conversión de 'int' en 'void (__cdecl *)(char *)'
1> La conversión de un tipo integral a un tipo de puntero requiere reinterpret_cast, conversión de estilo de C o conversión de estilo de función
1>d:\nestor\a.s.i\programación\ejercicios2\5ejerci cio28\5ejercicio28\5ejercicio28.cpp(64) : error C2040: '== : 'void (__cdecl *)(char *)' se diferencia en los niveles de direccionamiento indirecto de 'int'
1>El registro de compilación se guardó en el "file://d:\Nestor\A.S.I\Programación\EJERCICIOS2\5Ejercici o28\5Ejercicio28\Debug\BuildLog.htm"
1>5Ejercicio28 - 6 errores, 3 advertencias
========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ==========





Llevo media hora con este error y no logro entender por qué puede ser.
  #6 (permalink)  
Antiguo 28/04/2010, 08:25
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: binario, decimal, octal, hexadecimal

Tienes una variable que se llama "convertir", pero cuando te corresponde usarla, usas el nombre de una funcion.

Código C++:
Ver original
  1. if (convertirb=='B')    // <-- usando el nombre de una funcion
  2.     {
  3.         convertirb(a);
  4.     }
  #7 (permalink)  
Antiguo 29/04/2010, 06:03
 
Fecha de Ingreso: abril-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: binario, decimal, octal, hexadecimal

Hola, gracias por tu consejo, ahora me funciona todo excepto esta funcion:
Código c:
Ver original
  1. void convertirb (char *n)
  2. {
  3.     int i=0, binario=0;
  4.  
  5.     atoi (n);
  6.  
  7.  
  8. for (i=0; n[i]==1;) //Estoy casi seguro de que aqui esta el fallo pero no se como arreglarlo
  9.     {
  10.         binario=binario+(n[i]&#37;2);
  11.         n[i]=binario;
  12.     }
  13. }

Y con la octal y la de hexadecimal igual, pero si me deciis como arreglalo seria de gran ayuda.
  #8 (permalink)  
Antiguo 29/04/2010, 07:49
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: binario, decimal, octal, hexadecimal

Te falta incrementar la variable en el for:

for (i=0; n[i]==1;i++)
  #9 (permalink)  
Antiguo 30/04/2010, 05:25
 
Fecha de Ingreso: abril-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: binario, decimal, octal, hexadecimal

Lo siento, pero me sigue sin funcionar, y la he cambiado:

void convertirb (char *n)
{
int contador;

int i=0, binario=0, numero;

numero=atoi (n);

for (i=0; i<=99; i++)
{
n[i]='\0';
}

while (numero!=1)
{
if (numero<=2)
{
binario=binario+(numero/2);
}

else if
{
binario=binario+(numero%2);
n[i]=binario;
i++;
contador++;
}
}

for (i=contador; i>=0; i--)
{

}
}
  #10 (permalink)  
Antiguo 30/04/2010, 07:34
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: binario, decimal, octal, hexadecimal

Código C:
Ver original
  1. void convertirb (char *n)
  2. {
  3.  
  4.     int contador = 0,i = 0;
  5.     int numero=atoi (n);   // Asumo que en n esta el numero correcto
  6.     char copia[100];
  7.     for (i=0; i<=99; i++)
  8.     {
  9.         copia[i] = '\0';
  10.         n[i]='\0';
  11.     }
  12.  
  13.     i = 0;
  14.     while (numero != 0)
  15.     {  
  16.         if (numero &#37; 2 == 0 ) copia[i] = '0';
  17.         else copia[i] = '1';
  18.         numero = numero / 2;
  19.         i++;
  20.  
  21.     }
  22.         i--;
  23.         for(;i>=0;i--) n[contador++] = copia[i];
  24.  
  25. }
  #11 (permalink)  
Antiguo 30/04/2010, 11:58
 
Fecha de Ingreso: abril-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: binario, decimal, octal, hexadecimal

Hola ya he avanzado bastante pero ahora tengo un problema y es que dice que el array esta corrupto, no lo he hecho como el codigo de binario que me has pasado sam90, pero muchas gracias de todas formas.

El codigo es el siguiente:
Código c:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. void adecimalb (char *n);
  7. void adecimalo (char *n);
  8. void adecimalh (char *n);
  9. void convertirb (char *n);
  10. void convertiro (char *o);
  11. void convertirh (char *h);
  12.  
  13. void main()
  14. {
  15.     char a[100]="\0";
  16.     char base, convertir;
  17.     char numero;
  18.     int i, fuera=0;
  19.  
  20.  
  21.     printf ("Dame un numero binario, octal, decimal o hexadecimal, parare cuando introduzcas '***'\n\n");
  22.  
  23.     for (i=0; i<=100; i++)
  24.     {
  25.         numero=getche();
  26.         a[i]=numero;
  27.  
  28.         if (numero!='*')
  29.         {
  30.             fuera=0;
  31.         }
  32.  
  33.         if (a[i]=='*')
  34.         {
  35.             fuera++;
  36.             a[i]='\0';
  37.         }
  38.  
  39.         if (fuera==3)
  40.         {
  41.             i=200;
  42.         }
  43.     }
  44.  
  45.     printf ("\n\nEn que base esta?\n\n");
  46.     scanf ("%c", &base);
  47.  
  48.     printf ("\n\nA que base la quieres convertir? (binario, octal, decimal o hexadecimal)\n\n");
  49.     numero=getche();
  50.     convertir=numero;
  51.     printf ("\n");
  52.  
  53.     if (base=='B')
  54.     {
  55.         adecimalb(a);
  56.     }
  57.  
  58.     if (base=='O')
  59.     {
  60.         adecimalo(a);
  61.     }
  62.  
  63.     if (base=='H')
  64.     {
  65.         adecimalh(a);
  66.     }
  67.  
  68.     if (convertir=='B')
  69.     {
  70.         convertirb(a);
  71.     }
  72.  
  73.     if (convertir=='O')
  74.     {
  75.         convertiro(a);
  76.     }
  77.  
  78.     if (convertir=='H')
  79.     {
  80.         convertirh(a);
  81.     }
  82.  
  83.     printf ("\nEl numero es:\n");
  84.  
  85.     puts (a);
  86.    
  87.     getch();
  88. }
  89.  
  90. void convertirb (char *n)
  91. {
  92.     int contador=0, pasa=0, j=0;
  93.  
  94.     int i=0, binario=0, numero;
  95.  
  96.     numero=atoi(n);
  97.  
  98.     for (i=0; i<=99; i++)
  99.     {
  100.         n[i]='\0';
  101.     }
  102.  
  103.     while (numero/2!=1)
  104.     {
  105.         if (numero<=2)
  106.         {
  107.             n[i]=1;
  108.             pasa=1;
  109.             contador++;
  110.             i++;
  111.         }
  112.  
  113.         if (pasa==0)
  114.         {  
  115.             numero=numero/2;
  116.             binario=binario+(numero%2);
  117.             n[i]=binario;
  118.             i++;
  119.             contador++;
  120.         }
  121.     }
  122.  
  123.     for (i=contador; i>=0; i--)
  124.     {
  125.         j++;
  126.         n[j]=n[contador];  
  127.     }
  128. }


El programa esta incompleto, ya que me duda solo reside en pasar de decimal a binario, ya que me dice que la variable esta corrupta, yo creo que el problema esta cuando devuelve el array pero no estoy seguro ni se como solucionarlo.

Etiquetas: binario, decimal, hexadecimal
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:55.