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

Trong series về Lập trình Hướng đối tượng, chúng ta đã đi qua nhiều bài viết khác nhau. Trong bài viết cuối cùng 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.

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: tử số (tuso), mẫu số (mauso).
  • Phương thức:
    • Hàm Khởi Tạo Không Tham Số, Hàm Hủy
    • Nhập, Xuất
    • Cộng(Cong), Trừ(Tru), Nhân(Nhan), Chia(Chia)

Tính Tổng, Hiệu, Tích, Thương của hai 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 
using namespace std;

class Phanso {
private:
    int tuso, mauso;

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

    ~Phanso() {
        tuso = 0;
        mauso = 1;
    }

    void set() {
        cout << "Nhập Tử Số: ";
        cin >> this->tuso;
        cout << "Nhập Mẫu Số: ";
        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 Vandongvien gồm:

  • Thuộc tính: họ tên (hoten, chuỗi ký tự), tuổi (tuoi, số nguyên), môn thi đấu (monthidau, chuỗi ký tự), cân nặng (cannang, số thực), chiều cao (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.

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

  • Khai báo p là đối tượng của 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 arr 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 
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 << "Nhập Họ Tên: ";
        fflush(stdin);
        getline(is, obj.hoten);
        cout << "Nhập Môn Thi Đấu: ";
        fflush(stdin);
        getline(is, obj.monthidau);
        cout << "Nhập Tuổi: ";
        is >> obj.tuoi;
        cout << "Nhập Cân Nặng: ";
        is >> obj.cannang;
        cout << "Nhập Chiều Cao: ";
        is >> obj.chieucao;
        return is;
    }

    friend ostream& operator<< (ostream& os, VanDongVien obj) {
        cout << "Họ Tên: " << obj.hoten << endl;
        cout << "Môn Thi Đấu: " << obj.monthidau << endl;
        cout << "Tuổi: " << obj.tuoi << endl;
        cout << "Cân Nặng: " << obj.cannang << endl;
        cout << "Chiều 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("Nguyễn Văn A", "Bóng Đá", 20, 178, 70.5);
    cout << p << endl;

    cout << "Nhập Số Lượng: ";
    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:

Họ Tên: Nguyễn Văn A
Môn Thi Đấu: Bóng Đá
Tuổi: 20
Cân Nặng: 178
Chiều cao: 70.5

Họ Tên: Nguyen Van B
Môn Thi Đấu: Cau Long
Tuổi: 20
Cân Nặng: 80
Chiều cao: 190

Họ Tên: Nguyen Van C
Môn Thi Đấu: Bong Chuyen
Tuổi: 21
Cân Nặng: 78
Chiều cao: 188

Họ Tên: Nguyen Van D
Môn Thi Đấu: Boi Loi
Tuổi: 19
Cân Nặng: 81
Chiều cao: 188

Sort
Họ Tên: Nguyen Van C
Môn Thi Đấu: Bong Chuyen
Tuổi: 21
Cân Nặng: 78
Chiều cao: 188

Họ Tên: Nguyen Van D
Môn Thi Đấu: Boi Loi
Tuổi: 19
Cân Nặng: 81
Chiều cao: 188

Họ Tên: Nguyen Van B
Môn Thi Đấu: Cau Long
Tuổi: 20
Cân Nặng: 80
Chiều 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: tên chuyến (tenchuyen), ngày bay (ngaybay), giá vé (giave).
  • Phương thức:
    • Cấu tử.
    • Hủy.
    • Nhập.
    • Xuất.
    • getgiave(): hàm trả về giá vé.

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

  • Thuộc tính: họ tên (hoten), giới tính (gioitinh), tuổi (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 
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 << 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;
        cout << "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[1000];
    int tongtien;

public:
    Hanhkhach() {
        this->soluong = 0;
        ve[this->soluong];
        this->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[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:

- 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:
tNgay/Thang/Nam: 10/2/2020
Gia Ve: 500000
Ten Chuyen: Hai Phong - Ha Noi
Ngay Bay:
tNgay/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:
tNgay/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:
tNgay/Thang/Nam: 19/2/2020
Gia Ve: 1200000
Ten Chuyen: Ha Noi - Hue
Ngay Bay:
tNgay/Thang/Nam: 18/2/2020
Gia Ve: 1250000
Ten Chuyen: Hue - Da Nang
Ngay Bay:
tNgay/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:
tNgay/Thang/Nam: 19/2/2020
Gia Ve: 1200000
Ten Chuyen: Ha Noi - Hue
Ngay Bay:
tNgay/Thang/Nam: 18/2/2020
Gia Ve: 1250000
Ten Chuyen: Hue - Da Nang
Ngay Bay:
tNgay/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:
tNgay/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:
tNgay/Thang/Nam: 10/2/2020
Gia Ve: 500000
Ten Chuyen: Hai Phong - Ha Noi
Ngay Bay:
tNgay/Thang/Nam: 15/2/2020
Gia Ve: 450000
==> Tong Tien = 950000
FEATURED TOPIC