Hello everyone,
I've been reading these boards for a week or so and have gained some useful pointers from it. However I am still having trouble with the program that I am currently trying to write. The program has to integrate a polynomial, after taking input values from the user for the order of the polynomial, the coefficients, and the integration limits. I want the inputs to be as bullet proof as possible, i.e. asking for reentry if invalid. This is not the problem however.
My program:
The problem seems to be occuring somewhere in the sections in red. The order is accepted correctly, but then the program only asks me for 1 coefficient, then gives that as the coefficient for x^(order+1), which clearly doesn't exist. I'm guessing that there's a problem with how i've set up the loop, but i'm stumped after spending ages looking for the problem and would appreciate any help.Code:/***************************************************** This program takes numerical input from the user,and checks that the entry is a valid number of the required type i.e. no alphabetic or other characters except decimal points where required. It then uses Horner's Rule to evaluate the value of the integral of a polynomial created using the user's input values. ******************************************************************/ #include <stdio.h> #include <stdlib.h> /*Validation functions*/ long int OrderValidation() { int temp=0; long int order; char bufOrd[BUFSIZ], *ptrO; printf("Please enter the order of the polynomial, which must be between 0 and 100 inclusive: "); while(temp==0) { if(fgets(bufOrd, sizeof(bufOrd), stdin) != NULL) /*Reads user input as a string*/ { order=strtol(bufOrd, &ptrO, 10); if(bufOrd[0]!='\n' && (*ptrO=='\n' || *ptrO=='\0')) { if(order<0 || order>100) { printf("Please ensure that the order lies between 0 and 100.\n "); printf("Please re-enter the order of the polynomial: "); } else temp=1; } else printf("Please re-enter the order of the polynomial, using only numeric characters: "); } else printf("Please enter the order of the polynomial:\n"); } return(order); } double CoeffLimitValidation(int i, int number_terms) { int counter=0; double coeff; char bufCo[BUFSIZ], *ptrC; if(i>=0 && i<number_terms) printf("Please enter the value of the coefficient for x^%d: ", i); else if(i==-1) printf("Please enter the value of the lower integration limit: "); else if(i==-2) printf("Please enter the value of the upper integration limit: "); while(counter==0) { if(fgets(bufCo, sizeof(bufCo), stdin) != NULL) { coeff=strtod(bufCo, &ptrC); if(bufCo[0]!='\n' && (*ptrC=='\n' || *ptrC=='\0')) counter=1; else printf("Invalid entry. Please re-enter the value: "); } } return(coeff); } int main() { int number_terms, i, j, k; long int order; double *coeff, low_limit, up_limit, lower, upper, integral; order=OrderValidation(); printf("The order of the polynomial is: %d\n", order); /*Test Function*/ number_terms=order+1; coeff = (double*) malloc((number_terms)*sizeof(double)); /*Assign memory to coeff array*/ if(coeff!=NULL) printf("Please enter the coefficients in order of increasing power of x, starting with the constant.\n"); else { printf("Error allocating memory. the program will now terminate"); exit(EXIT_FAILURE); } for(i=0; i<number_terms; i++); /*Take into account constant term*/ { coeff[i]=CoeffLimitValidation(i, number_terms); /*validates each individual coeff, progressing when correctly input*/ printf("Coefficient for x^%d: %g\n", i, coeff[i]); /*Test function*/ } /*reset the value of i in order to reuse CoeffLimitValidation to get the limits*/ i=-1; low_limit=CoeffLimitValidation(i, number_terms); /*reset i to reuse CoeffLimitValidation to get the limit*/ i=-2; up_limit=CoeffLimitValidation(i, number_terms); /*Calculate the lower integration value*/ for(j=order; j>=0; j--) lower=((lower*low_limit)+(coeff[j]/(j+1))); /*Uses Horner's rule with adjustment to account for integration*/ /*Calculate the upper integration value*/ for(k=order; k>=0; k--) upper=((upper*up_limit)+(coeff[k]/(k+1))); /*Uses Horner's rule with adjustment to account for integration*/ integral=upper-lower; printf("The value of the integral is %g.\n", integral); free(coeff); return(0); }
For information, here's an example of the output i'm getting.
Thanks for any help.Code:Please enter the order of the polynomial, which must be between 0 and 100 inclusive: 4 The order of the polynomial is: 4 Please enter the coefficients in order of increasing power of x, starting with the constant. 3 Coefficient for x^5: 3 Please enter the value of the lower integration limit: 32 Please enter the value of the upper integration limit: 21 The value of the integral is INF



LinkBack URL
About LinkBacks


