Cómo pasar un programa de polinomios a archivos en lenguaje C

Iniciado por cosmiquito06, 30 Noviembre 2019, 17:55 PM

0 Miembros y 1 Visitante están viendo este tema.

cosmiquito06

Buenos días, tengo que hacer un programa en lenguaje C que obtenga el área bajo la curva dado por un polinomio de grado n, usando el método de trapecios, ya realicé esta parte con funciones pero me falta pasarlo correctamente a archivos, soy muy nuevo en esto, ya intenté pasar mi programa a archivos pero no me corre bien, al correrlo no me dice que ha creado el archivo de salida y para ver qué anda mal le puse varios printf al main y vi que me lee bien el intervalo a evaluar, el número de particiones y el grado, el problema viene al leer los coeficientes del polinomio del archivo, le puse una función de escritura para ver que leyera bien el polinomio y no me arroja nada a la pantalla, realmente lo he intentado varias veces pero no sé cómo corregir el problema, les agradecería bastante si alguno de ustedes me ayudara. El programa básico lo dejaré abajo:


CÓDIGO BASE:
#include <stdio.h>
#include <stdlib.h>
#define GRADMAX 20

typedef struct _Rx_{
  int g;
  double *c;
}Rx;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */


//Declaración de funciones
Rx leeP();
int escP(Rx p);
Rx suma(Rx a, Rx b);
Rx rest(Rx a, Rx b);
Rx mult(Rx a, Rx b);
Rx multMonomio(Rx a, double c, int e);//
Rx divR(Rx a, Rx b);
int esCero(Rx a);//
double evaluaPoli(Rx a, double x);
double Area(Rx c,int n, double a, double b);

int main(int argc, char *argv[]) {
Rx c, d, q;
double q2, x, a, b;
int n;


  printf("Por leer el polinomio.\n");
  c=leeP();
  printf("El polinomio es:\na = ");
  escP(c);
  printf("\nDigite una variable x con la que se evaluará en polinomio: \n");
  scanf("%lg",&x);
  printf("\nLa evaluación del polinomio es: \n");
  q2=evaluaPoli(c,x);//cambiar el numero
  printf("\n%lg\n",q2);
  printf("\nPor hallar el área bajo la curva del polinomio, introduzca el número de particiones :\n");
  scanf("%d",&n);
  printf("\nDigite los extremos a evaluar [a,b]:\n");
  printf("\n a \n");
  scanf("%lg",&a);
  printf("\n b \n");
  scanf("%lg",&b);
  printf("\n El area bajo la curva del polinomio ingresado es: \n");
  q2=Area(c, n, a, b);
  printf("\n%lg\n",q2);

  printf("\n\nFin del programa\n");

  return 0;
}

//funciones
Rx leeP()
{
  Rx ret;
  int i;

  printf("digite el grado:");
  scanf("%d", &(ret.g));
  //malloc
   if((ret.c=(double*)malloc((ret.g+1)*sizeof(double)))==NULL){
    printf("error al generar espacio.\n");
    ret.g = -1;
    return ret;
  }
  //
  for (i=0; i<=ret.g; i++){
    printf("digite el coeficiente del monomio x^%d:", i);
    scanf("%lf", &(ret.c));
  }
  for (; i<=GRADMAX; i++) ret.c=0.0;

  return ret;
}

//FUNCION PARA EVALUAR POLINOMIO
double evaluaPoli(Rx a, double x){
   int i;
    double c=0.0;
      
for(i=a.g;i>0;i--){

  c=(c+a.c)*x;
}
  c=c+a.c[0];

   return c;
}

//FUNCION QUE DA EL VALOR DEL area (MÉTODO TRAPECIOS)
double Area(Rx c,int n, double a, double b){ //declarar Rx c
   double funcionX, funcionA,funcionB,dx,area,i;

   funcionX=0.0;
   funcionA=evaluaPoli(c,a);
   funcionB=evaluaPoli(c,b);
   dx=(b-a)/n;
   for(i=a+dx;i<b;i=i+dx){//a+dx
      funcionX=funcionX+(evaluaPoli(c,i));//mult por 2
   }
   
   area=(dx/2.0)*(funcionA+2.0*(funcionX)+funcionB);
   return area;
}
//FUNCION PARA ESCRIBIR UN POLINOMIO
int escP(Rx p)
{
  int i;

  /* Estamos considerando que el polinomio cero
   * tiene grado -1 por conveniencia.
   */
  if(p.g<0){
    printf(" 0");
    return 0;
  }

  /* si no fue el polinomio cero, entonces solo
   * escribiremos los coeficientes que no sean cero.
   * Empezamos por el coeficiente principal.
   */
  for(i=p.g; i>1; i--)
    if (p.c!=0.0) printf("%+lg x^%d ", p.c, i);
  /* si el polinomio es constante, entonces su grado
   * es cero y no se debe escribir la informacion del
   * arreglo en su indice 1.
   */
  if (p.g>=1 && p.c[1]!=0.0 ) printf("%+lg x ", p.c[1]);
  /* Como el polinomio no es cero. Si fuera un polinomio
   * constante, necesariamente su coeficiente debe ser
   * distinto de cero. Si su grado es positivo, entonces
   * el coeficiente constante podria ser cero y no lo
   * escribimos.
   */
  if (p.c[0]!=0.0) printf("%+lg ", p.c[0]);

  return 0;
}


