“MỌI SỰ CỐ GẮNG CHƯA CHẮC ĐÃ GẶT GÁI ĐƯỢC KẾT QUẢ NHƯNG MỖI KẾT QUẢ ĐẠT ĐƯỢC CHẮC CHẮN LÀ CẢ MỘT QUÁ TRÌNH CỐ GẮNG”

Kỹ thuật lập trình hướng đối tượng và áp dụng cho bài toán quản lý sinh viên

Thứ hai - 21/03/2022 22:46
Tên chủ đề:
Kỹ thuật lập trình hướng đối tượng và áp dụng cho bài toán quản lý sinh viên. Sinh viên trong một trường học có các thuộc tính sau: mã sinh viên, họ và tên, tên khoa. Các sinh viên học các môn học chung là: tiếng anh, tin học cơ sở; Sinh viên ngành Toán học thêm các môn: giải tích, đại số; Sinh viên ngành Tin học thêm các môn: ngôn ngữ C, cấu trúc dữ liệu.
Kỹ thuật lập trình hướng đối tượng và áp dụng cho bài toán quản lý sinh viên
Nội dung:
I. KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.
II. ÁP DỤNG CHO BÀI TOÁN QUẢN LÝ SINH VIÊN.
Cách 1: kế thừa.
Cách 2: Đa hình (kế thừa và đa hình)
I. KỸ THUẬT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG.
1. Khái niệm lập trình hướng đối tượng.
Lập trình hướng đối tượng là phương pháp lập trình lấy đối tượng là nền tảng để xây dựng chương trình. Phương pháp hướng đối tượng lấy đối tượng làm vai trò trung tâm của việc lập trình, người ta gọi là nguyên lý lập trình từ dưới lên (bottom-up). Phương pháp hướng đối tượng kết hợp cả hai cách thiết kế từ trên xuống và từ dưới lên. Dữ liệu (thuộc tính) được bảo vệ và gắn chặt với từng đối tượng, các đối tượng chỉ trao đổi với nhau thông qua các hàm (phương thức).
          2. Những đặc tính chủ yếu:
Tập trung vào dữ liệu thay cho các chức năng.
 Chương trình được chia thành các đối tượng chứa trong các lớp.
 Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được các đối tượng.
 Các hàm xác định trên các vùng dữ liệu của đối tượng được gắn với nhau trên cấu trúc dữ liệu đó.
Dữ liệu được bao bọc, che giấu và không cho phép các hàm ngoại lai truy nhập tự do (các mức độ truy cập: private – bên trong phạm vi của lớp, protected – trong lớp và lớp kế thừa, public – truy cập được cả trong và ngoài lớp).
Các đối tượng trao đổi với nhau thông qua các hàm.
Dữ liệu và các hàm mới có thể dễ dàng bổ sung vào đối tượng nào đó khi cần thiết.
Chương trình được thiết kế theo cách tiếp cận bottom-up (dưới-lên).
          3. Kỹ thuật hướng đối tượng.
          Trừu tượng hoá thông tin: chỉ tập trung vào những đặc trưng chính chứ không thể xem xét tất cả; nghĩa là chúng ta đã sử dụng nguyên lý trừu tượng hoá:
+ Trừu tượng hoá thủ tục: thường được thể hiện bởi phương thức (hàm/hàm con)
          + Trừu tượng hoá dữ liệu: biểu diễn một nhóm các đối tượng có liên quan bằng một lớp có những đặc tính chung nhất (bỏ đi những tính chất khác biệt).
          Lớp (class): là kiểu dữ liệu trừu tượng, tập hợp các đối tượng có chung các thuộc tính (mô tả đối tượng cần quản lý) và phương thức xử lý dữ liệu.
          Đối tượng (Object): là thực thể mà trong đó các dữ liệu và các phương thức thao tác lên dữ liệu đã được đóng gói, được xác định trong thời gian hệ thống hoạt động và được coi như là biến của kiểu dữ liệu lớp (class).
          Đối tượng  = Phương thức + Dữ liệu.
          Đóng gói (bao gói): thông tin của đối tượng được che giấu để các đối tượng khác không thấy được gì về cấu trúc bên trong của nó. Các đối tượng chỉ có thể trao đổi với nhau thông qua các giao diện, thông qua các thông báo (chứa địa chỉ của đối tượng gửi, đối tượng nhận, các hàm cùng với các tham số).
          Kế thừa (sử dụng lại): các đối tượng của một lớp có thể sử dụng một số thuộc tính và phương thức của các đối tượng ở những lớp khác, tạo ra các cấu trúc phân cấp các lớp dựa trên hai nguyên lý sau:
  + Chi tiết hoá: định nghĩa những lớp mới tương tự như các lớp trước và được bổ sung thêm một số thuộc tính, phương thức mô tả chi tiết hơn về một nhóm các đối tượng cụ thể.
