30/09/2018, 16:15

Cách tính điểm trung bình?

Em có một bài tập: Nhập danh sách sinh viên, tìm điểm trung bình lớn nhất.

Em làm code tới đây, nhưng ko biết cách lấy Điểm trung bình như thế nào để so sánh ạ.

http://codepad.org/IIoAYSKs

//Tìm Điểm trung bình lớn nhất trong danh sách sinh viên.

//File SinhVien.h

#pragma once

//Khai báo thư viện
#include <iostream>
#include <string>

class SinhVien
{
private:
	std::string HoTen;
	int Tuoi;
	float DTB;
public:
	void Input();    //Nhập 1 sinh viên
	void Output();   //Xuất 1 sinh viên

	SinhVien(void);
	~SinhVien(void);
};



//File SinhVien.cpp
#include "SinhVien.h"

//Định nghĩa phương thức Input()
void SinhVien::Input()
{
	fflush(stdin);
	std::cout << "
Nhap vao ho ten: ";
	getline(std::cin, HoTen);
	do 
	{
		std::cout << "
Nhap vao tuoi: ";
		std::cin >> Tuoi;
		if (Tuoi < 18 || Tuoi > 50)
		{
			std::cout << "
Nhap sai tuoi. Nhap lai";
		}
	} while (Tuoi < 18 || Tuoi > 50);
	
	do 
	{
		std::cout << "
Nhap vao diem trung binh: ";
		std::cin >> DTB;
		if (DTB < 0 || DTB > 10)
		{
			std::cout << "
Nhap sai DTB. DTB tu 0 -> 10";
		}
	} while (DTB < 0 || DTB > 10);
	
}

//Định nghĩa phương thức Output()
void SinhVien::Output()
{
	std::cout << "
Ho ten: " << HoTen;
	std::cout << "
Tuoi: " << Tuoi;
	std::cout << "
Diem trung binh: " << DTB;
}

SinhVien::SinhVien(void)
{
}


SinhVien::~SinhVien(void)
{
}


//File DanhSachSinhVien.h

#pragma once
#include "SinhVien.h"
#include <vector>

class DanhSachSinhVien
{
private:
	std::vector<SinhVien *> List;
public:
	void Input(); // Khai báo phương thức nhập danh sách sinh viên.
	void Output(); // Khai báo phương thức xuất danh sách sinh viên.
	void Tim_DTB_Max();

	DanhSachSinhVien(void);
	~DanhSachSinhVien(void);
};


//File DanhSachSinhVien.cpp

#include "DanhSachSinhVien.h"
void DanhSachSinhVien::Input()
{
	int n;
	std::cout << "
Nhap vao so sinh vien: ";
	std::cin >> n;
	for (int i = 0; i < n; i++)
	{
		std::cout << "

		* Nhap Thong Tin Ho So Thu " << i + 1 << " *
";
		SinhVien *x = new SinhVien;

		x ->Input();		//Nhập dữ liệu cho Sinh Viên.
		List.push_back(x);	//Đưa Sinh Viên vào trong List.

	}
}

void DanhSachSinhVien::Output()
{
	
	for (int i = 0; i < List.size(); i++)
	{
		std::cout << "

		* Thong tin ho so thu " << i + 1 << " *
";
		List[i] ->Output();
	}
}


(
//Code tìm Điểm trung bình lớn nhất (Sai ở đây)
void DanhSachSinhVien::Tim_DTB_Max()
{
	float DTB_Max = List[0].DTB;
	for (int i = 1; i < List.size(); i++)
	{
		if (List[i].DTB > DTB_Max)
		{
			DTB_Max = List[i].DTB;
		}
	}
	std::cout << "
Diem trung binh lon nhat: " << DTB_Max;
}
)

DanhSachSinhVien::DanhSachSinhVien(void)
{
}


DanhSachSinhVien::~DanhSachSinhVien(void)
{
}

//File Main.cpp
#include "DanhSachSinhVien.h"

int main()
{
	DanhSachSinhVien *x = new DanhSachSinhVien;

	x ->Input();
	x ->Output();
	x ->Tim_DTB_Max();
	delete x;
	system("pause");
	return 0;
}
Đỗ Trung Quân viết 18:31 ngày 30/09/2018

Báo sai thế nào vậy bạn? Ra đáp án sai hay code không chạy?

BaoLe viết 18:22 ngày 30/09/2018

Giống đề cuối kỳ của mình quá.Bạn có thể tham khảo hàm tim điểm trung bình max này xem thử, ở đây mình làm struct.

struct sinhvien{
	char ho_va_ten[30],ma_so_sinh_vien[30],namsinh[30];
	float diem_trung_binh;
};
void diem_TB_max(sinhvien ds[],int so_sinh_vien){
	float max=0;
	for(int i=0;i<so_sinh_vien;i++){
		if(ds[i].diem_trung_binh>max)
			max=ds[i].diem_trung_binh;
	}
	printf("Diem trung binh lon nhat trong danh sach la:%d",max);
}
Đỗ Trung Quân viết 18:16 ngày 30/09/2018

float DTB_Max = List[0].DTB;
for (int i = 1; i < List.size(); i++)
{
if (List[i].DTB > DTB_Max)
}

??? Bạn có thấy gì lạ không

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018

Đồng ý, nhiều bạn hay nói là chạy sai hoặc không chạy, nhưng lại không định nghĩa như thế nào là không chạy

Lần sau chú ý nhé @Nhanh_Lan_R_ng

Nhánh Lan Rừng viết 18:24 ngày 30/09/2018

Rất lạ, nhưng ko biết chỗ đó phải làm thế nào, chỉ loay hoay ở đó nên ko biết phải làm sao đấy ạ.

