Lập Trình Hướng đối Tượng
|

Bài tập lập trình Hướng đối tượng tổng hợp

Đây là bài viết cuối cùng trong Series Lập Trình Hướng Đối Tượng. Và trong bài viết này chúng ta sẽ làm một số bài tập lập trình hướng đối tượng tổng hợp nhé.

Sau đây, chúng ta sẽ cùng nhau đi làm 1 bài tập lập trình hướng đối tượng khá cơ bản:

Bài tập lập trình hướng đối tượng cơ bản

Bài tập xây dựng lớp Phân số

Đề bài:

Xây dựng lớp Phanso gồm:

  • Thuộc Tính: tuso, mauso.
  • Phương thức:
    • Hàm Khởi Tạo Không Tham Số, Hàm Hủy
    • Nhập , Xuất
    • Cong(), Tru(), Nhan(), Chia()

Tính Tổng, Hiệu, Tích, Thương 2 phân số obj1obj2 rồi in kết quả ra màn hình

Code xây dựng class Phân số:

#include <bits/stdc++.h>
using namespace std;

class Phanso
{
private:
    int tuso, mauso;

public:
    Phanso()
    {
        tuso = 0;
        mauso = 1;
    }

    ~Phanso()
    {
        tuso = 0;
        mauso = 1;
    }
//-----------------------------------------------------------------//
    void set()
    {
        cout << "Nhap Tu So: "; cin >> this->tuso;
        cout << "Nhap Mau So: "; cin >> this-> mauso;
    }

    void get()
    {
        cout << this->tuso << "/" << this->mauso << endl;
    }
//-----------------------------------------------------------------//
    Phanso Cong(Phanso obj1, Phanso obj2)
    {
        Phanso obj3;
        obj3.tuso = obj1.tuso * obj2.mauso + obj1.mauso * obj2.tuso;
        obj3.mauso = obj1.mauso * obj2.mauso;
        return obj3;
    }
    Phanso Tru(Phanso obj1, Phanso obj2)
    {
        Phanso obj3;
        obj3.tuso = obj1.tuso * obj2.mauso - obj1.mauso * obj2.tuso;
        obj3.mauso = obj1.mauso * obj2.mauso;
        return obj3;
    }
    Phanso Nhan(Phanso obj1, Phanso obj2)
    {
        Phanso obj3;
        obj3.tuso = obj1.tuso * obj2.tuso;
        obj3.mauso = obj1.mauso * obj2.mauso;
        return obj3;
    }
    Phanso Chia(Phanso obj1, Phanso obj2)
    {
        Phanso obj3;
        obj3.tuso = obj1.tuso * obj2.mauso;
        obj3.mauso = obj1.mauso * obj2.tuso;
        return obj3;
    }
};

int main()
{
    Phanso obj1, obj2, obj3;
    obj1.set(); obj2.set();

    obj3 = obj3.Cong(obj1, obj2); obj3.get();
    obj3 = obj3.Tru(obj1, obj2); obj3.get();
    obj3 = obj3.Nhan(obj1, obj2); obj3.get();
    obj3 = obj3.Chia(obj1, obj2); obj3.get();

    return 0;
}

Input:

1 2
3 4

Output

10/8
-2/8
3/8
4/6

Bài Tập quản lý Vận động viên

Đề bài

Xây dựng lớp vận động viên VanDongVien gồm:

  • Thuộc tính: hoten (chuỗi ký tự), tuoi (số nguyên), monthidau (chuỗi ký tự), cannang (số thực), chieucao (số thực).
  • Phương thức:
    • Thiết lập không tham số.
    • Thiết lập 5 tham số
    • Hủy bỏ
    • Nạp chồng toán tử nhập >>
    • Nạp chồng toán tử xuất <<
    • Nạp chồng toán tử so sánh > (một vận động viên là lớn hơn nếu chiều cao lớn hơn,
      trong trường hợp chiều cao bằng nhau thì xét cân nặng lớn hơn)

