Chuyển tới nội dung chính

Đề 2019-2020

Trước hết phải khẳng định, đất đai là nguồn tài nguyên vô cùng quý giá, là tài sản quan trọng của quốc gia, là tư liệu sản xuất,… Đặc biệt, đất đai là điều kiện cần cho mọi hoạt động sản xuất và đời sống. Ở nước ta, khi còn nhiều người sống nhờ vào nông nghiệp, thì đất đai càng trở thành nguồn lực rất quan trọng.

Muốn phát huy tác dụng của nguồn lực đất đai, ngoài việc bảo vệ đất của quốc gia, còn phải quản lý đất đai hợp lý, nâng cao hiệu quả sử dụng đất sao cho vừa đảm bảo được lợi ích trước mắt, vừa tạo điều kiện sử dụng đất hiệu quả lâu dài để phát triển bền vững đất nước.

Hiện nay, ở Việt Nam đất đai được phân chia thành 2 loại chính sau:

  • Đất nông nghiệp.
  • Đất phi nông nghiệp (đất ở).

Quan điểm nhất quán của Đảng, Nhà nước và nhân dân ta đã được xác định từ năm 980 đến nay là đất đai thuộc sở hữu toàn dân, do Nhà nước đại diện chủ sở hữu và thống nhất quản lý. Để góp phần nâng cao hiệu quả quản lý nhà nước về đất đai, mỗi thửa đất được nhà nước quản lý và cấp quyền sử dụng cho một hoặc nhiều người dân (nhà nước cho phép nhiều người dân có thể đồng sở hữu quyền sử dụng đất) có nhu cầu sử dụng (Giấy chứng nhận quyền sử dụng đất hay còn được gọi là Sổ hồng).

  • Với các thửa đất nông nghiệp, thông tin cần quản lý gồm: số giấy chứng nhận (chuỗi), người sở hữu quyền sử dụng đất (gồm họ và tên, năm sinh, CMND, địa chỉ thường trú), số thửa đất, số tờ bản đồ, địa chỉ thửa đất, diện tích (m2m^2), thời gian sử dụng (được sử dụng đến năm nào), ngày cấp, đơn giá thuế phải đóng cho nhà nước hàng năm /1m2/ 1 m^2
  • Với các thửa đất phi nông nghiệp (đất ở), thông tin cần quản lý gồm: số giấy chứng nhận (chuỗi), người sở hữu quyền sử dụng đất (gồm họ và tên, năm sinh, CMND, địa chỉ thường trú), số thửa đất, số tờ bản đồ, địa chỉ thửa đất, diện tích (m2m^2), ngày cấp, đơn giá thuế phải đóng cho nhà nước hàng năm /1m2/ 1 m^2

Áp dụng kiến thức lập trình hướng đối tượng (kế thừa, đa hình) thiết kế sơ đồ chi tiết các lớp đối tượng (1 điểm) và khai báo các lớp (1 điểm) để xây dựng chương trình thực hiện các yêu cầu sau:

  1. Tạo danh sách các giấy chứng nhận quyền sử dụng đất mà nhà nước đã cấp cho người dân. (1 điểm)
  2. Tính tiền thuế mà người sử dụng đất phải đóng cho nhà nước và cho biết thửa đất nào (thông tin thửa đất) có tiền thuế phải đóng nhiều nhất. (1 điểm)
  3. Xuất ra màn hình thông tin các thửa đất nông nghiệp đã hết thời hạn sử dụng (năm sử dụng < năm hiện tại). (1 điểm)

Lưu ý: Các thông tin trong đề chỉ mô phỏng các thông tin với mục tiêu để sinh viên vận dụng kiến thức lập trình hướng đối tượng. Do vậy, các thông tin trong đề KHÔNG nhất thiết phải đúng hoặc khớp với các thông tin hiện tại trong thế giới thực. Sinh viên cần bám sát các mô tả trong đề thi để làm bài.

Phân tích đề

Bước 1: Xác định các lớp

Vừa đọc đề ta thấy được có hai lớp đối tượng chính là Đất nông nghiệpĐất ở. Ta sẽ tạo ra một lớp cơ sở có tên là Đất đai để 2 lớp trên kế thừa. Theo yêu cầu ở câu 1 và để tiện làm các câu 2, 3 thì ta sẽ tạo thêm lớp Danh sách đất.

Bước 2: Thiết kế thuộc tính

Ngoại trừ thuộc tính thời gian sử dụng chỉ có ở lớp Đất nông nghiệp, các thuộc tính còn lại ở 2 lớp con đều giống nhau nên ta sẽ cho tất cả các thuộc tính chung nằm ở lớp cơ sở Đất đai. Lớp Đất nông nghiệp khi kế thừa từ lớp Đất đai sẽ bổ sung thêm thuộc tính thời gian sử dụng, còn lớp Đất ở khi kế thừa từ lớp Đất đai thì sẽ không cần định nghĩa thêm thuộc tính nào nữa. Lớp

Cả 2 lớp con đều cần lưu thông tin của người sở hữu, mỗi người sỡ hữu thì lại có nhiều thông tin nhỏ khác, thế nên ta sẽ tạo thêm một lớp đối tượng là Người sỡ hữu. Tương tự thì cũng nên tạo thêm lớp Ngày để biểu diễn cho thuộc tính ngày cấp.

