Viết chương trình quản lý sinh viên bằng danh sách kề

Quản lý sinh viên [Bài tập C++] | Khiêm Lê

Xây dựng chương trình quản lý danh sách sinh viên với các tính năng sau:

  • Nhập và lưu danh sách sinh viên
    • Mô tả: Nhập thông tin sinh viên (MSSV, họ tên, điểm toán, văn, anh) từ file và hệ thống tự tính điểm trung bình
    • Mô tả tương tác:
      1. Nhập lệnh từ terminal: ./qlsv add <đường_dẫn_đến_file>
      2. Đọc file, tính điểm trung bình và lưu vào hệ thống
      3. Thông báo kết quả ra màn hình
  • Tìm kiếm sinh viên theo MSSV hoặc họ tên
    • Mô tả: Tìm kiếm sinh viên theo MSSV hoặc họ tên được nhập từ bàn phím
    • Mô tả tương tác:
      • Nhập lệnh từ Terminal: ./qlsv find
      • Đọc dữ liệu từ hệ thống, tìm kiếm và in kết quả ra màn hình theo format:
  • Xuất ra màn hình các sinh viên có điểm trung bình trên 5.0
    • Mô tả: Tìm kiếm và in tất cả sinh viên có điểm trung bình trên 5.0
    • Mô tả tương tác:
      • Nhập lệnh từ Terminal: ./qlsv passed
      • Đọc dữ liệu từ hệ thống và in ra tất cả sinh viên có DTB trên 5.0 theo format:

Source code

Trong video mình sử dụng mảng động và nó không hoạt động hiệu quả đối với dữ liệu quá lớn vậy nên mình chuyển sang dùng kiểu vector để linh hoạt hơn trong việc sử lý dữ liệu lớn. Bạn có thể tham khảo code bên dưới.

#include #include #include #include "SinhVien.hpp" using namespace std; #define DATABASE_PATH "data.txt" void saveDataToFile(vector sv) { ofstream fileStream; fileStream.open(DATABASE_PATH, ios::out | ios::app); for (int i = 0; i < sv.size(); i++) { sv[i].printToFile(fileStream); fileStream << endl; } } void addDataFromFile(string path) { ifstream file(path, ios::in); if (file.is_open()) { vector sv; string line; while (getline(file, line)) { SinhVien sinhVien; sinhVien.fromString(line); sv.push_back(sinhVien); } saveDataToFile(sv); cout << "Data added successfully!"; file.close(); } } void loadDataFromFile(vector &sv) { ifstream file(DATABASE_PATH, ios::in); if (file.is_open()) { string line; while (getline(file, line)) { SinhVien newSV; newSV.fromString(line, true); sv.push_back(newSV); } file.close(); } } void findByKeywords(vector keywords) { vector sv; loadDataFromFile(sv); int stt = 1; cout << "Founded students:\n"; cout << sv.size(); for (int i = 0; i < sv.size(); i++) { if (sv[i].mssv.find(keywords[0]) != string::npos) { cout << stt++ << ' '; sv[i].print(); cout << endl; } else { for (int j = 0; j < keywords.size(); j++) { if (sv[i].hoTen.find(keywords[j]) != string::npos) { cout << stt++ << ' '; sv[i].print(); cout << endl; } } } } } void passedStudents() { vector sv; loadDataFromFile(sv); int stt = 1; for (int i = 0; i < sv.size(); i++) { if (sv[i].dtb >= 5.0) { cout << stt++ << ' '; sv[i].print(); cout << endl; } } } int main(int argc, char* argv[]) { string action = argv[1]; if (action == "add") { string path = argv[2]; addDataFromFile(path); } else if (action == "find") { vector keywords; for (int i = 0; i < argc - 2; i++) keywords.push_back(argv[i + 2]); findByKeywords(keywords); } else if (action == "passed") { passedStudents(); } return 0; } #ifndef SinhVien_hpp #define SinhVien_hpp #include #include #include using namespace std; class SinhVien { public: string mssv, hoTen; float toan, van, av, dtb; void fromString(string str, bool fromDB = false) { vector arr; string word; for (int i = 0; i <= str.length(); i++) { if (str[i] == ' ' || i == str.length()) { arr.push_back(word); word = ""; } else { word += str[i]; } } int k = arr.size(); if (fromDB) { dtb = stof(arr[k - 1]); av = stof(arr[k - 2]); van = stof(arr[k - 3]); toan = stof(arr[k - 4]); for (int i = 1; i < k - 4; i++) { hoTen += arr[i]; hoTen += ' '; } } else { av = stof(arr[k - 1]); van = stof(arr[k - 2]); toan = stof(arr[k - 3]); dtb = (toan + av + van) / 3.0; for (int i = 1; i < k - 3; i++) { hoTen += arr[i]; hoTen += ' '; } } mssv = arr[0]; hoTen = hoTen.substr(0, hoTen.length() - 1); } void printToFile(ofstream& fileStream) { fileStream << mssv << ' '; fileStream << hoTen << ' '; fileStream << toan << ' '; fileStream << van << ' '; fileStream << av << ' '; fileStream << dtb; } void print() { cout << mssv << ' '; cout << hoTen << ' '; cout << toan << ' '; cout << van << ' '; cout << av << ' '; cout << dtb; } }; #endif 111 Nguyen Van A 7.5 7.25 8 112 Le Van B 4.3 5.5 7.83 113 Tran Van C 3 7 3 114 Pham Quoc D 4 4 4