Xây dựng chương trình chính:

  • Khai báo p là đối tượng lớp Vandongvien (sử dụng hàm thiết lập 5 tham số), hiển thị thông tin của p ra màn hình.
  • Nhập vào một mảng gồm n vận động viên.
  • Hiển thị danh sách đã nhập ra màn hình.
  • Sắp xếp mảng đã nhập theo thứ tự tăng dần, hiển thị danh sách đã sắp ra màn hình.

Lời Giải:

#include <bits/stdc++.h>
using namespace std;

class VanDongVien
{
protected:
    string hoten, monthidau;
    int tuoi;
    float cannang, chieucao;

public:
    VanDongVien()
    {
        this->hoten = this->monthidau = "";
        this->tuoi = 0;
        this->cannang = this->chieucao = 0;
    }
    
    VanDongVien(string hoten, string monthidau, int tuoi, float cannang, float chieucao)
    {
        this->hoten = hoten;
        this->monthidau = monthidau;
        this->tuoi = tuoi;
        this->cannang = cannang;
        this->chieucao = chieucao;
    }
    ~VanDongVien()
    {
        this->hoten = this->monthidau = "";
        this->tuoi = 0;
        this->cannang = this->chieucao = 0;
    }
    //----------------------------------------------//
    friend istream &operator>>(istream &is, VanDongVien &obj)
    {
        cin.ignore();
        cout << "Nhap Ho Ten: "; fflush(stdin); getline(is, obj.hoten);
        cout << "Nhap Mon Thi Dau: "; fflush(stdin); getline(is, obj.monthidau);
        cout << "Nhap Tuoi: "; is >> obj.tuoi;
        cout << "Nhap Can Nang: "; is >> obj.cannang;
        cout << "Nhap Chieu Cao: "; is >> obj.chieucao;
        return is;
    }

    friend ostream &operator<<(ostream &os, VanDongVien obj)
    {
        cout << "Ho Ten: " << obj.hoten << endl;
        cout << "Mon Thi Dau: " << obj.monthidau << endl;
        cout << "Tuoi: " << obj.tuoi << endl;
        cout << "Can Nang: " << obj.cannang << endl;
        cout << "Chieu cao: " << obj.chieucao << endl;
        return os;
    }

    bool operator > (const VanDongVien &obj)
    {
        if (this->chieucao > obj.chieucao)
            return true;
        else if (this->chieucao < obj.chieucao)
            return false;
        else if (this->cannang > obj.cannang)
            return true;
        else
            return false;
    }
};

void swap(VanDongVien &a, VanDongVien &b)
{
    VanDongVien temp = a;
    a = b;
    b = temp;
}

void Bubblesort(VanDongVien arr[], int n)
{
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
}

int main()
{  
    VanDongVien p("Nguyen Van A", "Bong Da", 20, 178, 70.5);
    cout << p;
    


    cout << "Nhap So Luong: "; int n; cin >> n;
    VanDongVien *arr = new VanDongVien[n];

    for (int i = 0; i < n; ++i) cin >> arr[i];

    cout << endl << endl;
    for (int i = 0; i < n; ++i) cout << arr[i] << endl;
    
    cout << "Sort" << endl;
    Bubblesort(arr,n);
    for (int i = 0; i < n; ++i) cout << arr[i] << endl;

    return 0;
}

Input

3
Nguyen Van B
Cau Long
20
80
190
Nguyen Van C
Bong Chuyen
21
78
188
Nguyen Van D
Boi Loi
19
81
188

Output

Ho Ten: Nguyen Van A
Mon Thi Dau: Bong Da
Tuoi: 20
Can Nang: 178
Chieu cao: 70.5

Ho Ten: Nguyen Van B
Mon Thi Dau: Cau Long
Tuoi: 20
Can Nang: 80
Chieu cao: 190

Ho Ten: Nguyen Van C
Mon Thi Dau: Bong Chuyen
Tuoi: 21
Can Nang: 78
Chieu cao: 188

