Lớp đa thức
Chương trình dưới đây là sự cải tiến chương trình trong mục 8.5 của chương 3 bằng cách đưa vào 2 hàm tạo: //hàm tạo không đối Dt() { This->n=0; this->a=null; } //hàm tạo có đối Dt(int n1) { This->n=n1 ; ...
Chương trình dưới đây là sự cải tiến chương trình trong mục 8.5 của chương 3 bằng cách đưa vào 2 hàm tạo:
//hàm tạo không đối Dt() { This->n=0; this->a=null; } //hàm tạo có đối Dt(int n1) { This->n=n1 ; This->a = new double[n1+1]; }
Hàm tạo có đối sẽ tạo một đối tượng mới (kiểu dt) gồm 2 thuộc tính là biến nguyên n và con trỏ a. Ngoài ra còn cấp phát bộ vùng nhớ (cho a) để chứa các hệ số của đa thức.
Nếu không xây dựng hàm tạo, mà sử dụng hàm tạo mặc định thì các đối tượng (kiểu dt) tạo ra bởi các lệnh khai báo sẽ chưa có bộ nhớ để chứa đa thức. Như vậy đối tượng tạo ra chưa hoàn chỉnh và chưa dùng được. Để có một đối tượng hoàn chỉnh phải qua 2 bước:
+ Dùng khai báo để tạo các đối tượng:
Dt d;
+ cấp phát vùng nhớ (cho đối tượng) để chứa đa thức:
D.n = m;
D.a = new double[m+1] ;
quy trình này được áp dụng trong các phương thức toán tử của chương trình trong mục 8.5 chương 3. Rõ ràng quy trình này vừa dài vừa không tiện lợi, lại hay mắc lỗi, vì người lập trình hay quên không cấp phát bộ nhớ.
Việc dùng các hàm tạo để sản sinh ra các đối tượng hoàn chỉnh tỏ ra tiện lợi hơn, vì tránh được các thao tác phụ (như cấp phát bộ nhớ) nằm bên ngoài khai báo. Phương án dùng hàm tạo sẽ được sử dụng trong các phương thức toán tử của chương trình dưới đây:
+ Nội dung chương trình gồm:
- Nhập, in các đa thức p, q, r, s
- Tính đa thức: f = -(p + q)*(r - s)
- Nhập các số thực x1 và x2
- Tính f(x1) (bằng cách dùng phương thức operator^)
- Tính f(x2) (bằng cách dùng hàm f)
// ct4_05.cpp #include <conio.h> #include <iostream.h> #include <math.h> Class dt { Private: Int n; // bac da thuc Double *a; // tro toi vung nho chua cac he so da thuc // a0, a1,... Public: Dt() { This->n=0; this->a=null; } Dt(int n1) { This->n=n1 ; This->a = new double[n1+1]; } Friend ostream& operator<< (ostream& os,const dt &d); Friend istream& operator>> (istream& is,dt &d); Dt operator-(); Dt operator+(const dt &d2); Dt operator-(dt d2); Dt operator*(const dt &d2); Double operator^(const double &x); // tinh gia tri da thuc Double operator[](int i) { If (i<0) Return double(n); Else Return a[i]; } } ; // ham tinh gia tri da thuc Double f(dt d,double x) { Double s=0.0 , t=1.0; Int n; N = int(d[-1]); For (int i=0; i<=n; ++i) { S += d[i]*t; T *= x; } Return s; } Ostream& operator<< (ostream& os,const dt &d) { Os << " - cac he so (tu ao): " ; For (int i=0 ; i<= d.n ; ++i) Os << d.a[i] <<" " ; Return os; } Istream& operator>> (istream& is,dt &d) { If (d.a!=null) delete d.a; Cout << " - bac da thuc: " ; Cin >> d.n; D.a = new double[d.n+1]; Cout << "nhap cac he so da thuc: " ; For (int i=0 ; i<= d.n ; ++i) { Cout << "he so bac " << i << " = " ; Is >> d.a[i] ; } Return is; } Dt dt::operator-() { Dt p(this->n); For (int i=0 ; i<=n ; ++i) P.a[i] = -a[i]; Return p; } Dt dt::operator+(const dt &d2) { Int k,i; K = n > d2.n ? N : d2.n ; Dt d(k); For (i=0; i<=k ; ++i) If (i<=n && i<=d2.n) D.a[i] = a[i] + d2.a[i]; Else if (i<=n) D.a[i] = a[i]; Else D.a[i] = d2.a[i]; I=k; While(i>0 && d.a[i]==0.0) --i; D.n = i; Return d ; } Dt dt::operator-(dt d2) { Return (*this + (-d2)); } Dt dt::operator*(const dt &d2) { Int k, i, j; K = n + d2.n ; Dt d(k); For (i=0; i<=k; ++i) d.a[i] = 0; for (i=0 ; i<= n ; ++i) For (j=0 ; j<= d2.n ; ++j) D.a[i+j] += a[i]*d2.a[j] ; Return d; } Double dt::operator^(const double &x) { Double s=0.0 , t=1.0; For (int i=0 ; i<= n ; ++i) { S += a[i]*t; T *= x; } Return s; } Void main() { Dt p,q,r,s,f; Double x1,x2,g1,g2; Clrscr(); Cout <<" nhap da thuc p " ; cin >> p; Cout << " da thuc p " << p ; Cout <<" nhap da thuc q " ; cin >> q; Cout << " da thuc q " << q ; Cout <<" nhap da thuc r " ; cin >> r; Cout << " da thuc r " << r ; Cout <<" nhap da thuc s " ; cin >> s; Cout << " da thuc s " << s ; F = -(p+q)*(r-s); Cout << " nhap so thuc x1: " ; cin >> x1; Cout << " nhap so thuc x2: " ; cin >> x2; G1 = f^x1; G2 = f(f,x2); Cout << " da thuc f " << f ; Cout << " f("<<x1<<") = " << g1; Cout << " f("<<x2<<") = " << g2; Getch(); }