+ Tổng quát hoá: định nghĩa những lớp mới từ một nhóm lớp có một số đặc tính giống nhau, gộp chung các đặc tính đó để tạo ra lớp mới gọi là lớp trừu tượng.
Lưu ý: Một lớp có thể kế thừa những tính chất của một hoặc nhiều lớp cơ sở ở các mức khác nhau trong cấu trúc phân cấp.
II. ÁP DỤNG CHO BÀI TOÁN QUẢN LÝ SINH VIÊN
1.    Mô tả bài toán.
•    Xây dựng các lớp kế thừa.
+ Sinh viên trong một trường học có các thuộc tính sau: mã sinh viên, họ và tên, tên khoa. Các sinh viên học các môn học chung là: tiếng anh, tin học cơ sở. Ta xây dựng được lớp sinh viên (SINHVIEN) gồm các thuộc tính sau: mã số, họ tên đệm, tên , khoa, điểm tiếng anh, điểm tin học cơ sở.
 + Sinh viên ngành Toán học thêm các môn: giải tích, đại số. Ta xây dựng được lớp ngành Toán (NGANHTOAN) kế thừa từ lớp sinh viên gồm các thuộc tính sau: điểm giải tích, điểm đại số.
+ Sinh viên ngành Tin học thêm các môn: ngôn ngữ C, cấu trúc dữ liệu. Ta xây dựng được lớp ngành Tin (NGANHTIN) kế thừa từ lớp sinh viên gồm các thuộc tính sau: điểm ngôn ngữ C, điểm cấu trúc dữ liệu.
•    Các phương thức.
+ Nhập dữ liệu: Nhap
+ Xuất thông tin: Indulieu
+ Tính điểm trung bình các môn học (tất cả các môn đều tính hệ số 1): Dtb
+ Xếp loại: Giỏi (Dtb >= 8.0), Khá (6.5 <= Dtb < 8.0), Trung bình (5.0 <= Dtb <6.5), Yếu là còn lại: Xeploai
+ Xuất danh sách sinh viên gồm thông tin sinh viên và điểm các môn học, điểm tb, xếp loại, (có thống kê mỗi ngành học có bao nhiêu sinh viên xếp loại: Giỏi, Khá, Tb, Yếu): Inketqua 
2.    Sơ đồ kế thừa.

