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

 

 


Tema destacado:


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Cómo pasar un programa de polinomios a archivos en lenguaje C en: 30 Noviembre 2019, 17:55 pm
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 :)


Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines