Error programa que cambia un número de base 10 a cualquier base

Iniciado por ERIK546, 12 Mayo 2012, 00:14 AM

0 Miembros y 3 Visitantes están viendo este tema.

ERIK546

Hola, solicito su ayuda para poder identificar el problema de este programa en C que cambia un numero de base 10 a cualquier base tanto parte entera como parte fraccionaria. Lo hace mediante dos funciones una que se encarga de la conversión de la parte entera y otra que se encarga de la conversión de la parte fraccionaria. Sin embargo en la función que convierte la parte fraccionaria es en la que se encuentra el problema y no he podido resolverlo agradecería grandemente su ayuda.

Les dejo el programa para que le den un vistazo:


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

/*Variables globales*/
int ndatos,base,precision;


/*Funciones de conversión*/
void conv_ent(int *p,int num,int base);
void conv_frac(int *p,double num,int base,int pre);


/*Funciones de lectura y escritura*/
int datload(FILE *file,double *t);
int datwrite(FILE *file,int **t,int Cuanto);

int main(){

/*Dos apuntadores tipo FILE para los archivos a leer y a escribir*/
FILE *file_in,*file_out;

/*Variable para nombrar al archivo de salida*/
char archivo1[50];

/*Variables para calculos*/
double *x,pfrac,pentera,cuantos;

/*Variables de conversion a enteros y triple apuntador para almacenar los digitos de todos
los números a convertir */
int parte_ent,***digitos,cuanto,i;

printf("¿Cuantos numeros quiere leer\?\n");
scanf("%d",&ndatos);

/*Se dimensiona el apuntador para almacenar los numeros que se quieren leer*/
x=(double*) malloc(ndatos*sizeof(double));

/*Lectura de datos*/
datload(file_in,x);

/*Se dimensiona las ndatos estructuras que se van a necesitar*/
digitos=(int***) malloc(ndatos*sizeof(int**));

printf("Introduzca la base a la que quiere convertir los numeros\n");
scanf("%i",&base);

printf("Diga cuantos digitos se calcularan para la parte fraccionaria\n");
scanf("%i",&precision);

printf("Introduzca el nombre del archivo donde se escribiran los datos\n");
scanf("%s",archivo1);


file_out = fopen (archivo1,"w");
/*Si el archivo se pudo crear se procede a hacer los cálculos*/
        if(file_out){
fprintf(file_out,"La representacion en base %i de los numeros es:\n",base);


/*Definición de Funciones*/

int datload(FILE *file,double *t);{
     char archivo[50];
     int i;
     printf("Introduzca el nombre del archivo desde donde se leeran los datos\n");
     scanf("%s",archivo);
     file = fopen(archivo,"r");
     
     if(file){
              for (i=0;i<ndatos;i++)
                  fscanf(file,"%lf\n",t+i);
              printf("El archivo ha sido cargado\n");
             }               
     else{
            printf("\nEL archivo no existe\n");
            system("pause");
            return 0;
         }
     
     
     fclose(file);
     return 0;
     
}

int datwrite(FILE *file,int **t,int Cuanto){
     
int j,k;

      for(j=Cuanto-1;j>0;j--)
fprintf(file,"%i",t[0][j]);
fprintf(file,".");
for(k=0;k<precision;k++)
fprintf(file,"%i",t[1][k]);
fprintf(file,"\n");
     
return 0;
     
}


void conv_ent(int *p,int num,int base){
int i;
for(i=0;num>0;i++){
p[i]=num%base;
num/=base;
}
}

void conv_frac(int *p,double num,int base,int pre){
int i,k;
double h=0.0;
for(i=1;i<=pre;i++){
for(k=0;k<base;k++){
if(num>(h+(k/pow(base,i))) && num<=(h+((k+1)/pow(base,i)))){
p[i-1]=k;
h+=(k/pow(base,i));
break;
}
}
}
}


durasno

#1
Hola! primero q nada antes d subir un programa revisa mejor el codigo, mas q nada para evitar los errores de sintaxis q tenes(ya q me trajo varios problemas :S) . En
for(i=cuanto-1;1>=0;i--);
el ; esta mal y pusiste 1>=0
Despues en la funcion conv_ent
for(i=0;num>0;i++);
tambien tenes mal puesto el ;

Ahora el programa... no sabia q se podia pasar cualquier numero fraccionario a cualquier base, solo me acordaba q se podia en binario. En fin, no mire el codigo q hiciste para la funcion conv_frac() ( parecia dificil de analizar :P ), asi q decidi hacer la mia basado en este video
http://www.youtube.com/watch?v=x9x3kMf_4Ho

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void conv_ent(int *p,int num, int base);
void conv_frac(int *p,double num,int base,int pre);
int main(){
   double x,pfrac,pentera,cuantos;
   int parte_ent,*digitos[2],cuanto=0,precision,base,i;
   
   
   printf("Introduzca un numero real\n");
   scanf("%lf",&x);
   pfrac=modf(x,&pentera);

   printf("Introduzca la base a la que quiere convertir el numero\n");
   scanf("%d",&base);

   printf("Diga cuantos digitos se calcularan para la parte fraccionaria\n");
   scanf("%d",&precision);

   cuantos=ceil(log(pentera)/log(base));
   cuanto=(int)cuantos;
   parte_ent=(int)pentera;
   digitos[0]=(int*)malloc(sizeof(int)*cuanto);

   conv_ent(digitos[0],parte_ent,base);

   digitos[1]=(int*)malloc(sizeof(int)*precision);
   conv_frac(digitos[1],pfrac,base,precision);


   printf("La representacion en base %d del numero %lf es: ",base,x);
   for(i=cuanto-1;i>=0;i--)
       printf("%d",digitos[0][i]);
    printf("."); /* este printf debe ir fuera del for anterior */
   
   for(i=0;i<precision;i++)
       printf("%i",digitos[1][i]);
                            printf("\n\n");
                           
  system("pause");
  return 0;
}
void conv_ent(int p[],int num,int base){
   int i;
   for(i=0;num>0;i++){
       p[i]=num%base;
       num/=base;
   }
}
void conv_frac(int *p,double num,int base,int pre){
    int i,k;
    double h=0.0;
    double pent,pfrac;
    /*for(i=1;i<=pre;i++){
                        for(k=0;k<base;k++){
                                            if(num>h+(k/pow(base),i)))&& num<=(h(k+1)/pow(base,i)){
                                                                       p[i-1]=k;
                                                                       h+=(k/pow(base,i));
                                                                       break;
                                                                       }
                                                                       }
                                                       }*/
  for(i=0;i<pre;i++) {
    num=num*base; /* multiplico x la base */
    num=modf(num,&pent); /* despues d ser multiplicado obtengo la parte entera y fraccionaria */
    p[i]=(int)pent; /* guardo en el arreglo la parte entera */
    if(num==0.0)
      break; /* si llega aca es xq la parte fraccionaria se hizo cero por lo tanto hay q salir del bucle */
  }
}

Acordate q solo lo hic pensando en pasarlo a binario, fijate si sirve para cualquier base

Saludos
Ahorrate una pregunta, lee el man

ERIK546

Cita de: durasno en 12 Mayo 2012, 03:13 AM
Hola! primero q nada antes d subir un programa revisa mejor el codigo, mas q nada para evitar los errores de sintaxis q tenes(ya q me trajo varios problemas :S) . En
for(i=cuanto-1;1>=0;i--);
el ; esta mal y pusiste 1>=0
Despues en la funcion conv_ent
for(i=0;num>0;i++);
tambien tenes mal puesto el ;

Ahora el programa... no sabia q se podia pasar cualquier numero fraccionario a cualquier base, solo me acordaba q se podia en binario. En fin, no mire el codigo q hiciste para la funcion conv_frac() ( parecia dificil de analizar :P ), asi q decidi hacer la mia basado en este video
http://www.youtube.com/watch?v=x9x3kMf_4Ho

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void conv_ent(int *p,int num, int base);
void conv_frac(int *p,double num,int base,int pre);
int main(){
   double x,pfrac,pentera,cuantos;
   int parte_ent,*digitos[2],cuanto=0,precision,base,i;
   
   
   printf("Introduzca un numero real\n");
   scanf("%lf",&x);
   pfrac=modf(x,&pentera);

   printf("Introduzca la base a la que quiere convertir el numero\n");
   scanf("%d",&base);

   printf("Diga cuantos digitos se calcularan para la parte fraccionaria\n");
   scanf("%d",&precision);

   cuantos=ceil(log(pentera)/log(base));
   cuanto=(int)cuantos;
   parte_ent=(int)pentera;
   digitos[0]=(int*)malloc(sizeof(int)*cuanto);

   conv_ent(digitos[0],parte_ent,base);

   digitos[1]=(int*)malloc(sizeof(int)*precision);
   conv_frac(digitos[1],pfrac,base,precision);


   printf("La representacion en base %d del numero %lf es: ",base,x);
   for(i=cuanto-1;i>=0;i--)
       printf("%d",digitos[0][i]);
    printf("."); /* este printf debe ir fuera del for anterior */
   
   for(i=0;i<precision;i++)
       printf("%i",digitos[1][i]);
                            printf("\n\n");
                           
  system("pause");
  return 0;
}
void conv_ent(int p[],int num,int base){
   int i;
   for(i=0;num>0;i++){
       p[i]=num%base;
       num/=base;
   }
}
void conv_frac(int *p,double num,int base,int pre){
    int i,k;
    double h=0.0;
    double pent,pfrac;
    /*for(i=1;i<=pre;i++){
                        for(k=0;k<base;k++){
                                            if(num>h+(k/pow(base),i)))&& num<=(h(k+1)/pow(base,i)){
                                                                       p[i-1]=k;
                                                                       h+=(k/pow(base,i));
                                                                       break;
                                                                       }
                                                                       }
                                                       }*/
  for(i=0;i<pre;i++) {
    num=num*base; /* multiplico x la base */
    num=modf(num,&pent); /* despues d ser multiplicado obtengo la parte entera y fraccionaria */
    p[i]=(int)pent; /* guardo en el arreglo la parte entera */
    if(num==0.0)
      break; /* si llega aca es xq la parte fraccionaria se hizo cero por lo tanto hay q salir del bucle */
  }
}

Acordate q solo lo hic pensando en pasarlo a binario, fijate si sirve para cualquier base

Saludos
Perdón por cambiar el código antes descrito pero es que al parecer el problema con la función que había mencionado ha sido resuelto, pero este nuevo código como podrás comprobarlo es diferente ya que lo que pretende este código es con las mismas funciones del código anterior que al parecer han sido arregladas ahora la conversión toma los números de un archivo de texto y al leerlos les aplica dichas funciones y escribe los nuevos números en un nuevo archivo de texto, también me es difícil comprender el código del todo, pero como podrás ver tengo funciones para la lectura y escritura del archivo así como las 2 funciones para convertir un número en base 10 a cualquier base (2 funciones porque una es para la parte entera y otra para la parte fraccionaria) agradezco mucho tu ayuda que me has aportado pero en serio necesito que este programa funcione y desconozco si son errores de sintaxis o si se trata de un error de la estructura del código. Muchas gracias de antemano.

durasno

Hola! no entendi muy bien q es lo q queres, pero te falta parte de codigo del main

Saludos
Ahorrate una pregunta, lee el man

ERIK546

Cita de: durasno en 15 Mayo 2012, 05:20 AM
Hola! no entendi muy bien q es lo q queres, pero te falta parte de codigo del main

Saludos
¿Qué tipo de código faltaría en el main para que el programa funcionara?

durasno

Despues de llamar a datload() y recuperar los numeros, deberias procesar esos numeros, es decir llamar a conv_ent() y conv_frac() como hacias antes. Ademas te falta llamar a datwrite() para guardar los numeros

Saludos
Ahorrate una pregunta, lee el man

ERIK546

Cita de: durasno en 15 Mayo 2012, 19:32 PM
Despues de llamar a datload() y recuperar los numeros, deberias procesar esos numeros, es decir llamar a conv_ent() y conv_frac() como hacias antes. Ademas te falta llamar a datwrite() para guardar los numeros

Saludos
Hola gracias por responder el código para hacer la conversión de cada uno de los números después de haberlos recuperado me imagino con datload() lo tengo con un ciclo for.
Lo dejo para que le des un vistazo:


for (i=0; i< ndatos; i++){
    digitos [i]=(int ***) malloc (2* sizeof (int*));
    pfrac=modf ([i], &pentera);
    cuantos= ceil (log (pentera)/log (base));
    cuanto= (int) cuantos;
    parte_ent= (int)pentera;
    digitos [i][0]= (int *) malloc (cuanto* sizeof (int));
    conv_ent (digitos [i][0], parte_ent, base);
    digitos [i][1]=(int*) malloc(precisión* sizeof (int));
    conv_frac (digitos [i][1], pfrac, base, precisión);}

Sin embargo la parte que mencionas en llamar datwrite() y poder escribir estos nuevos números desconozco como se podría realizar. Te agradecería si me pudieras decir como, gracias por todo durasno.

ERIK546

Cita de: ERIK546 en 15 Mayo 2012, 21:42 PM
Hola gracias por responder el código para hacer la conversión de cada uno de los números después de haberlos recuperado me imagino con datload() lo tengo con un ciclo for.
Lo dejo para que le des un vistazo:


for (i=0; i< ndatos; i++){
    digitos [i]=(int ***) malloc (2* sizeof (int*));
    pfrac=modf ([i], &pentera);
    cuantos= ceil (log (pentera)/log (base));
    cuanto= (int) cuantos;
    parte_ent= (int)pentera;
    digitos [i][0]= (int *) malloc (cuanto* sizeof (int));
    conv_ent (digitos [i][0], parte_ent, base);
    digitos [i][1]=(int*) malloc(precisión* sizeof (int));
    conv_frac (digitos [i][1], pfrac, base, precisión);}

Sin embargo la parte que mencionas en llamar datwrite() y poder escribir estos nuevos números desconozco como se podría realizar. Te agradecería si me pudieras decir como, gracias por todo durasno.
Quedaría algo así, al ponerlo en el programa de hecho he llamado a la función datwrite. Sin embargo me marca error, les dejo el código:

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

/*Variables globales*/
int ndatos,base,precision;


/*Funciones de conversión*/
void conv_ent(int *p,int num,int base);
void conv_frac(int *p,double num,int base,int pre);


/*Funciones de lectura y escritura*/
int datload(FILE *file,double *t);
int datwrite(FILE *file,int **t,int Cuanto)

int main(){

/*Dos apuntadores tipo FILE para los archivos a leer y a escribir*/
FILE *file_in,*file_out;

/*Variable para nombrar al archivo de salida*/
char archivo1[50];

/*Variables para calculos*/
double *x,pfrac,pentera,cuantos;

/*Variables de conversion a enteros y triple apuntador para almacenar los digitos de todos
los números a convertir */
int parte_ent,***digitos,cuanto,i;

printf("¿Cuantos numeros quiere leer\?\n");
scanf("%d",&ndatos);

/*Se dimensiona el apuntador para almacenar los numeros que se quieren leer*/
x=(double*) malloc(ndatos*sizeof(double));

/*Lectura de datos*/
datload(file_in,x);

/*Se dimensiona las ndatos estructuras que se van a necesitar*/
digitos=(int***) malloc(ndatos*sizeof(int**));

printf("Introduzca la base a la que quiere convertir los numeros\n");
scanf("%i",&base);

printf("Diga cuantos digitos se calcularan para la parte fraccionaria\n");
scanf("%i",&precision);

printf("Introduzca el nombre del archivo donde se escribiran los datos\n");
scanf("%s",archivo1);


file_out = fopen (archivo1,"w");
/*Si el archivo se pudo crear se procede a hacer los cálculos*/
        if(file_out){
fprintf(file_out,"La representacion en base %i de los numeros es:\n",base);

for (i=0; i< ndatos; i++){
    digitos [i]=(int ***) malloc (2* sizeof (int*));
    pfrac=modf ([i], &pentera);
    cuantos= ceil (log (pentera)/log (base));
    cuanto= (int) cuantos;
    parte_ent= (int)pentera;
    digitos [i][0]= (int *) malloc (cuanto* sizeof (int));
    conv_ent (digitos [i][0], parte_ent, base);
    digitos [i][1]=(int*) malloc(precisión* sizeof (int));
    conv_frac (digitos [i][1], pfrac, base, precisión);
    datwrite(file_out,int digitos[i],int cuanto);
}
}
}


/*Definición de Funciones*/

int datload(FILE *file,double *t){
     char archivo[50];
     int i;
     printf("Introduzca el nombre del archivo desde donde se leeran los datos\n");
     scanf("%s",archivo);
     file = fopen(archivo,"r");
     
     if(file){
              for (i=0;i<ndatos;i++)
                  fscanf(file,"%lf\n",t+i);
              printf("El archivo ha sido cargado\n");
             }               
     else{
            printf("\nEL archivo no existe\n");
            system("pause");
            return 0;
         }
     
     
     fclose(file);
     return 0;
     
}

int datwrite(FILE *file,int **t,int Cuanto){
     
int j,k;

      for(j=Cuanto-1;j>0;j--)
fprintf(file,"%i",t[0][j]);
fprintf(file,".");
for(k=0;k<precision;k++)
fprintf(file,"%i",t[1][k]);
fprintf(file,"\n");
     
return 0;
     
}


void conv_ent(int *p,int num,int base){
int i;
for(i=0;num>0;i++){
p[i]=num%base;
num/=base;
}
}

void conv_frac(int *p,double num,int base,int pre){
int i,k;
double h=0.0;
for(i=1;i<=pre;i++){
for(k=0;k<base;k++){
if(num>(h+(k/pow(base,i))) && num<=(h+((k+1)/pow(base,i)))){
p[i-1]=k;
h+=(k/pow(base,i));
break;
}
}
}
}