elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error programa que cambia un número de base 10 a cualquier base
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error programa que cambia un número de base 10 a cualquier base  (Leído 5,810 veces)
ERIK546

Desconectado Desconectado

Mensajes: 44



Ver Perfil WWW
Error programa que cambia un número de base 10 a cualquier base
« en: 12 Mayo 2012, 00:14 am »

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:

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);


/*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;
}
}
}
}



« Última modificación: 14 Mayo 2012, 19:34 pm por ERIK546 » En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #1 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
Código
  1. for(i=cuanto-1;1>=0;i--);
el ; esta mal y pusiste 1>=0
Despues en la funcion conv_ent
Código
  1. 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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. void conv_ent(int *p,int num, int base);
  5. void conv_frac(int *p,double num,int base,int pre);
  6. int main(){
  7.    double x,pfrac,pentera,cuantos;
  8.    int parte_ent,*digitos[2],cuanto=0,precision,base,i;
  9.  
  10.  
  11.    printf("Introduzca un numero real\n");
  12.    scanf("%lf",&x);
  13.    pfrac=modf(x,&pentera);
  14.  
  15.    printf("Introduzca la base a la que quiere convertir el numero\n");
  16.    scanf("%d",&base);
  17.  
  18.    printf("Diga cuantos digitos se calcularan para la parte fraccionaria\n");
  19.    scanf("%d",&precision);
  20.  
  21.    cuantos=ceil(log(pentera)/log(base));
  22.    cuanto=(int)cuantos;
  23.    parte_ent=(int)pentera;
  24.    digitos[0]=(int*)malloc(sizeof(int)*cuanto);
  25.  
  26.    conv_ent(digitos[0],parte_ent,base);
  27.  
  28.    digitos[1]=(int*)malloc(sizeof(int)*precision);
  29.    conv_frac(digitos[1],pfrac,base,precision);
  30.  
  31.  
  32.    printf("La representacion en base %d del numero %lf es: ",base,x);
  33.    for(i=cuanto-1;i>=0;i--)
  34.        printf("%d",digitos[0][i]);
  35.     printf("."); /* este printf debe ir fuera del for anterior */
  36.  
  37.    for(i=0;i<precision;i++)
  38.        printf("%i",digitos[1][i]);
  39.                             printf("\n\n");
  40.  
  41.   system("pause");
  42.   return 0;
  43. }
  44. void conv_ent(int p[],int num,int base){
  45.    int i;
  46.    for(i=0;num>0;i++){
  47.        p[i]=num%base;
  48.        num/=base;
  49.    }
  50. }
  51. void conv_frac(int *p,double num,int base,int pre){
  52.     int i,k;
  53.     double h=0.0;
  54.     double pent,pfrac;
  55.     /*for(i=1;i<=pre;i++){
  56.                          for(k=0;k<base;k++){
  57.                                              if(num>h+(k/pow(base),i)))&& num<=(h(k+1)/pow(base,i)){
  58.                                                                         p[i-1]=k;
  59.                                                                         h+=(k/pow(base,i));
  60.                                                                         break;
  61.                                                                         }
  62.                                                                         }
  63.                                                         }*/
  64.   for(i=0;i<pre;i++) {
  65.     num=num*base; /* multiplico x la base */
  66.     num=modf(num,&pent); /* despues d ser multiplicado obtengo la parte entera y fraccionaria */
  67.     p[i]=(int)pent; /* guardo en el arreglo la parte entera */
  68.     if(num==0.0)
  69.       break; /* si llega aca es xq la parte fraccionaria se hizo cero por lo tanto hay q salir del bucle */
  70.   }
  71. }
Acordate q solo lo hic pensando en pasarlo a binario, fijate si sirve para cualquier base

Saludos


« Última modificación: 12 Mayo 2012, 03:16 am por durasno » En línea

Ahorrate una pregunta, lee el man
ERIK546

Desconectado Desconectado

Mensajes: 44



Ver Perfil WWW
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #2 en: 14 Mayo 2012, 19:41 pm »

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
Código
  1. for(i=cuanto-1;1>=0;i--);
