1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Xử lý đa thức bằng danh sách liên kết ppt

11 4K 84

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 132,05 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Xử lý đa thức bằng danh sách liên kết Khai báo danh sách liên kết đơn lưu trữ một đa thức.. Viết các hàm :  Nhập đa thức vào danh sách liên kết..  Tính giá trị của một đa thức với X

Trang 1

Xử lý đa thức bằng danh sách liên kết Khai báo danh sách liên kết đơn lưu trữ một đa thức Viết các hàm :

 Nhập đa thức vào danh sách liên kết

In đa thức

Cộng hai đa thức

Nhân hai đa thức

 Tính giá trị của một đa thức với X cho trước

Khai báo các struct cần thiết: Mỗi đa thức gồm nhiều đơn thức, mỗi đơn thức là

một số hạng có dạng aX^b, như vậy mỗi đơn thức cần 2 thành phần: hệ số và số

struct Donthuc

{

float heso;

int somu;

};

struct Node

{

Donthuc Info;

Node *pNext;

};

struct Dathuc

Trang 2

{

Node *pHead;

};

void ListInit(Dathuc &tmp)

{

tmp.pHead=0;

}

Để nhập đa thức vào danh sách liên kết trước hết ta cần khai báo hàm thêm một đơn thức vào danh sách liên kết, đơn thức thêm vào sẽ đảm bảo thứ tự lũy thừa giảm dần và không trùng bậc lũy thừa, như vậy cần xét trong danh sách liên kết nếu đã có đơn thức cùng bậc lũy thừa thì sẽ cộng hệ số vào đơn thức đó, nếu chưa

có thì đơn thức mới sẽ được thêm vào trước đơn thức có bậc lũy thừa nhỏ hơn nó void Add(Dathuc &L, Donthuc t)

{

Node *tmp = new Node;

tmp->Info = t;

//Nếu danh sách rỗng hoặc số mũ đầu danh sách nhỏ hơn số mũ đơn thức thì sẽ thêm vào đầu danh sách

if (L.pHead == NULL || L.pHead->Info.somu < t.somu)

{

tmp->pNext=L.pHead;

Trang 3

L.pHead=tmp;

}

else

{

Node *cur=L.pHead;

//Tìm vị trí mà đơn thức đứng sau nó có số mũ nhỏ hơn số mũ đơn thức cần thêm

while (cur->pNext && cur->pNext->Info.somu >= t.somu)

{

cur=cur->pNext;

}

//Nếu vị trí tìm được có số mũ bằng với số mũ đơn thức cần thêm thì chỉ cần cộng hệ số vào đơn thức tại đó

if (cur->Info.somu == t.somu)

cur->Info.heso += t.heso;

else

{

//Thêm vào sau vị trí tìm được

tmp->pNext = cur->pNext;

cur->pNext=tmp;

}

Trang 4

}

}

Nhập đa thức: ta lần lượt nhập hệ số và số mũ cho đến khi nhập xong lũy thừa bậc

0 thì kết thúc nhập

void NhapDathuc(List &tmp)

{

Donthuc t;

do

{

cout<<endl<<"He so: "; cin>>t.heso;

cout<<"So mu: "; cin>>t.somu;

Add(tmp,t);

}

while (t.somu>0);

}

In đa thức ra màn hình (xuất đa thức), vì đa thức nhập vào đã đảm bảo thứ tự giảm dần bậc lũy thừa nên ta chỉ cần duyệt hết danh sách và in ra từng đơn thức theo

dạng aX^b, để biểu thức in ra được đẹp hơn thì cần kiểm tra một số chi tiết sau:

Nếu hệ số bằng 0 thì bỏ qua, nếu hệ số nhỏ hơn không thì không in dấu “+” giữa các đơn thức, nếu số mũ bằng 0 thì chỉ in hệ số

void XuatDathuc(List L)

