#1 10-06-2007 15:50:02

mieczyk

Member

3375619
Zarejestrowany: 03-08-2007
Posty: 24
Punktów :   
WWW

[Metody numeryczne][C] - Schemat Hornera

Przykładowy programik, który oblicza wartość wielomianu f(x) w zależności od argumentu.

Wielomian oraz argument powinien być zapisany w pliku tekstowym "in.txt" w następującej postaci:

[PRZYKŁAD]

Kod:

3x^3+2x^2-5x+7 3

- Zapis wielomianu jest bez spacji,
- Po spacji podajemy argument (x).

W tym przykładzie, poniższy programik powinien wypisać na ekranie:

Kod:

f(3.00) = 91.00

horner.c

Kod:

#include <stdio.h>
#include <stdlib.h>


/* Funkcja, ktora czyta wielomian z pliku *.txt.
      - a - tablica na wspolczynniki wielomianu,
      - n - stopien wielomianu,
      - x - argument funkcji,
      - name - nazwa pliku.
   --------------------------------------------------------------
   Plik musi zawierac jedna linijke z wielomianem postaci:
   
   Ax^n+Bx^(n-1)+Cx^(n-2)+...+WYRAZ_WOLNY ARGUMENT 
   --------------------------------------------------------------
    - Wielomian nie moze zawierac spacji i powinien zawierac wszystkie elementy,
    - Po pojedynczej spacji znajduje sie argument wielomianu, */ 
   
void read_polynomial(float *a, int *n, float *x, const char *name)
{
     FILE *fp_in;           /* Uchwyt pliku */
     
     char wielomian[201];   /* Przyjmujemy, ze wielomian nie zawiera wiecej niz 200 znakow */
     char help[201];        /* Tablica pomocnicza */
     
     
     /* Czytanie z pliku */
     fp_in = fopen(name,"r");
     fscanf(fp_in, "%s %f", wielomian, x);
     fclose(fp_in);
     
     /* Wydobywanie stopnia wielomianu */
     int i=0; int j=0;
     while(wielomian[i]!='^') i++;
     i++;
     while(wielomian[i] != '+' && wielomian[i] != '-')
     {               
         help[j] = wielomian[i];
         i++; j++;
     }
     help[j]='\0';
     *n = atoi(help);
     
     
     /* Wydobywanie wspolczynnikow wielomianu */
     i=0; j=0; 
     int k=0;
     while(wielomian[i] != ' ')
     {
         if(wielomian[i]=='x')
         {
            help[j]='\0';
            j=0;
            a[k] = atof(help);
            k++;
            
            while(wielomian[i] != '+' && wielomian[i] != '-') i++; 
            if (wielomian[i]=='+')i++;
         }
         
         help[j] = wielomian[i];
         i++; j++;
         
     }
     a[k] = atof(help);  
}



/* Funkcja liczaca wartosc funkcji f(x) na podstawie schematu Hornera.
    - a - tablica ze wspolczynnikami wielomianu f(x),
    - b - tablica ze wspolczynnikami wielomianu q(x),
    - x - wartosc argumentu,
    - s - wartosc funkcji f(x) <- to co liczy funkcja horner(),
    - n - stopien wielomianu.
---------------------------------------------------------------------------
Po wykonanu sie funkcji, zmienna s przyjmie wartosc f(x) w zaleznosci od
argumentu.  */
 
void horner(float *a, float *b, float x, float *s, int n)
{
    int i;
    
    
    b[0] = a[0];
    for(i=1; i<=n; i++)
        b[i]=a[i]+b[i-1]*x;       
           
    *s = b[n];
}


        
int main()
{
    float a[20];     /* Tablica ze wspolczynnikami wielomianu f(x) */
    float b[20];     /* Tablica ze wspolczynnikami wielomianu q(x) */
    int n;           /* Stopien wielomianu */
    float x;         /* Argument wielomianu */
    float s;         /* Wartosc wielomianu */
    int i;           /* Zmienna iteracyjna */
    
    read_polynomial(a, &n, &x, "in.txt");
    
    horner(a, b, x, &s, n); 
   
    printf("f(%.2f) = %.2f", x, s);
    
    getchar();
    return 0;
}

Offline

 

Stopka forum

RSS
Powered by PunBB 1.2.23
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
GotLink.pl