Thứ Tư, 28 Tháng Chín 2022
Trang chủLập trìnhLập trình C/C++Chương trình quản lý sinh viên sử dụng struct trong lập trình...

Chương trình quản lý sinh viên sử dụng struct trong lập trình C/C++

Chương trình quản lý sinh viên là một bài tập khá phổ biến khi học lập trình. Tiếp tục chuyên mục giải bài tập với Struct trong C/C++ hôm nay chúng ta sẽ cùng làm lại bài tập này nhé.

Chương trình quản lý sinh viên

Yêu cầu của bài toán

Cụ thể mình có thể phát biểu đề bài gồm có các ý như sau.

  1. Định nghĩa Struct Sinh viên bao gồm, tên sinh viên, quê quán, năm sinh, điểm toán, điểm lý, điểm hóa, điểm trung bình.
  2. Nhập vào n sinh viên gồm các thông tin tên sinh viên, quê quán, năm sinh, điểm toán, điểm lý, điểm hóa.
  3. Tính điểm trung bình toán, lý, hóa của các sinh viên.
  4. Xuất n sinh viên ra màn hình
  5. Tìm kiếm sinh viên theo tên nhập từ bàn phím.
  6. Sắp xếp sinh viên tên theo alpha B.
  7. Đếm số sinh viên có điểm trung bình là yếu, trung bình, khá và giỏi(Điểm trung bình: yếu < 5, 5<=tb < 6.5, 7 <= khá <= 7.9, giỏi >= 8)

Xây dựng chương trình

Đã có yêu cầu bài toán, bây giờ chúng ta hãy cùng viết chương trình Quản lý sinh viên.

Xây dựng Struct Sinh viên

Định nghĩa struc sinh viên như sau:

//Định nghĩa struct Sinh vien
typedef struct SinhVien{
	char name[100]; //biến tên sinh viên tối đa 100 ký tự
	char quequan[100]; //biên quê quán sinh viên tối đa 100 ký tự
	int namsinh; //Năm sinh
	float d_toan, d_ly, d_hoa; //Điểm toán, lý hóa
};

Vậy là ta đã định nghĩa xong struct Sinh viên, bây giờ ta cùng đi viết hàm nhập n sinh viên.

Xây dựng hàm nhập và tính điểm trung bình trong hàm nhập

//Viết hàm nhập vào n sinh viên
void nhap(int &n, SinhVien A[]){
	printf("Nhap so sinh vien ");
	scanf("%d", &n); //Nhập vào n số lượng sinh viên
	
//Sử dụng for để nhập vào thông tin n sinh viên
	for(int i = 0;i <n; i++){
      //Thực hiện nhập các thông tin cho một sinh viên
		printf("\nSinh vien thu %d: \n", i+1);
		printf(" Nhap ten: ");
		fflush(stdin);//Sau khi nhập số mà đến nhập chuỗi ta nên xóa bộ nhớ đệm
		gets(A[i].name);
		
		printf(" Nhap que quan: ");
		gets(A[i].quequan);
		
		printf(" Nhap Nam sinh: ");
		scanf("%d", &A[i].namsinh);
		
		printf(" Nhap diem toan: ");
		scanf("%f", &A[i].d_toan);
			
		printf(" Nhap diem ly: ");
		scanf("%f", &A[i].d_ly);
			
		printf(" Nhap diem hoa: ");
		scanf("%f", &A[i].d_hoa);
		
    //Tính điểm trung bình bằng cách cộng tổng điểm 3 môn toán lý hóa rồi chia cho 3
		A[i].dtb = (A[i].d_toan + A[i].d_ly + A[i].d_hoa) / 3;
	}
}

Vậy đã có hàm nhập, ta viết hàm xuất ra n sinh viên nhé.

Xây dựng hàm xuất n sinh viên

//Viết hàm xuất
void xuat(int n,  SinhVien A[]){
//Xuất tên cột
	printf("\n%-15s %-15s %-10s  %-10s  %-10s  %-10s %-10s","Ten sinh vien","Que quan","Nam sinh", "Diem toan", "Diem ly", "Diem hoa", "Diem tb");

//Sử dụng vòng lặp for để xuất thông tin n sinh viên
	for(int i = 0;i <n; i++){
		printf("\n%-15s %-15s %-10d  %-10.1f  %-10.1f %-10.1f %-10.1f", A[i].name,A[i].quequan, A[i].namsinh, A[i].d_toan, A[i].d_ly, A[i].d_hoa, A[i].dtb);
	}
}

Trong hàm printf %-15s, hay %-15d, dấu gạch 15(-15) có ý nghĩa là nó sẽ chiếm 1 khoảng vị trí gồm 15 ký tự. %-10.1f dấu (.1) có nghĩa là chỉ lấy 1 số sau dấu phẩy.

Hàm xuất n sinh viên cũn đã được viết xong.

Xây dựng hàm tìm kiếm sinh viên theo tên