Ho Ten: Nguyen Van D
Mon Thi Dau: Boi Loi
Tuoi: 19
Can Nang: 81
Chieu cao: 188

Sort
Ho Ten: Nguyen Van C
Mon Thi Dau: Bong Chuyen
Tuoi: 21
Can Nang: 78
Chieu cao: 188

Ho Ten: Nguyen Van D
Mon Thi Dau: Boi Loi
Tuoi: 19
Can Nang: 81
Chieu cao: 188

Ho Ten: Nguyen Van B
Mon Thi Dau: Cau Long
Tuoi: 20
Can Nang: 80
Chieu cao: 190

Bài Tập OOP nâng cao

Bài Tập quản lý bán vé máy bay

Đề bài

Xây dựng lớp Vemaybay gồm:

  • Thuộc tính: tenchuyen, ngaybay, giave
  • Phương thức:
    • Cấu tử
    • Hủy
    • Nhap
    • Xuat
    • getgiave() : hàm trả về giá vé

Xây dựng lớp Nguoi gồm:

  • Thuộc tính: hoten, gioitinh, tuoi
  • Phương thức:
    • Cấu tử
    • Hủy
    • Nhập
    • Xuất

Xây dựng lớp Hanhkhach (mỗi hành khách được mua nhiều vé) kế thừa lớp Nguoi bổ
sung thêm:

  • Thuộc tính: Vemaybay *ve; int soluong;
  • Phương thức:
    • Cấu tử
    • Hủy
    • Nhập
    • Xuất
    • tongtien(): trả về Tổng số tiền phải trả của hành khách

Chương trình chính: Nhập vào 1 danh sách n hành khách (n nhập từ bàn phím).
Hiển thị danh sách hành khách và số tiền phải trả tương ứng của mỗi khách hàng.
Sắp xếp danh sách hành khách theo chiều giảm dần của Tổng tiền.

Lời Giải

#include <bits/stdc++.h>
using namespace std;

class Date
{
protected:
    int day, month, year;

public:
    Date()
    {
        this->day = this->month = this->year = 0;
    }
    ~Date()
    {
        this->day = this->month = this->year = 0;
    }
    void input()
    {
        cout << "Nhap Ngay: ";
        cin >> this->day;
        cout << "Nhap Thang: ";
        cin >> this->month;
        cout << "Nhap Nam: ";
        cin >> this->year;
    }
    void output()
    {
        cout << "Ngay/Thang/Nam: " << this->day << "/" << this->month << "/" << this->year << endl;
    }
};
//-------------------------------------------------------------//
class Vemaybay
{
protected:
    string tenchuyen;
    Date ngaybay;
    int giave;

public:
    Vemaybay()
    {
        this->tenchuyen = "";
        this->giave = 0;
    }
    ~Vemaybay()
    {
        this->tenchuyen = "";
        this->giave = 0;
    }
    void input()
    {
        cin.ignore();
        cout << "Nhap Ten Chuyen: "; fflush(stdin); getline(cin, this->tenchuyen);
        cout << "Nhap Ngay Bay: " << endl;
        ngaybay.input();
        cout << "Nhap Gia Ve: "; cin >> this->giave;
    }
    void output()
    {
        cout << "Ten Chuyen: " << this->tenchuyen << endl;
        cout << "Ngay Bay: " << endl << "\t";
        this->ngaybay.output();
        cout << "Gia Ve: " << this->giave << endl;
    }
    int getgiave()
    {
        return this->giave;
    }
};

class Nguoi
{
protected:
    string hoten, gioitinh;
    int tuoi;

public:
    Nguoi()
    {
        this->hoten = this->gioitinh = "";
        this->tuoi = 0;
    }
    ~Nguoi()
    {
        this->hoten = this->gioitinh = "";
        this->tuoi = 0;
    }
    void input()
    {
        cin.ignore();
        cout << "Nhap Ho Ten: "; fflush(stdin); getline(cin, this->hoten);
        cout << "Nhap Gioi Tinh: "; fflush(stdin); getline(cin, this->gioitinh);
        cout << "Nhap Tuoi: "; cin >> this->tuoi;
    }
    void output()
    {
        cout << "Ho Ten: " << this->hoten << endl;
        cout << "Gioi Tinh: " << this->gioitinh << endl;
        cout << "Tuoi: " << this->tuoi << endl;
    }
};

