5Ta sẽ đặt một kí tự tìm kiếm delimiter là kí tự chấm phẩy như trên : mỗi lần lấy ra một trường thông tin nào đó, ta sẽ lấy từ đầu chuỗi đến vị trí có dấu chấm phẩy pos_of_delimiter, Sau
BÀI TOÁN THỰC TẾ
Hệ thống quản lý sinh viên và điểm học phần là phần mềm ứng dụng dùng để lưu trữ, tổ chức và quản lý thông tin sinh viên, thông tin học phần và điểm học phần của sinh viên theo từng học kỳ tại một cơ sở giáo dục đại học.
Chức năng của hệ thống:
- Nhập dữ liệu sinh viên và học phần: Người dùng có thể nhập thông tin của sinh viên, bao gồm mã số sinh viên, họ và tên, giới tính, ngày sinh Cũng như thông tin về học phần, bao gồm mã học phần, tên môn học và số tín chỉ.
- Nhập điểm học phần: Người dùng có thể nhập điểm học phần của sinh viên trong từng học phần cụ thể.
- Hiển thị danh sách sinh viên: Chương trình cho phép hiển thị danh sách toàn bộ sinh viên trong hệ thống, bao gồm mã số sinh viên, họ tên, giới tính, ngày sinh.
- Bổ sung, xóa, sửa thông tin sinh viên và học phần: Người dùng có thể bổ sung thông tin mới, xóa thông tin sinh viên và học phần không cần thiết và sửa thông tin của sinh viên và học phần đã có.
- Tính điểm trung bình chung tích lũy (GPA) của sinh viên: Hệ thống tính toán điểm trung bình chung tích lũy (GPA) của từng sinh viên dựa trên điểm số học phần đã nhập và hiển thị kết quả.
- Hiển thị danh sách sinh viên không đạt học phần: Chương trình cho phép hiển thị danh sách sinh viên không đạt điểm học phần nào (điểm < 4) trong các học phần đã nhập.
- Hiển thị danh sách học phần chưa đạt: Chương trình cho phép hiển thị danh sách các học phần mà sinh viên chưa đạt (điểm < 4) trong các học phần đã nhập.
- Hiển thị điểm học phần của sinh viên: Người dùng có thể nhập mã số sinh viên và học phần cụ thể và chương trình sẽ hiển thị điểm số của sinh viên trong học phần đó Quy trình hoạt động của chương trình:
- Người dùng nhập thông tin sinh viên và học phần.
- Người dùng nhập điểm học phần cho sinh viên cụ thể.
- Người dùng có thể thực hiện các thao tác bổ sung, xóa và sửa thông tin sinh viên và học phần.
- Hệ thống tính điểm trung bình chung tích lũy (GPA) cho từng sinh viên dựa trên điểm học phần đã nhập.
- Người dùng có thể hiển thị danh sách toàn bộ sinh viên, danh sách sinh viên không đạt học phần, danh sách học phần chưa đạt, và điểm học phần của sinh viên theo yêu cầu.
QUÁ TRÌNH THIẾT KẾ CHƯƠNG TRÌNH THEO PHƯƠNG PHÁP TINH CHỈNH TỪNG BƯỚC
A.Gi i thi u các cấấu trúc d li u t t o ra ớ ệ ữ ệ ự ạ
1.Sinh viên và danh sách sinh viên a.Sinh viên : gồm các trường mã số sinh viên (int MSSV) , Họ đệm (string Ho_dem), Tên sinh viên (string Ten_sv), Giới tính (string Gioi_tinh), Ngày sinh (Ngay_Sinh *Ngay_sinh)
Source code : struct Sinh_Vien
MSSV;int string Ho_dem; string Ten_sv; string Gioi_tinh;
Ngay_Sinh *Ngay_sinh; void load_sv(stringline)
{ ngay_sinh = newNgay_Sinh; string delimiter = ;";" pos_of_delimiter = int line.find(delimiter); i = 0;int do
{ pos_of_delimiter = line.find(delimiter); string info = line.substr(0, pos_of_delimiter); switch (i)
{ case 0: MSSV = stoi(info); break; case 1: Ho_dem info; = break; case 2: ten_sv info; = break; case 3: gioi_tinh info; = break; case 4:
String and character manipulation functions are essential for text processing and data analysis One of the most common tasks is extracting information from a string based on a given delimiter For example, if a string contains a date in the format "MM/DD/YYYY," you might need to extract the month, day, and year as separate variables C++ provides several functions that can be used for this purpose, including `find()` and `substr()` The `find()` function returns the position of the first occurrence of a specified character or string within a given string The `substr()` function extracts a substring from a given string starting at a specified position and continuing for a specified number of characters.
{ case 0:ngay_sinh->day = stoi(info_date); break; case 1:ngay_sinh->month = stoi(info_date); break; case 2:ngay_sinh->year = stoi(info_date); break; } j++; line= line.substr(pos_of_delimiter_date + 1, line.length() - 1);
} while (pos_of_delimiter_date != string::npos); break;
} } i++; line= line.substr(pos_of_delimiter + 1, line.length() - 1); } while (pos_of_delimiter != string::npos);
} void print() { cout sinh_vien->Ho_dem =new_sv->Ho_dem; chuan_hoa(new_sv->Ten_sv); head = temp_node; temp_node->next = NULL; } else { sv_node* p = head; while (p->next != NULL) { p = p->next;
} p->next = temp_node; temp_node->next = NULL; }
} // hàm kiểm tra xem 1 mã sinh viên có tồn tại trong danh sách check_sv( int intip_MSSV)
{ for (sv_node* p = head; p != NULL; p = p->next) {
(ifip_MSSV == p->sinh_vien->MSSV) { return 1;
} temp_node->sinh_vien->Ten_sv =new_sv->Ten_sv; temp_node->sinh_vien->Ngay_sinh = new_sv->Ngay_sinh;
// thêm vào danh sách liên kết
- Ở đây còn có thêm 1 hàm ( add_sv() )dùng để thêm sinh viên vào từ 1 con trỏ kiểu sinh viên có sẵn bằng cách khởi tạo 1 nút sinh viên temp_node rồi gán dữ liệu của con trỏ new_sv cho con trỏ sinh_vien của temp_node
- Thuật toán để thêm 1 nút trong danh sách là o Nếu ban đầu danh sách rỗng, tức head = NULL thì head = temp_node và temp_node->next = NULL. o Nếu ban đầu danh sách không rỗng, tức head != NULL , thì tìm đến nút cuối(tức là nút có next = NULL) , ta gọi nút đó là p Khi đã tìm được rồi thì gán p->next
= temp_node, temp->node = NULL.
- Còn có thêm 1 hàm ( check_sv() ) dùng để kiểm tra xem 1 sinh viên có thuộc danh sách không bằng cách truyền vào mã số sinh viên và duyệt toàn bộ danh sách 2.H c phấần và danh sách h c phấần ọ ọ a.Học phần : gồm trường mã học phần ( string Ma_hp), tên học phần (string Ten_hp), số tín chỉ (int So_tc)
Source code : struct Hoc_Phan
{ string Ma_hp; string Ten_hp;
So_tc;int void load_hp(stringline)
{ string delimiter = ;";" pos_of_delimiter = int line.find(delimiter); i = 0;int do
{ pos_of_delimiter = line.find(delimiter); string info = line.substr(0, pos_of_delimiter); switch (i)
{ case 0: Ma_hp info; = break; case 1: Ten_hp info; = break; case 2: So_tc = stoi(info); break;
} i++; line =line.substr(pos_of_delimiter + 1, line.length() - 1); } while (pos_of_delimiter != string::npos);
} void print() { cout 12)
} break; case 2: if (day < 0 || day > 29)
} break; case 3: if (day < 0 || day > 31)
// hàm trả lại tên học phần khi truyền vào mã học phần string find_name_hp(HP_List*& hp, string ip) { program_exe += "[->] Di vao ham tim kiem ten hoc phan ! \n"; string replace = ip; program_exe += "[exe] Duyet tung hoc phan cua danh sach! \n";
UPPER(replace); for (hp_node* p = hp->head; p != NULL; p p->next)
{ if (p->hoc_phan->Ma_hp == replace) { program_exe += "[exe] Tra ve ket qua la :
" + ip + " : " + p->hoc_phan->Ten_hp + " \n"; return p->hoc_phan->Ten_hp;
} } program_exe += "[exe] Tra ve ket qua la NULL \n"; return NULL;
// hàm tìm kiếm điểm của sinh viên void find_dt(DT_List*& dt, HP_List*& hp, SV_List*& sv)
{ program_exe += "[->] Di vao ham tim kiem diem thi!\n"; int ip_MSSV; int flag_all = 1; program_exe += "[exe] Kiem tra ma so sinh vien nhap vao co hop le.\n"; do { int flag_sv = 0;
// nhập vào mã số của sinh viên while (true)
{ cout > ip_MSSV; if (cin.fail() || ip_MSSV next) { if (ip_MSSV == ptr->sinh_vien->MSSV) { flag_sv = 1; break;
} } replace->add_hp(p->hoc_phan); flag = 1;
} } if (flag == 0) { cout Ma_hp) { flag = 1; break;
} } if (flag == 0) { cout head; // tạo ra 1 nút đi trước nút đang xét trong vòng lặp for (hp_node* p = hp->head; p ! NULL; p = p->next)
{ if (p->hoc_phan->Ma_hp == ma_hp) { if (p == hp->head) { hp->head = p->next; program_exe += "[exe] Da xoa 1 hoc phan theo ki tu " + hp_char + " : " + p->hoc_phan->Ma_hp + ";" + p->hoc_phan->Ten_hp + ";" + nts(p->hoc_phan-
>So_tc) + " trong danh sach! \n"; cout 31)
} break; case 6: if (day < 0 || day > 30)
} break; case 7: if (day < 0 || day > 31)
} break; case 8: if (day < 0 || day > 31)
} break; case 9: if (day < 0 || day > 30)
} break; case 10: if (day < 0 || day > 31)
} break; case 11: if (day < 0 || day > 30)
} break; case 12: if (day < 0 || day > 31)
{ int flag = 1; if (month < 0 || month > 12)
{ if (flag_sv == 0) { program_exe += "[exe] Khong ton tai ma so sinh vien \n"; cout head; p != NULL; p p->next)
{ if (ip_MSSV == p->diem_thi->MSSV) { replace->add_dt(p->diem_thi);
} } program_exe += "[exe] Dua ra danh sach cac hoc phan cua sinh vien!\n"; if (replace->head == NULL) { cout