3.    Code C++ (VC2019)
Cách 1: kế thừa.
// 43VangVanQuyn.cpp : This file contains the 'main' function. Program execution begins and ends there.//#include <iostream>#include <string.h>#include <iomanip>using namespace std;class SINHVIEN {protected:	char maso[10], hotendem[30], ten[20], khoa[20];	double diemanh, diemtincs;public:	void Nhap();	void Indulieu();};class NGANHTOAN :SINHVIEN {private:	double diemgt, diemds;public:	void Nhap();	void Indulieu();	double Dtb();	string Xeploai();};class NGANHTIN :SINHVIEN {private:	double diemnnc, diemctdl;public:	void Nhap();	void Indulieu();	double Dtb();	string Xeploai();};void SINHVIEN::Nhap() {	cout << "Ma so: "; cin.getline(this->maso, 10);	cout << "Ho ten dem: "; cin.getline(this->hotendem, 30);	cout << "Ten: "; cin.getline(this->ten, 20);	cout << "khoa: "; cin.getline(this->khoa, 20);	cout << "Diem tieng Anh: "; cin >> this->diemanh;	cout << "Diem tin co so: "; cin >> this->diemtincs;}void SINHVIEN::Indulieu() {	cout << setw(10) << left << maso << setw(25) << left << hotendem << setw(10) << left << ten << setw(15) << left << khoa		<< setw(10) << left << setprecision(2) << fixed << diemanh		<< setw(10) << left << setprecision(2) << fixed << diemtincs;}void NGANHTOAN::Nhap() {	this->SINHVIEN::Nhap();	cout << "Diem giai tich: "; cin >> this->diemgt;	cout << "Diem dai so: "; cin >> this->diemds;}void NGANHTOAN::Indulieu() {	this->SINHVIEN::Indulieu();	cout << setw(10) << left << setprecision(2) << fixed << diemgt		<< setw(10) << left << setprecision(2) << fixed << diemds		<< setw(10) << left << setprecision(2) << fixed << Dtb()		<< setw(20) << left << Xeploai();}double NGANHTOAN::Dtb() {	double dtb = 0;	dtb = this->diemanh + this->diemtincs;	dtb = dtb + this->diemgt + this->diemds;	dtb = dtb / 4;	return dtb;}string NGANHTOAN::Xeploai() {	string kq = "";	double dtb = this->Dtb();	if (dtb > 8.0) {		kq = "Gioi";	}	else if ((dtb >= 6.5) && (dtb < 8.0)) {		kq = "Kha";	}	else if ((dtb >= 5.0) && (dtb < 6.5)) {		kq = "Trung binh";	}	else {		kq = "Yeu";	}	return kq;}void NGANHTIN::Nhap() {	this->SINHVIEN::Nhap();	cout << "Diem NN C: "; cin >> this->diemnnc;	cout << "Diem CTDL: "; cin >> this->diemctdl;}void NGANHTIN::Indulieu() {	this->SINHVIEN::Indulieu();	cout << setw(10) << left << setprecision(2) << fixed << diemnnc		<< setw(10) << left << setprecision(2) << fixed << diemctdl		<< setw(10) << left << setprecision(2) << fixed << Dtb()		<< setw(20) << left << Xeploai();}double NGANHTIN::Dtb() {	double dtb = 0;	dtb = this->diemanh + this->diemtincs;	dtb = dtb + this->diemnnc + this->diemctdl;	dtb = dtb / 4;	return dtb;}string NGANHTIN::Xeploai() {	string kq = "";	double dtb = this->Dtb();	if (dtb > 8.0) {		kq = "Gioi";	}	else if ((dtb >= 6.5) && (dtb < 8.0)) {		kq = "Kha";	}	else if ((dtb >= 5.0) && (dtb < 6.5)) {		kq = "Trung binh";	}	else {		kq = "Yeu";	}	return kq;}class DS_SVTOAN{private:	NGANHTOAN* ds = new NGANHTOAN[100];	int i = 0;	double dtb = 0;	int gioi = 0, kha = 0, tb = 0, yeu = 0;public:	void Nhap() {		char ok;		while (i < 100) {			ds[i].Nhap();			i++;			cout << "Ban co tiep tuc nhap khong? (C/K): ";			cin >> ok; cin.ignore();			if (ok == 'k' || ok == 'K') break;		}	}	void Inketqua() {		cout << "Ket qua nganh toan:" << endl;		cout << setw(10) << left << "ma so" << setw(25) << left << "Ho va" << setw(10) << left << "Ten" << setw(15) << left << "Khoa"			<< setw(10) << left << "T. Anh" << setw(10) << left << "Tin CS" << setw(10) << left << "Giai tich" << setw(10) << left << "Dai so"			<< setw(10) << left << "DTB" << setw(20) << left << "Xep loai" << endl;		int j = 0;		for (int j = 0; j < i; j++) {			//Thong ke xep loai			dtb = ds[j].Dtb();			if (dtb > 8.0) {				gioi++;			}			else if ((dtb >= 6.5) && (dtb < 8.0)) {				kha++;			}			else if ((dtb >= 5.0) && (dtb < 6.5)) {				tb++;			}			else {				yeu++;			}			ds[j].Indulieu();			cout << endl;		}		//In thong ke xep loai		cout << "Gioi: " << setw(20) << left << gioi 			<< "Kha: " << setw(20) << left << kha 			<< "Tb: " << setw(20) << left << tb			<<"Yeu: " << setw(20) << left << yeu << endl;	}};class DS_SVTIN{private:	NGANHTIN* ds = new NGANHTIN[100];	int i = 0;	double dtb = 0;	int gioi = 0, kha = 0, tb = 0, yeu = 0;public:	void Nhap() {		char ok;		while (i < 100) {			ds[i].Nhap();			i++;			cout << "Ban co tiep tuc nhap khong? (C/K): ";			cin >> ok; cin.ignore();			if (ok == 'k' || ok == 'K') break;		}	}	void Inketqua() {		cout << "Ket qua nganh tin:" << endl;		cout << setw(10) << left << "ma so" << setw(25) << left << "Ho va" << setw(10) << left << "Ten" << setw(15) << left << "Khoa"			<< setw(10) << left << "T. Anh" << setw(10) << left << "Tin CS" << setw(10) << left << "NNLT C" << setw(10) << left << "CTDL"			<< setw(10) << left << "DTB" << setw(20) << left << "Xep loai" << endl;		int j = 0;		for (int j = 0; j < i; j++) {			//Thong ke xep loai			dtb = ds[j].Dtb();			if (dtb > 8.0) {				gioi++;			}			else if ((dtb >= 6.5) && (dtb < 8.0)) {				kha++;			}			else if ((dtb >= 5.0) && (dtb < 6.5)) {				tb++;			}			else {				yeu++;			}			ds[j].Indulieu();			cout << endl;		}		//In thong ke xep loai		cout << "Gioi: " << setw(20) << left << gioi			<< "Kha: " << setw(20) << left << kha			<< "Tb: " << setw(20) << left << tb			<< "Yeu: " << setw(20) << left << yeu << endl;	}};int main(){	DS_SVTOAN dssvtoan;	cout << "Nhap danh sach sinh vien nganh toan:" << endl;	dssvtoan.Nhap();	DS_SVTIN dssvtin;	cout << "Nhap danh sach sinh vien nganh tin:" << endl;	dssvtin.Nhap();	dssvtoan.Inketqua();	dssvtin.Inketqua();	return 0;}

Cách 2: Đa hình (kế thừa và đa hình)
 

Tác giả: Vàng Văn Quyn

Chú ý: Việc đăng lại bài viết trên ở website hoặc các phương tiện truyền thông khác mà không ghi rõ nguồn https://365.io.vn là vi phạm bản quyền

Tổng số điểm của bài viết là: 1 trong 1 đánh giá

Xếp hạng: 1 - 1 phiếu bầu
Click để đánh giá bài viết
Thống kê
  • Đang truy cập120
  • Hôm nay2,677
  • Tháng hiện tại92,761
  • Tổng lượt truy cập1,918,506
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây