Bài tập quản lý sinh viên trong C/C++Bài tập quản lý sinh viên trong C/C++

Chào mừng bạn đến với EzBeauty.vn! Trong bài viết này, chúng ta sẽ tìm hiểu về cách quản lý sinh viên trong C/C++ thông qua một bài tập thú vị. Hãy cùng khám phá nhé!

Đề bài

Đề bài: Viết chương trình quản lý sinh viên trong C/C++. Mỗi đối tượng sinh viên có các thuộc tính sau: id, tên, giới tính, tuổi, điểm toán, điểm lý, điểm hóa, điểm trung bình và học lực.
Id là mã sinh viên tự động tăng.
Khi khởi tạo, chương trình sẽ đọc file “student.txt” để lấy ra danh sách sinh viên đã được lưu trước đó.
Điểm trung bình là giá trị trung bình của 3 môn toán, lý và hóa.
Học lực được tính như sau:

  • Giỏi: nếu điểm trung bình lớn hơn hoặc bằng 8.
  • Khá: nếu điểm trung bình nhỏ hơn 8 và lớn hơn hoặc bằng 6.5.
  • Trung Bình: nếu điểm trung bình nhỏ hơn 6.5 và lớn hơn hoặc bằng 5.
  • Yếu: nếu điểm trung bình nhỏ hơn 5.

Yêu cầu:

  • Tạo ra một menu với các chức năng sau:
      1. Thêm sinh viên.
      1. Cập nhật thông tin sinh viên bởi ID.
      1. Xóa sinh viên bởi ID.
      1. Tìm kiếm sinh viên theo tên.
      1. Sắp xếp sinh viên theo điểm trung bình (GPA).
      1. Sắp xếp sinh viên theo tên.
      1. Hiển thị danh sách sinh vien.
      1. Ghi danh sách sinh viên vào file “student.txt”.

Lời giải

Chúng ta sẽ sử dụng cấu trúc struct để định nghĩa một sinh viên và một mảng struct để lưu trữ danh sách sinh viên. Hãy cùng điểm qua các bước cài đặt chương trình quản lý sinh viên trong C/C++.

Tạo cấu trúc SinhVien

Chúng ta sẽ tạo cấu trúc SinhVien như sau, với trường diemTB để tính điểm trung bình và trường hocluc để xếp loại học lực.

  int id;
  char ten[50];
  char gioiTinh[10];
  int tuoi;
  float diemToan;
  float diemLy;
  float diemHoa;
  float diemTB;
  char hocluc[10];
};

Định nghĩa các hàm

Sau đây là danh sách các hàm mà chúng ta sẽ sử dụng trong chương trình quản lý sinh viên. Các hàm này sẽ được cung cấp thân hàm sau đó.

1. Hàm printLine(int n)

Hàm này in ra một dòng có n ký tự “_”.

void printLine(int n) {
  for (int i = 0; i < n; i++) {
    printf("_");
  }
  printf("n");
}

2. Hàm idLonNhat(SV a[], int n)

Yêu cầu của bài toán là id của sinh viên tự động tăng. Chúng ta sẽ tạo hàm này để lấy ra id lớn nhất của danh sách sinh viên a[].

int idLonNhat(SV a[], int n) {
  int maxId = 0;
  for (int i = 0; i < n; i++) {
    if (a[i].id > maxId) {
      maxId = a[i].id;
    }
  }
  return maxId;
}

3. Hàm nhập thông tin sinh viên

Hàm này được sử dụng để thêm mới sinh viên vào danh sách sinh viên. Với hàm này, chúng ta sẽ tách ra thành 2 hàm sau.

void nhapThongTinSV(SV &sv, int id)

void nhapThongTinSV(SV &sv, int id) {
  printf("Nhap ten sinh vien: ");
  fflush(stdin);
  gets(sv.ten);
  printf("Nhap gioi tinh: ");
  fflush(stdin);
  gets(sv.gioiTinh);
  printf("Nhap tuoi: ");
  scanf("%d", &sv.tuoi);
  printf("Nhap diem toan: ");
  scanf("%f", &sv.diemToan);
  printf("Nhap diem ly: ");
  scanf("%f", &sv.diemLy);
  printf("Nhap diem hoa: ");
  scanf("%f", &sv.diemHoa);
  sv.id = id;
  sv.diemTB = (sv.diemToan + sv.diemLy + sv.diemHoa) / 3;
  if (sv.diemTB >= 8) {
    strcpy(sv.hocluc, "Gioi");
  } else if (sv.diemTB >= 6.5) {
    strcpy(sv.hocluc, "Kha");
  } else if (sv.diemTB >= 5) {
    strcpy(sv.hocluc, "Trung Binh");
  } else {
    strcpy(sv.hocluc, "Yeu");
  }
}

