SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: ermiguel1979 en Lunes 14 de Diciembre de 2009, 15:42

Título: Cambio de base
Publicado por: ermiguel1979 en Lunes 14 de Diciembre de 2009, 15:42
Hola a todos, tengo que hacer un programita que dice lo siguiente:
Realizar un porgrama para convertir números enteros decimales (en base 10) a sus respectivas representaciones octales (en base 8), por medio de sucesivas divisiones.

Y... no tengo ni idea de como hacerlo. Os agradezco toda la ayuda que me podais dar...

Un saluo!!!
Título: Re: Cambio de base
Publicado por: diego.martinez en Lunes 14 de Diciembre de 2009, 18:07
tal y como te habran  enseñado en clase, la conversion de base se hace simplemente dividiendo el numero en base diez entre el valor de base.
Despues, coges todos los restos de las distintas divisiones y los colocas en orden inverso (osea, desde el ultimo al primero) y ese es el valor en la nueva base.
Título: Re: Cambio de base
Publicado por: ermiguel1979 en Martes 15 de Diciembre de 2009, 09:56
Buenos días. Lo de dividir lo tengo claro, pero como lo hago para almacenar los restos y luego mastrarlos al revés???, será con un vector u algo así...

Los vectores no se como se usan.... le voy a preguntar al profe, pero si pudieses aclararme algo...

Muchas gracias. Un saludo.
Título: Re: Cambio de base
Publicado por: diego.martinez en Martes 15 de Diciembre de 2009, 16:20
para ver el resultado de una division puedes usar

para ver el  valor floor(dividendo / divisor)
para ver el resto dividento%divisor

a medida que extraigas los restos ve metiendolos por la derecha o bien en un array o bien multiplicando por el valor de representación.
Título: Re: Cambio de base
Publicado por: ermiguel1979 en Miércoles 16 de Diciembre de 2009, 15:16
Buenas tardes Diego, te mando lo que tengo hecho. Debería funcionar, jejejjeje; pero me dá un problema al leer en el vector tras la primera iteración del bucle
while. He incluido algnos PRINTF para ver lo que va haciendo...
Porfa, echale un vistazo que yo no veo el error...

/*EJERCICIO 6; PRACTICA 4*/

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

/*Algoritmo -> CAMBIO DE BASE DECIMAL-OCTAL*/
int main (void){
   //DECLARACION DE VARIABLES
   /*entradas*/
   int numero;         //el numero a cambiar de base (dado en base 10)
   /*Intermedias*/
   int i, j;         //contadores de bucles
   int cociente;      //cociente de las sucesivas divisiones del numero/8
   int resto;         //'resto' de numero/8;va al array;sera el numero,base 8
   /*Salidas*/
   int octal [10];         /*Array (vector) de tipo entero
   para guardar el numero en base octal (base 8)*/
   /*Leer Variables*/
   printf("Escribir numero en base 10:  ");
   scanf("%i", &numero);
   
   //OPERACIONES
   i=2;         //se prepara 'i' con ese valor para que el bucle while_
               //guarde los valore de 'resto' en los espacios del vector
   
   cociente=numero/8;      //la primera division se hace fuera del bucle
   resto=numero%8;
   octal[1]=resto;
   printf("%i, %i, %i, %in", i, cociente, resto, octal[1]);
   while (cociente>=8){
      resto=cociente%8;
      cociente=cociente/8;
      octal=resto;
      i++;            //'i' aumenta +1 cada iteración recorriendo 'octal'
   }
   printf("%i, %i, %i, %in", i, cociente, resto, octal);
   i=i+1;
   octal=cociente;      //para guardar el ultimo valor de 'cociente'
   
   //RESULTADOS
   printf("%i, en base octal es: ", numero);
   for(j=i; j<=1; j--){      //recorre el vector de atras hacia delante
      printf("%i",octal[j]);
   }   
}


Oye, muchas gracias por tu tiempo y felices fiestas!
Título: Re: Cambio de base
Publicado por: locazopro en Jueves 17 de Diciembre de 2009, 07:04
ten en cuenta que cuando declaras un array por ejemplo:

Código: C
  1.  
  2. int octal[10];
  3.  
  4.  

ese array tiene capacidad para 10 enteros pero cuando quieres referirte a ellos no partes del 1 partes del 0, o sea cuando por ejemplo te quieres referir al primero de ellos lo haces:

Código: C
  1.  
  2. octal[0];
  3.  
  4.  

entonces, el último sería

Código: C
  1.  
  2. octal[9];
  3.  
  4.  

tienes 10 elementos pero cuando te refieres a ellos el máximo es octal[9], ya que se cuenta desde el 0 al 9. Digo todo esto, porque veo que comienzas definiendo desde octal[1] y no desde el cero.

Saludos!
Título: Re: Cambio de base
Publicado por: ermiguel1979 en Jueves 17 de Diciembre de 2009, 09:38
Buenos días Locazoporro. Pues tienes razón, no había caido en eso. vaya bulto de tio... Voy a corregirlo ahora mismo.