class Hanhkhach : public Nguoi
{
protected:
    int soluong;
    //Vemaybay *ve;
    Vemaybay ve[1000];
    int tongtien;

public:
    Hanhkhach()
    {
        this->soluong = 0;
        //this->ve = new Vemaybay[this->soluong];
        ve[this->soluong];
        tongtien = 0;
    }
    ~Hanhkhach()
    {
        soluong = 0;
        delete []ve;
        tongtien = 0;
    }
    void input()
    {
        Nguoi :: input();
        cout << "Nhap So Luong Ve Hanh Khach Da Mua: "; cin >> this->soluong;
        //ve = new Vemaybay[this->soluong];
        ve[this->soluong];
        for (int i = 0; i < this->soluong; ++i)
        {
            ve[i].input();
            tongtien += ve[i].getgiave();
        }
    }
    void output()
    {
        cout << "- Thong Tin Khach Hang: " << endl;
        Nguoi :: output();
        cout << "- Thong Tin Chuyen Bay: " << endl;
        for (int i = 0; i < this->soluong; ++i)
        {
            ve[i].output();
            cout << endl;
        }
        cout << "==> Tong Tien = " << this->tongtien;
        cout << endl;
    }

    bool operator < (const Hanhkhach &obj)
    {
        if (this->tongtien < obj.tongtien) return true;
        else return false;
    }
};
//----------------------------------------------------------//

void swap(Hanhkhach &a, Hanhkhach &b)
{
    Hanhkhach temp = a;
    a = b;
    b = temp;
}


void Bubblesort(Hanhkhach arr[], int n)
{
    for (int i = 0; i < n - 1; ++i)
        for (int j = 0; j < n - i - 1; ++j)
            if (arr[j] < arr[j + 1])
                swap(arr[j], arr[j + 1]);
}
//----------------------------------------------------------//
int main()
{
    cout << "Nhap So Luong Khach Hang: "; int n; cin >> n;
    Hanhkhach *arr = new Hanhkhach[n];
    for (int i = 0; i < n; ++i) arr[i].input();
    cout << endl << endl << "Output" << endl << endl;
    for (int i = 0; i < n; ++i)
    {
        arr[i].output();
        cout << endl << "------------------" << endl << endl;
    }

    cout << "After Sort: " << endl;
    Bubblesort(arr, n);
    for (int i = 0; i < n; ++i)
    {
        arr[i].output();
        cout << endl << "------------------" << endl << endl;
    }
    return 0;
}

Input

3
Nguyen Van A
Nam
20
2
Ha Noi - Hai Phong
10 2 2020
500000
Hai Phong - Ha Noi
15 2 2020
450000
Nguyen Van B
Nam
21
1
Ha Noi - TP.Ho Chi Minh
20 2 2020
1500000
Nguyen Thi C
Nu
19
3
Ha Noi - Da Nang
19 2 2020
1200000
Ha Noi - Hue
18 2 2020
1250000
Hue - Da Nang
22 2 2020
500000

Output

Output

- Thong Tin Khach Hang: 
Ho Ten: Nguyen Van A
Gioi Tinh: Nam
Tuoi: 20
- Thong Tin Chuyen Bay: 
Ten Chuyen: Ha Noi - Hai Phong
Ngay Bay: 
	Ngay/Thang/Nam: 10/2/2020
Gia Ve: 500000

Ten Chuyen: Hai Phong - Ha Noi
Ngay Bay: 
	Ngay/Thang/Nam: 15/2/2020
Gia Ve: 450000

==> Tong Tien = 950000

------------------