Dùng mảng một chiều để lưu trữ một lớp học có N sinh viên. Biết rằng mỗi sinh viên bao gồm các thông tin sau: Tên (chuỗi ký tự), Mã số sinh viên (chuỗi ký tự), Điểm trung bình. Hãy viết hàm thực hiện các yêu cầu sau:
a. In danh sách sinh viên ra màn hình
b. Liệt kê những sinh viên có điểm trung bình cao nhất trong lớp học.
c. Cho biết số sinh viên có điểm trung bình >=5. Nếu không có thì thông báo không có.
d. Tìm một sinh viên có tên X trong lớp học (X nhập từ bàn phím)
e. Xoá một sinh viên có mã số cho trước trong lớp học. Nếu không có thì thông báo không có.
f. Sắp xếp danh sách sinh viên tăng theo điểm trung bình bằng thuật toán sắp xếp mà các bạn đã học (Selection Sort, Interchange Sort, Binary Sort)
g. Chèn một sinh viên vào lớp học, biết ràng sau khi chèn danh sách sinh viên vẫn tăng dần theo điểm trung bình.

#include #include #include #include struct sv { char ten[20]; char MSSV[10]; int dtb; }; struct NODE { sv info; struct NODE* next; }; struct LIST { NODE *head; NODE *tail; }; NODE* CreateNode (sv x) { NODE *p; p=new NODE; if(p==NULL) exit(1); p->info=x; p->next=NULL; return p; } void CreateList (LIST &L) { L.head=L.tail=NULL; } void input (sv &x) { printf("\nNhap MSSV: "); fflush(stdin); gets(x.MSSV); printf("\nNhap ten: "); fflush(stdin); gets(x.ten); printf("\nNhap dtb: "); scanf("%d", &x.dtb); } void AddLast (LIST &L, NODE *p) { if(L.head==NULL) L.head=L.tail=p; else { L.tail->next=p; L.tail=p; } } void nhap (LIST &L) { sv x; char kt; printf("\nNhan phim bat ki de tiep tuc nhap."); printf("\nNhan 0 de dung nhap."); do { kt=getch(); if(kt=='0') break; input(x); NODE *p=CreateNode(x); AddLast(L,p); } while (1); } void output (sv x) { printf("\n%s %s %d",x.MSSV,x.ten,x.dtb); } void xuat (LIST L) { NODE *p; p=L.head; while(p!=NULL) { output(p->info); p=p->next; } } void maxdtb (LIST L) { NODE *p,*max; int dem; p=L.head; max=p; while (p!=NULL) { if(p->info.dtb>max->info.dtb) { max=p; dem=0; } if(p->info.dtb==max->info.dtb) { max=p; dem++; } p=p->next; } printf("\nSV co dtb cao nhat la: \n"); if(dem==0) output(max->info); else { NODE *q=L.head; while (q!=NULL) { if(q->info.dtb==max->info.dtb) output(q->info); q=q->next; } } } void thongkedtb (LIST L) { NODE *p; int dem=0; p=L.head; while (p!=NULL) { if(p->info.dtb>=5) dem++; p=p->next; } if(dem==0) printf("\nKo co sv co dtb>=5."); else printf("\nCo %d sv co dtb >=5.",dem); } void tim (LIST L) { NODE *p; int dem=0; char k[20]; printf("\nNhap ten sv can tim: "); fflush(stdin); gets(k); p=L.head; while (p!=NULL) { if(strcmp(k,p->info.ten)==0) dem++; p=p->next; } if(dem!=0) { printf("\nTim thay sv: "); output(p->info); } else printf("\nKo tim thay."); } void xoa (LIST &L) { NODE *p, *q; char a[10]; p=L.head; q=NULL; printf("\nNhap MSSV can xoa: "); fflush(stdin); gets(a); while (p!=NULL) { if(strcmp(a, p->info.MSSV)==0) break; else printf("\nKo co sv can xoa."); q=p; p=p->next; } if(q!=NULL) { if(p!=NULL) { q->next=p->next; delete (p); if(p==L.tail) L.tail=q; delete(p); } } else { L.head=p->next; delete(p); if(L.head==NULL) L.tail=NULL; } } void selectionsort (LIST &L) { NODE *p,*q,*min; p=L.head; sv temp; while (p!=L.tail) { min=p; q=p->next; while (q!=NULL) { if(q->info.dtbinfo.dtb) min=q; q=q->next; } temp=p->info; p->info=min->info; min->info=temp; p=p->next; } } void menu() { LIST L; NODE *p,*q,*moi; sv x; char chon; CreateList(L); do { printf("\n\t\t\tMENU"); printf("\n\t1. Nhap ds"); printf("\n\t2. In ds"); printf("\n\t3. Ds sv co dtb cao nhat"); printf("\n\t4. Ds sv co dtb >=5"); printf("\n\t5. Tim sv"); printf("\n\t6. Xoa sv"); printf("\n\t7. Sap xep ds"); printf("\n\t8. Chen sv"); printf("\n\tNhap 0 de thoat"); chon=getch(); switch(chon) { case '1': { nhap(L); break;} case '2': { xuat(L); break;} case '3': { maxdtb(L); break;} case '4': { thongkedtb(L); break;} case '5': { tim(L); break;} case '6': { xoa(L); printf("\nDs sau khi xoa: "); xuat(L); break;} case '7': { selectionsort(L);printf("\nDs sau khi sap xep: "); xuat(L); break;} case '8': { sv them; printf("\nNhap thong tin sv can them: "); input(them); NODE *t= CreateNode(them); AddLast(L,t); selectionsort(L); printf("\nDs sau khi them :"); xuat(L); break; } case '0': exit(1); default: printf("\nNhap lai."); } } while (chon!='0'); } int main() { while(1) { menu(); getch(); } }


Page 2