Để tìm kiếm 1 sinh viên trong n sinh viên đã có, ta sẽ so sánh tên sinh viên đã nhập lần lượt với tất cả các sinh viên có trong dánh sách, sinh viên nào tên khớp thì ta đưa ra kết quả. Duyệt hết tất cả sinh viên mà không có sinh viên nào khớp tên thì không tìm thấy.

Để so sánh nhanh 2 chuỗi khớp nhau không ta có thể sử dụng 2 hàm có sẵn trong thư viên string.h là hàm strcmp, hàm này thì có phân biệt chữ hoa chữ thường. Hoặc ta sẽ dùng hàm stricmp, hàm này sẽ tối ưu hơn vì nó không phân biệt hoa thường, tức là bạn nhập tên là Kiet thì khi tìm kiếm kien nó vẫn sẽ cho ra kết quả.

Vậy ta có thể viết hàm tìm kiếm như sau:

//HÀM tim kiếm sinh viên theo tên
void timKiem(int n, SinhVien A[]){
//Nhập tên sinh viên cần tìm kiếm
	printf("Nhap ten sinh vien can tim: ");
	char name[100];
	fflush(stdin);
	gets(name);
	
	bool  check = false; //Biến để kiểm tra xem có sinh viên nào được tìm thấy hay không

   //Sử dụng  vòng for để lần lượt tìm qua tất cả sinh viên
	for(int i = 0; i< n; i++){
        //So sánh xem sinh viên nào có tên khớp với tên nhập từ bàn phím
		if(stricmp(A[i].name, name) == 0){
			check = true;
			printf("\n%-15s %-15s %-10d  %-10.1f  %-10.1f %-10.1f %-10.1f", A[i].name,A[i].quequan, A[i].namsinh, A[i].d_toan, A[i].d_ly, A[i].d_hoa, A[i].dtb);
		}
	}
	if(check == false){
		printf(" =>Khong tim thay sinh vien nao");
	}
}

Xây dựng hàm sắp xếp sinh viên

Xây dựng hàm sắp xếp sinh viên ta vẫn sẽ dùng cách sắp xếp đơn giản và phổ biến đối với những bạn mới học lập trình nhất sắp xếp tuần tự.

//Hàm sắp xếp sinh viên
void sapXep(int n, SinhVien A[]){
	for(int i = 0; i<n-1;i++){
		for(int j = i+1;j<n;j++){
   //kiểm tra xem sinh viên thứ nhất tên có tên đứng theo trước sinh viến thứ 2 theo  alpha B không thì ta sẽ đảo vị trí của chúng
			if(strcmp(A[i].name, A[j].name) == 1){
				SinhVien temp = A[i];
				A[i] = A[j];
				A[j] = temp;
 			}
		}
	}
	xuat(n, A);
}

Xây dựng hàm đếm số sinh viên yếu, trung bình, khá, giỏi

//Hàm đếm số sinh viên trung bình, yếu, khá, giỏi
void demYeuTbKhaGioi(int n, SinhVien A[]){
	int yeu = 0, tb = 0, kha = 0, gioi = 0;
	
	for(int i = 0; i<n;i++){
		if(A[i].dtb < 5) yeu++;
		else if(A[i].dtb < 6.5) tb++;
		else if(A[i].dtb < 8) kha++;
		else gioi++;
	}
	printf("\nSo sinh vien yeu la: %d", yeu);
	printf("\nSo sinh vien trung binh la: %d", tb);
	printf("\nSo sinh vien kha la: %d", kha);
	printf("\nSo sinh vien gioi la: %d", gioi);
}

Hàm main

Biến n và biến danh sách Sinh viên ta sẽ khai báo trong hàm main như bên dưới.

//Hàm main
int main()
{
	int n = 0; //Khai bao n
	SinhVien listSV[100]; //Khai báo danh sách SV tối đa la 100

    //Sau đó viết code gọi các hàm thành phần tại đây
}

Chương trình hoàn chỉnh

Như vậy là ta đã xây dựng xong các hàm thành phần với tất cả các ý mà bài toán yêu cầu. Bây giờ việc đơn giản chỉ là ghép chúng lại thành một chương trình hoàn chỉnh và chạy chương trình.

Code chương trình

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

struct SinhVien{
	char name[100];
	char quequan[100];
	int namsinh;
	float d_toan, d_ly, d_hoa;
	float dtb; 
};

void nhap(int &n, SinhVien A[]){
	printf("Nhap so sinh vien ");
	scanf("%d", &n);
	
	for(int i = 0;i <n; i++){
		printf("\nSinh vien thu %d: \n", i+1);
		printf(" Nhap ten: ");
		fflush(stdin);
		gets(A[i].name);
		
		printf(" Nhap que quan: ");
		gets(A[i].quequan);
		
		printf(" Nhap Nam sinh: ");
		scanf("%d", &A[i].namsinh);
		
		printf(" Nhap diem toan: ");
		scanf("%f", &A[i].d_toan);
			
		printf(" Nhap diem ly: ");
		scanf("%f", &A[i].d_ly);
			
		printf(" Nhap diem hoa: ");
		scanf("%f", &A[i].d_hoa);
		
		A[i].dtb = (A[i].d_toan + A[i].d_ly + A[i].d_hoa) / 3;
	}
}

