Lược đồ Hoocner
Chương trình mẫu
Ứ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();
}