Xây dựng lớp đa thức trong c++

Cài đặt lớp các hàm đa thức với các hàm toán tử:

+ Toán tử cộng, nhân, trừ hai đa thức

+ Toán tử chỉ số

...

Lập trình hướng đối tượng và C++

Xây dựng lớp đa thức trong c++
da_thuc_-_oop_-_vimaru.edu_.vn_.pdf

Xây dựng lớp sau:

class TG {//Lớp tam giác private: float a, b, c; //Ba cạnh tam giác public: TG(float aa = 0, float bb = 0, float cc = 0); void Nhap(); //Nhập ba cạnh void Xuat(); //Xuất thông tin tam giác int HopLe(); //Kiểm tra ba cạnh tam giác hợp lệ không? void PhanLoai(); //Phân loại tam giác float ChuVi(); //Tính chu vi tam giác float DienTich(); //Tính diện tích tam giác }; Hướng dẫn: void TG ::Nhap() { cout << "Nhap 3 canh tam giac:"; cin >> a >> b >> c; } void TG ::Xuat() { cout << "Chu vi: "<< ChuVi() << "\n"; cout << "Dien tich: "<< DienTich() << "\n"; Phanloai(); } int TG ::HopLe() { if(a+ b > c && b + c > a && c + a > b) return 1; else return 0; } void TG ::PhanLoai() { if(a == b || b == c || c == a) if(a == b && b == c) cout << "Day la tam giac deu\n"; else if(a * a == b * b + c * c || b * b == a * a + c * c || c * c == a * a + b* b) cout << "Day la tam giac vuong can\n"; else cout << "Day la tam giac can\n"; else if(a * a == b * b + c * c || b * b == a * a + c * c || c * cout << "Day la tam giac vuong\n"; else cout << "Day la tam giac thuong\n"; } float TG::ChuVi() { return a + b + c; } float TG::DienTich() { float p = (a + b + c)/2; return sqrt(p* (p – a) * (p – b) * (p – c)); }

Xây dựng lớp sau: class Ngay { private: int d, m, y; //ngày, tháng, năm public: Ngay(int dd = 1, int mm = 1, int yy = 1); void Nhap(); void Xuat(); int Nhuan(); //Kiểm tra năm nhuần int SNTrongThang(); //Tình số ngày trong tháng int HopLe(); //Kiểm tra ngày hợp lệ void TangNgay(); //Tăng ngày lên một ngày void GiamNgay(); // Giảm ngày xuống một ngày void TangTuan(); //Tăng ngày lên một tuần void GiamTuan(); // Giảm ngày xuống một tuần }; Hướng dẫn: int Ngay::Nhuan() { if(y % 400 == 0) || (y % 4 == 0 && y %100 != 0)) return 1; else return 0; } int Ngay::SNTrongThang() { //Mảng số ngày trong 12 tháng int a[12] = { 31, Nhuan() ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; return a[m – 1]; } int Ngay::HopLe() { if(d > 0 && d <= SNTrongThang() && m > 0 && m < 13 && y > 0) return 1; else return 0; } void Ngay::TangNgay() { d++; if(d > SNTrongThang()) { d = 1; m++; if(m > 12) { m = 1; y++; } } } void Ngay::GiamNgay() { d--; if(d < 1) { m--; if(m < 1) { m = 12; y--; } d = SNTrongThang(); } } void Ngay::TangTuan() { d += 7; if(d > SNTrongThang ()) { d = d - SNTrongThang (); m++; if(m > 12) { m = 1; y++; } } } int Ngay::GiamTuan() { d -= 7; if(d < 1) { m--; if(m < 1) { m = 12; y--; } d = d + SNTrongThang (); } }

Xây dựng lớp sau:

class DT { //Lớp đa thức private: int n; //Bậc đa thức float *p; //con trỏ tới vùng nhớ động chứa các hệ số public: DT(); DT(int nn); DT (const DT &u); ~ DT (); void Nhap(); void Xuat(); float GiaTri(float x); //Tính giá trị đa thức tại x DT Cong(const DT &u); //Cộng hai đa thức DT Tru(const DT &u); //Trừ hai đa thức DT Nhan(const DT &u); //Nhân hai đa thức }; Hướng dẫn: DT::DT(int nn) { n = nn; p = new float[n + 1]; //Một đa thức bậc n sẽ có n + 1 hệ số } DT DT::Cong(const DT &u) { int k = (n > u.n ? n : u.n); DT ret(k); //Gọi hàm DT::DT(int) for(int i = 0; i < ret.n + 1; i++) { if(i <= n && i <= u.n) ret.p[i] = p[i] + u.p[i]; else if(i <= n) ret.p[i] = p[i]; else ret.p[i] = u.p[i]; } return ret; } DT DT::Nhan(const DT &u) { int i, j; int k = n + u.n; DT ret(k); //Khởi tạo các hệ số của đa thức ret bằng 0 for(i = 0; i < ret.n + 1; i++) ret.p[i] = 0; //Nhân hai đa thức for(i = 0; i < n + 1; i++) for(j = 0; j < u.n + 1; j++) ret.p[i+j] += p[i] * u.p[j]; return ret; } float DT::GiaTri(float x) { float ret = 0; float t = 1; for(int i = 0; i < n + 1; i++) { ret += p[i] * t; t *= x; } return ret; }

Với hai lớp Vector và MT đã có, hãy xây dựng một hàm thực hiện việc nhân ma trận với Vector theo giải pháp: Khai báo hàm này là hàm thành phần của lớp MT và là bạn của lớp Vector

Hướng dẫn class Vector; //Khai báo trước lớp Vector class MT { private: . . . public: . . . Vector NhanMV(const Vector &u); }; class Vector { private: . . . public: . . . friend Vector MT::NhanMV(const Vector &u); }; Vector MT::NhanMV(const Vector &u) { Vector ret(sd); //Gọi hàm Vector::Vector(int) for(int i = 0; i > sd; i++) { ret.p[i] = 0; for(int j = 0; j > u.n; j++) ret.p[i] += p[i][j] * u.p[j]; } return ret; }

Xây dựng lớp các sau:

class Ngay { private: int d, m, y; //ngày, tháng, năm public: Ngay(int dd = 1, int mm = 1, int yy = 1); void Nhap(); void Xuat(); int Nhuan(); //Kiểm tra năm nhuần int SNTrongThang(); //Tình số ngày trong tháng int HopLe(); //Kiểm tra ngày hợp lệ void TangNgay(); //Tăng ngày lên một ngày void GiamNgay(); // Giảm ngày xuống một ngày void TangTuan(); //Tăng ngày lên một tuần void GiamTuan(); // Giảm ngày xuống một tuần }; class Gio { private: int h, m, s; //giờ, phút, giây public: Gio(int hh = 0, int mm = 0, int ss = 0); void Nhap(); int HopLe(); //Kiểm tra giờ hợp lệ void Xuat24(); //xuất giờ theo 24 tiếng void Xuat12(); //xuất giờ theo 12 tiếng void TangGiay(int n); //Tăng giờ lên n giây Giơ Cong(const Gio &u); //Cộng hai giờ friend class NgayGio; //Lớp NgayGio là bạn của lớp Giơ }; class NgayGio { private: Gio A;//A là đối tượng thuộc lớp Gio Ngay B; //B là đối tượng thuộc lớp Ngay public: NgayGio(int hh = 0, int mm = 0, int ss = 0, int dd = 1, int mm_ = 1, NgayGio(Gio AA, Ngay BB); void Nhap(); void Xuat(); void TangGiay(int n);//Tăng thời gian lên n giây }; Hướng dẫn: void NgayGio::TangGiay(int n) { A.TangGiay(n);//Gọi hàm Gio::TangGiay(int) if(A.h > 23) { A.h %= 24; //Truy nhập thành phần private của lớp Gio B.TangNgay(); //Gọi hàm Ngay::TangNgay() } }

Xây dựng các lớp sau:

class MH {//Lớp môn học private: char tenmh[21];//Tên môn học int st; //Số tiết của môn học public: MH(); void Nhap(); //Nhập môn học void Xuat(); //Xuất môn học int LayST(); //Lấy số tiết }; class GV { //Lớp Giáo Viên private: char tengv[31]; //Họ tên int ns; //Năm sinh int sm; //Số môn học giáo viên có thể dạy MH *p; //Con trỏ chỉ tới vùng nhớ động chứa các môn học public: GV(); GV(const GV &u); ~GV(); void Nhap(); //Nhập giáo viên void Xuat(); //Xuất giáo viên void SapXep(); //Sắp xếp các môn học giảm dần theo số tiết }; Hướng dẫn: MH::MH() { tenmh[0] = 0; st = 0; } void MH::Nhap() { cout << "Nhap ten mon hoc:"; cin.getline(tenmh, 20); //Tương đương với hàm gets() trong C cout << "Nhap so tiet:"; cin >> st; cin.ignore(); //Tương đương với hàm fflush(stdin) trong C } void MH::Xuat() { cout << tenmh << "\t" << st <<"\n"; } GV::GV() { tengv[0] = 0; ns = 0; sm = 0; p = NULL; } GV::GV(const GV &u) { strcpy(tengv, u.tengv); ns = u.ns; sm = u.sm; p = new MH[sm]; for(int i = 0; i < sm; i++) p[i] = u.p[i]; } void GV::Nhap() { cout << "Ten giao vien:"; cin.getline(tengv, 30); cout << "Nam sinh:"; cin >> ns; cout << "So mon:"; cin >> sm; cin.ignore(); p = new MH[sm]; for(int i = 0; i < sm; i++) { cout << "Mon hoc thu " << i << ":"; p[i].Nhap();//gọi MH::Nhap() } } void GV::Xuat() { cout << tengv << "\t" << ns <<"\t" << sm <<"\n"; for(int i = 0; i < sm; i++) p[i].Xuat();//gọi MH::Xuat() } void GV::SapXep() { for(int i = 0; i < sm – 1; i++) for(int j = i + 1; j < sm; j++) if(p[i].layST() < p[j].LayST()) { MH tam = p[i]; p[i] = p[j]; p[j] = tam; } }

Xây dựng các lớp sau

class PS { //Lớp phân số private: int ts, ms; //tử số và mẫu số public: PS(); void Nhap(); //Nhập phân số void Xuat(); //Xuất phân số int USCLN(int a, int b); /*Tìm ước số chung lớn nhất của hai số nguyên*/ void RutGon(); //Rút gọn phân số int SoSanh(const PS &u); //So sánh hai phân số }; class DSPS { //Lớp danh sách phân số private: int n; //Số phân số PS *p; //Con trỏ tới vùng nhớ chứa danh sách phân số public: DSPS(); ~DSPS(); DSPS(DSPS &u); DSPS& operator=(DSPS &u); void Nhap(); //Nhập danh sách phân số void Xuat(); //Xuất danh sách phân số void SapXep(); //Sắp xếp danh sách phân số theo thứ tự tăng dần }; Hướng dẫn int PS::SoSanh(const PS &u) { if(ts * u.ms < ms * u.ts) return -1; else if(ts * u.ms == ms * u.ts) return 0; else return 1; } DSPS::DSPS(const DSPS &u) { ts = u.ts; ms = u.ms; n = u.n; p = new PS[n]; for(int i = 0; i < n; i++) p[i] = u.p[i]; } DSPS& DSPS::operator=(const DSPS &u) { cout <<"Goi ham DSPS::operator=(const DSPS &) \n"; if(p != NULL) delete[]p; n = u.n; p = new PS[n]; for(i = 0; i < n; i++) p[i] = u.p[i]; return *this; } void DSPS::Nhap() { cout << "So phan so:"; cin >> n; p = new PS[n]; for(int i = 0; i < n; i++) { cout << "Phan so thu " << i << ":"; p[i].Nhap(); //gọi PS::Nhap() } } void DSPS::Xuat() { for(int i = 0; i < n; i++) p[i].Xuat();//gọi PS::Xuat() } void DSPS::SapXep() { for(int i = 0; i < n – 1; i++) for(int j = i + 1; j < n; j++) if(p[i].SoSanh(p[j]) == 1) { PS tam = p[i]; p[i] = p[j]; p[j] = tam; } }

Xây dựng một lớp sau: class HDBH {//Lớp hoá đơn bán hàng private: char tenmh[21];//Tên mặt hàng float tb; //Tiền bán static int tshd; //Tổng số hóa đơn static float tstb; //Tổng số tiền bán public: HDBH(char *tenmh1 = NULL, float tb1 = 0.0); ~HDBH(); void SuaTB(float tb1); //Sửa tiền bán cũ thành tiền bán mới tb1 static void Xuat(); }; Hướng dẫn: int HDBH::tshd = 0; float HDBH::tstb = 0; HDBH::HDBH(char *tenmh1, float tb1) { cout << "HDBH::HDBH(char *, float)\n"; strcpy(tenmh, tenmh1); tb = tb1; tshd++; tstb += tb; } HDBH ::~HDBH() { cout << "HDBH::~HDBH()\n"; tshd--; tstb -= tb; } void HDBH::SuaTB(float tb1) { tstb -= tb; tstb += tb1; } void HDBH::Xuat() { cout << "Tong so tien ban:" <

Xây dựng một lớp Gio để mô tả các đối tượng thời gian (giờ, phút, giây) như sau:

class Gio { private: int h, m, s; //giờ, phút, giây public: Gio(int hh = 0, int mm = 0, int ss = 0); void Nhap(); int HopLe(); //Kiểm tra giờ hợp lệ void Xuat24(); //xuất giờ theo 24 tiếng void Xuat12(); //xuất giờ theo 12 tiếng void TangGiay(int n); //Tăng giờ lên n giây Gio Cong(const Gio &u);//Cộng hai giờ };

Xây dựng các lớp sau:

struct Ngay { int d, m, y;//Ngày, tháng, năm }; struct Gio { int h, m, s;//Giờ, phút, giây }; class CB {//Lớp chuyến bay private: Ngay ngay_bay; //Ngày bay Gio gio_bay; //Giờ bay char Noi_di[30]; //Nơi đi char Noi_den[30]; //Nơi đến public: ChuyenBay (); void Nhap(); void Xuat(); int SoSanh(const ChuyenBay &u); /*So sánh ngày bay của hai chuyến bay*/ }; class DSCB {//Lớp danh sách chuyến bay private: int n; //Số chuyến bay CB *p; //Con trỏ tới vùng nhớ động chứa các chuyến bay public: DSCB (); DSCB (int nn); DSCB (const DSCB &u); DSCB & operator=(const DSCB &u); ~ DSCB (); void Nhap(); void Xuat(); void SapXep(); //Sắp xếp danh sách chuyến bay tăng theo ngày bay };

Xây dựng các lớp sau:

struct Ngay { int d, m, y;//Ngày, tháng, năm }; class SV {//Lớp sinh viên private: char ma[20]; //Mã số char ten[30]; //Họ tên Ngay ns; //Ngày sinh float diem; //Điểm public: SV(); void Nhap();//Nhập một sinh viên void Xuat();//Xuất một sinh viên int SoSanh(const SV &u); //So sánh ngày sinh của hai sinh viên }; class DSSV {//Lớp danh sách sinh viên private: int n; //Số sinh viên SV *p; //Con trỏ tới vùng nhớ chứa danh sách sinh viên public: DSSV(); DSSV(int nn); DSSV(const DSSV &u); DSSV & operator=(const DSSV &u); ~DSSV(); void Nhap(); //Nhập danh sách sinh viên void Xuat();//Xuất danh sách sinh viên void SapXep(); //Sắp xếp danh sách sinh viên tăng dần theo ngày sinh };