AHORA EL CÓDIGO QUE MODIFIQUÉ PARA ARCHIVOS:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define GRADMAX 20

typedef struct _Rx_{
  int g;
  double *c;
}Rx;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//PROGRAMA QUE OBTIENE EL AREA BAJO LA CURVA DE UN POLINOMIO CON COEFICIENTES EN LOS REALES

//Declaración de funciones
Rx leeP(FILE *f); //file *f como en las matrices, para que lea del archivo
int escP(FILE *f,Rx p);
double evaluaPoli(Rx a, double x);
double Area(Rx c,int n, double a, double b);
int liberaP(Rx *a);
Rx iniRx(int g);

int main(int argc, char *argv[]) {
FILE *ent, *sal;
char *noment="polinomio.txt", *nomsal="resultado.txt";
//Rx C;
//

      
Rx c;
double q2, x, a, b;
int n,i,g;

  printf("Por leer el archivo %s.\n", noment);
  ent=fopen(noment, "rt");//r: abre archivo de lectura, t:archivo de texto
  if(ent==NULL){
    int mi_error=errno;
   /* la variable global errno tiene la
    * codificacion del error de fopen
    * (como ejemplo ponga el nombre de un archivo inexistente)
    */
    printf("Hubo un error en la lectura del archivo. Codigo: %d. Mensaje: <<%s>>\nPor finalizar la ejecucion del programa.\n",
      mi_error, strerror(mi_error));
    return -1;
  }
  printf("Por leer la informacion del archivo\n\n");
  printf("Por leer los extremos:\n\n");
  fscanf(ent,"%lg%lg",&a,&b);//checar en los apuntes si es posible poner el slash
  printf("El extremo a es:%lg, b:%lg \n",a,b);//si lo hace correcto
  printf("Por leer el número de particiones:\n\n");
  fscanf(ent,"%d",&n);//si lo lee bien
  printf("El número de particiones es: %d\n",n);
  printf("Por leer el polinomio C.\n");
  fscanf(ent, "%d", &g);//primero digitar el grado del polinomio
  printf("El grado del polinomio es: %d\n",g);//si lo lee bien
  c= iniRx(g);
  //c.c=(double*)malloc((c.g+1)*sizeof(double)); //le da espacio al polinomio
  for(i=0;i<=c.g;i++){ //arreglo de los coeficientes del polinomio (como en la matriz)
      c=leeP(ent);
   }

  printf("Por calcular el área bajo la curva en el intervalo ingresado:\n");
  q2=Area(c,n,a,b);
  printf("El area es: %lg\n",q2);
  printf("Por escribir el resultado en el archivo %s\n", nomsal);
  sal=fopen(nomsal, "wt");//w:si no existe se crea, si existe su contenido se destruye para ser creado de nuevo
  if (sal==NULL){
    int mi_error=errno;
   /* la variable global errno tiene la
    * codificacion del error de fopen
    * (como ejemplo ponga una ruta inexistente para un archivo)
    */
    printf("Hubo un error en la escritura del archivo: %d <<%s>>\nPor finalizar la ejecucion del programa.\n",
      mi_error, strerror(mi_error));

    fclose(ent); /*cerrar los archivos que tenemos abiertos en este momento*/
    return -1;
  }
  fprintf(sal,"El área bajo la curva es: %lg ",q2);
 
   
  /*printf("Por leer el polinomio.\n");
  c=leeP();
  printf("El polinomio es:\na = ");
  escP(c);
  printf("\nDigite una variable x con la que se evaluará en polinomio: \n");
  scanf("%lg",&x);
  printf("\nLa evaluación del polinomio es: \n");
  q2=evaluaPoli(c,x);//cambiar el numero
  printf("\n%lg\n",q2);
  printf("\nPor hallar el área bajo la curva del polinomio, introduzca el número de particiones :\n");
  scanf("%d",&n);
  printf("\nDigite los extremos a evaluar [a,b]:\n");
  printf("\n a \n");
  scanf("%lg",&a);
  printf("\n b \n");
  scanf("%lg",&b);
  printf("\n El area bajo la curva del polinomio ingresado es: \n");
  q2=Area(c, n, a, b);
  printf("\n%lg\n",q2);
  liberaP(&c);*/

  fclose(ent);//cerrar los archivos
  fclose(sal);
 
  printf("\n\nFin del programa\n");
  system("pause");
  return 0;
}

