Đa thức là một trong những phạm trù toán học cơ bản, không chỉ học sinh ở nước ta mà còn ở tất cả các nước trên thế giới được tiếp cận khá sớm. Ở Việt Nam, ngay từ chương trình môn toán trung học cơ sở, học sinh đã được tiếp cận với khái niệm đa thức. Một trong những khái niệm mở đầu được đề cập tới đó là đa thức một biến.Có rất nhiều phép toán có thể thực hiện trên đa thức một biến như: cộng hai đa thức, trừ hai đa thức, nhân hai đa thức… Việc thực hiện các phép toán này đối với những đa thức nhỏ, có ít phần tử thì ta có thể thực hiện và kiểm tra tính đúng đắn một cách dễ dàng và nhanh chóng. Tuy nhiên, với những đa thức thực tế trong các lĩnh vực khoa học thường có số lượng phần tử rất lớn, có độ phức tạp rất cao, việc thực hiện tính toán thủ công làm chúng ta tốn khá nhiều thời gian và công sức mà độ tin cậy lại không cao. Khi đó, chiếc máy tính điện tử sẽ trở thành một trợ thủ đắc lực của bạn và một chương trình được viết ra có thể giúp bạn giải quyết những công việc trên một cách dễ dàng và nhanh chóng với độ chính xác cao.Để định nghĩa một kiểu dữ liệu mới đồng thời mang lại cho tất cả mọi người một công cụ hữu ích giúp thực hiện tất cả các phép toán thường gặp trên đa thức một biến, tôi đã quyết định lựa chọn đề tài “Cài đặt lớp đa thức”. Để có thể nắm rõ được những thuật toán được sử dụng cũng như cách thức tổ chức hoạt động của chương trình, mời các bạn tìm hiểu phần nội dung đề tài.
Trang 1- -
BÀI TIỂU LUẬN
HỌC PHẦN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 2- -
BÀI TIỂU LUẬN
HỌC PHẦN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 3Trong quá trình học tập tại trường, chúng em đã được học hỏi và tiếp thu rất nhiều kiến thức đại cương cũng như chuyên ngành nhằm nâng cao vốn hiểu biết và là hành trang quý báu giúp chúng em vững bước vào đời Em xin gửi lời cảm ơn chân thành đến quý thầy cô đã giảng dạy chúng em trong suốt thời gian qua, khoa Công Nghệ Thông Tin và truyền thông cũng như tất cả quý thầy cô trong trường Đại học Hồng Đức Đặc biệt em xin chân thành cảm ơn cô Nguyễn Thị Xuân Đài – người đã trực tiếp giảng dạy chúng em học phần Lập trình hướng đối tượng C++ và cũng là người tận tình hướng dẫn em trong suốt thời gian thực hiện đề tài này
Tuy nhiên, dù rất cố gắng nhưng do thời gian có hạn nên bài tiểu luận của
em khó tránh khỏi những thiếu sót Em rất mong nhận được sự thông cảm và đóng góp ý kiến của quý thầy cô và các bạn để bài tiểu luận của em được hoàn chỉnh hơn
Em xin chân thành cảm ơn!
Thanh Hóa, 11/2014
Sinh viên thực hiện
Trang 41.1 Lí do chọn đề tài 1
1.2 Mục tiêu và nhiệm vụ của đề tài 1
1.2.1 Mục tiêu đề tài 1
1.2.2 Nhiệm vụ đề tài 1
1.3 Khách thể, đối tượng và phạm vi nghiên cứu 2
1.3.1 Khách thể nghiên cứu 2
1.3.2 Đối tượng và phạm vi nghiên cứu 2
1.4 Các phương pháp nghiên cứu 2
CHƯƠNG II: CƠ SỞ LÍ LUẬN 3
2.1 Khái niệm đa thức một biến 3
2.2 Phép cộng trừ hai đa thức 3
2.3 Phép nhân hai đa thức 3
2.4 Phép chia có dư của hai đa thức 4
2.5 Đạo hàm của đa thức 4
2.6 Nguyên hàm của một đa thức 4
CHƯƠNG III: NỘI DUNG 6
3.1 Xây dựng lớp phân số 6
3.2 Xây dựng lớp đơn thức 8
3.3 Lưu trữ và chuẩn hóa đa thức 10
3.3.1 Lưu trữ 10
3.3.2 Chuẩn hóa 10
3.4 Xây dựng các hàm tạo cho đa thức 11
3.5 Xây dựng các toán tử cho đa thức 12
3.5.1 Nhóm các toán tử số học 12
3.5.2 Toán tử gán 16
Trang 53.5.6 Nhóm các toán tử khác 19
3.6 Hàm tính đạo hàm đa thức 19
3.7 Hàm tính nguyên hàm của đa thức 20
3.8 Hàm tính giá trị của đa thức 21
3.9 Nhóm các hàm khác của đa thức 22
3.10 Xây dựng giao diện chương trình 22
CHƯƠNG IV: KẾT LUẬN 27
4.1 Tóm tắt kết quả nghiên cứu 27
4.2 Đề xuất và hướng phát triển 27
TÀI LIỆU THAM KHẢO 29
Trang 6CHƯƠNG I: MỞ ĐẦU 1.1 Lí do chọn đề tài
Đa thức là một trong những phạm trù toán học cơ bản, không chỉ học sinh ở nước ta mà còn ở tất cả các nước trên thế giới được tiếp cận khá sớm Ở Việt Nam, ngay từ chương trình môn toán trung học cơ sở, học sinh đã được tiếp cận với khái niệm đa thức Một trong những khái niệm mở đầu được đề cập tới đó là đa thức một biến
Có rất nhiều phép toán có thể thực hiện trên đa thức một biến như: cộng hai
đa thức, trừ hai đa thức, nhân hai đa thức… Việc thực hiện các phép toán này đối với những đa thức nhỏ, có ít phần tử thì ta có thể thực hiện và kiểm tra tính đúng đắn một cách dễ dàng và nhanh chóng Tuy nhiên, với những đa thức thực tế trong các lĩnh vực khoa học thường có số lượng phần tử rất lớn, có độ phức tạp rất cao, việc thực hiện tính toán thủ công làm chúng ta tốn khá nhiều thời gian và công sức mà độ tin cậy lại không cao Khi đó, chiếc máy tính điện tử sẽ trở thành một trợ thủ đắc lực của bạn và một chương trình được viết ra có thể giúp bạn giải quyết những công việc trên một cách dễ dàng và nhanh chóng với độ chính xác cao
Để định nghĩa một kiểu dữ liệu mới đồng thời mang lại cho tất cả mọi người một công cụ hữu ích giúp thực hiện tất cả các phép toán thường gặp trên đa thức
một biến, tôi đã quyết định lựa chọn đề tài “Cài đặt lớp đa thức” Để có thể nắm
rõ được những thuật toán được sử dụng cũng như cách thức tổ chức hoạt động của chương trình, mời các bạn tìm hiểu phần nội dung đề tài
1.2 Mục tiêu và nhiệm vụ của đề tài
1.2.1 Mục tiêu đề tài
Đề tài này được thực hiện nhằm định nghĩa một kiểu dữ liệu mới đồng thời tạo ra một chương trình thực hiện tất cả các phép toán thường gặp đối với đa thức một biến bao gồm: cộng hai đa thức, trừ hai đa thức, nhân hai đa thức…
1.2.2 Nhiệm vụ đề tài
Trang 7- Tổ chức lưu trữ một đa thức một biến cụ thể
- Chuẩn hóa đa thức theo đúng những quy tắc trong toán học
- Xây dựng hàm tạo cho lớp
- Xây dựng các toán tử cho lớp
- Xây dựng hàm tính đạo hàm của một đa thức
- Xây dựng hàm tính nguyên hàm của một đa thức
- Xây dựng giao diện cho chương trình
1.3 Khách thể, đối tượng và phạm vi nghiên cứu
1.3.1 Khách thể nghiên cứu
Cài đặt lớp đa thức và một chương trình demo thực hiện tất cả những phép toán thường gặp trên đa thức một biến
1.3.2 Đối tượng và phạm vi nghiên cứu
Lớp đa thức và các phép toán thường gặp trên đa thức một biến
1.4 Các phương pháp nghiên cứu
- Phương pháp thu thập tài liệu: thu thập tài liệu từ những bài báo khoa học, các trang web tin học và một số ebook về đề tài nghiên cứu, giáo trình và các tài liệu học tập khác
- Phương pháp phân tích và tổng hợp tài liệu: từ những tài liệu đã thu thập, tiến hành tìm hiểu, phân tích và tồng hợp nội dung liên quan đến
Trang 8CHƯƠNG II: CƠ SỞ LÍ LUẬN 2.1 Khái niệm đa thức một biến
Các đa thức của một biến (cũng được gọi là đa thức một ẩn) có dạng
2.3 Phép nhân hai đa thức
Cho hai đa thức:
(x) =
Trang 9(x) =
Khi đó P(x) Q(x) là một đa thức có bậc m + n và có các hệ số xác định bởi
=
2.4 Phép chia có dư của hai đa thức
Với hai đa thức P(x) và Q(x) bất kỳ, trong đó bậc của đa thức Q deg(Q) ≥
1, tồn tại duy nhất các đa thức S(x) và R(x) thoả mãn đồng thời các điều kiện:
i P(x) = Q(x) S(x) + R(x)
ii deg(R) < deg(Q)
S(x) được gọi là thương số và R(x) được gọi là số dư trong phép chia P(x) cho Q(x)
2.5 Đạo hàm của đa thức
Cho hàm số biến số thực y = ʄ(x) xác định trên khoảng (a; b) (khoảng (a; b)={x ∊ℝ | a < x < b}) Xét giá trị x0 ∊ (a; b) và giá trị x ∊ (a; b)
Đặt Δx = x − x0 thì x = x0 + Δx Δx được gọi là số gia đối số
Đặt Δy = f(x) – f(x0) Δy được gọi là số gia hàm số
Xét tỷ số Nếu khi Δx→0, tỷ số đó dần tới một giới hạn thì giới hạn đó được gọi là đạo hàm của hàm số y = f(x) tại điểm x0 kí hiệu là ʄ'(x) hay ̇ ( )
ʄ (x) = lim
→ʄ( + Δx) − ʄ( )
Công thức tính đạo hàm đa thức một biến:
(u + v)' = u' + v'
(xα)' = α xα-1
2.6 Nguyên hàm của một đa thức
Trang 10Cho hàm f xác định trên D ⊂ ℝ Hàm F là một nguyên hàm của f nếu F’(x)
= f(x) với mọi x ∊ D
Công thức tính nguyên hàm đa thức một biến:
(u + v)' = u' + v'
(xα)' = α xα-1
Trang 11CHƯƠNG III: NỘI DUNG 3.1 Xây dựng lớp phân số
Trong chương trình, chúng tôi đã xây dựng lớp phân số trong thư viện
fraction.h với nội dung như sau:
class fraction
{
long nume, deno;
long ucln(long a, long b);
friend fraction operator +(fraction const &a, fraction const &b);
friend fraction operator -(fraction const &a, fraction const &b);
friend fraction operator *(fraction const &a, fraction const &b);
friend fraction operator /(fraction const &a, fraction const &b);
fraction operator ++();
fraction operator ();
fraction operator ++(int);
fraction operator (int);
fraction operator +=(const fraction &f);
fraction operator -=(const fraction &f);
fraction operator *=(const fraction &f);
fraction operator /=(const fraction &f);
fraction operator ^=(long exp);
friend fraction operator ^(const fraction &f, long exp);
Trang 12void operator =(const fraction &f);
friend long operator ==(const fraction &f1, const fraction &f2);
friend long operator !=(const fraction &f1, const fraction &f2);
friend long operator >(const fraction &f1, const fraction &f2);
friend long operator <(const fraction &f1, const fraction &f2);
friend long operator >=(const fraction &f1, const fraction &f2);
friend long operator <=(const fraction &f1, const fraction &f2);
friend istream &operator >>(istream &in, fraction &f);
friend ostream &operator <<(ostream &out, const fraction &f);
- long get_nume() và long get_deno() lần lượt là các hàm thành viên
dùng để lấy ra giá trị của tử số và mẫu số với kết quả được trả về thông
qua lời gọi hàm
- fraction(long nu=0, long de=1) là hàm tạo một phân số từ hai đối nu
và de, fraction(fraction const &f) là hàm tạo có chức năng sao chép giá trị của phân số f vào giá trị của phân số đang được con trỏ this trỏ tới
- fraction operator -() là toán tử dùng để đổi dấu của phân số (nhân giá trị của phân số với -1)
- operator float() và operator long() là hai toán tử dùng để chuyển đổi giá trị của phân số sang các kiểu tương ứng là float và long
Trang 13- fraction operator ++(), fraction operator (), fraction operator ++(int), fraction operator (int) là các toán tử dùng để tăng giảm giá trị của phân số đi 1
- void operator =(const fraction &f) là toán tử dùng để gán cho đa thức đang được con trỏ this trỏ tới giá trị của phân số f
- Các toán tử +, -, *, / lần lượt dùng để cộng, trừ, nhân, chia hai phân số cho nhau
- Các toán tử +=, -=, *=, /= lần lượt dùng để cộng, trừ, nhân, chia phân
số đang được con trỏ this trỏ tới một phân số khác
- Hai toán tử ^ và ^= lần lượt dùng để lũy thừa phân số được trỏ tới bởi con trỏ this với đối số exp
- friend istream &operator >>(istream &in, fraction &f) và friend ostream &operator <<(ostream &out, const fraction &f) là hai toán tử dùng để nhập và xuất một phân số
3.2 Xây dựng lớp đơn thức
Lớp đơn thức được chúng tôi xây dựng trong thư viện monomial.h với nội
dung như sau:
monomial(long co_nume=0, long co_deno=1, long ex=0);
monomial(const fraction &co, int ex=0);
~monomial();
long set_monomial(long co_nume=0, long co_deno=1, long ex=0);
fraction get_coe() const;
long get_exp() const ;
int set_coe(const fraction &co);
int set_exp(const long &ex);
// -
monomial operator -();
Trang 14friend monomial operator +(const monomial &m, const fraction &cofm); friend monomial operator -(const monomial &m, const fraction &cofm); friend monomial operator *(const monomial &m1, monomial const &m2); monomial operator ++();
monomial operator ();
monomial operator *=(const monomial &m);
monomial operator +=(const fraction &cofm);
monomial operator -=(const fraction &cofm);
monomial operator ^=(long exp);
friend monomial operator ^(const monomial &f, long exp);
void operator =(const monomial &m);
friend long operator ==(const monomial &m1, const monomial &m2);
friend long operator !=(const monomial &m1, const monomial &m2);
friend long operator >(const monomial &m1, const monomial &m2);
friend long operator <(const monomial &m1, const monomial &m2);
friend long operator >=(const monomial &m1, const monomial &m2);
friend long operator <=(const monomial &m1, const monomial &m2);
friend istream &operator >>(istream &in, monomial &e);
friend ostream &operator <<(ostream &out, const monomial &e);
- long set_monomial(long co_nume=0, long co_deno=1, long ex=0) là hàm thành viên dùng để thiết lập giá trị cho phân số co_nume ứng
Trang 15mũ của đơn thức Khi co_deno = 0, đơn thức sẽ nhận giá trị 0, ngược lại thì chuẩn hóa phân số và gán giá trị cha đơn thức tương ứng
- fraction get_coe() const và long get_exp() const lần lượt là hai hàm thành viên dùng để lấy ra giá trị hệ số và số mũ của phân số
- int set_coe(const fraction &co) và int set_exp(const long &ex) lần
lượt là hai hàm thành viên dùng thiết lập giá trị hệ số và số mũ cho
- Các toán tử còn lại được dùng để so sánh giá trị của hai đơn thức với
vector <monomial> pol;
Trong vector, mỗi phần tử ứng với mỗi đơn thức thành viên trong đa thức 3.3.2 Chuẩn hóa
Việc chuẩn hóa đa thức được hàm thành viên void standize() đảm nhận
Trang 16Hàm này làm những công việc sau:
- Sắp xếp các đơn thức trong vector theo thứ tự giảm dần độ lớn của các đơn thức
- Nếu đơn thức nào đó có hệ số bằng 0 thì loại bỏ đơn thức này ra khỏi
vector
- Nếu đơn thức hiện hành và đơn thức nằm ngay phía sau trong vector
có cùng số mũ thì thay thế hai đơn thức này bằng một đơn thức khác
có hệ số là tích của hai đơn thức đó, số mũ là tổng số mũ của hai đơn thức đó
- Sau quá trình ở trên, nếu vector rỗng (không còn một đơn thức thành
viên nào trong vector) thì chèn một đơn thức có giá trị 0 vào vector
Trang 17Trong lớp đa thức, chúng tôi đã xây dựng 3 hàm tạo:
polynomial(const monomial &m=0);
polynomial(const vector <monomial> &p);
polynomial(const polynomial &p);
- polynomial(const polynomial &p) là hàm dùng để sao chép giá trị của
đa thức p cho đa thức đang được trỏ tới bởi con trỏ this Hàm này chỉ đơn giản gán giá trị của vector pol của hai đa thức cho nhau
3.5 Xây dựng các toán tử cho đa thức
3.5.1 Nhóm các toán tử số học
Nhóm các toán tử này bao gồm:
friend polynomial operator +(const polynomial &p1, const polynomial &p2);
friend polynomial operator -(const polynomial &p1, const polynomial &p2);
friend polynomial operator *(const polynomial &p1, const polynomial &p2);
friend polynomial operator /(const polynomial &p1, const polynomial &p2);
friend polynomial operator %(const polynomial &p1, const polynomial &p2);
Trong đó:
Toán tử cộng
Toán tử này được định nghĩa như sau:
polynomial operator +(const polynomial &p1, const polynomial &p2)
Trang 19Toán tử này làm những công việc như sau:
- Khai báo một vector rt dùng để lưu trữ kết quả tạm thời, có kiểu dữ liệu là monomial
- Khai báo hai biến i, j có kiểu nguyên lần lượt dùng để duyệt hai đa thức p1 và p2
- Thực hiện công việc cộng hai đa thức với tư tưởng như sau: Nếu i có giá trị lớn hơn chỉ số của đơn thức cuối cùng của p1 thì thêm đơn thức
có chỉ số j của p2 vào rt rồi sau đó tăng j lên 1; ngược lại, nếu j có giá trị lớn hơn chỉ số của đơn thức cuối cùng của p2 thì thêm đơn thức có chỉ số i của p1 vào rt rồi sau đó tăng i lên 1; ngược lại, nếu đơn thức
có chỉ số i của p1 và j của p2 có cùng số mũ thì thêm đơn thức có giá trị là tổng của p1[i] và p2[j] vào rt rồi tăng cả i và j lên 1, ngược lại thêm đơn thức có số mũ lớn hơn vào rt rồi sau đó tăng chỉ số lên 1
Toán tử này được định nghĩa một cách tương tự như toán tử cộng, chỉ khác
ở phép toán đại số được thực hiện trong toán tử là trừ thay vì cộng
Toán tử nhân
Toán tử này được định nghĩa như sau:
polynomial operator *(const polynomial &p1, const polynomial &p2)
{
vector <monomial> rt;
for (int i=0; i<p1.size(); i++)
for (int j=0; j<p2.size(); j++)
rt.push_back(p1[i]*p2[j]);
polynomial result(rt);
return result;
}
Trang 20Toán tử này được khai báo là bạn của lớp, dùng để nhân hai đa thức p1 và
p2 với nhau, đa thức kết quả được trả về qua lời gọi hàm
Toán tử này thực hiện những công việc sau:
- Khai báo vector rt có kiểu monomial dùng để lưu trữ tạm thời đa thức
- Trả về đa thức result thông qua lời gọi hàm
Toán tử chia lấy phần nguyên
polynomial operator /(const polynomial &p1, const polynomial &p2)