Xây dựng lớp điểm trong c++

Đề 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.
  • 2. Cập nhật thông tin sinh viên bởi ID.
  • 3. Xóa sinh viên bởi ID.
  • 4. Tìm kiếm sinh viên theo tên.
  • 5. Sắp xếp sinh viên theo điểm trung bình (GPA).
  • 6. Sắp xếp sinh viên theo tên.
  • 7. Hiển thị danh sách sinh vien.
  • 8. Ghi danh sách sinh viên vào file "student.txt" .


Lời giải

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


Tạo cấu trúc sinh vien

Chúng ta sẽ tạo một cấu trúc sinh viên như sau, diemTB sẽ được tính bằng trung bình của các môn toán, lý và hóa. hocluc sẽ được tính toán dựa vào diemTB như yêu cầu của bài toán.

struct SinhVien {
    int id;
    char ten[30];
    char gioiTinh[5];
    int tuoi;
    float diemToan;
    float diemLy;
    float diemHoa;
    float diemTB = 0;
    char hocluc[10] = "-";
};

Bây giờ chúng ta có thể sử dụng struct SinhVien với đơn giản hơn bằng SV với từ khóa

void printLine(int n);
int idLonNhat(SV a[], int n);
void nhapThongTinSV(SV &sv, int id);
void nhapSV(SV a[], int id, int n);
void capNhatThongTinSV(SV &sv);
void capNhatSV(SV a[], int id, int n);
int xoaTheoID(SV a[], int id, int n);
void timKiemTheoTen(SV a[], char ten[], int n);
void tinhDTB(SV &sv);
void xeploai(SV &sv);
void sapxepTheoDTB(SV a[], int n);
void sapXepTheoTen(SV a[], int n);
void showStudent(SV a[], int n);
int docFile(SV a[], char fileName[]);
void ghiFile(SV a[], int n, char fileName[]);
void pressAnyKey();
0, như sau:

typedef SinhVien SV;



Đị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 đó:

void printLine(int n);
int idLonNhat(SV a[], int n);
void nhapThongTinSV(SV &sv, int id);
void nhapSV(SV a[], int id, int n);
void capNhatThongTinSV(SV &sv);
void capNhatSV(SV a[], int id, int n);
int xoaTheoID(SV a[], int id, int n);
void timKiemTheoTen(SV a[], char ten[], int n);
void tinhDTB(SV &sv);
void xeploai(SV &sv);
void sapxepTheoDTB(SV a[], int n);
void sapXepTheoTen(SV a[], int n);
void showStudent(SV a[], int n);
int docFile(SV a[], char fileName[]);
void ghiFile(SV a[], int n, char fileName[]);
void pressAnyKey();


1. Hàm printLine(int n)

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

Tham số:

  • n: là số ký tự "_" sẽ được in ra màn hình.

Thân hàm printLine():

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



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.

Nên 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[].

Tham số:

  • a[]: là danh sách sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm idLonNhat():

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


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 nhapSV(SV a[], int id, int n).

Tham số:

  • &sv: nhập thông tin sinh viên sv. Sử dụng tham chiếu &, tức là thông tin sẽ được thay đổi cả bên trong và bên ngoài hàm.
  • a[]: là danh sách sinh viên.
  • id: là id (tự động tăng) của sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm nhapThongTinSV():

void nhapThongTinSV(SV &sv, int id) {
    cout << "\n Nhap ten: "; fflush(stdin); gets(sv.ten);
    cout << " Nhap gioi tinh: "; gets(sv.gioiTinh);
    cout << " Nhap tuoi: "; cin >> sv.tuoi;
    cout << " Nhap diem Toan: "; cin >> sv.diemToan;
    cout << " Nhap diem Ly: "; cin >> sv.diemLy;
    cout << " Nhap diem Hoa: "; cin >> sv.diemHoa;
    sv.id = id;
    tinhDTB(sv);
    xeploai(sv);
}

Thân hàm nhapSV():

void nhapSV(SV a[], int id, int n) {
    printLine(40);
    printf("\n Nhap sinh vien thu %d:", n + 1);
    nhapThongTinSV(a[n], id);
    printLine(40);
}



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 capNhatSV(SV a[], int id, int n).