- Thong Tin Khach Hang: 
Ho Ten: Nguyen Van B
Gioi Tinh: Nam
Tuoi: 21
- Thong Tin Chuyen Bay: 
Ten Chuyen: Ha Noi - TP.Ho Chi Minh
Ngay Bay: 
	Ngay/Thang/Nam: 20/2/2020
Gia Ve: 1500000

==> Tong Tien = 1500000

------------------

- Thong Tin Khach Hang: 
Ho Ten: Nguyen Thi C
Gioi Tinh: Nu
Tuoi: 19
- Thong Tin Chuyen Bay: 
Ten Chuyen: Ha Noi - Da Nang
Ngay Bay: 
	Ngay/Thang/Nam: 19/2/2020
Gia Ve: 1200000

Ten Chuyen: Ha Noi - Hue
Ngay Bay: 
	Ngay/Thang/Nam: 18/2/2020
Gia Ve: 1250000

Ten Chuyen: Hue - Da Nang
Ngay Bay: 
	Ngay/Thang/Nam: 22/2/2020
Gia Ve: 500000

==> Tong Tien = 2950000

------------------

After Sort: 
- Thong Tin Khach Hang: 
Ho Ten: Nguyen Thi C
Gioi Tinh: Nu
Tuoi: 19
- Thong Tin Chuyen Bay: 
Ten Chuyen: Ha Noi - Da Nang
Ngay Bay: 
	Ngay/Thang/Nam: 19/2/2020
Gia Ve: 1200000

Ten Chuyen: Ha Noi - Hue
Ngay Bay: 
	Ngay/Thang/Nam: 18/2/2020
Gia Ve: 1250000

Ten Chuyen: Hue - Da Nang
Ngay Bay: 
	Ngay/Thang/Nam: 22/2/2020
Gia Ve: 500000

==> Tong Tien = 2950000

------------------

- Thong Tin Khach Hang: 
Ho Ten: Nguyen Van B
Gioi Tinh: Nam
Tuoi: 21
- Thong Tin Chuyen Bay: 
Ten Chuyen: Ha Noi - TP.Ho Chi Minh
Ngay Bay: 
	Ngay/Thang/Nam: 20/2/2020
Gia Ve: 1500000

==> Tong Tien = 1500000

------------------

- Thong Tin Khach Hang: 
Ho Ten: Nguyen Van A
Gioi Tinh: Nam
Tuoi: 20
- Thong Tin Chuyen Bay: 
Ten Chuyen: Ha Noi - Hai Phong
Ngay Bay: 
	Ngay/Thang/Nam: 10/2/2020
Gia Ve: 500000

Ten Chuyen: Hai Phong - Ha Noi
Ngay Bay: 
	Ngay/Thang/Nam: 15/2/2020
Gia Ve: 450000

==> Tong Tien = 950000

------------------

Trong bài tập lập trình hướng đối tượng số 3 này, mình có 1 lưu ý nhỏ.
Nếu không sắp xếp các hành khách theo tổng tiền, thì mình vẫn có thể khai báo ve là một con trỏ kiểu Vemaybay, nhưng khi mình thực hiện sắp xếp, mình phải đổi chỗ các ô nhớ chứa hành khách. Nếu vẫn khai báo Vemaybay *ve, nghĩa là ve sẽ được lưu trong bộ nhớ chỉ đọc, nên khi đổi chỗ sẽ gây lỗi Segmentation Fault.

Lỗi Phân Đoạn - Bài Tập C++

Bạn có thể xem thêm về lỗi này tại đây

Bài tổng hợp các bài tập lập trình hướng đối tượng từ cơ bản đến nâng cao của mình đến đây là hết rồi. Cảm ơn tất cả mọi người đã ủng hộ mình trong thời gian qua. Chào mọi người, và có thể sẽ hẹn gặp lại mọi người trong một dịp gần nhất.


Các bạn có thể xem thêm lời giải và các bài tập lập trình hướng đối tượng khác tại:

  1. Bài tập lập trình C
  2. Bài tập lập trình hướng đối tượng C++

Similar Posts

Subscribe
Notify of
guest
2 Bình luận
Inline Feedbacks
View all comments