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