void xuat(int n,  SinhVien A[]){
	printf("\n%-15s %-15s %-10s  %-10s  %-10s  %-10s %-10s","Ten sinh vien","Que quan","Nam sinh", "Diem toan", "Diem ly", "Diem hoa", "Diem tb");
	for(int i = 0;i <n; i++){
		printf("\n%-15s %-15s %-10d  %-10.1f  %-10.1f %-10.1f %-10.1f", A[i].name,A[i].quequan, A[i].namsinh, A[i].d_toan, A[i].d_ly, A[i].d_hoa, A[i].dtb);
	}
}

void timKiem(int n, SinhVien A[]){
	printf("Nhap ten sinh vien can tim: ");
	char name[100];
	fflush(stdin);
	gets(name);
	
	bool  check = false;
	for(int i = 0; i< n; i++){
		if(stricmp(A[i].name, name) == 0){
			check = true;
			printf("\n%-15s %-15s %-10d  %-10.1f  %-10.1f %-10.1f %-10.1f", A[i].name,A[i].quequan, A[i].namsinh, A[i].d_toan, A[i].d_ly, A[i].d_hoa, A[i].dtb);
		}
	}
	if(check == false){
		printf(" =>Khong tim thay sinh vien nao");
	}
}

void sapXep(int n, SinhVien A[]){
	for(int i = 0; i<n-1;i++){
		for(int j = i+1;j<n;j++){
			if(strcmp(A[i].name, A[j].name) == 1){
				SinhVien temp = A[i];
				A[i] = A[j];
				A[j] = temp;
 			}
		}
	}
	xuat(n, A);
}

void demYeuTbKhaGioi(int n, SinhVien A[]){
	int yeu = 0, tb = 0, kha = 0, gioi = 0;
	
	for(int i = 0; i<n;i++){
		if(A[i].dtb < 5) yeu++;
		else if(A[i].dtb < 6.5) tb++;
		else if(A[i].dtb < 8) kha++;
		else gioi++;
	}
	printf("\nSo sinh vien yeu la: %d", yeu);
	printf("\nSo sinh vien trung binh la: %d", tb);
	printf("\nSo sinh vien kha la: %d", kha);
	printf("\nSo sinh vien gioi la: %d", gioi);
}

int main()
{
	int n = 0;
	SinhVien listSV[100];
	
	printf("\n---------------NHAP-------------------\n");
	nhap(n, listSV);
	
	int chon = 1;
	
	while(chon != 0){
		printf("\n\n---------------------------------------------------------------------------\n");
		printf("1. Nhap lai\n");
		printf("2. Xuat DS sinh vien\n");
		printf("3. Tim kiem Sinh vien\n");
		printf("4. Sap xep DS Sinh Vien\n");
		printf("5. Dem so hoc sinh yeu, trung binh, kha,  gio\n");
		printf("0. Thoat\n");
		printf("---------------------------------------------------------------------------\n");
		printf(" Chon: ");
		scanf("%d", &chon);
		
		switch(chon){
			case 1:
				printf("\n---------------NHAP-------------------\n");
				nhap(n, listSV);
				break;
			case 2:
				printf("\n---------------XUAT-------------------\n");
				xuat(n, listSV);
				break;
			case 3:
				printf("\n---------------TIM KIEM-------------------\n");
				timKiem(n, listSV);
				break;
			case 4:
				printf("\n---------------SAP XEPSINH VIEN THEO TEN-------------------\n");
				sapXep(n, listSV);
				break;
			case 5:
				printf("\n---------------DEM HOC LUC SINH VIEN-------------------\n");
				demYeuTbKhaGioi(n, listSV);
				break;
		}
	}
}

Và đây là kết quả khi ta chạy chương trình trên

Kết quả khi chạy chương trình

[XEM THÊM TẤT CẢ BÀI VIẾT CHỦ ĐỀ C/C++ TẠI ĐÂY]

XEM THÊM
1000 lượt truy cập website kiếm được bao nhiêu tiền từ Google Adsense
Kiếm tiền Accesstrade, kiếm tiền tại nhà với Accesstrade.vn – Tiếp thị liên kết
Bài toán tách tên người nhập môn lập trình C/C++
Tìm UCLN, BCNN của 3 số, 4 số…nhiều số và của một mảng
0 0 Phiếu bình chọn
Xếp hạng bài viết
BÀI VIẾT LIÊN QUAN
Đăng ký nhận thông báo
Thông báo email khi
guest
0 Bình luận
Không thể gửi email
Phản hồi nội tuyến

NÊN ĐỌC THÊM

Bạn muốn tìm kiếm gì?


0
Giáo sư! có thể ném gạch bên dưới nhé!x
()
x