Lớp Danh sách đất sẽ là một mảng các con trỏ thuộc lớp Đất đai để có thể áp dụng tính đa hình

Bước 3: Thiết kế phương thức

  1. Đa số các bài dạng này đều cần phải làm các phương thức nhập, xuất cho từng lớp đối tượng. Các lớp nhập, xuất ở lớp cơ sở sẽ là phương thức ảo.

  2. Tạo phương thức tính tiền ở lớp cơ sở, cả 2 loại đất có cách thức tính tiền như nhau nên không cần là phương thức ảo. Phương thức tìm đất có thuế nhiều nhất ở lớp Danh sách.

  3. Tạo một phương thức kiểm tra ở lớp cơ sở để xem một loại đất có phải nông nghiệp không. Nó sẽ là phương thức ảo, phiên bản ở lớp nông nghiệp sẽ trả về giá trị true, phiên bản ở lớp đất ở trả về giá trị false. Ngoài ra lớp nông nghiệp sẽ có thêm phương thức kiểm tra hết hạn.

Sơ đồ thiết kế lớp

Lời giải tham khảo

#include <iostream>
#include <string>
using namespace std;

class NguoiSoHuu {
private:
string tenNguoi;
int namSinh;
string cmnd;
string diaChi;
public:
void Nhap() {
cout << "Nhap ten nguoi so huu: ";
cin >> tenNguoi;
cin.ignore();
cout << "Nhap nam sinh: ";
cin >> namSinh;
cout << "Nhap cmnd: ";
cin >> cmnd;
cin.ignore();
cout << "Nhap dia chi nguoi so huu: ";
cin >> diaChi;
cin.ignore();
}
void Xuat() {
cout << tenNguoi << endl << namSinh << endl
<< cmnd << endl << diaChi << endl;
}
};

class Ngay {
private:
int ngay;
int thang;
int nam;
public:
void Nhap() {
cout << "Nhap ngay: ";
cin >> ngay;
cout << "Nhap thang: ";
cin >> thang;
cout << "Nhap nam: ";
cin >> nam;
}
void Xuat() {
cout << ngay << "/" << thang << "/" << nam << endl;
}
int getNam()
{
return nam;
}
};

class DatDai {
protected:
string soGiay;
NguoiSoHuu nguoi;
int soThua;
int dienTich;
Ngay ngayCap;
string diaChiDat;
int soTo;
int giaThue;
public:
virtual void Nhap() {
cout << "Nhap so giay: ";
cin >> soGiay;
cin.ignore();
cout << "Nhap nguoi so huu:\n";
nguoi.Nhap();
cout << "Nhap so thua dat: ";
cin >> soThua;
cout << "Nhap dien tich dat: ";
cin >> dienTich;
cout << "Nhap ngay cap: ";
ngayCap.Nhap();
cout << "Nhap dia chi dat: ";
cin >> diaChiDat;
cin.ignore();
cout << "Nhap so to ban do: ";
cin >> soTo;
cout << "Nhap don gia thue: ";
cin >> giaThue;
}
virtual void Xuat() {
cout << soGiay << endl;
nguoi.Xuat();
cout << soThua << endl << dienTich << endl;
ngayCap.Xuat();
cout << diaChiDat << endl << soTo << endl << giaThue << endl;
}
virtual bool KiemTraNongNghiep() {
return false;
}
int TinhThue() {
return dienTich * giaThue;
}
};

class DatNongNghiep : public DatDai {
protected:
Ngay thoiHan;
public:
void Nhap() {
DatDai::Nhap();
cout << "Nhap thoi han su dung: ";
thoiHan.Nhap();
}
void Xuat() {
DatDai::Xuat();
thoiHan.Xuat();
}
bool KiemTraThoiHan() {
if (thoiHan.getNam() < 2023)
return true;
return false;
}
bool KiemTraNongNghiep() {
return true;
}
};

class DatO : public DatDai {};

class DanhSachDat {
protected:
DatDai* arr[50];
int size;
public:
void Nhap() {
cout << "Nhap so luong dat: ";
cin >> size;
for (int i = 0; i < size; ++i) {
cout << "Nhap kieu dat: 1 = Nong nghiep, 2 = Dat o: ";
int type;
cin >> type;
if (type == 1) {
arr[i] = new DatNongNghiep();
}
if (type == 2) {
arr[i] = new DatO();
}
arr[i]->Nhap();
}
}
DatDai* TimThueNhieuNhat() {
int maxIndex = 0;
for (int i = 1; i < size; ++i) {
if (arr[i]->TinhThue() > arr[maxIndex]->TinhThue()) {
maxIndex = i;
}
}
return arr[maxIndex];
}
void XuatDatNongNghiepHetHan() {
for (int i = 0; i < size; ++i) {
if (arr[i]->KiemTraNongNghiep()) {
if (((DatNongNghiep*)arr[i])->KiemTraThoiHan()) {
arr[i]->Xuat();
}
}
}
}
};

int main() {
DanhSachDat item;
item.Nhap();
DatDai* kq = item.TimThueNhieuNhat();
kq->Xuat();
item.XuatDatNongNghiepHetHan();
return 0;
}