• Jueves 28 de Marzo de 2024, 21:18

Autor Tema:  Cambio de base  (Leído 3397 veces)

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Cambio de base
« en: Lunes 14 de Diciembre de 2009, 15:42 »
0
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!!!

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Cambio de base
« Respuesta #1 en: Lunes 14 de Diciembre de 2009, 18:07 »
0
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.

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Cambio de base
« Respuesta #2 en: Martes 15 de Diciembre de 2009, 09:56 »
0
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.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Cambio de base
« Respuesta #3 en: Martes 15 de Diciembre de 2009, 16:20 »
0
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.

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Cambio de base
« Respuesta #4 en: Miércoles 16 de Diciembre de 2009, 15:16 »
0
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!

locazopro

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Cambio de base
« Respuesta #5 en: Jueves 17 de Diciembre de 2009, 07:04 »
0
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!

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Cambio de base
« Respuesta #6 en: Jueves 17 de Diciembre de 2009, 09:38 »
0
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!!

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Cambio de base
« Respuesta #7 en: Jueves 17 de Diciembre de 2009, 09:53 »
0
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!

locazopro

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Cambio de base
« Respuesta #8 en: Viernes 18 de Diciembre de 2009, 00:17 »
0
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!

ermiguel1979

  • Miembro activo
  • **
  • Mensajes: 45
    • Ver Perfil
Re: Cambio de base
« Respuesta #9 en: Viernes 18 de Diciembre de 2009, 18:26 »
0
Esta perfecto, justo eso es lo que me faltaba. Ala, listo para el siguiente ejercicio.

Gracias!