//funciones
Rx leeP(FILE *f)
{
  Rx ret;
  int i;

  //printf("digite el grado:");
  scanf("%d", &(ret.g));
  //malloc
   if((ret.c=(double*)malloc((ret.g+1)*sizeof(double)))==NULL){
   // printf("error al generar espacio.\n");
    ret.g = -1;
    return ret;
  }
  //
  for (i=0; i<=ret.g; i++){
   // printf("digite el coeficiente del monomio x^%d:", i);
    scanf("%lf", &(ret.c));
  }
  for (; i<=GRADMAX; i++) ret.c=0.0;

  return ret;
}

//FUNCION PARA EVALUAR POLINOMIO
double evaluaPoli(Rx a, double x){
   int i;
    double c=0.0;
      
for(i=a.g;i>0;i--){

  c=(c+a.c)*x;
}
  c=c+a.c[0];

   return c;
}

//FUNCION QUE DA EL VALOR DEL area (MÉTODO TRAPECIOS)
double Area(Rx c,int n, double a, double b){ //declarar Rx c
   double funcionX, funcionA,funcionB,dx,area,i;

   funcionX=0.0;
   funcionA=evaluaPoli(c,a);
   funcionB=evaluaPoli(c,b);
   dx=(b-a)/n;
   for(i=a+dx;i<b;i=i+dx){//a+dx
      funcionX=funcionX+(evaluaPoli(c,i));//mult por 2
   }
   
   area=(dx/2.0)*(funcionA+2.0*(funcionX)+funcionB);
   return area;
}
//FUNCION PARA ESCRIBIR UN POLINOMIO
int escP(FILE *f,Rx p)
{
  int i;

  /* Estamos considerando que el polinomio cero
   * tiene grado -1 por conveniencia.
   */
  if(p.g<0){
    printf(" 0");
    return 0;
  }

  /* si no fue el polinomio cero, entonces solo
   * escribiremos los coeficientes que no sean cero.
   * Empezamos por el coeficiente principal.
   */
  for(i=p.g; i>1; i--)
    if (p.c!=0.0) printf("%+lg x^%d ", p.c, i);
  /* si el polinomio es constante, entonces su grado
   * es cero y no se debe escribir la informacion del
   * arreglo en su indice 1.
   */
  if (p.g>=1 && p.c[1]!=0.0 ) printf("%+lg x ", p.c[1]);
  /* Como el polinomio no es cero. Si fuera un polinomio
   * constante, necesariamente su coeficiente debe ser
   * distinto de cero. Si su grado es positivo, entonces
   * el coeficiente constante podria ser cero y no lo
   * escribimos.
   */
  if (p.c[0]!=0.0) printf("%+lg ", p.c[0]);

  return 0;
}

//FUNCION PARA LIBERAR ESPACIO
int liberaP(Rx *a)
{
  if (a!=NULL) return -1;
  if (a->c!=NULL) free(a->c);
  a->c=NULL;
  a->g=-1;

  return 0;
}

//Inicializa polinomio
Rx iniRx(int g)
{
  Rx ret={g:g, c:NULL};
  double ceroReal=0.0; //ceroQ
  int i;

  ret.c = (double* )malloc(g+1*sizeof(double));
  if(ret.c==NULL) return ret;
  for(i=0; i<g; i++){
    ret.c=(double*)malloc(g+1*sizeof(double));//pendiente cambié la n por una g
    if(ret.c==NULL){
      while(--i>=0) free(ret.c);
      free(ret.c);
      ret.c=NULL;
      break;
    }
    //for (j=0; j<n; j++) ret.ent[j]=ceroQ;
  }

  return ret;
}


:D NOTA:
Para pasar a archivos me basé en un programa de matrices realizado en clases, de donde modifiqué la función iniPoli que antes era para matrices.
Gracias por su tiempo :)



hacksilver

Hola, podías explicar mejor lo que pretendes con "pasar a archivos", pero observando el segundo código veo que pasas un puntero a fichero que no usas en funciones auxiliares. Sigues utilizando los scanf/printf de consola cuando quizás preferirías usar fscanf y fprintf con ese puntero a fichero. Eso depende de lo que quieras conseguir.

cosmiquito06

Hola, muchas gracias por responder, por pasar a archivos me refiero a leer de un archivo .txt y dar el resultado en un archivo del mismo tipo, en el primer código ya tengo mis funciones y la función main bien, es decir si me compila, me corre y me da bien el resultado, el problema es cuando lo pasé a archivos, utilicé los printf y scanf en el main para ver dónde estaba el error pues al correr el programa no me generaba ningún resultado en el archivo de salida, así me di cuenta que está leyendo el archivo de entrada bien, hasta el grado, los coeficientes del polinomio ya no me los lee bien y no sé por qué, no se si me equivoqué en la manera de pasarlo a archivos o haya un error en la función.