Tham số:

  • &sv: nhập thông tin sinh viên sv. Sử dụng tham chiếu &, tức là thông tin sẽ được thay đổi cả bên trong và bên ngoài hàm.
  • a[]: là danh sách sinh viên.
  • id: là id (tự động tăng) của sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm capNhatThongTinSV():

void capNhatThongTinSV(SV &sv) {
    cout << "\n Nhap ten: "; fflush(stdin); gets(sv.ten);
    cout << " Nhap gioi tinh: "; gets(sv.gioiTinh);
    cout << " Nhap tuoi: "; cin >> sv.tuoi;
    cout << " Nhap diem Toan: "; cin >> sv.diemToan;
    cout << " Nhap diem Ly: "; cin >> sv.diemLy;
    cout << " Nhap diem Hoa: "; cin >> sv.diemHoa;
    tinhDTB(sv);
    xeploai(sv);
}

Thân hàm capNhatSV():

void capNhatSV(SV a[], int id, int n) {
    int found = 0;
    for(int i = 0; i < n; i++) {
        if (a[i].id == id) {
            found = 1;
            printLine(40);
            cout << "\n Cap nhat thong tin sinh vien co ID = " << id;
            capNhatThongTinSV(a[i]);
            printLine(40);
            break;
        }
    }
    if (found == 0) {
        printf("\n Sinh vien co ID = %d khong ton tai.", id);
    }
}


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. Tình sinh viên có ID đã cho trong danh sách, nếu tồn tại thì thực hiện xóa sinh viên.

Tham số:

  • a[]: là danh sách sinh viên.
  • id: là id của sinh viên sẽ bị xóa.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm xoaTheoID():

int xoaTheoID(SV a[], int id, int n) {
    int found = 0;
    for(int i = 0; i < n; i++) {
        if (a[i].id == id) {
            found = 1;
            printLine(40);
            for (int j = i; j < n; j++) {
                a[j] = a[j+1];
            }
            cout << "\n Da xoa SV co ID = " << id;
            printLine(40);
            break;
        }
    }
    if (found == 0) {
        printf("\n Sinh vien co ID = %d khong ton tai.", id);
        return 0;
    } else {
        return 1;
    }
}



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.

Tham số:

  • a[]: là danh sách sinh viên.
  • ten[]: là từ khóa để so sánh với tên sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm timKiemTheoTen():

typedef SinhVien SV;
0


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

Thân hàm tinhDTB():

typedef SinhVien SV;
1

Thân hàm xeploai():

typedef SinhVien SV;
2



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.

Tham số:

  • a[]: là danh sách sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm sapxepTheoDTB():

typedef SinhVien SV;
3


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.

Tham số:

  • a[]: là danh sách sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm sapXepTheoTen():

typedef SinhVien SV;
4



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.

Tham số:

  • a[]: là danh sách sinh viên.
  • n: là số lượng sinh viên có trong danh sách.

Thân hàm showStudent():

typedef SinhVien SV;
5


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.

Tham số:

  • a[]: là danh sách sinh viên sẽ được đọc ra từ file.
  • fileName[]: là tên của file lưu trữ danh sách sinh viên.

Giá trị trả về của hàm là số lượng sinh viên có trong file và danh sách sinh viên.

Thân hàm docFile():

typedef SinhVien SV;
6



12. Hàm ghi 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.

Tham số:

  • a[]: là danh sách sinh viên sẽ được ghi vào file.
  • n: là số lượng sinh viên.
  • fileName[]: là tên của file lưu trữ danh sách sinh viên.

Giá trị trả về của hàm là số lượng sinh viên có trong file và danh sách sinh viên.

Thân hàm ghiFile():

typedef SinhVien SV;
7


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.

Giải thích ý nghĩa của các biến:

  • key: là giá trị bạn nhập để chọn tùy chọn trong menu.
  • fileName: tên của file lưu trữ danh sách sinh viên.
  • arraySV[]: lưu trữ một mảng các struct sinh viên.
  • soluongSV: số lượng sinh viên hiện tại của mảng arraySV.
  • idCount: là biến đếm id tự động tăng của sinh viên.

Khi khởi tạo chương trình chúng ta sẽ đọc danh sách sinh viên có sẵn trong file sinhvien.txt, đồng thời lấy ra được số lượng sinh viên và id lớn nhất hiện tại của danh sách sinh viên.