Lược đồ Hoocner
Ứng dụng lược đồ Hoocner
- Tính giá trị đa thức tại một điểm.
- Biến đổi tịnh tuyến X=(x-c) hay f(x)=f(X+c).
- Tính giá trị đa thức tại đạo hàm cấp i (i=1..n).

Chương trình mẫu

Code:

#include "conio.h"
#include "stdio.h"
#include "iostream.h"
double*NhapDaThuc(int Bac) {
   double*Temp = new double [Bac+1];
   for(int i= 0; i<=Bac; i++) {
      cout<<"a"<<i<<" = ";
      cin>>Temp[i];
   }
   return Temp;
}
void XuatDaThuc(double*A,int Bac, char*s) {
   cout<<s<<" = "<<A[0];
   for(int i=1; i<=Bac; i++){
      if(A[i]>0)
         cout<<"+"<<A[i]<<"x^"<<i;
      if(A[i]<0)
         cout<<A[i]<<"x^"<<i;
   }
}

void XuatDaThuc(double*A,int Bac, char*s, double c) {
   cout<<s<<" = "<<A[0];
   for(int i=1; i<=Bac; i++){
      if(A[i]>0) {
         if (c < 0)
            cout<<"+"<<A[i]<<"(x"<<c<<")^"<<i;
         else
            cout<<"+"<<A[i]<<"(x+"<<c<<")^"<<i;
      }
      if(A[i]<0) {
         if (c < 0)
            cout<<A[i]<<"(x"<<c<<")^"<<i;
         else
            cout<<A[i]<<"(x+"<<c<<")^"<<i;
      }
   }
}
double**BangHoocner(double*Fx, int n,double c) {
   double**temp;
   *temp = new double [n+2];
   temp[0] = new double [n+1];
   for(int i = 0; i<=n; i++)
      temp[0][i] = Fx[n-i];
   for( i = 1;i<=n+1;i++){
      temp[i] = new double [n+2-i];
      temp[i][0] = temp[i-1][0];
      for(int j=1;j<=n-i+1;j++)
         temp[i][j] = temp[i][j-1]*c+temp[i-1][j];
   }
   return temp;
}
double*Hoocner(double*Fx, int n,double c) {
   double*P = new double [n+1];
   double**temp;
   *temp = new double [n+2];
   temp[0] = new double [n+1];
   for(int i = 0; i<=n; i++)
      temp[0][i] = Fx[n-i];
   for( i = 1;i<=n+1;i++){
      temp[i] = new double [n+2-i];
      temp[i][0] = temp[i-1][0];
      for(int j=1;j<=n-i+1;j++)
         temp[i][j] = temp[i][j-1]*c+temp[i-1][j];
      P[i-1] = temp[i][n-i+1];
   }
   temp = NULL;
   return P;
}
void XuatBangHoocner(double**A,int n, double c) {
   for(int i = 0; i<=n; i++)
      cout<<"\t"<<A[0][i];
   cout<<"\n---------------------------------------------------";
   for( i = 1;i<=n+1;i++){
      cout<<endl;
      cout<<c<<"|\t"<<A[i][0];
      for(int j=1;j<=n-i+1;j++)
         cout<<"\t"<<A[i][j];
   }
}
double DaoHam_Px(double*Px,int n, int i) {
   double Temp = Px[i];
   for(int j =1;j<=i;j++)
      Temp*=j;
   return Temp;
}
void Menu() {
   clrscr();
   cout<<"\n\t-------------------------------------------------";
   cout<<"\n\t\tLUOC DO HOOCNER VA UNG DUNG";
   cout<<"\n\t-------------------------------------------------";
   cout<<"\n\t1. Nhap Da Thuc!";
   cout<<"\n\t2. Gia Tri Da Thuc Tai Diem x!";
   cout<<"\n\t3. Bang Luoc Do Hooner Cap n (Phan Tich Theo x)!";
   cout<<"\n\t4. Gia Tri Da Thuc O Dao Ham Cap i = 0..n Tai x";
   cout<<"\n\t5. Thoat!";
}
void Exit() {
      asm {
      mov ah,4ch;
      int 21h
   }
}
/*Chuong Trinh Chinh*/
void main() {
   double*Fx,x,**A,*Px;
   int n =-1;
   char ch = 0;
   while (ch!='5'){
      Menu();
      gotoxy(4,11);
      printf("Ban Chon Chuc Nang:");
      ch = getch();
      if (ch>'0'&& ch <='5') {
         printf("%c",ch);
         getch();
      }
      switch (ch){
         case '1':
            cout<<"\n\n\tNHAP DA THUC!";
            cout<<"\nNhap Bac Da Thuc n = ";
            cin>>n;
            Fx = NhapDaThuc(n);
            XuatDaThuc(Fx,n,"P(x)");
            getch();
            break;
         case '2':
            cout<<"\n\n\tTINH GIA TRI DA THUC TAI MOT DIEM";
            if(n == -1) {
               cout<<"\nBan Chua Nhap Da Thuc!";
               cout<<"\nNhap Bac Da Thuc n = ";
               cin>>n;
               Fx = NhapDaThuc(n);
               XuatDaThuc(Fx,n,"P(x)");
            }
            cout<<"\nNhap Vao Diem x = ";
            cin>>x;
            Px = Hoocner(Fx,n,x);
            cout<<"f("<<x<<") = "<<Px[0];
            getch();
            break;
         case '3':
            if (n==-1) {
               cout<<"\n\nCHUA NHAP DA THUC MOI";
               getch();
               break;
            }
            cout<<"\n\n\tBANG LUOC DO HOONER!";
            cout<<"\nNhap Gia Tri x Can Phan Tich: ";
            cin>>x;
            A = BangHoocner(Fx,n,x);
            cout<<"Bang Hoocner\n";
            XuatBangHoocner(A,n,x);
            Px = Hoocner(Fx,n,x);
            XuatDaThuc(Fx,n,"\n\nP(x)");
            XuatDaThuc(Px,n,"\nP(x)",-x);
            getch();
            break;
         case '4':
            if (n==-1) {
               cout<<"\n\nCHUA NHAP DA THUC MOI";
               getch();
               break;
            }
            cout<<"\nTINH GIA TRI CUA P(x) TAI DAO HAM CAP i";
            cout<<"\nNhap Gia Tri x Tinh: ";
            cin>>x;
            double i;
            Px = Hoocner(Fx,n,x);
             Lap:
            cout<<"Nhap Vao Dao Ham Cap:";
            cin>>i;
            if(i<0) {
               cout<<"Cap Dao Ham Khong Dung! Nhap Lai\n";
               goto Lap;
            }
            if(i>n) {
               cout<<"\nGia Tri Dao Ham Cap "<<i<<" Cua P(x)=0";
               getch();
               break;
            }
            XuatDaThuc(Px,n,"P(x)",-x);
            cout<<"\nGia Tri Dao Ham Cap "<<i<<" Cua P(x) = ";
            cout<<DaoHam_Px(Px,n,i);
            getch();
            break;
      }

   }
   A = NULL;
   delete Fx,A,Px;
   Exit();
}