Hola,
el problema que tengo es que no se como acertar en crear un bucle para sacar decimales del 1 al 256 y obtener su binario, octal y hex.
El objetivo final es poder crear una lista para números del 1 al 256 de conversión decimal a binario, decimal a octal y decimal a hex.
Primero he comenzado con la conversión del código de decimal a binario, realizando este código:
#include <stdio.h>
/* conversor de decimal a binario */
int main(){
int numero;
printf("Introduzca un numero en decimal: ");
scanf("%d",&numero);
while(numero>=2){
printf("\t%d",numero%2);
numero/=2;
}
printf("\t %d",numero);
printf("\n");
}
Una vez conseguido la primera parte me propongo a crear la lista del 1 al 256, primero lo he intentado con un bucle for pero me creaba bucle infinito. Después he pasado a usar otro bucle while con variable contador para sacar decimales hasta el límite (256) pero no consigo interpretar como sacar la conversión de un decimal seguido del otro.
Aquí va como he tenido que dejar el código:
#include <stdio.h>
/* tabla decimal a binario,octal y hexadecimal */
int main(){
int numero,contador=1;
while(contador<=4){
numero=0;
numero++;
while(numero>=2){
printf("Decimal %d \t%d",contador,numero%2);
numero/=2;
}
printf("\t %d",numero);
contador++;
}
}
Gracias.
Un saludo
Aquí hay una propuesta que imprime una tabla con los valores en binario de todos los números desde 1 hasta 256:
#include <stdio.h>
/* conversor de decimal a binario */
int main() {
int i, numero;
int base;
printf("decimal\tbinario\n"
"------------------------\n");
for ( i = 1; i <= 256; i++ ) {
numero = i;
printf( "%d\t", numero );
base = 2;
while(numero >= 1) {
printf("%d ", numero%base);
numero/=base;
}
printf("\n");
}
}
Ten en cuenta que el número binario aparece invertido, no se si sea un problema para tí. Si es así, avisa para decirte cómo podrías corregirlo.
Ahora, una propuesta que imprime en binario, octal y hexadecimal.Sólo tienes que cambiar el valor de la variable base, y en el caso de hex, debes imprimir letras cuando corresponda a digitos entre 10 y 15:
#include <stdio.h>
/* conversor de decimal a binario */
int main() {
int i, numero, resto;
int base;
printf("decimal\tbinario\toctal\thex\n"
"------------------------\n");
for ( i = 1; i <= 256; i++ ) {
numero = i;
printf( "%d\t", numero );
/* binario */
base = 2;
while(numero >= 1) {
printf("%d", numero%base);
numero/=base;
}
/* octal */
printf(" ");
base = 8;
numero = i; /* rescatamos el valor de numero */
while(numero >= 1) {
printf("%d", numero%base);
numero/=base;
}
/* hexadecimal */
printf(" ");
base = 16;
numero = i; /* rescatamos el valor de numero */
while(numero >= 1) {
resto = numero % base;
if ( resto < 10 )
printf("%d", numero%base);
else
printf("%c", 'A' + resto - 10 );
numero/=base;
}
printf("\n");
}
}
Aquí la salida con los primeros 20 números, y como puedes ver la tabla sale un poco desordenada. Se requiere hacer más código si quieres embellecerla, jeje
decimal binario octal hex
------------------------
1 1 1 1
2 01 2 2
3 11 3 3
4 001 4 4
5 101 5 5
6 011 6 6
7 111 7 7
8 0001 01 8
9 1001 11 9
10 0101 21 A
11 1101 31 B
12 0011 41 C
13 1011 51 D
14 0111 61 E
15 1111 71 F
16 00001 02 01
17 10001 12 11
18 01001 22 21
19 11001 32 31
20 00101 42 41
Con estructuras, uniones y desplazamientos binarios se puede conseguir el mismo efecto y sin hacer apenas operaciones... aunque lo mismo se sale un poco de lo que pretendía tu profesor con la práctica :)
typedef union
{
int entero;
struct
{
unsigned short : 6;
unsigned short valor : 3;
} octal;
struct
{
unsigned short : 4;
unsigned short valor: 4;
} hex;
struct
{
unsigned short : 7;
unsigned short valor: 1;
} bin;
} conversor;
int main( )
{
int numero;
printf( "Introduce un numero: " );
scanf( "%d", &numero );
conversor conver;
conver.entero = numero;
printf( "octal: " );
int i;
for ( i = 0; i < 3; i++ ) // 128 requiere 3 digitos hexadecimales
{
printf( "%d", conver.octal.valor );
conver.entero <<= 3;
}
printf ("\n" );
conver.entero = numero;
printf( "hexadecimal: " );
for ( i = 0; i < 2; i++ ) // 128 requiere 2 digitos hexadecimales
{
printf( "%x", conver.hex.valor );
conver.entero <<= 4;
}
printf( "\n" );
conver.entero = numero;
printf( "binario: " );
for ( i = 0; i < 8; i++ ) // 128 requiere 8 digitos binarios
{
printf( "%d", conver.bin.valor );
conver.entero <<= 1;
}
printf( "\n" );
}
Al fin y al cabo el ordenador hace muchas veces buena parte del trabajo por nosotros.
¿Por qué me siento algo aludido con el mensaje anterior?, Jaja, broma.
Bueno, traté de dar una solución con métodos elementales, ya ese era más o menos el estilo del programa originalmente presentado. Pero esperemos que al autor aclare qué tipo de programación está dispuesto a usar .....
Y como decimos los programadores, entre más "bajo" o elemental el nivel que usemos, más trabajo para uno ;D
Cita de: yoel_alejandro en 22 Mayo 2014, 18:36 PM
Bueno, traté de dar una solución con métodos elementales, ya ese era más o menos el estilo del programa originalmente presentado.
En ese caso pongo otra opción muy sencilla parecida al de yoel_alejandro
#include <stdio.h>
#include <string.h>
#define HEX "0123456789ABCDEF"
int main(void)
{
char hex[20] = "";
int dec = 255, temp = dec, fact = 1, resto = 0, i;
for(; dec; fact *= 10, dec = dec / 2)
resto += (dec % 2) * fact;
printf("Binario: %d\n", resto);
dec = temp, resto = 0, fact = 1;
for(; dec; fact *= 10, dec = dec / 8)
resto += (dec % 8) * fact;
printf("Octal: %d\n", resto);
dec = temp;
for(i = 0; dec; i++, dec = dec / 16)
hex[i] = HEX[(dec % 16)];
printf("Hexadecimal: %s\n", strrev(hex));
return 0;
}
Saludos
¡Que manía con obtener las cadenas a la inversa y luego tener que darles la vuelta!
¡¡ ¡Es broma !!!, ¿ehhhh?.
Pero esa es en esencia la diferencia sustancial con códigos anteriores: calculo previamente la longitud de la cadena contenedora del número en la base en cuestión y luego la relleno al revés. Además de otras sutiles diferencias:
#include <stdio.h>
#define DIGITOS "0123456789ABCDEF"/*"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"*/
int main(){
int i,n_digitos,numero,base,cociente,num;
char cadena[11];
for (numero=1;numero<=256;numero++){
printf("\n%3d",numero);
for(base=2;base<=14/*37*/;base+=6/*base++*/){
if (base==14)
base=16;
cociente=num=numero;
for (n_digitos=0;num;n_digitos++,num/=base);
for (i=n_digitos-1;cociente;i--,cociente/=base)
cadena[i]=DIGITOS[cociente % base];
cadena[n_digitos]='\0';
printf(" en BASE (%d)=%-9s ",base,cadena);
}
}
return 0;
}
Y creo que se ve que el código "estaba" para otra cosa. Concreta mente para obtener un número decimal en las bases de 2 a 36, cosa que se consigue activando lo que está desactivado, pero ese ya sería otro problema.
Y aquí la salida para los veinte últimos:
Citar
236 en BASE (2)=11101100 en BASE (8)=354 en BASE (16)=EC
237 en BASE (2)=11101101 en BASE (8)=355 en BASE (16)=ED
238 en BASE (2)=11101110 en BASE (8)=356 en BASE (16)=EE
239 en BASE (2)=11101111 en BASE (8)=357 en BASE (16)=EF
240 en BASE (2)=11110000 en BASE (8)=360 en BASE (16)=F0
241 en BASE (2)=11110001 en BASE (8)=361 en BASE (16)=F1
242 en BASE (2)=11110010 en BASE (8)=362 en BASE (16)=F2
243 en BASE (2)=11110011 en BASE (8)=363 en BASE (16)=F3
244 en BASE (2)=11110100 en BASE (8)=364 en BASE (16)=F4
245 en BASE (2)=11110101 en BASE (8)=365 en BASE (16)=F5
246 en BASE (2)=11110110 en BASE (8)=366 en BASE (16)=F6
247 en BASE (2)=11110111 en BASE (8)=367 en BASE (16)=F7
248 en BASE (2)=11111000 en BASE (8)=370 en BASE (16)=F8
249 en BASE (2)=11111001 en BASE (8)=371 en BASE (16)=F9
250 en BASE (2)=11111010 en BASE (8)=372 en BASE (16)=FA
251 en BASE (2)=11111011 en BASE (8)=373 en BASE (16)=FB
252 en BASE (2)=11111100 en BASE (8)=374 en BASE (16)=FC
253 en BASE (2)=11111101 en BASE (8)=375 en BASE (16)=FD
254 en BASE (2)=11111110 en BASE (8)=376 en BASE (16)=FE
255 en BASE (2)=11111111 en BASE (8)=377 en BASE (16)=FF
256 en BASE (2)=100000000 en BASE (8)=400 en BASE (16)=100
Y un fuerte saludo para
yoel_alejandro del que hace semanas que no sabíamos nada. Se te ha echado de menos campeón.
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)