{

Trang 5

Node *cur=L.pHead;

if (cur)

{

cout<<cur->Info.heso<<"X^"<<cur->Info.somu;

cur=cur->pNext;

}

while (cur)

{

if (cur->Info.heso)

{

if (cur->Info.heso>0) cout<<"+";

cout<<cur->Info.heso;

if (cur->Info.somu) cout<<"X^"<<cur->Info.somu;

}

cur=cur->pNext;

}

}

Cộng 2 đa thức, với hàm thêm một đơn thức vào đa thức trên thì việc cộng 2 đa thức hết sức dễ dàng, chỉ việc tạo một đa thức mới rồi duyệt qua 2 đa thức và thêm từng đơn thức vào đa thức mới

Dathuc Cong2Dathuc(Dathuc a, Dathuc b)

Trang 6

{

Dathuc tmp;

DathucInit(tmp);

Node *cur = a.pHead;

while (cur)

{

Add(tmp,cur->Info);

cur=cur->pNext;

}

cur = b.pHead;

while (cur)

{

Add(tmp,cur->Info);

cur=cur->pNext;

}

return tmp;

}

Nhân 2 đa thức thì lấy từng đơn thức của đa thức này nhân với từng đơn thức của

đa thức kia rồi thêm vào một đa thức mới

Trang 7

Dathuc Nhan2Dathuc(Dathuc a, Dathuc b)

{

Dathuc tmp;

DathucInit(tmp);

Node *cur_a=a.pHead;

Node *cur_b;

Donthuc t;

while (cur_a)

{

cur_b=b.pHead;

while (cur_b)

{

t.heso = cur_a->Info.heso * cur_b->Info.heso; t.somu = cur_a->Info.somu + cur_b->Info.somu; Add(tmp,t);

cur_b=cur_b->pNext;

}

cur_a=cur_a->pNext;

Trang 8

}

return tmp;

}

Cần một hàm rút gọn đa thức để xóa đi các đơn thức có hệ số bằng 0 trong đa thức void Rutgon(Dathuc &tmp)

{

Node *cur;

while (tmp.pHead && tmp.pHead->Info.heso==0)

{

cur=tmp.pHead;

tmp.pHead = tmp.pHead->pNext;

delete cur;

}

if (tmp.pHead)

{

cur=tmp.pHead;

while (cur->pNext)

{

Trang 9

if (cur->pNext->Info.heso == 0)

{

Node *del = cur->pNext;

cur->pNext = del->pNext;

delete del;

}

else

cur=cur->pNext;

}

}

}

Tính giá trị đa thức

float TinhGiatri(float X, Dathuc L)

{

float Ret=0;

Node *cur=L.pHead;

while (cur)

{

Ret += cur->Info.heso * pow(X,cur->Info.somu);

Trang 10

cur=cur->pNext;

}

return Ret;

}

Ví dụ sử dụng các hàm trên

void main()

{

Dathuc A,B,C,D;

DathucInit(A);

DathucInit(B);

DathucInit(C);

float X;

cout<<"Nhap da thuc thu nhat: "<<endl; NhapDathuc(A);

cout<<"Da thuc thu nhat: "<<endl;

XuatDathuc(A);

cout<<endl<<"Nhap da thuc thu hai: "<<endl; NhapDathuc(B);

cout<<endl<<"Da thuc thu hai: "<<endl;

Trang 11

XuatDathuc(B);

C=Cong2Dathuc(A,B);

cout<<endl<<"Tong hai da thuc: "<<endl;

Rutgon(C);

XuatDathuc(C);

cout<<endl<<"X = ";

cin>>X;

cout<<endl<<"Gia tri da thuc tong: "<<TinhGiatri(X,C)<<endl;

D=Nhan2Dathuc(A,B);

cout<<endl<<"Tich hai da thuc: "<<endl;

Rutgon(D);

XuatDathuc(D);

cout<<endl<<"X = ";

cin>>X;

cout<<endl<<"Gia tri da thuc tich: "<<TinhGiatri(X,D)<<endl; }

Ngày đăng: 13/08/2014, 19:21

TỪ KHÓA LIÊN QUAN

w