@Its not me:
Człowieku uparłeś się na obsługiwanie błędów, a i tak nie obsłużyłeś wszystkich (co z <=1). Pamiętaj, że to jest początkujący i on przechodzi fazę "ma działać" (dawać dobry wynik). Każdy od takiego podejścia zaczynał, a dopiero potem kolejne poziomy wtajemniczenia: "powinno/musi być efektywne" i "musi być niezawodne".
Więc pomijając poprawki obsług błędów ja bym napisał to tak (zresztą przeglądając twój algorytm mam spore wątpliwości czy robi to co powinien - przepisałeś od BUDI bez zastanowienia):
#include <cstdio>
#include <cstdlib>
inline double DifProduct(const double x, const double x0[], const int n)
{
double result;
result=1.0;
for(int i=0;i<n;++i)
result*=(x-x0[i]);
return result;
}
double LagrangeInterp(double x, const double x0[], const double y0[],int n)
{
double result,a;
a = DifProduct(x,x0,n);
n--; // uwaga! zmiejszenie n
result = 0.0;
for(int i=0;i<=n;++i)
{
if(x==x0[i])
return y0[i];
result += a*y0[i]/((x-x0[i])*DifProduct(x0[i],x0,i)*DifProduct(x0[i],x0+i+1,n-i));
}
return result;
}
int main (void)
{
int n,i;
double x;
printf ("Podaj ilosc elementow: ");
scanf ("%d", &n);
double x0[n], y0[n];
for (i = 0; i < n; i++)
{
printf ("Podaj x[%d]: ", i);
scanf ("%f", &x0[i]);
printf ("Podaj y[%d]: ", i);
scanf ("%f", &y0[i]);
}
printf ("Podaj wartosc x : ");
scanf ("%f", &x);
printf("w(%f) wynosi %f\n", x, LagrangeInterp(x,x0,y0,n));
system("pause");
}
Przyznaje, że nie jest to rozwiązanie optymalne bo można pewne wartości "zwinąć" do y0, ale nie chciało mi się tego robić (człon y0[i]/(DifProduct(x0[i],x0,i)*DifProduct(x0[i],x0+i+1,n-i)) jest stały przy tych samych punktach wejściowych a różnych x).