Cần giúp đỡ chỉnh sửa code về tính kế thừa C++

Em mới học C++ và có bài tập về tính kế thừa như này
Xây dựng lớp Người gồm tên, năm sinh.Lớp sinh viên kế thừa lớp ngừoi có thêm thuộc tính điêm trung bình.Nhập n số nguyên n và khởi tạo n sinh viên.In ra sinh viên được thưởng biết rằng sinh viên được thưởng nếu điểm trung bình > 9.
Code em như này nhưng mà phần xuất ra vẫn bị sai và em thấy code em khá linh tinh cần mọi người xem và chỉnh sửa giúp ạ.

#include <iostream>
#include <stdio.h>
#include <string>
    using namespace std;
    class Nguoi {
    protected:
    	char Ten[30];
    	int NamSinh;
    	int n;
    };
    class SinhVien : public Nguoi {
    private:
    	float DiemTB;
    public:
    	void Nhap() {
    		cout << "Nhap so sinh vien:";
    		cin >> n;
    		cout << "Nhap thong tin sinh vien" << endl;
    		for (int i = 0; i < n; i++) {
    			fflush(stdin);
    			cout << "Nhap ten:";
    			cin >> Ten;
    			cout << "Nhap nam sinh:";
    			cin >> NamSinh;
    			cout << "Nhap diem trung binh :";
    			cin >> DiemTB;
    		}
    	}		
    	void Xuat() {
    		cout << "Xuat thong tin" << endl;
    		for (int i = 0; i < n; i++) {
    			cout << "Ten: " << Ten << endl;
    			cout << "Nam Sinh: " << NamSinh << endl;
    			cout << "Diem TB: " << DiemTB << endl;
    		}
    	}
    	float Thuong() {
    		if (DiemTB > 9) {
    			cout << "Sinh vien duoc thuong co ten: " << Ten << " va nam sinh: " << NamSinh;
    		}
    		else { 
    			cout << "Khong co sinh vien nao duoc thuong"; 
    		}
    		return DiemTB;
    	}
    };
    int main() {
    	SinhVien sv;
	sv.Nhap();
	sv.Xuat();
	sv.Thuong();
	return 0;
}

Bạn có học về mảng chưa? Cách khởi tạo mảng trong C++ đấy!

2 Likes

Thay vì khai báo:

Thì bạn “biến” nó thành mảng!

2 Likes

bạn sửa cho mình xem được không mình chưa hình dung ra.

Thế là bạn chưa học về mảng hay danh sách liên kết?

2 Likes

Dùng mảng đối tượng hả bạn?

Thế bạn biết cách khai báo mảng thế nào rồi?


Lớp SinhVien, phần Nhap()Xuat() không có vòng lặp đâu nhé! Một SinhVien chỉ là công việc là nhập/xuất cho chính nó thôi.

3 Likes

Phân tích chút xíu :slight_smile:

  1. Đối tượng Người và Sinh Viên của bạn viết đúng rồi nhưng thiếu các hàm get-set cho các biến : Tên, NamSinh, DiemTB

  2. Phần Nhập n số nguyên n và khởi tạo n sinh viên.In ra sinh viên được thưởng biết rằng sinh viên được thưởng nếu điểm trung bình > 9. cái này bạn không nên viết chung vào đối tượng SinhVien mà viết riêng ra ở hàm Main hoặc tạo 1 đối tượng khác vd ChuongTrinh hay gì đó rồi viết nhập xuất gì tùy ý bạn ! Mình có viết bên dưới xuất ra trong hàm Main luôn để bạn tham khảo.

  3. Bạn chưa có 1 danh sách gì để lưu lại tất cả sinh viên được nhập vào ? Bạn cần tìm hiểu array , std::vector, list … để biết cách lưu lại ! Ở dưới mình dùng std::vector

  4. Công việc bạn cần làm tiếp theo là gì ?

  • Không dùng std::string m_Ten mà chùng char m_Ten[30]

  • Bạn thử thay std::vector<SinhVien> dsSinhVien; của mình viết thành 1 mảng SinhVien dsSinhVien[100] hoặc SinhVien *dsSinhVien = new SinhVien[100]

  • Không dùng hàm Main để nhập N sinh viên và in ra … nữa mà là dùng 1 đối tượng khác như bạn muốn làm vd:

QuanLySinhVien
{
private:
int n ;
public:
void Nhap()...
...v...v...
};

void Main()
{
QuanLySinhVien qlsv;

qlsv.Nhap();
}

mình vd vậy !

Đây là bài mẫu mình làm cho bạn !

#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>

using namespace std;
class Nguoi 
{
protected:
	std::string m_Ten; //m = member
	int m_NamSinh;
public:
	//tao set-get function cho Ten
	void setTen(std::string i_ten) //i= input
	{
		m_Ten = i_ten;
	}
	std::string getTen() 
	{
		return m_Ten;
	}

	//tao set-get function cho Nam sinh
	void setNamSinh(int i_namSinh)
	{
		m_NamSinh = i_namSinh;
	}
	int getNamSinh()
	{
		return m_NamSinh;
	}
};

class SinhVien : public Nguoi 
{
private:
	float m_DiemTB;
public:

	SinhVien() {

	}

	SinhVien(std::string i_ten,int i_NamSinh,float i_DiemTB) {
		
		m_Ten = i_ten;
		m_NamSinh = i_NamSinh;
		m_DiemTB = i_DiemTB;
	}

	//tao set-get function cho m_DiemTB
	void setDiemTB(float i_diemTB) //i= input
	{
		m_DiemTB = i_diemTB;
	}
	float getDiemTB()
	{
		return m_DiemTB;
	}
};


int main() 
{
	int n = -1;
	cout << "Nhap so sinh vien:";
	cin >> n;
	cout << "Nhap thong tin sinh vien" << endl;
	
	//Can 1 cai gi do de luu lai tat ca cac sinh vien
	//dung List , Array , Vector ...
	//O day minh dung std::vector
	
	std::vector<SinhVien> dsSinhVien;

	std::string Ten = "";
	int NamSinh = -1;
	float DiemTB = 0.0f;

	//nhap
	for (int i = 0; i < n; i++) {
		fflush(stdin);
		cout << "Nhap ten:";
		cin >> Ten;
		cout << "Nhap nam sinh:";
		cin >> NamSinh;
		cout << "Nhap diem trung binh :";
		cin >> DiemTB;

		//cach 1 khoi tao sinh vien qua constructor
		// minh thich dung cach nay vi ngan gon !
		SinhVien sv(Ten, NamSinh, DiemTB);

		//cach 2 khoi tao sinh vien qua cac ham set.
		//SinhVien sv;
		//sv.setDiemTB(DiemTB);
		//sv.setTen(Ten);
		//sv.setNamSinh(NamSinh);

		dsSinhVien.push_back(sv);

	}

	//xuat
	cout << "Danh sach sinh vien duoc thuong:" << endl;
	for (int i = 0; i < n; i++) {

		SinhVien sv = dsSinhVien.at(i);
		
		if (sv.getDiemTB() > 9)
		{
			cout << "Ten: " << sv.getTen() << endl;
			cout << "Nam Sinh: " << sv.getNamSinh() << endl;
			cout << "Diem TB: " << sv.getDiemTB() << endl;
		}
	}

	return 0;
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?