Muchas gracias por tu tiempo y un saludo!!
Título: Re: Cambio de base
Publicado por: ermiguel1979 en Jueves 17 de Diciembre de 2009, 09:53
Tampoco me funciona. He hecho los cambios que dijiste pero sigue sin funcionar. Te vuelvo a mandar el programa...

/*EJERCICIO 6(BIS); PRACTICA 4*/

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

/*Algoritmo -> CAMBIO DE BASE DECIMAL-OCTAL*/
int main (void){
   //DECLARACION DE VARIABLES
   /*entradas*/
   int numero;          //el numero a cambiar de base (dado en base 10)
   /*Intermedias*/
   int i, j;            //contadores de bucles
   int cociente;          //cociente de las sucesivas divisiones de numero/8
   int resto;          //'resto' de numero/8;va al array;sera el numero,base 8
   /*Salidas*/
   int octal [10];       /*Array (vector) de tipo entero
para guardar el numero en base octal (base 8)*/
   /*Leer Variables*/
   printf("Escribir numero en base 10: ");
   scanf("%i", &numero);

   //OPERACIONES
   i=1;             //se prepara 'i' con ese valor para que el bucle while_
               //guarde los valore de 'resto' en los espacios del vector

   cociente=numero/8;          //la primera division se hace fuera del bucle
   resto=numero%8;
   octal[0]=resto;
   while (cociente>=8){
      resto=cociente%8;
      cociente=cociente/8;
      octal=resto;
      i++;             //'i' aumenta +1 cada iteración recorriendo 'octal'
   }
   i=i+1;
   octal=cociente;             //para guardar el ultimo valor de 'cociente'

   //RESULTADOS
   printf("%i, en base octal es: ", numero);
   for(j=i; j<=0; j--){          //recorre el vector de atras hacia delante
      printf("%i",octal[j]);
   }
}



Por si le ves algo que pueda dar conflicto. Gracias!
Título: Re: Cambio de base
Publicado por: locazopro en Viernes 18 de Diciembre de 2009, 00:17
mmm, bueno, creo que tienes algunos errores. Fíjate bien en el último bucle:

Código: C
  1.  
  2. for(j=i; j<=0; j--){ /*recorre el vector de atras hacia delante*/
  3.    printf("%i",octal[j]);
  4. }
  5.  
  6.  

tu condición es que j sea menor o igual a cero, lo que nunca pasará ya que i es siempre mayor que cero.

Otra cosa, viendo el como haces la transformación, el último incremento que le haces a i no es necesario, mira, prueba este código, debería funcionar (solo cambié de tu código lo que he comentado aquí):

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. /*Algoritmo -> CAMBIO DE BASE DECIMAL-OCTAL*/
  6. int main (void)
  7. {
  8. /*DECLARACION DE VARIABLES*/
  9.     /*entradas*/
  10.     int numero; /*//el numero a cambiar de base (dado en base 10)*/
  11.     /*Intermedias*/
  12.     int i, j; /*contadores de bucles*/
  13.     int cociente; /*cociente de las sucesivas divisiones de numero/8*/
  14.     int resto; /*'resto' de numero/8;va al array;sera el numero,base 8*/
  15.     /*Salidas*/
  16.     int octal [10]; /*Array (vector) de tipo entero
  17. para guardar el numero en base octal (base 8)*/
  18.     /*Leer Variables*/
  19.     printf("Escribir numero en base 10: ");
  20.     scanf("%d", &numero);
  21.  
  22. /*//OPERACIONES*/
  23.     i=1; /*//se prepara 'i' con ese valor para que el bucle while_
  24. //guarde los valore de 'resto' en los espacios del vector*/
  25.  
  26.     cociente=numero/8; /*//la primera division se hace fuera del bucle*/
  27.     resto=numero%8;
  28.     octal[0]=resto;
  29.     while (cociente>=8) {
  30.         resto=cociente%8;
  31.         cociente=cociente/8;
  32.         octal[i]=resto;
  33.         i++; /*//'i' aumenta +1 cada iteración recorriendo 'octal'*/
  34.     }
  35.     /*i=i+1;*/
  36.     octal[i]=cociente; /*//para guardar el ultimo valor de 'cociente'*/
  37.  
  38. /*//RESULTADOS*/
  39.     printf("%d, en base octal es: ", numero);
  40.     for (j=i; j>=0; j--) { /*//recorre el vector de atras hacia delante*/
  41.         printf("%d",octal[j]);
  42.     }
  43.  
  44. return -1;
  45. }
  46.  
  47.  

y dime que tal, para ver si es lo que buscas.

Saludos!
Título: Re: Cambio de base
Publicado por: ermiguel1979 en Viernes 18 de Diciembre de 2009, 18:26
Esta perfecto, justo eso es lo que me faltaba. Ala, listo para el siguiente ejercicio.

Gracias!