-3
I’m doing a C program, which consists of implementing the Lagrange interpolation method. Where the user enters the table data (values of x and fx, and I have to return the value of lx and px, only when I calculate the value of lx, the result of 0, the way I am allocating the values of x and fx are correct ?.
One of the tests to see if the program works is: quantity of terms = 3 x0 = 0 X1 = 1 x2 = 3 fx0 = -5 fx1 = 1 fx2 = 25
exit: lx0 = -0.333 lx1 = 1 lx2 = 0.33333 px = 11
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
//Estruturas
typedef struct tabela {
int termos;
float *x;
float fx;
float ponto;
}tabela;
typedef struct conta {
float *lxi;
float *lxf;
float px;
}conta;
//FUNCOES
float intro(tabela *p_tabela, int qtd);
void alocaTabela(tabela **p, int tamanho);
void alocaConta(conta **p, int tamanho);
float calculaL(conta*p_conta, tabela*p_tabela);
int main(){
int qtd;
//PONTEIROS
tabela *p_tabela;
conta *p_conta;
printf("\nDigite a quantidade de termos da sua tabela: ");
scanf("%d", &qtd);
//FUNCOES
alocaTabela(&p_tabela, qtd);
alocaConta(&p_conta, qtd);
intro(p_tabela,qtd);
calculaL(p_conta, p_tabela);
}
void alocaTabela(tabela **p, int tamanho) {
if ((*p = (tabela *) malloc(tamanho * sizeof(tabela))) == NULL) {
printf("\nErro na alocacao. O programa sera encerrado!\n");
exit(1);
}
}
void alocaConta(conta **p, int tamanho) {
if ((*p = (conta *) malloc(tamanho * sizeof(conta))) == NULL) {
printf("\nErro na alocacao. O programa sera encerrado!\n");
exit(1);
}
}
float intro(tabela *p_tabela, int qtd){
int i, j;
//ATRIBUINDO VALOR DE QTD PARA TERMOS
p_tabela->termos=qtd;
//ARMAZENAMENTO DOS VALORES DE X
for (i = 0; i < p_tabela->termos; i++) {
printf("\nDigite os valores de X: ");
printf("\nX(%d): ", i);
scanf("%f", (p_tabela->x+i));
}
printf("\n\n");
printf("-------------------------------------");
printf("\n\n");
//ARMAZENAMENTO DOS VALORES DE FX
for (j = 0; j < p_tabela->termos; j++) {
printf("\nDigite os valores de F(x): ");
printf("\nF(X[%d]): ", j);
scanf("%f", &(p_tabela+j)->fx);
}
printf("\n\n");
printf("-------------------------------------");
printf("\n\n");
//ARMAZENAMENTO DO PONTO
printf("\nDigite o ponto a ser interpolado: ");
scanf("%f", &(p_tabela->ponto));
}
float calculaL(conta*p_conta, tabela*p_tabela){
//Lx = (x-xj)/(xi-xj) * ................ sendo x = ponto
int i, j;
for(i=0; i < p_tabela->termos;i++){
for(j=0;j<=p_tabela->termos;j++){
if(j!=i)
j++;
*(p_conta->lxi+(j)) *= (p_tabela->ponto) - *(p_tabela->x+(j++)) / *(p_tabela->x+(i)) - *(p_tabela->x+(j++));
}
printf("\n\nL(X[%d]): %f", i, *(p_conta->lxf+(j)));
}
}