void nhapSV(SV a[], int id, int n)

void nhapSV(SV a[], int id, int n) {
  for (int i = 0; i < id; i++) {
    nhapThongTinSV(a[i], i + 1);
  }
  printf("Them sinh vien moi:n");
  nhapThongTinSV(a[id], id + 1);
  printf("Them sinh vien thanh cong!n");
}

4. Hàm cập nhật thông tin sinh viên

Hàm này được sử dụng để cập nhật thông tin sinh viên theo ID. Với hàm này, chúng ta sẽ tách ra thành 2 hàm sau.

void capNhatThongTinSV(SV &sv)

void capNhatThongTinSV(SV &sv) {
  printf("Nhap ten sinh vien moi: ");
  fflush(stdin);
  gets(sv.ten);
  printf("Nhap gioi tinh moi: ");
  fflush(stdin);
  gets(sv.gioiTinh);
  printf("Nhap tuoi moi: ");
  scanf("%d", &sv.tuoi);
  printf("Nhap diem toan moi: ");
  scanf("%f", &sv.diemToan);
  printf("Nhap diem ly moi: ");
  scanf("%f", &sv.diemLy);
  printf("Nhap diem hoa moi: ");
  scanf("%f", &sv.diemHoa);
  sv.diemTB = (sv.diemToan + sv.diemLy + sv.diemHoa) / 3;
  if (sv.diemTB >= 8) {
    strcpy(sv.hocluc, "Gioi");
  } else if (sv.diemTB >= 6.5) {
    strcpy(sv.hocluc, "Kha");
  } else if (sv.diemTB >= 5) {
    strcpy(sv.hocluc, "Trung Binh");
  } else {
    strcpy(sv.hocluc, "Yeu");
  }
  printf("Cap nhat thong tin sinh vien thanh cong!n");
}

void capNhatSV(SV a[], int id, int n)

void capNhatSV(SV a[], int id, int n) {
  int flag = 0;
  int index = -1;
  for (int i = 0; i < n; i++) {
    if (a[i].id == id) {
      index = i;
      flag = 1;
      break;
    }
  }
  if (flag == 0) {
    printf("Khong tim thay sinh vien co ID = %dn", id);
  } else {
    capNhatThongTinSV(a[index]);
  }
}

5. Hàm xóa sinh viên theo ID

Hàm này được sử dụng để xóa sinh viên khỏi danh sách theo ID. Nếu sinh viên có ID đã cho trong danh sách, thì thực hiện xóa sinh viên.

void xoaTheoID(SV a[], int id, int &n) {
  int flag = 0;
  int index = -1;
  for (int i = 0; i < n; i++) {
    if (a[i].id == id) {
      index = i;
      flag = 1;
      break;
    }
  }
  if (flag == 0) {
    printf("Khong tim thay sinh vien co ID = %dn", id);
  } else {
    for (int i = index; i < n - 1; i++) {
      a[i] = a[i + 1];
    }
    n--;
    printf("Xoa sinh vien co ID = %d thanh cong!n", id);
  }
}

6. Hàm tìm kiếm sinh viên theo tên

Hàm này được sử dụng để tìm kiếm sinh viên trong danh sách theo tên. Không phân biệt chữ hoa, chữ thường.

void timKiemTheoTen(SV a[], char ten[], int n) {
  int flag = 0;
  for (int i = 0; i < n; i++) {
    if (strcasecmp(a[i].ten, ten) == 0) {
      flag = 1;
      printf("Sinh vien co ten "%s" co ID = %dn", a[i].ten, a[i].id);
    }
  }
  if (flag == 0) {
    printf("Khong tim thay sinh vien co ten "%s"n", ten);
  }
}

