Bài tập cấu trúc dữ liệu: Làm sao nhập được N sinh viên?

Phần này chưa học, nên muốn tìm hiểu trước. Code trên là của người khác

Đề thi là như thế này:

Cho một danh sách sinh viên được mô tả chi tiết như sau:

  • Danh sách sinh viên gồm n sinh viên. với n được nhập bất kỳ.
  • Thông tin một sinh viên bao gồm: Số thứ tự, Mã số sinh viên, Họ tên sinh viên, Điểm Nhập môn lập trình, Môn toán A1, Môn toán A2, Môn Vật lý kỹ thuật, Môn anh văn, Điểm trung bình tích lũy, Xếp loại (xuất sắc, giỏi, khá, trung bình, yếu).
  • Thông tin môn học bao gồm: Mã môn, Tên môn, Số tín chỉ, Điểm.

Thực hiện các yêu cầu sau:
a) Hãy thiết kế và xây dựng các cấu trúc (struct) phù hợp cho bài toán (3 điểm).
b) Xây dựng một chương trình hoàn chỉnh cho một lớp học đảm bảo các thao tác sau:

  • Hàm nhập xuất danh sách sinh viên (2 điểm).
  • Tìm một sinh viên thông qua mã số sinh viên hoặc qua tên sinh viên (1 điểm)
  • Tìm sinh viên có điểm trung bình cao nhất (1 điểm)
  • Liệt kê danh sách các sinh viên thuộc một loại bất kỳ (1 điểm)
  • Thêm, xóa một sinh viên ra khỏi danh sách (2 điểm)
  • Sắp xếp danh sách sinh viên tăng dần (1 điểm).
    • Theo điểm trung bình tích lũy
    • Hoặc Theo tên theo thứ tự ABC …

Lưu ý:

  • ĐTBTC là trung bình cộng của tất cả các môn dựa trên điểm số và số tín chỉ.
  • Lưu ý: Xếp loại được tính như sau:
    • Xuất sắc: ĐTBTL>=9
    • Giỏi với: 8.0<=ĐTBTL<9
    • Khá với: 6.5<=ĐTBTL<8.0
    • Trung bình: 5.0<=ĐTBTL<6.5
    • Yếu: ĐTBTL<5
#include <stdio.h>
#include <conio.h>

#pragma pack(1) // Tránh bị làm tròn bộ nhớ.
// Khai báo cấu trúc dữ liệu sinh viên.
struct SinhVien
{
	char MaSo[30];
	float DiemToan, DiemLy, DiemHoa;
};
typedef struct SinhVien SINHVIEN; // Đổi "struct SinhVien" thành "SINHVIEN"

void NhapDuLieu(SINHVIEN &);
void XuatSinhVien(SINHVIEN);
float TinhDiemTrungBinh(SINHVIEN);

// Hàm nhập dữ liệu sinh viên.
void NhapDuLieu(SINHVIEN &x) // Chú ý: Phải có &: Tham chiếu.
{
	fflush(stdin); // Xóa bộ nhớ đệm.
	printf("\nNhap vao ho ten: ");
	gets(x.MaSo);

	// Nhập điểm toán.
	do{
		printf("\nNhap vao diem toan: ");
		scanf("%f", &x.DiemToan);

		if(x.DiemToan < 0 || x.DiemToan > 10)
		{
			printf("\nDiem toan khong hop le. Xin kiem tra lai !");
		}
	}while(x.DiemToan < 0 || x.DiemToan > 10);

	// Nhập điểm lý.
	do{
		printf("\nNhap vao diem ly: ");
		scanf("%f", &x.DiemLy);

		if(x.DiemLy < 0 || x.DiemLy > 10)
		{
			printf("\nDiem ly khong hop le. Xin kiem tra lai !");
		}
	}while(x.DiemLy < 0 || x.DiemLy > 10);

	// Nhập điểm hóa.
	do{
		printf("\nNhap vao diem hoa: ");
		scanf("%f", &x.DiemHoa);

		if(x.DiemHoa < 0 || x.DiemHoa > 10)
		{
			printf("\nDiem hoa khong hop le. Xin kiem tra lai !");
		}
	}
         while(x.DiemHoa < 0 || x.DiemHoa > 10);
}

// Hàm xuất sinh viên.
void XuatSinhVien(SINHVIEN x)
{
	printf("\nMa so: %s", x.MaSo);
	printf("\nDiem toan: %f", x.DiemToan);
	printf("\nDiem ly: %f", x.DiemLy);
	printf("\nDiem hoa: %f", x.DiemHoa);
	printf("\nDiem trung binh la: %f", TinhDiemTrungBinh(x));
}

// Tính điểm trung bình của sinh viên.
float TinhDiemTrungBinh(SINHVIEN x)
{
	return (x.DiemToan + x.DiemLy + x.DiemHoa) / 3;
}

