Bài toán quản lý sinh viên bằng c năm 2024

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.