7. Hàm tính điểm trung bình và xếp loại học lực

void tinhDTB(SV &sv) {
  sv.diemTB = (sv.diemToan + sv.diemLy + sv.diemHoa) / 3;
}

void xeploai(SV &sv) {
  if (sv.diemTB >= 8) {
    strcpy(sv.hocluc, "Gioi");
  } else if (sv.diemTB >= 6.5) {
    strcpy(sv.hocluc, "Kha");
  } else if (sv.diemTB >= 5) {
    strcpy(sv.hocluc, "Trung Binh");
  } else {
    strcpy(sv.hocluc, "Yeu");
  }
}

8. Hàm sắp xếp danh sách sinh viên theo điểm trung bình

Hàm này được sử dụng để sắp xếp sinh viên theo điểm trung bình theo thứ tự tăng dần.

void sapxepTheoDTB(SV a[], int n) {
  for (int i = 0; i < n - 1; i++) {
    for (int j = i + 1; j < n; j++) {
      if (a[i].diemTB > a[j].diemTB) {
        SinhVien temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }
  }
  printf("Sap xep danh sach sinh vien theo diem trung binh (GPA) thanh cong!n");
}

9. Hàm sắp xếp danh sách sinh viên theo tên

Hàm này được sử dụng để sắp xếp sinh viên theo tên theo thứ tự tăng dần và không phân biệt chữ hoa, chữ thường.

void sapXepTheoTen(SV a[], int n) {
  for (int i = 0; i < n - 1; i++) {
    for (int j = i + 1; j < n; j++) {
      if (strcasecmp(a[i].ten, a[j].ten) > 0) {
        SinhVien temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }
  }
  printf("Sap xep danh sach sinh vien theo ten thanh cong!n");
}

10. Hàm hiển thị danh sách sinh viên ra màn hình

Hàm này được sử dụng để hiển thị danh sách sinh viên ra màn hình.

void showStudent(SV a[], int n) {
  printf("%-5s %-20s %-10s %-5s %-10s %-10s %-10s %-10s %-10sn", "ID", "Ten", "Gioi Tinh", "Tuoi", "Diem Toan", "Diem Ly", "Diem Hoa", "Diem TB", "Hoc Luc");
  printLine(90);
  for (int i = 0; i < n; i++) {
    printf("%-5d %-20s %-10s %-5d %-10f %-10f %-10f %-10f %-10sn", a[i].id, a[i].ten, a[i].gioiTinh, a[i].tuoi, a[i].diemToan, a[i].diemLy, a[i].diemHoa, a[i].diemTB, a[i].hocluc);
  }
}

11. Hàm đọc danh sách sinh viên từ file

Hàm này được sử dụng để đọc danh sách sinh viên từ file.

int docFile(SV a[], char fileName[]) {
  FILE *file = fopen(fileName, "rb");
  int n;
  if (file == NULL) {
    printf("Khong tim thay file "%s"n", fileName);
    return 0;
  } else {
    fread(&n, sizeof(int), 1, file);
    fread(a, sizeof(SV), n, file);
    fclose(file);
    return n;
  }
}

12. Hàm ghi danh sách sinh viên vào file

Hàm này được sử dụng để ghi danh sách sinh viên vào file.

void ghiFile(SV a[], int n, char fileName[]) {
  FILE *file = fopen(fileName, "wb");
  fwrite(&n, sizeof(int), 1, file);
  fwrite(a, sizeof(SV), n, file);
  fclose(file);
  printf("Ghi danh sach sinh vien vao file "%s" thanh cong!n", fileName);
}

13. Hàm main của chương trình quản lý sinh vien trong C/C++

Hàm main của chúng ta được sử dụng để khởi tạo menu và điều khiển chương trình quản lý sinh viên.

int main() {
  int key;
  char fileName[] = "student.txt";
  SV arraySV[100];
  int soluongSV = docFile(arraySV, fileName);
  int idCount = idLonNhat(arraySV, soluongSV);

  printf("Chuong trinh quan ly sinh vienn");
  printf("-------------------------------n");

  do {
    printf("Menu:n");
    printf("1. Them sinh vien.n");
    printf("2. Cap nhat thong tin sinh vien theo ID.n");
    printf("3. Xoa sinh vien theo ID.n");
    printf("4. Tim kiem sinh vien theo ten.n");
    printf("5. Sap xep sinh vien theo diem trung binh (GPA).n");
    printf("6. Sap xep sinh vien theo ten.n");
    printf("7. Hien thi danh sach sinh vien.n");
    printf("8. Ghi danh sach sinh vien vao file "%s".n", fileName);
    printf("0. Thoat chuong trinh.n");
    printf("> ");
    scanf("%d", &key);

    switch(key) {
      case 1:
        idCount++;
        nhapSV(arraySV, idCount, soluongSV);
        soluongSV++;
        break;
      case 2: {
        int id;
        printf("Nhap ID sinh vien can cap nhat: ");
        scanf("%d", &id);
        capNhatSV(arraySV, id, soluongSV);
        break;
      }
      case 3: {
        int id;
        printf("Nhap ID sinh vien can xoa: ");
        scanf("%d", &id);
        xoaTheoID(arraySV, id, soluongSV);
        break;
      }
      case 4: {
        char ten[50];
        fflush(stdin);
        printf("Nhap ten sinh vien can tim kiem: ");
        gets(ten);
        timKiemTheoTen(arraySV, ten, soluongSV);
        break;
      }
      case 5:
        sapxepTheoDTB(arraySV, soluongSV);
        break;
      case 6:
        sapXepTheoTen(arraySV, soluongSV);
        break;
      case 7:
        showStudent(arraySV, soluongSV);
        break;
      case 8:
        ghiFile(arraySV, soluongSV, fileName);
        break;
      case 0:
        printf("Tam biet!n");
        break;
      default:
        printf("Lua chon khong hop le. Vui long chon lai!n");
    }
    printf("-------------------------------n");
  } while(key != 0);

  return 0;
}

Cài đặt chương trình quản lý sinh viên trong C/C++

Sau đây là toàn bộ code của chương trình quản lý sinh viên:

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

struct SinhVien {
  int id;
  char ten[50];
  char gioiTinh[10];
  int tuoi;
  float diemToan;
  float diemLy;
  float diemHoa;
  float diemTB;
  char hocluc[10];
};

void printLine(int n) {
  for (int i = 0; i < n; i++) {
    printf("_");
  }
  printf("n");
}

int idLonNhat(SV a[], int n) {
  int maxId = 0;
  for (int i = 0; i < n; i++) {
    if (a[i].id > maxId) {
      maxId = a[i].id;
    }
  }
  return maxId;
}

void nhapThongTinSV(SV &sv, int id) {
  printf("Nhap ten sinh vien: ");
  fflush(stdin);
  gets(sv.ten);
  printf("Nhap gioi tinh: ");
  fflush(stdin);
  gets(sv.gioiTinh);
  printf("Nhap tuoi: ");
  scanf("%d", &sv.tuoi);
  printf("Nhap diem toan: ");
  scanf("%f", &sv.diemToan);
  printf("Nhap diem ly: ");
  scanf("%f", &sv.diemLy);
  printf("Nhap diem hoa: ");
  scanf("%f", &sv.diemHoa);
  sv.id = id;
  sv.diemTB = (sv.diemToan + sv.diemLy + sv.diemHoa) / 3;
  if (sv.diemTB >= 8) {
    strcpy(sv.hocluc, "Gioi");
  } else if (sv.diemTB >= 6.5) {
    strcpy(sv.hocluc, "Kha");
  } else if (sv.diemTB >= 5) {
    strcpy(sv.hocluc, "Trung Binh");
  } else {
    strcpy(sv.hocluc, "Yeu");
  }
}

void nhapSV(SV a[], int id, int n) {
  for (int i = 0; i < id; i++) {
    nhapThongTinSV(a[i], i + 1);
  }
  printf("Them sinh vien moi:n");
  nhapThongTinSV(a[id], id + 1);
  printf("Them sinh vien thanh cong!n");
}

void capNhatThongTinSV(SV &sv) {
  printf("Nhap ten sinh vien moi: ");
  fflush(stdin);
  gets(sv.ten);
  printf("Nhap gioi tinh moi: ");
  fflush(stdin);
  gets(sv.gioiTinh);
  printf("Nhap tuoi moi: ");
  scanf("%d", &sv.tuoi);
  printf("Nhap diem toan moi: ");
  scanf("%f", &sv.diemToan);
  printf("Nhap diem ly moi: ");
  scanf("%f", &sv.diemLy);
  printf("Nhap diem hoa moi: ");
  scanf("%f", &sv.diemHoa);
  sv.diemTB = (sv.diemToan + sv.diemLy + sv.diemHoa) / 3;
  if (sv.diemTB >= 8) {
    strcpy(sv.hocluc, "Gioi");
  } else if (sv.diemTB >= 6.5) {
    strcpy(sv.hocluc, "Kha");
  } else if (sv.diemTB >= 5) {
    strcpy(sv.hocluc, "Trung Binh");
  } else {
    strcpy(sv.hocluc, "Yeu");
  }
  printf("Cap nhat thong tin sinh vien thanh cong!n");
}

void capNhatSV(SV a[], int id, int n) {
  int flag = 0;
  int index = -1;
  for (int i = 0; i < n; i++) {
    if (a[i].id == id) {
      index = i;
      flag = 1;
      break;
    }
  }
  if (flag == 0) {
    printf("Khong tim thay sinh vien co ID = %dn", id);
  } else {
    capNhatThongTinSV(a[index]);
  }
}

void xoaTheoID(SV a[], int id, int &n) {
  int flag = 0;
  int index = -1;
  for (int i = 0; i < n; i++) {
    if (a[i].id == id) {
      index = i;
      flag = 1;
      break;
    }
  }
  if (flag == 0) {
    printf("Khong tim thay sinh vien co ID = %dn", id);
  } else {
    for (int i = index; i < n - 1; i++) {
      a[i] = a[i + 1];
    }
    n--;
    printf("Xoa sinh vien co ID = %d thanh cong!n", id);
  }
}

void timKiemTheoTen(SV a[], char ten[], int n) {
  int flag = 0;
  for (int i = 0; i < n; i++) {
    if (strcasecmp(a[i].ten, ten) == 0) {
      flag = 1;
      printf("Sinh vien co ten "%s" co ID = %dn", a[i].ten, a[i].id);
    }
  }
  if (flag == 0) {
    printf("Khong tim thay sinh vien co ten "%s"n", ten);
  }
}

void tinhDTB(SV &sv) {
  sv.diemTB = (sv.diemToan + sv.diemLy + sv.diemHoa) / 3;
}

void xeploai(SV &sv) {
  if (sv.diemTB >= 8) {
    strcpy(sv.hocluc, "Gioi");
  } else if (sv.diemTB >= 6.5) {
    strcpy(sv.hocluc, "Kha");
  } else if (sv.diemTB >= 5) {
    strcpy(sv.hocluc, "Trung Binh");
  } else {
    strcpy(sv.hocluc, "Yeu");
  }
}

void sapxepTheoDTB(SV a[], int n) {
  for (int i = 0; i < n - 1; i++) {
    for (int j = i + 1; j < n; j++) {
      if (a[i].diemTB > a[j].diemTB) {
        SinhVien temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }
  }
  printf("Sap xep danh sach sinh vien theo diem trung binh (GPA) thanh cong!n");
}

void sapXepTheoTen(SV a[], int n) {
  for (int i = 0; i < n - 1; i++) {
    for (int j = i + 1; j < n; j++) {
      if (strcasecmp(a[i].ten, a[j].ten) > 0) {
        SinhVien temp = a[i];
        a[i] = a[j];
        a[j] = temp;
      }
    }
  }
  printf("Sap xep danh sach sinh vien theo ten thanh cong!n");
}

void showStudent(SV a[], int n) {
  printf("%-5s %-20s %-10s %-5s %-10s %-10s %-10s %-10s %-10sn", "ID", "Ten", "Gioi Tinh", "Tuoi", "Diem Toan", "Diem Ly", "Diem Hoa", "Diem TB", "Hoc Luc");
  printLine(90);
  for (int i = 0; i < n; i++) {
    printf("%-5d %-20s %-10s %-5d %-10f %-10f %-10f %-10f %-10sn", a[i].id, a[i].ten, a[i].gioiTinh, a[i].tuoi, a[i].diemToan, a[i].diemLy, a[i].diemHoa, a[i].diemTB, a[i].hocluc);
  }
}

int docFile(SV a[], char fileName[]) {
  FILE *file = fopen(fileName, "rb");
  int n;
  if (file == NULL) {
    printf("Khong tim thay file "%s"n", fileName);
    return 0;
  } else {
    fread(&n, sizeof(int), 1, file);
    fread(a, sizeof(SV), n, file);
    fclose(file);
    return n;
  }
}

void ghiFile(SV a[], int n, char fileName[]) {
  FILE *file = fopen(fileName, "wb");
  fwrite(&n, sizeof(int), 1, file);
  fwrite(a, sizeof(SV), n, file);
  fclose(file);
  printf("Ghi danh sach sinh vien vao file "%s" thanh cong!n", fileName);
}

int main() {
  int key;
  char fileName[] = "student.txt";
  SV arraySV[100];
  int soluongSV = docFile(arraySV, fileName);
  int idCount = idLonNhat(arraySV, soluongSV);

  printf("Chuong trinh quan ly sinh vienn");
  printf("-------------------------------n");

  do {
    printf("Menu:n");
    printf("1. Them sinh vien.n");
    printf("2. Cap nhat thong tin sinh vien theo ID.n");
    printf("3. Xoa sinh vien theo ID.n");
    printf("4. Tim kiem sinh vien theo ten.n");
    printf("5. Sap xep sinh vien theo diem trung binh (GPA).n");
    printf("6. Sap xep sinh vien theo ten.n");
    printf("7. Hien thi danh sach sinh vien.n");
    printf("8. Ghi danh sach sinh vien vao file "%s".n", fileName);
    printf("0. Thoat chuong trinh.n");
    printf("> ");
    scanf("%d", &key);

    switch(key) {
      case 1:
        idCount++;
        nhapSV(arraySV, idCount, soluongSV);
        soluongSV++;
        break;
      case 2: {
        int id;
        printf("Nhap ID sinh vien can cap nhat: ");
        scanf("%d", &id);
        capNhatSV(arraySV, id, soluongSV);
        break;
      }
      case 3: {
        int id;
        printf("Nhap ID sinh vien can xoa: ");
        scanf("%d", &id);
        xoaTheoID(arraySV, id, soluongSV);
        break;
      }
      case 4: {
        char ten[50];
        fflush(stdin);
        printf("Nhap ten sinh vien can tim kiem: ");
        gets(ten);
        timKiemTheoTen(arraySV, ten, soluongSV);
        break;
      }
      case 5:
        sapxepTheoDTB(arraySV, soluongSV);
        break;
      case 6:
        sapXepTheoTen(arraySV, soluongSV);
        break;
      case 7:
        showStudent(arraySV, soluongSV);
        break;
      case 8:
        ghiFile(arraySV, soluongSV, fileName);
        break;
      case 0:
        printf("Tam biet!n");
        break;
      default:
        printf("Lua chon khong hop le. Vui long chon lai!n");
    }
    printf("-------------------------------n");
  } while(key != 0);

  return 0;
}

Run chương trình quản lý sinh viên trong C/C++

Chạy chương trình C/C++ cho kết quả ban đầu như sau:

Bài tập quản lý sinh viên trong C/C++

Nhập một vài sinh viên vào hệ thống:

Bài tập quản lý sinh viên trong C/C++

Hiển thị danh sách sinh viên:

Bài tập quản lý sinh viên trong C/C++

Tìm kiếm sinh viên theo tên:

Bài tập quản lý sinh viên trong C/C++

Sắp xếp sinh viên theo điểm trung bình:

Bài tập quản lý sinh viên trong C/C++

Sắp xếp sinh viên theo tên:

Bài tập quản lý sinh viên trong C/C++

Ghi danh sách sinh viên vào file “student.txt”:

Bài tập quản lý sinh viên trong C/C++

Nội dung file “student.txt”:

Bài tập quản lý sinh viên trong C/C++

Download chương trình quản lý sinh viên trong C/C++

Bạn có thể tải về chương trình quản lý sinh viên trong C/C++ tại đây.

By Hà Phương

Với kinh nghiệm trên 7 năm trong lĩnh vực làm đẹp mình tạo nên EzBeauty là website chia sẻ kiến thức và thông tin cho mọi người!