void main()
{
	SINHVIEN x;
	NhapDuLieu(x);
	XuatSinhVien(x);
	printf("\nsizeof = %d", sizeof(x));
	getch();
}
5 Likes

Em viết cái đề cụ thể ra đi @Kelvin_Nguy_n? Em trình bày khó hiểu quá :cry:

2 Likes

có gì mà ko nhập được n sinh viên. mình mới tạo 1 struct với danh sách học sinh trong lớp học. bạn tìm khoá wiki có j ko hiểu hỏi mình :smile:

2 Likes

Phần này chưa học, nên muốn tìm hiểu trước. Code trên là của người khác
Đề thi là như thế này:
Cho một danh sách sinh viên được mô tả chi tiết như sau:

  • Danh sách sinh viên gồm n sinh viên. với n được nhập bất kỳ.
  • Thông tin một sinh viên bao gồm: Số thứ tự, Mã số sinh viên, Họ tên sinh viên, Điểm Nhập môn lập trình, Môn toán A1, Môn toán A2, Môn Vật lý kỹ thuật, Môn anh văn, Điểm trung bình tích lũy, Xếp loại (xuất sắc, giỏi, khá, trung bình, yếu).
  • Thông tin môn học bao gồm: Mã môn, Tên môn, Số tín chỉ, Điểm.

Thực hiện các yêu cầu sau:
a) Hãy thiết kế và xây dựng các cấu trúc (struct) phù hợp cho bài toán (3 điểm).
b) Xây dựng một chương trình hoàn chỉnh cho một lớp học đảm bảo các thao tác sau:

  • Hàm nhập xuất danh sách sinh viên (2 điểm).
  • Tìm một sinh viên thông qua mã số sinh viên hoặc qua tên sinh viên (1 điểm)
  • Tìm sinh viên có điểm trung bình cao nhất (1 điểm)
  • Liệt kê danh sách các sinh viên thuộc một loại bất kỳ (1 điểm)
  • Thêm, xóa một sinh viên ra khỏi danh sách (2 điểm)
  • Sắp xếp danh sách sinh viên tăng dần (1 điểm).
    • Theo điểm trung bình tích lũy
    • Hoặc Theo tên theo thứ tự ABC …

Lưu ý:

  • ĐTBTC là trung bình cộng của tất cả các môn dựa trên điểm số và số tín chỉ.
  • Lưu ý: Xếp loại được tính như sau:
    • Xuất sắc: ĐTBTL>=9
    • Giỏi với: 8.0<=ĐTBTL<9
    • Khá với: 6.5<=ĐTBTL<8.0
    • Trung bình: 5.0<=ĐTBTL<6.5
    • Yếu: ĐTBTL<5
3 Likes

quá dễ. :smile: đầu tiên bạn hãy tạo các thông tin cho 1 sinh viên đi. sau đó là bao nhiêu sinh viên chẳng được. làm từng bước nhỏ trc tránh sai xót. có j cứ lên đây hỏi ok

2 Likes

Theo mình là bạn có thể dùng danh sách liên kết hoặc dùng mảng cũng được,nhưng dùng danh sách liên kết có vẻ thú vị hơn đấy.Bạn có thể tham khảo các video về danh sách liên kết của anh Đạt đấy.

1 Like

đề yêu cầu dùng struct mà :smile: hehe

2 Likes

Không nên hỏi chèn vào topic của người khác @Nhanh_Lan_R_ng, em có topic riêng của em rồi mà.
I moved a post to an existing topic: Off-topics will be moved here

2 Likes

Dùng mảng hoặc biến con trỏ để lưu dữ liệu sinh viên

2 Likes

Tìm một sinh viên thông qua mã số sinh viên hoặc qua tên sinh viên thi lam như thế nào?

1 Like

Tìm 1 số có ở trong mảng không thì bạn làm thế nào?

1 Like

Viết 1 hàm tìm mã hoặc tên

1 Like
char *trichTen(char *hoten)
{
    int k = strlen(hoten) - 1;
    while (k >= 0 && hoten[k] != ' ') k--;
    return (hoten + k + 1);
}
 
void timTheoTen(char ten[10])
{
    printf("\nNhung sinh vien co ten '%s':\n", ten);
    Nut *p = dau;
    while (p != NULL)                       //duyệt danh sách
    {
        if (strcmp(trichTen(p->HoTen), ten) == 0)
            printf("- %s (%g diem)\n", p->HoTen, p->Diem);
        p = p->Tiep;
    }
}
3 Likes

Kiểu cấu trúc struct trong C
Bạn có thể tham khảo những video này. Ngoài ra đang quay lại video cấu trúc struct C++ có những câu hỏi trên của bạn .

1 Like

2 posts were split to a new topic: Thắc mắc bài tập struct

1 Like

A post was split to a new topic: Cần giúp đỡ bài tập cài đặt danh sách sinh viên

A post was split to a new topic: Hiển thị nhân viên có quê ở Hà Nội thì code như thế nào?

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

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

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