Cần gợi ý cách chọn ra học sinh cao điểm nhất trong một mảng lớp

Viết chương trình thực hiện những yêu cầu sau:
a. Nhập mảng một chiều các lớp học (LOPHOC). Biết rằng một lớp học gồm những thành phần như sau:

  • Tên lớp: chuỗi tối đa 30 ký tự.
  • Sĩ số: kiểu số nguyên 2 byte.
  • Danh sách các học sinh trong lớp ( tối đa 50 học sinh).

b. Xuất mảng.
c. Tìm một lớp có sỉ số đông nhất.
d. Tìm một học sinh có điểm trung bình lớn nhất

Hi mọi người, mình tới câu d chưa nghĩ ra hướng giải quyết, nhờ mọi người góp ý với ạ.
Thank all

#include"stdio.h"
#include"conio.h"
#define size 40

struct HOCSINH
{
	char hoten[30];
	float toan;
	float van;
	float trungbinh;
};


struct LOPHOC
{
	char ten[30];
	int siso;
	HOCSINH hs[size];
};


void Nhap_1_HS(HOCSINH* hs)
{
	printf("Ho ten: ");
	while (getchar() != '\n');
	gets_s(hs->hoten);
	printf("Diem mon Toan: ");
	scanf_s("%f", &hs->toan);
	printf("Diem mon Van: ");
	scanf_s("%f", &hs->van);
}

void Xuat_1_HS(HOCSINH hs)
{
	puts(hs.hoten);
	printf("Diem Toan: ");
	printf("%.2f\n", hs.toan);
	printf("Diem Van: ");
	printf("%.2f\n", hs.van);
	printf("Diem trung binh: ");
	hs.trungbinh = (float)(hs.van + hs.toan) / 2;
	printf("%.2f", hs.trungbinh);
	printf("\n\n");
}

void Nhap_1_lop_hoc(LOPHOC* lop)
{
	while (getchar() != '\n');
	printf("Ten lop: ");
	gets_s(lop->ten);
	do
	{
		printf("Si so: ");
		scanf_s("%d", &lop->siso);
	} while (lop->siso < 1 || lop->siso > size);
	for (int i = 0; i < lop->siso; i++)
	{
		Nhap_1_HS(&lop->hs[i]);
	}
}

void Xuat_1_lop_hoc(LOPHOC lop)
{
	printf("\nlop: ");
	puts(lop.ten);
	printf("Si so: %d", lop.siso);
	printf("\nDanh sach:\n");
	for (int i = 0; i < lop.siso; i++)
	{
		Xuat_1_HS(lop.hs[i]);
	}
}

void Nhap_DS_lop(LOPHOC lop[], int* n)
{
	do
	{
		printf("Nhap so luong lop hoc: ");
		scanf_s("%d", n);
	}
	while (*n < 1 || *n > size);
	for (int i = 0; i < *n; i++)
	{
		Nhap_1_lop_hoc(&lop[i]);
	}
}

void Xuat_DS_lop(LOPHOC lop[], int n)
{
	for (int i = 0; i < n; i++)
	{
		Xuat_1_lop_hoc(lop[i]);
	}
}

//Tim lop co si so dong nhat
void Siso_max(LOPHOC lop[], int n)
{
	int max = lop[0].siso;
	int vt = 0;
	for(int i = 0; i < n; i++)
	{
		if (lop[i].siso > max)
		{
			max = lop[i].siso;
			vt = i;
		}
	}
	printf("Lop: ");
	puts(lop[vt].ten);
	printf("Si so: %d", lop[vt].siso);
}


void main()
{
	LOPHOC lop[size];
	int n;
	HOCSINH hs[size];
	Nhap_DS_lop(lop, &n);
	Xuat_DS_lop(lop, n);
	printf("Lop co si so dong nhat:\n");
	Siso_max(lop, n);
	
	

}
  • Gán học sinh đầu tiên là max
  • loop qua tất cả học sinh, đứa mô điểm cao hơn thì update lại giá trị của max là học sinh đó

Giống tìm số lớn nhất ý mà

  1. Ở phần khai báo cấu trúc theo yêu cầu của câu a:
    • Sĩ số kiểu số nguyên 2 byte là kiểu short, kiểu int là 4 byte.
    • Danh sách học sinh tối đa là 50, nhưng bạn khai báo chỉ có 40 (size).
  2. Câu d cũng giống với câu c, cũng tìm giá trị lớn nhất, nhưng phải lặp lần 1 qua từng lớp, sau đó lặp lồng lần 2 qua từng học sinh trong lớp đó để tìm điểm lớp nhất như cách làm câu c.
    Lần này bạn phải lưu cả vị trí của lớp học và vị trí của học sinh. vt.
3 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

Thank bạn đã góp ý. Mình có đoạn code cho câu d nhưng chưa chạy được

void Hs_max_lop(LOPHOC lop[], int n)
{
	float max = lop[0].hs[0].trungbinh;//hs dau tien cua lop dau tien co max tb, 
	for (int i = 0; i < n; i++)
	{
		for(int j = 0; j < lop[i].siso; j++)
		if (lop[i].hs[j].trungbinh > max)
		{
			max = lop[i].hs[j].trungbinh;
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j, lop[i].siso; j++)
		{
			if (lop[i].hs[j].trungbinh == max)
			{
				Xuat_1_HS(lop[i].hs[j]);
			}
		}
	}
}

Nhờ bạn xem qua thử nha. Cám ơn bạn

Bác @ SITUVN.gcd đã gợi ý:
Lần này bạn phải lưu cả vị trí của lớp học và vị trí của học sinh. vt .
Có vẻ bạn không để ý lắm.

Có nghĩa là bạn cần thêm 2 biến:
1 để lưu index của lớp có chứa học sinh cao điểm nhất.
1 để lưu index của học sinh đó trong lớp.
Khi gán max đồng thời bạn cũng gán cho 2 giá trị index

Khi vòng lặp for đầu tiên xong chúng ta đã có 3 giá trị điểm cao nhất, index lớp chứa học sinh cao điểm nhất, index của học sinh cao điểm nhất trong lớp.

Để in ra học sinh cao điểm nhất bạn chỉ cần truy cập vào

lớp[index lớp chứa học sinh cao điểm nhất].hs[index của học sinh trong lớp]

như vậy sẽ nhanh hơn so với phải lặp lần thứ 2 để in ra.

Ps: for (int j = 0; j, lop[i].siso; j++) vòng lặp 2 sai syntax

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