Nhánh Lan Rừng viết 18:28 ngày 30/09/2018

Có thể hướng dẫn em làm về class ko, tại em chia nó ra làm 2 class nên ko biết phải xử lý nó như thế nào để lấy ra phần tử trung bình của từng List.

Đỗ Trung Quân viết 18:19 ngày 30/09/2018

ChuanHoaHoTen(HoTen);

Cái này ở đâu ra vậy?
Bạn nên xem lại tất cả nhé.

Nhánh Lan Rừng viết 18:26 ngày 30/09/2018

Cái này em làm rồi, tại lúc post lên ko có copy bỏ nó vào, vì em chỉ muốn hỏi khúc tìm điểm trung bình lớn nhất nên ko chú ý phía trên đó ạ. Em ko biết làm sao lấy giá trị Điểm trung bình trong List[0] -> List[n]. Chỗ đó nó lạ nhưng em ko biết phải làm thế nào. Bỏ cái tìm điểm trung bình lớn nhất ra, nhập xuất sinh viên thì tốt ạ.

Đỗ Trung Quân viết 18:23 ngày 30/09/2018

Bạn cho chạy vòng lặp từ 0 theo code của bạn. hoặc sửa theo bài của bạn trên.

        float DTB_Max=0;
	for(int i=0;i < List.size(); i++){
		if(List[i]->DTB > DTB_Max)
			DTB_Max = List[i]->DTB;
	}
Nhánh Lan Rừng viết 18:29 ngày 30/09/2018

List[i].DTB
Vì em để List[0].DTB nên phải bắt đầu từ 1 mà, chứ đầu phải để DTB = 0 đâu.
Nó ko hiểu DTB ở đâu thì làm sao mà so sánh được ạ, làm thế nào để nó hiểu DTB nằm ở List[i] mà List[i] thì chứa hết thông tin của 1 sinh viên.

Vì nó ko hiểu nên chạy bị báo lỗi
error C2228: left of ‘.DTB’ must have class/struct/union.

Em đang học về class nên đang cố gắng tìm hiểu về nó, nên mới chia ra tới 2 class đó ạ. Nếu làm giống bạn ở thì chỉ có 1 class, với lại cũng không cần sử dụng vector.

Đỗ Trung Quân viết 18:25 ngày 30/09/2018

Nói thế nào bây giờ nhỉ. Có phải nó báo lỗi kiểu như biến DTB là private bạn không thể sử dụng đúng k?

BaoLe viết 18:32 ngày 30/09/2018

Mình xin trích lại đoạn code của bạn để tìm điểm trung bình lớn nhất.

void DanhSachSinhVien::Tim_DTB_Max()
{
	float DTB_Max = List[0].DTB;
	for (int i = 1; i < List.size(); i++)
	{
		if (List[i].DTB > DTB_Max)
		{
			DTB_Max = List[i].DTB;
		}
	}
	std::cout << "\nDiem trung binh lon nhat: " << DTB_Max;
}

Cái sai của bạn ở đây đó là:
1.DTB là cái riêng của class Sinhvien.Chỉ những cái nằm trong phần public của class SinhVien hay nói cách khác chỉ những phương thức thuộc class SinhVien mới truy cập được.
2.Mỗi phần tử của vector List là một con trỏ,muốn truy cập thì phải dùng toán tử ->
Còn về hàm tìm điểm trung bình max thì mình thấy ok rồi đấy.

Nhánh Lan Rừng viết 18:24 ngày 30/09/2018

Chính xác là như 2 anh nói rồi, vì cái DTB là private nên nó ko hiểu, làm thế nào để nó hiểu được ạ, em có xem qua video của anh Đạt về get/set nói về biến private và public nhưng lại ko hiểu cách dùng về nó. Không biết phải sử dụng cái này hay ko.
@14520054 @Is2IT

BaoLe viết 18:24 ngày 30/09/2018

Mình sửa lại như sau, không biết có đúng không nữa.Nếu sai nhờ mọi người fix lại giúp mình.

class SinhVien
{
private:
	std::string HoTen;
	int Tuoi;
	float DTB;
public:
	void Input();   
	void Output();   
	float get_DTB();
	SinhVien(void);
	~SinhVien(void);
};
float SinhVien::get_DTB(){
	return this->DTB;
}

Mình có sửa laị phần class SinhVien của bạn như trên,dưới đây là hàm tìm điểm trung bình lớn nhất.

void DanhSachSinhVien::Tim_DTB_Max()
{
	float DTB_Max = List[0]->get_DTB();
	for (int i = 1; i < List.size(); i++)
	{
		if (List[i]->get_DTB() > DTB_Max)
		{
			DTB_Max = List[i]->get_DTB();
		}
	}
	std::cout << "\nDiem trung binh lon nhat: " << DTB_Max;
Đỗ Trung Quân viết 18:23 ngày 30/09/2018

Truy cập biến private thì có nhiều cách. get() là dễ nhất
Lúc đầu bạn nói rõ nó k cho truy cập biến private có phải nhanh không, làm mình nhìn toét cả mắt.

        float getdTB(){
			float dtb = DTB;
			return dtb;
        }
 	void Tim_DTB_Max()
	{
		float DTB_Max = List[0]->getdTB();
		for (int i = 0; i < List.size(); i++)
		{
			if (List[i]->getdTB() > DTB_Max)
			{
				DTB_Max = List[i]->getdTB();
			}
		}
		std::cout << "\nDiem trung binh lon nhat: " << DTB_Max;
	}
Nhánh Lan Rừng viết 18:30 ngày 30/09/2018

Cảm ơn 2 anh nhé, chạy tốt rồi.

Bài liên quan
0