el ; esta mal y pusiste 1>=0
Despues en la funcion conv_ent
Código
  1. 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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. void conv_ent(int *p,int num, int base);
  5. void conv_frac(int *p,double num,int base,int pre);
  6. int main(){
  7.    double x,pfrac,pentera,cuantos;
  8.    int parte_ent,*digitos[2],cuanto=0,precision,base,i;
  9.  
  10.  
  11.    printf("Introduzca un numero real\n");
  12.    scanf("%lf",&x);
  13.    pfrac=modf(x,&pentera);
  14.  
  15.    printf("Introduzca la base a la que quiere convertir el numero\n");
  16.    scanf("%d",&base);
  17.  
  18.    printf("Diga cuantos digitos se calcularan para la parte fraccionaria\n");
  19.    scanf("%d",&precision);
  20.  
  21.    cuantos=ceil(log(pentera)/log(base));
  22.    cuanto=(int)cuantos;
  23.    parte_ent=(int)pentera;
  24.    digitos[0]=(int*)malloc(sizeof(int)*cuanto);
  25.  
  26.    conv_ent(digitos[0],parte_ent,base);
  27.  
  28.    digitos[1]=(int*)malloc(sizeof(int)*precision);
  29.    conv_frac(digitos[1],pfrac,base,precision);
  30.  
  31.  
  32.    printf("La representacion en base %d del numero %lf es: ",base,x);
  33.    for(i=cuanto-1;i>=0;i--)
  34.        printf("%d",digitos[0][i]);
  35.     printf("."); /* este printf debe ir fuera del for anterior */
  36.  
  37.    for(i=0;i<precision;i++)
  38.        printf("%i",digitos[1][i]);
  39.                             printf("\n\n");
  40.  
  41.   system("pause");
  42.   return 0;
  43. }
  44. void conv_ent(int p[],int num,int base){
  45.    int i;
  46.    for(i=0;num>0;i++){
  47.        p[i]=num%base;
  48.        num/=base;
  49.    }
  50. }
  51. void conv_frac(int *p,double num,int base,int pre){
  52.     int i,k;
  53.     double h=0.0;
  54.     double pent,pfrac;
  55.     /*for(i=1;i<=pre;i++){
  56.                          for(k=0;k<base;k++){
  57.                                              if(num>h+(k/pow(base),i)))&& num<=(h(k+1)/pow(base,i)){
  58.                                                                         p[i-1]=k;
  59.                                                                         h+=(k/pow(base,i));
  60.                                                                         break;
  61.                                                                         }
  62.                                                                         }
  63.                                                         }*/
  64.   for(i=0;i<pre;i++) {
  65.     num=num*base; /* multiplico x la base */
  66.     num=modf(num,&pent); /* despues d ser multiplicado obtengo la parte entera y fraccionaria */
  67.     p[i]=(int)pent; /* guardo en el arreglo la parte entera */
  68.     if(num==0.0)
  69.       break; /* si llega aca es xq la parte fraccionaria se hizo cero por lo tanto hay q salir del bucle */
  70.   }
  71. }
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.
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #3 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
En línea

Ahorrate una pregunta, lee el man
ERIK546

Desconectado Desconectado

Mensajes: 44



Ver Perfil WWW
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #4 en: 15 Mayo 2012, 19:11 pm »

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?
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #5 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
En línea

Ahorrate una pregunta, lee el man
ERIK546

Desconectado Desconectado

Mensajes: 44



Ver Perfil WWW
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #6 en: 15 Mayo 2012, 21:42 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:

Código:
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.
En línea

ERIK546

Desconectado Desconectado

Mensajes: 44



Ver Perfil WWW
Re: Error programa que cambia un número de base 10 a cualquier base
« Respuesta #7 en: 16 Mayo 2012, 03:59 am »

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:

Código:
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:
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;
}
}
}
}
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error en la Base de Datos « 1 2 »
Sugerencias y dudas sobre el Foro
panchox 11 5,423 Último mensaje 23 Octubre 2005, 18:45 pm
por BenRu
Base de datos en cualquier aplicacion?
.NET (C#, VB.NET, ASP)
Sauruxum 4 3,163 Último mensaje 26 Enero 2011, 21:58 pm
por [D4N93R]
Programa en C que cambie de base 10 a cualquier base y viceversa
Programación C/C++
ERIK546 6 37,294 Último mensaje 2 Mayo 2012, 04:16 am
por durasno
ERROR en programa para factorizar desde un numero
Programación C/C++
Puntoinfinito 7 7,986 Último mensaje 18 Octubre 2012, 23:37 pm
por $Edu$
programa que cambie de base binaria a base decimal en C
Programación C/C++
estudiante_1 1 2,704 Último mensaje 23 Noviembre 2015, 02:37 am
por Deivbid
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines