Thuật toán tìm họ có điểm trung bình cao nhất

mọi người gọi ý giúp em thuật toán tìm họ có điểm trung bình cao nhất với, em cảm ơn ạ
ví dụ: Nguyen Van A 6
Nguyen Van B 7
Tran Van A 8
Tran Van B 1
thì điểm trung bình của họ Nguyễn là (6+7)/2=6.5, còn của họ Tran là (9+1/)2=5
thì mình in ra họ Nguyen có điểm trung bình cao nhất.

1 Like
struct _DTB
{
	char Ho[80];
	float sum;
	float cnt;
};
_DTB dtb[1000];
   
 for (int j = 0; j < N; j++)
    		{
    			// Tach ho khoi ten
    			p = 0;
    			while (sv[j].Name[p] != ' ')
    			{
    				Ho[p] = sv[j].Name[p];
    				p++;
    			}
    			Ho[p] = '\0';
    			
    			for (k = 0; k < sz; k++)
    			{
    				if (strcmp(Ho, dtb[k].Ho) == 0)
    				{
    					// Neu ho giong nhau thi cong vao sum va tang cnt
    					dtb[k].sum += sv[j].DTB;
    					dtb[k].cnt++;
    					break;
    				}
    			}

    			if (k == sz)
    			{
    				strcpy(dtb[sz].Ho, Ho); // Ho moi
    				dtb[sz].sum = sv[j].DTB;
    				dtb[sz].cnt = 1;
    				sz++;
    			}
    		}

    		ans = -1.0;

    		for (int j = 0; j < sz; j++)
    		{
    			if (ans < dtb[j].sum / dtb[j].cnt)
    			{
    				ans = dtb[j].sum / dtb[j].cnt;
    				pos = j;
    			}
    		}

    		cout << dtb[pos].Ho << '\t' << fixed << setprecision(1) << round(ans) << endl;

Bạn tạo một mảng struct chứa họ, dtb và số lượng dtb(vì không biết trước có bao nhiêu người có họ đó). Sau đó mỗi lần check mảng sinh viên thì tách họ của người đó rồi xem đã có họ này trong mảng struct chưa.
Nếu có thì sum +=, cnt++
Nếu không thì là họ mới nên bạn khởi tạo sum = điểm sinh viên đó và cnt = 1

6 Likes

cảm ơn bác, em làm được rồi ạ

2 Likes

Làm được là hiểu được hay copy code về chạy được?

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