1. Trang chủ
  2. » Luận Văn - Báo Cáo

bài tập lớn cuối kì quản lý sinh viên học phần điểm thi

73 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

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

Trang 1

Đề tài 1: Quản lý sinh viên, học phần, điểm thi

Giáo viên hướng dẫn : TS Nguyễn Thị ThanhHuyền

Sinh viên thực hiện : Vũ Văn Thành 20216885 Bộ môn : Kỹ thuật lập trình

Mã lớp : 142298

Trang 2

A.Giới thiệu các cấu trúc dữ liệu tự tạo ra 4

1.Sinh viên và danh sách sinh viên 4

2.Học phần và danh sách học phần 6

3.Điểm thi và danh sách điểm thi 8

B.Quá trình thiết kế theo phương pháp tinh chỉnh từng bước 9

III IN MÃ NGUỒN 37

IV Hình ảnh thực hiện các chức năng của chương trình 65

1.Chức năng hiển thị thông tin sinh viên : 65

2.Chức năng thêm thông tin 66

3.Chức năng sửa thông tin 67

4.Chức năng xóa thông tin 69

5.Chức năng tìm kiếm thông tin 70

6.Chức năng tính GPA của toàn bộ sinh viên 72

7.Chức năng tìm điểm 1 học phần của toàn bộ sinh viên 72

8.Chức năng tìm kiếm sinh viên không đạt 1 học phần 73

9.Danh sách học phần mà 1 sinh viên chưa đạt 73

10.Điểm trung bình tích lũy của sinh viên 74

11.Chức năng sao lưu 74

12.File text ghi kết quả ra và quá trình thực thi chương trình 75

Trang 3

I BÀI TOÁN THỰC TẾ

Mô tả bài toán:

- Hệ thống quản lý sinh viên và điểm học phần là một chương trình dùng để quản lý thông tin về sinh viên, học phần và điểm số của sinh viên trong một trường đại học Hệthống cho phép thêm, sửa, xóa thông tin sinh viên và học phần, cũng như nhập và hiển thị điểm số của sinh viên trong các học phần.

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.

Trang 4

4- 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.

II 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 :

structSinh_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:

{

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; }

line =line.substr(pos_of_delimiter + 1, line.length() - 1); } while (pos_of_delimiter != string::npos); }

void print() { cout << left;

cout <<"\t| "<< setw(15) << MSSV << "|"<< setw(25) << Ho_dem ten_sv +" "+ << "|"<< setw(13) << gioi_tinh

<<"|"<< setw(17) << ngay_sinh->ngay_sinh() <<"|\n"; }

- Trong struct trên ta có viết sẵn 2 hàm dùng để thêm dữ liệu cho 1 biến sinh viên từ 1 chuỗi kí tự lấy ra trong file là load_sv() và 1 hàm dùng để in thông tin sinh viên là print() :

+ Hàm load_sv() sẽ lấy dữ liệu của 1 bản ghi có dạng như sau trong file :“MSSV;Họ đệm;Tên sinh viên;Giới tính;Ngày sinh\n”

Trang 5

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 khi lấy xong một trường thông tin thì cắt chuỗi từ vị trí đầu đến vị trí kí tự tìm kiếm trên :

Mô tả quá trình hoạt động thuật toán như sau :

“MSSV;Họ đệm;Tên sinh viên;Giới tính;Ngày sinh\n” cắt ra thông tin MSSV rồi gán vào con trỏ có kiểu Sinh_Vien

Cập nhật lại chuỗi : “Họ đệm;Tên sinh viên;Giới tính;Ngày sinh\n” Tiếp tục với quy trình như vậy, riêng với ngày sinh thì có định dạng khác là day/month/year nên trong trường hợp còn chuỗi này ta phải đặt delimiter_date =“/”, rồi làm đệ quy như thuật toán bên trên.

+ Hàm print() in ra các trường thông tin của sinh viên theo thứ tự lần lượt như trên : nhưng có thêm các dấu “|” để kẻ sẵn 1 hàng trong khi in danh sách sinh viên, hàm còn sử dụng đến std::setw() và std::left của thư viện iomanip.h để căn chỉnh lại Terminal sao cho in ra cho đẹp.

b.Nút sinh viên : gồm 1 con trỏ để ghi dữ liệu sinh viên và 1 con trỏ để chỉ đến nút tiếp theo.

Source code :

struct sv_node

Sinh_Vien* sinh_vien; sv_node* next;};

c.Danh sách sinh viên : gồm 1 con trỏ head chỉ vào đầu danh sách được cấp phát động bằng toán tử new, 1 hàm constructor để khởi tạo cho các con trỏ trong nút đầu được cấp phát động.

Source code :

sv_node* head = newsv_node;

SV_List() // hàm khởi tạo (constructor) {

head->sinh_vien = newSinh_Vien; head->sinh_vien->Ngay_sinh = newNgay_Sinh; head = NULL;

}

// hàm thêm thông tin từ 1 sinh viên có sẵn trong file

void add_sv(Sinh_Vien* new_sv) {

// truyền dữ liệu cho con trỏ temp_node sv_node* temp_node = newsv_node; temp_node->sinh_vien = newSinh_Vien; temp_node->sinh_vien->Ngay_sinh = newNgay_Sinh; temp_node->sinh_vien->MSSV = new_sv->MSSV; temp_node->sinh_vien->Gioi_tinh =new_sv->Gioi_tinh; chuan_hoa(new_sv->Ho_dem);

temp_node->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; }

Trang 6

6 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

(head == if NULL) {

} return 0; }

- Ở đâ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 sinhviê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ứclà 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 :

structHoc_Phan{ string Ma_hp; string Ten_hp; So_tc;int

void load_hp(stringline) {

{

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 << left;

cout <<"\t| "<< setw(15) << Ma_hp << "|"<< setw(45) << Ten_hp << "|"<< setw(13) << So_tc <<"|\n"; }

Trang 7

7(pos_of_delimiter), Sau khi lấy xong một trường thông tin thì cắt chuỗi từ vị trí đầu đến vị trí kí tự tìm kiếm trên :

Mô tả quá trình hoạt động thuật toán như sau :

“Mã học phần;Tên học phần;Số tín chỉ\n” cắt ra thông tin Mã học phần rồi gán vào con trỏ có kiểu Hoc_Phan

Cập nhật lại chuỗi : “Tên học phần;Số tín chỉ\n” Tiếp tục với quy trình như vậy.

+ Hàm print() in ra các trường thông tin của sinh viên theo thứ tự lần lượt như trên : nhưng có thêm các dấu “|” để kẻ sẵn 1 hàng trong khi in danh sách học phần, ngoài ra còn sử dụng đến std::setw() và std::left của thư viện iomanip.h để căn chỉnh lại Terminal sao cho in ra cho đẹp.

b.Nút học phần : gồm 1 con trỏ để ghi dữ liệu học phần và 1 con trỏ để chỉ đến nút tiếp theo.

Source code :

struct hp_node

Hoc_Phan* hoc_phan; hp_node* next;};

c.Danh sách học phần : gồm 1 con trỏ head chỉ vào đầu danh sách được cấp phát động bằng toán tử new, 1 hàm constructor để khởi tạo cho các con trỏ trong nút đầu được cấp phát động.

Source code :

hp_node* head = newhp_node;

HP_List() {

head->hoc_phan = newHoc_Phan; head = NULL;

}

// hàm thêm 1 học phần từ 1 file ban đầu

void add_hp(Hoc_Phan *new_hp) {

hp_node* temp = newhp_node; temp->hoc_phan = newHoc_Phan; temp->hoc_phan->Ma_hp =new_hp->Ma_hp; for int ( i = 0; i < new_hp->Ten_hp.length(); i++) {

new_hp->Ten_hp i[ ] = toupper(new_hp->Ten_hp );[

head = temp;

temp->next = NULL; }

else

{

hp_node* p = head; while (p->next != NULL) {

p = p->next; } p->next = temp; temp->next = NULL; }

}

// hàm kiểm tra xem 1 mã học phần có tồn tại trong danh sách

check_hp(int stringma_hp) {

for (hp_node* p = head; p != NULL; p = p->next) {

(ifma_hp== p->hoc_phan->Ma_hp) {

return 1; } } return 0;

}};

Trang 8

8- Cũng tương tự như trên danh sách học phần , ở đây còn có thêm 1 hàm ( add_hp())dùng để thêm học phần vào từ 1 con trỏ kiểu học phần có sẵn bằng cách khởi tạo 1 nút học phầntemp_node rồi gán dữ liệu của con trỏ new_hp cho con trỏ học_phần của temp.

- Ở đây còn có thêm 1 hàm check_hp() kiểm tra xem 1 mã học phần có tồn tại trong danh sách không bằng cách truyền vào mã học phần và duyệt toàn bộ danh sách.

3.Đi m thi và danh sách đi m thiểể

a.Điểm thi :

Source code :

structDiem_Thi{ string Ma_hp; MSSV;int

float Diem_hp; void load_dt(stringline) {

{

case 0: Ma_hp info; = break; case 1: MSSV = stoi(info); break; case 2: Diem_hp = stof(info); break; }

i++;

line =line.substr(pos_of_delimiter + 1, line.length() - 1); } while (pos_of_delimiter != string::npos); }

void print() { cout << left;

cout <<"\t| "<< setw(20) << Ma_hp << "|"<< setw(25) << MSSV << "|"<< setw(16) << Diem_hp <<"|\n"; }

- Trong struct trên ta có viết sẵn 2 hàm dùng để thêm dữ liệu cho 1 biến điểm thi từ 1 chuỗi kí tự lấy ra trong file là load_hp() và 1 hàm dùng để in thông tin điểm thi là print() :

+ Hàm load_dt() sẽ lấy dữ liệu của 1 bản ghi có dạng như sau trong file :“Mã học phần;Mã số sinh viên;Điểm\n”

Ta 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 khi lấy xong một trường thông tin thì cắt chuỗi từ vị trí đầu đến vị trí kí tự tìm kiếm trên :

Mô tả quá trình hoạt động thuật toán như sau :

“Mã học phần;Mã số sinh viên;Điểm” cắt ra thông tin Mã học phần rồi gán vào con trỏ có kiểu Hoc_Phan

Cập nhật lại chuỗi : “Mã số sinh viên;Điểm\n” Tiếp tục với quy trình như vậy.

+ Hàm print() in ra các trường thông tin của sinh viên theo thứ tự lần lượt như trên : nhưng có thêm các dấu “|” để kẻ sẵn 1 hàng trong khi in danh sách học phần, ngoài ra còn sử dụng đến std::setw() và std::left của thư viện iomanip.h để căn chỉnh lại Terminal sao cho in ra cho đẹp.

Trang 9

c.Danh sách điểm thi : gồm 1 con trỏ head chỉ vào đầu danh sách được cấp phát động bằng toán tử new, 1 hàm constructor để khởi tạo cho các con trỏ trong nút đầu được cấp phát động.

Source code :

dt_node* head = newdt_node;

DT_List() {

head->diem_thi = newDiem_Thi; head = NULL;

}

// hàm thêm 1 bản ghi điểm thi từ 1 con trỏ có sẵn (Nhập từ file ban đầu)

void add_dt(Diem_Thi * new_dt) {

dt_node* temp = newdt_node; temp->diem_thi = newDiem_Thi; temp->diem_thi->Ma_hp =new_dt->Ma_hp; temp->diem_thi->Diem_hp = new_dt->Diem_hp; temp->diem_thi->MSSV = new_dt->MSSV;

(head == if NULL) { head = temp; temp->next = NULL; }

else

{

dt_node* p = head; while (p->next != NULL) {

p = p->next; } p->next = temp; temp->next = NULL; }

}};

- Cũng tương tự như trên danh sách sinh viên , ở đây còn có thêm 1 hàm ( add_dt())dùng để thêm 1 bản ghi điểm thi vào từ 1 con trỏ kiểu điểm thi có sẵn bằng cách khởi tạo 1 nút điểm thi temp rồi gán dữ liệu của con trỏ new_dt cho con trỏ điểm thi của temp.

3.Ngày sinh

Source code :

structNgay_Sinh{ day;int

Trang 10

2.Bổ sung, xóa, sửa chữa ( Tìm kiếm )

Nhập dữ liệu

Lưu data dướidạng struct và 1danh sách sinh

Lưu datadưới dạngstruct và 1danh sách

Lưu data dướidạng struct và1 danh sách

điểm thi

Kiểm tra MSSV và mãhọc phần có tồn tạitrong 2 file SV.bin và

HP.bin không? Kiểm tra có 2 bản ghi nào giống nhau về 2 trường dữ liệu này? Kiểm tra

định dạngngày sinh

Kiểm travai tròKiểm

tra xemcó trùng lặp mã học

Các thao tác cập nhật dữliệu

Kiểm tra mãhọc phần đãtồn tại chưa

Kiểm tra số tínchỉ đã đúngđịnh dạng số

Kiểm tra MSSV và mãhọc phần có tồn tại trong

2 file SV.bin và HP.binkhông? Kiểm tra có 2 bản ghi nàogiống nhau về 2 trường dữ liệu này? Kiểm tra

định dạngngày sinh

Kiểm tra sốđiểm đãđúng địnhdạng chưaBổ sung

Trang 11

Kiểm traMSSV có tồn

tại không

Kiểm tra mãhọc phần có tồn

tại không

Kiểm tra xemmã số sinhviên, mã họcphần cần xóacó tồn tại trong

bản ghi nàokhôngXóa những bản

ghi có MSSVtương ứng trong

file DT.bin

Xóa những bảnghi có mã họcphần tương ứngtrong file DT.bin

HP.binSửa chữa

Kiểm tra mãhọc phần đãtồn tạichưa.Cập nhậtlại file DT.binnếu thay đổimã học phần

Kiểm travai tròKiểm tra

MSSV đã tồntại chưa

Kiểm tra MSSV vàmã học phần đã tồn

tại ở 1 bản ghi nàochưaKiểm tra

định dạngngàysinh.Cậpnhật lại fileDT.bin nếucó thay đổimã số sinh

Kiểm traxem số tínchỉ đã hợplệ hay chưa

Trang 12

123.Điểm tích lũy trung bình GPA của toàn bộ sinh viên

GPA của toàn bộsinh viên

GPA của mỗisinh viên

Kiểm trađiểm củasinh viêntrong danh

Kiểm tratổng số tín

chỉ màsinh viên

đã họcTìm kiếm

MSSV cóđược nhậpđúng địnhdạng

Kiểm tra kí tự không phải là số

Kiểm trađịnhdạngngàysinh, giới

Kiểm traxem mãhọc phần

có đượcnhập đúngđịnh dạng

Kiểm trađầu vàođúng định

dạng sốnguyêndương

Kiểmtra đúng

địnhdạngMSSV,Mã họcphầnKiểm

tra kí tựđầu vàođúngđịnhdạng

Trang 13

134.Điểm 1 học phần của toàn bộ sinh viên

5.Các sinh viên không đạt học phần

6.Danh sách học phần mà một sinh viên chưa đạt Điểm 1 họcphần của toàn

bộ sinh viên

Kiểm tra xemmã học phần

có tồn tạitrong HP.bin

Kiểm tra xem mã học phần có tồn tại trong DT.bin

Các sinh viênkhông đạt học

Kiểm tra mãhọc phần cótồn tại trongdanh sách

Kiểm tra xemđiểm họcphần có nhỏ

hơn 4

Danh sách họcphần mà 1 sinhviên chưa đạt

Kiểm tracó tồn tạimã số sinhviên trongSV.bin

Kiểm trađiểm của cácmôn nhỏ hơn4 trong danh

sách DT.bin

Trang 14

147.GPA của 1 sinh viên

Bước 1 :

- Dữ liệu vào: Dữ liệu về sinh viên, học phần và điểm thi.

- Dữ liệu ra: Tùy thuộc vào chức năng người dùng chọn mà sẽ cho ra kết quả khác nhau : o Chức năng 1: Nhập dữ liệu vào các file nhị phân SV.BIN, HP.BIN, DT.BIN.

->Dữ liệu ra : Ghi được vào file nhị phân các thông tin

o Chức năng 2 + 3 + 4 + 5: Cập nhật dữ liệu các file SV.BIN, HP.BIN, DT.BIN (thêm, sửa, xóa, tìm kiếm).

->Dữ liệu ra : Các file nhị phân được cập nhật sau khi sửa, xóa.o Chức năng 6: Tính GPA của tất cả sinh viên.

->Dữ liệu ra : GPA của toàn bộ sinh viên.

o Chức năng 7: Điểm 1 học phần của toàn bộ sinh viên ->Dữ liệu ra : Danh sách điểm học phần của toàn bộ sinh viên.o Chức năng 8: Các sinh viên không đạt 1 học phần

->Dữ liệu ra : Danh sách sinh viên không đạt 1 học phần.o Chức năng 9: Danh sách học phần mà 1 sinh viên chưa đạt.

->Dữ liệu ra : Danh sách học phần chưa đạt của 1 sinh viên.- Ý tưởng thuật toán :

o Chức năng 2 + 3 + 4 + 5 :GPA của 1

sinh viên

Kiểm tra xem mã số sinh viên có tồn tại trong danh sách SV.bin và DT.bin

Trang 15

15Kiểm tra các MSSV, mã học phần của mỗi file SV.BIN hoặc HP.BIN, hoặc cả 1 bộ MSSV+mã học phần không trùng trong các thao tác cập nhật dữ liệu.

Viết 1 hàm sao lưu ra file của mỗi danh sách sinh viên, học phần, điểm thi.Sau khi thực hiện các thao tác xóa, sửa thì ấn sao lưu sẽ in danh sách hiệntại ra file tương ứng.

o Chức năng 6 :

Chuyển điểm thang 10 trong file điểm thi (DT.BIN) thành điểm thang 4.Lấy điểm thang 4 nhân với số tín chỉ của một môn học của mỗi sinh viên rồi chia cho tổng số tín chỉ mà sinh viên đó đã học được -> GPA.

o Chức năng 7 :

Kiểm tra xem mã học phần có tồn tại trong file điểm thi hay không.Nếu có thêm mỗi bản ghi vào 1 danh sách , sau khi thêm hết thì in ra danh sách đó Nếu không trả về kết quả không có sinh viên nào.

o Chức năng 8:

Kiểm tra xem mã học phần có tồn tại trong file điểm thi hay không Kiểm tra xem danh sách điểm thi với mã học phần đó, điểm thi nào nhỏ hơn 4 thì in ra.

Thêm 1 sinh viên : add_sv()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách sinh viên.-Dữ liệu ra : 1 sinh viên mới được nhập các trường thông tin từ bàn phím vào danh sách sinh viên.

-Ý tưởng : Khởi tạo 1 nút temp (có kiểu dữ liệu sv_node* )dùng để lưu trữ các trường thông tin của 1 sinh viên được nhập từ bàn phím

+Đầu tiên nhập vào mã số sinh viên và kiểm tra xem đúng định dạng chưa cũng như có tồn tại rồi hay không

+Tiếp theo nhập vào các thông tin như Họ đệm, Tên sinh viên +Nhập vào ngày sinh thì phải kiểm tra xem đúng định dạng chưa.Chọn giới tính nam nữ bằng 1 menu option nhỏ

Trang 16

16+Thêm nút temp đó vào danh sách liên kết như đã trình bày ở mục giới thiệu các cấu trúc dữ liệu bên trên.

Hàm thêm vào 1 học phần

Thêm 1 học phần : add_hp()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách học phần.-Dữ liệu ra : 1 học phần mới được nhập các trường thông tin từ bàn phím vào danh sách học phần.

-Ý tưởng : Khởi tạo 1 nút temp (có kiểu dữ liệu hp_node* )dùng để lưu trữ các trường thông tin của 1 sinh viên được nhập từ bàn phím.

+Đầu tiên nhập vào mã học phần và kiểm tra xem đúng định dạng chưa cũng như có tồn tại rồi hay không

+Tiếp theo nhập vào tên học phần , số tín chỉ thì phải kiểm tra xem đúng định dạng số nguyên dương chưa

+Thêm nút temp đó vào danh sách liên kết như đã trình bày ở mục giới thiệu các cấu trúc dữ liệu bên trên.

Hàm thêm vào 1 bản ghi điểm thi

Thêm 1 bản ghi điểm thi : add_dt()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách học phần.-Dữ liệu ra : 1 học phần mới được nhập các trường thông tin từ bàn phím vào danh sách học phần.

-Ý tưởng : Khởi tạo 1 nút temp (có kiểu dữ liệu dt_node* )dùng để lưu trữ các trường thông tin của 1 sinh viên được nhập từ bàn phím

+Đầu tiên nhập vào mã học phần và kiểm tra xem đúng định dạng chưa cũng như có tồn tại rồi hay không trong danh sách SV.BIN Nếu không thì yêu cầu nhập lại

+Tiếp theo nhập vào mã học phần , nếu không tồn tại trong danh sách HP.BIN thì yêu cầu nhập lại.

+ Nếu bộ MSSV + mã học phần đã có trong file DT.BIN thì yêu cầu nhập lại do trùng lặp.

+Thêm nút temp đó vào danh sách liên kết như đã trình bày ở mục giới thiệu các cấu trúc dữ liệu bên trên.

Bước 3 : Hàm xóa

Hàm xóa 1 sinh viên

Thêm 1 sinh viên : delete_sv()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách sinh viên.-Dữ liệu ra : 1 sinh viên được xóa khỏi danh sách.

-Ý tưởng : Người dùng lựa chọn các thuộc tính để tìm kiếm sinh viên cần xóa

+ Xóa theo MSSV : Nhập vào mã số sinh viên, kiểm tra tồn tại và định dạng.Nếu nhập sai thì có 2 lựa chọn là thoát hoặc nhập lại.Nếu nhập đúng thì

Trang 17

17tìm trong danh sách sinh viên MSSV đó rồi xóa khỏi danh sách theo thuật toán : gọi 2 con trỏ p , last là con trỏ trỏ vào đầu danh sách sinh viên ( last luôn đi trước p )

o Nếu nút cần xóa ở đầu danh sách thì gán cho p->next = head, rồi giải phóng p bằng delete(p).

o Nếu nút cần xóa không ở đầu danh sách thì đầu tiên duyệt qua p = head, last chưa cập nhật, nếu p != head và vẫn chưa phải nút cần xóa thì head = head ->next

+ Xóa theo STT của sinh viên trong danh sách : Nhập vào số thứ tự của sinh viên trong danh sách, kiểm tra xem số đó có đúng định dạng là 1 số nguyên dương hay không Dùng con trỏ p duyệt từ đầu danh sách sinh viên, last là con trỏ đi sau p

o Tiếp theo đó ta đặt 1 biến count = 0 và bắt đầu dùng biến này đếm từ đầu danh sách , đến khi index – 1 = count thì ta xóa nút đang ở vị trí này ( vì trong danh sách liên kết thì chạy từ 0 còn index ở đây ta đangxét chạy từ 1)

o Nếu index – 1 != count thì ta cho count++ sau khi p = p->next.Sau khi xóa xong thì cập nhật lại danh sách điểm thi sao cho không còn mã sinh

viên này nữa.

+Xóa theo kí tự trong tên học phần : Kiểm tra chuỗi kí tự đầu vào, viết hoa tất cả các kí tự trong chuỗi đó ( vì mã học phần đều được viết hoa ) và dùng 1 hàm để kiểm tra xem kí tự đó có tồn tại trong chuỗi tên của học phần không.

o Nếu có thì hiển thị ra danh sách các học phần có chứa kí tự đó, rồi nhập vào mã số học phần và xóa như bên trên phần xóa theo Mã học phần.

o Nếu không thì in ra không có học phần nào tồn tại.

Cập nhật lại danh sách điểm thi sao cho không còn tồn tại mã học phần này nữa.

Hàm xóa 1 bản ghi điểm thi

Thêm 1 bản ghi điểm thi : delete_dt()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách học phần.-Dữ liệu ra : 1 bản ghi điểm thi được xóa ra khỏi danh sách điểm thi.-Ý tưởng : Nhập vào mã học phần và kiểm tra các điều kiện.

Trang 18

18+Nếu thỏa mã thì in ra danh sách điểm thi của học phần đó của tất cả sinh viên.

o Sau đó nhập vào mã số sinh viên ở trong danh sách trên,nếu nhập sai thì yêu cầu nhập lại, nếu nhập đúng thì xóabản ghi khỏi danh sách.

Bước 4 : Hàm sửa

Hàm sửa dữ liệu của 1 sinh viên

Sửa 1 sinh viên : edit_sv()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách sinh viên và 1 danhsách điểm thi.

-Dữ liệu ra : 1 sinh viên được sửa dữ liệu trong danh sách.-Ý tưởng : Người dùng nhập vào mã số của sinh viên cần sửa.

+ Sửa MSSV : Nhập vào mã số sinh viên mới , kiểm tra mã số này đã trùng lặp với mã số nào trong danh sách chưa Nếu không thì thay đổi lại mã số sinh viên Cập nhật lại danh sách điểm thi với mã số sinh viên vừa sửa bằng cách lưu lại mã số sinh viên trước lúc sửa bằng biến old_MSSV

+ Sửa Họ và tên đệm, Tên sinh viên , giới tính : Nhập một chuỗi như bình thường , riêng giới tính thì lựa chọn theo options có sẵn.

+ Sủa ngày sinh : kiểm tra lại ngày tháng năm có đúng định dạng hay không.

Hàm sửa dữ liệu của 1 học phần

+ Sửa tên học phần, số tín chỉ : Nhập vào chuỗi tên học phần như bình thường , nhập số tín chỉ kiểm tra đúng định dạng số nguyên dương chưa.

Hàm sửa dữ liệu 1 bản ghi điểm thi

Thêm 1 bản ghi điểm thi : edit_dt()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách điểm thi.-Dữ liệu ra : 1 bản ghi điểm thi được sửa trong danh sách điểm thi.-Ý tưởng :

+Nhập vào mã học phần và kiểm tra các điều kiện tồn tại hay không.

Trang 19

19+ Nhập vào mã số sinh viên, nếu không tồn tại trong danh sách thì yêu cầu nhập lại.

+Sửa lại điểm của sinh viên theo đúng định dạng số thực nhập vào.

Bước 5 : Hàm tìm kiếm

Hàm tìm kiếm 1 sinh viên

Tìm kiếm 1 sinh viên : find_sv()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách sinh viên.-Dữ liệu ra : Danh sách sinh viên được tìm thấy trong danh sách có thông tin đầu vào trùng khớp.

-Ý tưởng : Người dùng lựa chọn 1 trong các thông tin mà mình nhớ để tìm kiếm sinh viên.Tạo 1 danh sách SV_List *replace để lưu các sinh viên có dữ liệu khớp với đầu vào.

+ Tìm theo MSSV : Duyệt từ đầu danh sách, tìm kiếm mã số sinh viên giốngvới như trong danh sách rồi thêm vào danh sách replace.

+ Tìm theo tên sinh viên :Nhập vào kí tự đầu vào có trong tên sinh viên, kiểm tra xem chuỗi đó có trong tên 1 sinh viên bất kì nào không bằng hàm check() tự viết.Nếu có thì thêm vào danh sách replace.

+ Tìm kiếm theo ngày sinh : Nhập vào ngày sinh, kiểm tra đúng định dạng và so sánh với các ngày sinh trong danh sách.

+ Tìm kiếm theo giới tính : Lựa chọn các options có sẵn để tìm kiếm sinh viên nam hoặc nữ.

Hàm tìm kiếm 1 học phần

Tìm kiếm 1 học phần : find_hp()

-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách học phần.-Dữ liệu ra : Danh sách học phần được lấy ra có thông tin đầu vào trùng khớp.

-Ý tưởng Người dùng lựa chọn 1 trong các thông tin mà mình nhớ để tìm :

kiếm học phần Tạo 1 danh sách HP_List *replace để lưu các học phần có dữliệu khớp với đầu vào.

+ Tìm kiếm theo Mã học phần : Nhập vào mã học phần Duyệt danh sách từ đầu , nếu thấy mã học phần này thì thêm vào danh sách replace

+ Tìm kiếm theo tên học phần, số tín chỉ : Nhập vào chuỗi tên học phần như bình thường , nhập số tín chỉ kiểm tra đúng định dạng số nguyên dương chưa.->Thêm vào danh sách replace

Hàm tìm kiếm 1 bản ghi điểm thi

Tìm kiếm 1 bản ghi điểm thi : find_dt()

Trang 20

20-Dữ liệu vào : 1 tham chiếu tới 1 con trỏ của 1 danh sách điểm thi.-Dữ liệu ra : Danh sách bản ghi điểm thi trong danh sách điểm thi.-Ý tưởng :

+Nhập vào mã số sinh viên và kiểm tra các điều kiện tồn tại hay không trong file điểm thi và sinh viên.-> Đưa ra danh sách sinh viên và tất cảđiểm của họ

+ Nhập vào mã học phần, nếu không tồn tại trong danh sách trên thì yêu cầu nhập lại.

+Đưa ra điểm của sinh viên trong học phần này.

Các hàm tìm kiếm 1 tên học phần, tên sinh viên, số tín chỉ

Tìm kiếm tên học phần : find_name hp(HP_List *&hp, string ip)

-Truyền vào mã học phần rồi, duyệt danh sách nếu trùng mã học phần thì in ra.

Tìm kiếm tên sinh viên : find_name_sv(SV_List *&sv , string MSSV)-Truyền vào mã sinh viên rồi, duyệt danh sách nếu trùng mã số sinh viên thì in ra.

Tìm kiếm số tín chỉ của 1 học phần : number_tc()

-Truyền vào 1 mã học phần và 1 danh sách học phần, hiển thị ra số tín chỉ.

Bước 6 : Hàm chức năng

Tính điểm tích lũy trung bình GPA của 1 hoặc toàn bộ sinh viên.

-Dữ liệu vào : Danh sách điểm thi, học phần, mã số sinh viên.-Dữ liệu ra : GPA của mỗi sinh viên được lưu vào file GPA.BIN.

-Ý tưởng : Duyệt danh sách sinh viên từ đầu, sử dụng hàm GPA truyền vào mã số sinh viên của mỗi vòng lặp và danh sách học phần, điểm thi -> kết quả GPA của mỗi sinh viên.

Điểm 1 học phần của toàn bộ sinh viên

-Dữ liệu vào : Mã học phần, danh sách điểm thi, danh sách học phần.-Dữ liệu ra : Danh sách điểm của toàn bộ sinh viên nếu tồn tại của 1 sinh viên.

Trang 21

21-Ý tưởng : Duyệt danh sách điểm thi, nếu mã học phần trùng với mã trong danh sách điểm thi thì in ra danh sách những sinh viên đó.Sử dụng hàm find_name_sv() để in thêm 1 trường là tên của sinh viên đó.

Danh sách sinh viên chưa đạt 1 học phần

-Dữ liệu vào : Mã học phần, danh sách điểm thi, danh sách học phần.-Dữ liệu ra : Danh sách điểm của toàn bộ sinh viên nếu tồn tại của 1 sinh viên.-Ý tưởng : Duyệt danh sách điểm thi, nếu mã học phần trùng với mã trong danh sách điểm thi thì kiểm tra điểm thi xem nhỏ hơn 4 thì in ra danh sách những sinh viên đó.Sử dụng hàm find_name_sv() để in thêm 1 trường là tên của sinh viên đó.

Danh sách học phần mà 1 sinh viên chưa đạt

-Dữ liệu vào : Mã số sinh viên, danh sách điểm thi, danh sách học phần.-Dữ liệu ra : Danh sách học phần của 1 sinh viên có điểm thi nhỏ hơn 4.-Ý tưởng : Duyệt danh sách điểm thi, nếu mã sinh viên trùng với mã trong danh sách điểm thi thì kiểm tra điểm thi xem nhỏ hơn 4 thì in ra danh sách những học phần đó.Sử dụng hàm find_name_hp() để in thêm 1 trường là tên của học phần đó.

Bước 7 : Một số hàm khác

Hàm in ra danh sách : show_sv() , show_hp(), show_dt() ->In ra danh sách các sinh viên, học phần , điểm thi.Hàm sắp xếp danh sách sinh viên : sort_list()

->Truyền vào 1 danh sách sinh viên SV_List *& sv;

->In ra danh sách các sinh viên được sắp theo tên với thứ tự alphabet.Hàm chuẩn hóa thông tin : chuan_hoa(), chuan_hoa_ngay_sinh()

->Trả về đúng định dạng của tên sinh viên : viết hoa kí tự đều, xóa khoảng trắng ->Ngày sinh được ghi đúng theo định dạng ngày/tháng/năm.

Hàm chuyển số thành chuỗi : convert_from_number_to_string(), nts()->Chuyển số thực hoặc số nguyên sang kiểu chuỗi

Hàm đọc ghi vào file nhị phân : readBinaryFile() , writeBinaryFile()

->readBinaryFile() có tham số truyền vào là tên 1 file, và đọc ra 1 tập hợp kí tự có trong file.

->writeBinaryFile() có tham số truyền vào là tên 1 file, 1 chuỗi kí tự và trả về 1 file được ghi vào nhưng mã hòa thành các chuỗi 01101101101…

Trang 22

Hàm liên quan đến GPA :

+ Chuyển sang thang điểm 4 : thang_diem_4()

->Truyền vào điểm thang 10 trả về kết quả thang 4.

->Lấy biến tổng : total_tc ta được GPA.

Hàm sao lưu file

Sao lưu ra file sinh viên : back_up_to_file_sv();

->Truyền vào 1 danh sách sinh viên và tên file SV.BIN, viết thông tin sinh viên trong danh sách ra file SV.BIN.

Sao lưu ra file học phần : back_up_to_file_hp();

->Truyền vào 1 danh sách học phần và tên file HP.BIN, viết thông tin học phần trong danh sách ra file HP.BIN

Sao lưu ra file điểm thi: back_up_to_file_dt();

->Truyền vào 1 danh sách học phần và tên file DT.BIN, viết thông tin điểm thi trong danh sách ra file DT.BIN

Hàm update file điểm thi sau khi cập nhật sửa xong sinh viên, học phần : update_file_after_delete()

->Truyền vào danh sách sinh viên, học phần, điểm thi và 3 file SV.BIN, HP.BIN, DT.BIN

->Dựa vào dữ liệu của các file trên để cập nhật lại file DT.BIN

Bước 8 : Khởi tạo các hàm theo ý tưởng bên trên Hàm nhập :

Hàm nhập sinh viên :

// hàm thêm thông tin sinh viên từ bàn phímvoid add_sv(SV_List *&sv){

program_exe +="[->] Da di vao ham them 1 sinh vien!\n"; sv_node* temp = newsv_node;

temp->sinh_vien = newSinh_Vien; temp->sinh_vien->Ngay_sinh = newNgay_Sinh; cout <<"[!] Them sinh vien \n"; while true ( )

{

// nhập vào ngày tháng năm sinh

cout <<"\n"; {

cout <<"\t(?) Nhap vao ngay sinh : "; cin >> temp->sinh_vien->Ngay_sinh->day; cout <<"\t(?) Nhap vao thang sinh : "; cin >> temp->sinh_vien->Ngay_sinh->month; cout <<"\t(?) Nhap vao nam sinh : "; cin >> temp->sinh_vien->Ngay_sinh->year;

Trang 23

23 flag = 0;int

while true ( ) {

cout <<"\t(?) Nhap vao ma so sinh vien : "; cin >> temp->sinh_vien->MSSV;

(cin.fail() || temp->sinh_vien->MSSV <= 0 || cin.get() != if'\n' // cin.fail() trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } }

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(temp->sinh_vien->MSSV == p->sinh_vien->MSSV)if

{ flag = 1; } } (flag == 1)if

program_exe +="[exe] Da nhap thanh cong 1 ma so sinh vien moi" nts(temp->sinh_vien->MSSV) + +" \n";

cout <<"\t(?) Nhap vao ho dem : "; getline(cin.ignore(), temp->sinh_vien->Ho_dem); chuan_hoa(temp->sinh_vien->Ho_dem);

program_exe +="[exe] Da nhap thanh cong 1 ho dem sinh vien moi " temp->sinh_vien->Ho_dem + +" \n";

cout <<"\t(?) Nhap vao ten sinh vien : "; fflush(stdin);

{

cout <<"\t(?) Ngay thang nam sinh khong hop le ! Nhap lai :\n";

} } while true ( );

program_exe +="[exe] Da nhap thanh cong 1 ngay sinh cua sinh vien moi " temp->sinh_vien->Ngay_sinh->ngay_sinh() + +" \n";cout <<"\n";

cout <<"\t(?) Lua chon gioi tinh : \n\n"; gioi_tinh = Options(int "Nam" "Nu" "" "" "" "", , , , , ); switch (gioi_tinh) {

case 0: temp->sinh_vien->Gioi_tinh ="Nam"; break; case 1: temp->sinh_vien->Gioi_tinh ="Nu"; break; }

cout << endl;

program_exe +="[exe] Da nhap thanh cong 1 gioi tinh cua sinh vien moi " temp->sinh_vien->Gioi_tinh + +" \n";

( ->head == ifsv NULL) {

->head = temp;sv temp->next = NULL; }

else

sv_node* p = sv->head; while (p->next != NULL) {

p = p->next; } p->next = temp; temp->next = NULL; }

cout <<"Da them 1 sinh vien moi !\n";

program_exe +="[exe] Da them 1 sinh vien : " nts(temp-+

Hàm nhập học phần :

// hàm thêm thông tin học phần từ bàn phímvoid add_hp(HP_List *&hp){

program_exe +="[->] Da di vao ham them 1 hoc phan moi !\n"; hp_node* temp = newhp_node;

temp->hoc_phan = newHoc_Phan; // nhập vào mã học phần

{

while true ( ) {

cout <<"\t(?) Nhap vao so tin chi : "; cin >> temp->hoc_phan->So_tc;

(cin.fail() || temp->hoc_phan->So_tc <= 0 || cin.get() != if '\n')

// cin.fail() trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

Trang 24

24 flag = 0;int

cout <<"\t(?) Nhap vao ma hoc phan :"; getline(cin, temp->hoc_phan->Ma_hp); for (hp_node* p = ->head; p != hp NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == temp->hoc_phan->Ma_hp) {

flag = 1; } } (flag == 0)if

{ break; } else

for int ( i = 0; i < temp->hoc_phan->Ten_hp.length(); i++) {

temp->hoc_phan->Ten_hp = toupper(temp->hoc_phan-[

>Ten_hp i );[ ]

}

program_exe +="[exe] Da nhap thanh cong ten cua 1 hoc phan moi " temp->hoc_phan->Ten_hp + +" \n";

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } }

program_exe +="[exe] Da nhap thanh cong so tin chi cua 1 hoc phan moi " nts(temp->hoc_phan->So_tc) + +" \n";

( ->head == ifhp NULL) {

->head = temp;hp temp->next = NULL; }

else

hp_node* p = hp->head; while (p->next != NULL) {

p = p->next; } p->next = temp; temp->next = NULL; }

program_exe +="[exe] Da them 1 sinh vien : " temp-+

// hàm thêm 1 điểm thi

void add_dt(DT_List*& dt, HP_List*& hp, SV_List*& sv){

program_exe +="[->] Di vao ham them 1 diem thi!\n"; // Nhập các thông tin từ bàn phím

dt_node* temp = newdt_node; temp->diem_thi = newDiem_Thi;

program_exe +="[exe] Kiem tra xem ma hoc phan co ton tai hay khong.\n";

{ flag = 0;int

// kiểm tra xem mã học phần có tồn tại hay không

do

{ flag_hp = 0;int

cout <<"\t(?) Nhap vao ma hoc phan : "; getline(cin, temp->diem_thi->Ma_hp); UPPER(temp->diem_thi->Ma_hp);

for (hp_node* hp_ptr = ->head; hp_ptr != hp NULL; hp_ptr = hp_ptr->next)

{

(temp->diem_thi->Ma_hp if == hp_ptr->hoc_phan->Ma_hp) {

flag_hp = 1; break; }

{ break; } } while true ( );

program_exe +="[exe] Kiem tra xem ma sinh vien nay co diem cua hocphan do chua \n";

// kiểm tra xem có bị trùng với 1 bộ điểm thi nào không

for (dt_node* p = ->head; p != dt NULL; p = p->next) {

(p->diem_thi->Ma_hp if == tem>diem_thi->Ma_hp && >diem_thi->MSSV == temp->diem_thi->MSSV)

{ flag = 1; break; } } (flag == 1)if

{

program_exe +="[exe] Da co diem cua sinh vien " nts(temp-+

Trang 25

25 }

{

program_exe +="[exe] Ma hoc phan " temp->diem_thi-+

>Ma_hp +" dung Thoat vong lap kiem tra ma hoc phan \n"; break;

} } while true ( );

program_exe +="[exe] Kiem tra xem ma sinh vien co ton tai hay khong.\n";

// kiểm tra xem mã sinh viên có tồn tại hay không

do

{ flag_sv = 0;int

// nhập vào mã số của sinh viên

while true ( ) {

cout <<"\t(?) Nhap vao ma so sinh vien : "; cin >> temp->diem_thi->MSSV;

(cin.fail() || temp->diem_thi->MSSV <= 0 || cin.get() != if'\n' // cin.fail() trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } }

for (sv_node* sv_ptr = ->head; sv_ptr != sv NULL; sv_ptr = sv_ptr->next)

{

(temp->diem_thi->MSSV == sv_ptr->sinh_vien->MSSV)if

{ flag_sv = 1; break; } }

>diem_thi->MSSV) +" voi hoc phan " temp->diem_thi->Ma_hp + +".\n"; cout <<"(*) Trung khop ! Sinh vien da co diem cua hoc phan nay ! Nhap lai : \n";

cin.ignore(); }

{ break; } } while true ( );

program_exe +="[exe] Nhap diem \n";

{ break; } } while true ( );

// thêm vào danh sách

( ->head == ifdt NULL) {

->head = temp;dt temp->next = NULL; }

else

dt_node* p = dt->head; while (p->next != NULL) {

p = p->next; } p->next = temp; temp->next = NULL; }

program_exe +="[exe] Da them diem cua sinh vien " nts(temp-+

>diem_thi->MSSV) +" voi hoc phan"

temp->diem_thi->Ma_hp + +" : "

convert_from_number_to_string(temp->diem_thi->Diem_hp, 2) + +" diem.\n";

cout <<"[V] Da them vao danh sach diem thi !\n";}

Hàm xóa

Xóa 1 sinh viên

// hàm xóa thông tin sinh viênvoid delete_sv(SV_List *&sv){

program_exe +="[->] Da di vao ham xoa 1 sinh vien! \n"; cout <<"[->] Xoa sinh vien theo\n";

se = Options(int "MSSV" "STT" "QUAY LAI", , , "", "", ""); switch (se)

{ case 0: {

program_exe +="[exe] Lua chon xoa 1 sinh vien theo ma so sinh

{

(p == if sv->head) { //continue;

} else

{

last = last->next; }

} }

Trang 26

vien \n"; index;int

flag_all = 1;int

do

{ flag = 0;int

// nhập vào mã số của sinh viên cần sửa

while true ( ) {

cout <<"\t(?) Nhap vao ma so sinh vien muon sua : "; cin >> index;

(cin.fail() || index <= 0 || cin.get() != if '\n') // cin.fail() trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } }

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(p->sinh_vien->MSSV == index)if

{ flag = 1; break; } } (flag == 0)if

{

cout <<"(*) Khong ton tai ma so sinh vien nay ! \n"; select = Options(int "NHAP LAI", "THOAT" "" "" "" "", , , , ); switch (select)

{

sv_node* last = sv->head;

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(p->sinh_vien->MSSV == index)if

{

(p == if sv->head) {

->head = p->next;sv

program_exe +="[exe] Da xoa sinh vien co ma so sinh vien" nts(p->sinh_vien->MSSV)+

p->sinh_vien->Ho_dem p->sinh_vien-+" "+ +" "+

>Ten_sv +" trong danh sach\n";

cout <<"[V] Da xoa sinh vien co ma sinh vien "<< >sinh_vien->MSSV)

<< " " p->sinh_vien->Ho_dem +" "<< >Ten_sv <<" trong danh sach\n";

delete(p); break; } else

{

last->next = p->next;

program_exe +="[exe] Da xoa sinh vien co ma so sinh vien

flag_all = 0; }

} while (flag_all == 1);

break; } case 1: {

program_exe +="[exe] Lua chon xoa 1 sinh vien theo so thu tu trong danh sach sinh vien \n";

index;int

// nhập vào số thứ tự

while true ( ) {

cout <<"\t(?) Nhap vao so thu tu cua sinh vien trong danh sach : "; cin >> index;

(cin.fail() || index <= 0 || cin.get() != if '\n') // cin.fail() trả về đúng vềnhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } }

sv_node* last = sv->head; count = 0;int

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(index - 1 == count)if

{

(p == if sv->head) {

->head = p->next;sv

cout <<"[V] Da xoa sinh vien co thu tu "<< nts(index) <<" : "

<< nts(p->sinh_vien->MSSV)

<< " " p->sinh_vien->Ho_dem << << >Ten_sv <<" trong danh sach\n";

program_exe +="[exe] Da xoa sinh vien co thu tu " nts(index) ++" : "+ nts(p->sinh_vien->MSSV)

p->sinh_vien->Ho_dem p->sinh_vien->Ten_sv +";"+ +";"++" trong danh sach\n";

delete(p); break; } else

program_exe +="[exe] Da xoa sinh vien co thu tu " nts(index) ++" : "+ nts(p->sinh_vien->MSSV)

p->sinh_vien->Ho_dem p->sinh_vien->Ten_sv +" "+ +" "++" trong danh sach\n";

p->next = p; delete(p); break; } } else

{

(p == if sv->head)

Trang 27

" nts(p->sinh_vien->MSSV)+

p->sinh_vien->Ho_dem p->sinh_vien-+" "+ +" "+

>Ten_sv +" trong danh sach\n";

cout <<"[V] Da xoa sinh vien co ma sinh vien "<< >sinh_vien->MSSV)

<< " " p->sinh_vien->Ho_dem +" "<< >sinh_vien->Ten_sv <<" trong danh sach\n";

p->next = p; delete(p); break; } } else

{ count++; } else

{ count++; last = last->next; }

} } break;

}

case 2: program_exe +="[exe] Lua chon quay lai \n"; break; default:break;

}}

Xóa 1 học phần// hàm xóa thông tin 1 học phần void delete_hp(HP_List *&hp){

program_exe += "[->] Da di vao ham xoa 1 hoc phan! \n"; int count = 0;

for (hp_node* p = hp->head; p != NULL; p = p->next) {

count++; }

if (hp->head != NULL) {

cout << "[->] Xoa theo thong tin : \n";

int se = Options("STT", "MA HOC PHAN", "TEN HOC PHAN", "QUAY LAI", "", "");

switch (se) { case 0: {

program_exe += "[exe] Xoa 1 hoc phan theo so thu tu trong danh sach \n";

int index; do {

// nhập vào số thứ tự cửa học phần while (true)

cin.clear(); // Xóa trạng thái lỗi của cin cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin cout << "Vui long nhap mot so nguyen duong hop le.\n";

} else { break; } }

if (index <= 0 || index > count) {

cout << "(*) So thu tu khong ton tai trong danh sach ! Nhap lai : \n";

cout << "[V] Da xoa 1 hoc phan theo ma hoc phan : " << p->hoc_phan->Ma_hp + ";"

<< p->hoc_phan->Ten_hp + ";" << >hoc_phan->So_tc) << " trong danh sach! \n";

p->next = p; delete(p); break; } } else {

if (p == hp->head) {

continue; // nếu p = head thì last không giữ nguyên

} else {

last = last->next; // nếu p != head thì last tiến 1 bước trong danh sách

}

// tất cả các if else để last luôn đi sau p ngoại trừ p = head;

} }

program_exe += "[exe] Da xoa hoc phan co ma hoc phan " + ma_hp + " \n";

flag_all = 0; break; }

} while (flag_all == 1); break; } case 2: {

string hp_char; string ma_hp; int flag_all = 1;

program_exe += "[exe] Xoa 1 hoc phan theo ten trong danh sach! \n";

int flag = 0;

Trang 28

} else { break; } } while (true); hp_node* last = hp->head; int count = 0;

for (hp_node* p = hp->head; p != NULL; p = p->next) {

if (index - 1 == count) {

if (p == hp->head) {

hp->head = p->next;

program_exe += "[exe] Da xoa 1 hoc phan theo so thu tu " + nts(index) + " : "

+ >Ma_hp + ";" + >Ten_hp + ";" + nts(p->hoc_phan->So_tc) + " trong danh sach! \n";

cout << "[V]Da xoa 1 hoc phan theo so thu tu " <<nts(index) << " : "

<< >hoc_phan->Ma_hp << ";" << >hoc_phan->Ten_hp << ";" << nts(p->hoc_phan->So_tc) << " trong danh sach! \n";

delete(p); break; } else {

last->next = p->next;

program_exe += "[exe] Da xoa 1 hoc phan theo so thu tu " + nts(index) + " : "

+ >Ma_hp + ";" + >Ten_hp + ";" + nts(p->hoc_phan->So_tc) + " trong danh sach! \n";

cout << "[V] Da xoa 1 hoc phan theo so thu tu " << nts(index) << " : "

<< >hoc_phan->Ma_hp << ";" << >hoc_phan->Ten_hp << ";" << nts(p->hoc_phan->So_tc) << " trong danh sach! \n";

p->next = p; delete(p); break; } } else {

if (p == hp->head) {

count++; } else { count++; last = last->next; }

} } break; } case 1: {

program_exe += "[exe] Xoa 1 hoc phan theo ma hoc phan \n";

string ma_hp; int flag_all = 1;

HP_List* replace = new HP_List;

cout << "\t(?) Nhap vao ten hoc phan hoac ki tu co trong ten hoc phan : ";

//cin.ignore(); // xóa kí tự còn tồn đọng trong bộ nhớ đệm getline(cin, hp_char);

replace->add_hp(p->hoc_phan); flag = 1;

} } if (flag == 0) {

cout << "(*) Khong ton tai hoc phan nao !\n"; break;

} else if (flag == 1) {

cout << "[->] Day la danh sach cac hoc phan co ki tu " << hp_char << " : \n";

show_hp(replace); do {

cout << "\t(?) Nhap vao ma hoc phan muon xoa :"; getline(cin, ma_hp);

UPPER(ma_hp); int flag = 0;

for (hp_node* p = h>head; p != NULL; p = >next)

{

if (ma_hp == p->hoc_phan->Ma_hp) {

flag = 1; break; } } if (flag == 0) {

cout << "(*) Khong ton tai ma hoc phan nay ! Nhap lai : \n";

int select = Options("NHAP LAI", "THOAT", "", "", "", "");

switch (select) {

case 0:flag_all = 1; break; case 1: flag_all = 0; break; }

} else {

hp_node* last = hp->head; // tạo ra 1 nút đi trước nút đang xét trong vòng lặp

for (hp_node* p = h>head; p != NULL; 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 + " : "

+ >hoc_phan->Ma_hp + ";" +

Trang 29

for (hp_node* p = hp->head; p != NULL; p = p->next) {

if (ma_hp == p->hoc_phan->Ma_hp) {

flag = 1; break; } } if (flag == 0) {

cout << "(*) Khong ton tai ma hoc phan nay ! Nhap lai : \n";

int select = Options("NHAP LAI", "THOAT", "", "", "", "");

switch (select) {

case 0:flag_all = 1; break; case 1: flag_all = 0; break; }

} else {

hp_node* last = hp->head; // tạo ra 1 nút đi trước nút đang xét trong vòng lặp

for (hp_node* p = h>head; p != NULL; 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 ma hoc phan : "

+ >hoc_phan->Ma_hp + ";" + >hoc_phan->Ten_hp + ";" + nts(p->hoc_phan->So_tc) + " trong danh sach! \n";

cout << "[V] Da xoa 1 hoc phan theo ma hoc phan : " << p->hoc_phan->Ma_hp + ";"

<< p->hoc_phan->Ten_hp + ";" << >hoc_phan->So_tc) << " trong danh sach! \n"; delete(p);

break; } else {

last->next = p->next;

program_exe += "[exe] Da xoa 1 hoc phan theo ma hoc phan : "

+ >hoc_phan->Ma_hp + ";" + >hoc_phan->Ten_hp + ";" + nts(p->hoc_phan->So_tc) + " trong danh sach! \n";

p->hoc_phan->Ten_hp + ";" + nts(p->hoc_phan->So_tc) + " trong danh sach! \n";

cout << "[V] Da xoa 1 hoc phan theo ki tu "<< hp_char << " : "

<< >hoc_phan->Ma_hp << ";" + >hoc_phan->Ten_hp << ";" << nts(p->hoc_phan->So_tc) << " trong danh sach! \n";

delete(p); break; } else {

last->next = p->next;

program_exe += "[exe] Da xoa 1 hoc phan theo ki tu " + hp_char + " : "

+ >hoc_phan->Ma_hp + ";" + >hoc_phan->Ten_hp + ";" + nts(p->hoc_phan->So_tc) + " trong danh sach! \n";

cout << "[V] Da xoa 1 hoc phan theo ki tu "<< hp_char << " : "

<< >hoc_phan->Ma_hp << ";" + >hoc_phan->Ten_hp << ";" << nts(p->hoc_phan->So_tc) << " trong danh sach! \n";

p->next = p; delete(p); break; } } else {

if (p == hp->head) {

continue; // nếu p = head thì last không giữ nguyên

} else {

last = last->next; // nếu p != head thì last tiến 1 bước trong danh sách

}

// tất cả các if else để last luôn đi sau p ngoại trừ p = head;

} }

program_exe += "[exe] Da xoa 1 hoc phan theo ki tu ten " + hp_char + " trong danh sach! \n";

flag_all = 0; break; }

} while (flag_all == 1); break; } break; }

case 3:program_exe += "[exe] Lua chon thoat! \n"; return; default:break;

} } else {

cout << "(*) Khong the xoa hoc phan vi danh sach hoc phantrong !\n";

}}

Trang 30

Xóa 1 bản ghi điểm thi

// Xóa 1 bản ghi điểm thi void delete_dt(DT_List*& dt){

// nhập vào mã số sinh viên và mã học phần

program_exe +="[->] Da di vao ham xoa 1 ban ghi diem thi ! \n"; DT_List* replace = newDT_List;

string ip_Ma_hp; ip_MSSV;int

replace->add_dt(p->diem_thi); }

}

(replace->head != if NULL) {

cout <<"[->] Day la cac sinh vien co diem cua hoc phan nay : \n";

show_dt(replace); cout <<"\n"; do

{ flag = 0;int

cout <<"\t(?) Nhap vao ma so sinh vien ma ban muon xoa : "; cin >> ip_MSSV;

for (dt_node* q = replace->head; q != NULL; q = q->next) {

(ip_MSSV == q->diem_thi->MSSV)if

{ flag = 1; break; } } (flag == 1)if

{ break; } else

{

cout <<"(*) Ma so sinh vien khong ton tai trong danh sach sinh vien co diem hoc phan nay !\n";

cout <<"\t(?) Lua chon : \n";

se = Options(int "NHAP LAI", "THOAT" "" "" "" "", , , , ); switch (se)

{ case break 0: ; case 1:flag_all = 0; }

cin.ignore();

}

} while (flag_all == 1); (flag_all == 1)if

{

// xóa ra khỏi danh sách điểm thi

dt_node* last = dt->head;

for (dt_node* p = ->head; p != dt NULL; p = p->next) {

(p->diem_thi->Ma_hp if == ip_Ma_hp && >MSSV == ip_MSSV)

{

(p == if dt->head) {

->head = p->next;dt delete(p); break; } else

{

last->next = p->next; p->next = p;

delete(p); // giải phóng bộ nhớ được cấp phát chop

break; } } else

{

(p == if dt->head) { continue; } else

{

last = last->next; }

} }

program_exe +="[exe] Da xoa diem cua sinh vien " +

nts(ip_MSSV) +" voi ma hoc phan " ip_Ma_hp + +" ra khoi danh sach.\n";

cout <<"[V] Da xoa diem cua sinh vien "<< ip_MSSV <<" voi ma hoc phan "<< ip_Ma_hp <<" khoi danh sach !\n"; }

} else

program_exe +="[exe] Khong co diem cua bat cu sinh vien nao voi hoc phan nay!\n";

cout <<"(*) Khong co diem cua bat cu sinh vien nao voi hoc phan nay !\n";

}};

Hàm sửa

Sửa thông tin 1 sinh viên :

Trang 31

cout <<"\t(?) Nhap vao ma so sinh vien muon sua : "; cin >> index;

(cin.fail() || index <= 0 || cin.get() != if '\n') // cin.fail() trả vềđúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } } count = 0;int

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(p->sinh_vien->MSSV == index)if

{ count++; } } (count != 1)if

{

cout <<"Sinh vien co ma so nay khong ton tai !\n"; se = Options(int "NHAP LAI", "THOAT" "" "" "" "", , , , ); switch (se)

{ case break 0: ; case 1:flag_all = 0; break; }

} else

{ break; }

cout <<"\t(!) Lua chon thong tin muon sua : \n";

se = Options(int "MSSV" "HO VA TEN DEM" "TEN SINH , ,

VIEN", "NGAY SINH" "GIOI TINH" "QUAY LAI", , ); program_exe +="[exe] Lua chon thong tin can sua : \n"; switch (se)

{ case 0: {

program_exe +="[exe] Da lua chon sua MSSV \n"; old_MSSV = index;int

replace;int

} case 1: {

program_exe +="[exe] Da lua chon sua HO VA TEN DEM\n";

string replace; flag = 0;int

cout <<"\t(?) Nhap vao Ho va ten dem cua sinh vien muon sua : ";

getline(cin, replace); chuan_hoa(replace);

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

p->sinh_vien->Ho_dem + +" -> " replace + +"\n"; break;

} } break; } case 2: {

program_exe +="[exe] Da lua chon sua TEN SINH VIEN\n";

string replace; count = 0;int

program_exe +="[exe] Da lua chon sua NGAY SINH\n"; Ngay_Sinh* new_date = newNgay_Sinh; do

{ break;

Trang 32

32 do

{ count = 0;int

flag = 0;int

// nhập vào mã số của sinh viên cần sửa

while true ( ) {

cout <<"\t(?) Nhap vao ma so sinh vien muon sua thanh: ";

cin >> replace;

(cin.fail() || replace <= 0 || cin.get() != if '\n') // cin.fail()trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n";

} else

{ break; } }

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(replace == p->sinh_vien->MSSV && replace != if

index) { count++; } } (count == 0)if

} } (flag == 1)if

{ break; } } else

}

cout <<"[V] Da thay doi ma so sinh vien cua sinh vien " <<

nts(old_MSSV) <<" -> "<< nts(replace) << " va cap nhat lai danh sach diem thi !\n";

break;

} else

{

cout <<"Dinh dang ngay thang nam sinh khong hop le ! Nhap lai : \n";

} } while true ( );

for (sv_node* p = ->head; p != sv NULL; p = p->next) {

} break; } case 4: {

program_exe +="[exe] Da lua chon sua MSSV \n"; cout <<"\n[?] Lua chon gioi tinh ban muon sua : \n"; se = Options(int "Nam" "Nu" "" "" "" "", , , , , ); for (sv_node* p = ->head; p != sv NULL; p = p->next) {

(index == p->sinh_vien->MSSV && se == 0)if

} } break; } case break 5: ; } }}

Sửa 1 học phần

Trang 33

cout <<"\t(?) Nhap vao ma hoc phan muon sua : "; getline(cin, ma_hp);

UPPER(ma_hp);

for (hp_node* p = ->head; p != hp NULL; p = p->next) {

(ma_hp if == p->hoc_phan->Ma_hp) {

flag = 1; break; } } (flag == 1)if

{ break; } else

TIN CHI" "QUAY LAI", , "", "");

program_exe +="[exe] Lua chon 1 thong tin ma ban muon sua \n";

switch (se) { case 0: {

program_exe +="[exe] Lua chon sua MA HOC PHAN \n"; string new_hp;

for (hp_node* p = ->head; p != hp NULL; p = p->next) {

(new_hp if == p->hoc_phan->Ma_hp && new_hp !=

ma_hp) { flag = 1; break; } } (flag == 1)if

p->diem_thi->Ma_hp new_hp;=

} }

cout <<"[V] Da thay doi ma hoc phan "<< old_hp <<" -> "<<

new_hp <<" va cap nhat lai trong danh sach diem thi !\n"; break;

} case 1: {

program_exe +="[exe] Lua chon sua TEN HOC PHAN.\n"; string new_name;

cout <<"\t(?) Nhap vao ten hoc phan : "; getline(cin, new_name);

program_exe +="[exe] Nhap vao thanh cong ten hoc phan moi "+ new_name +".\n";

UPPER(new_name);

for (hp_node* p = ->head; p != hp NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == ma_hp) {

program_exe +="[exe] Thay doi ten hoc phan : " p-+

>hoc_phan->Ma_hp +" -> " new_name + +"\n"; p->hoc_phan->Ten_hp new_name;=

cout <<"[V] Da thay doi ten hoc phan : " p->hoc_phan-+

>Ma_hp +" -> " new_name + +"\n"; }

} break; } case 2: {

program_exe +="[exe] Lua chon sua SO TIN CHI.\n"; new_tc;int

// nhập vào mã số của sinh viên cần sửa

while true ( ) {

cout <<"\t(?) Nhap vao so tin chi muon sua : "; cin >> new_tc;

(cin.fail() || new_tc <= 0 || cin.get() != if '\n') // cin.fail() trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n"; }

else

{ break; } }

program_exe +="[exe] Nhap vao so tin chi moi thanh cong : "

+ nts(new_tc) +"\n"; flag = 0;int

for (hp_node* p = ->head; p != hp NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == ma_hp) {

Trang 34

34 break;

} } while true ( );

program_exe +="[exe] Nhap vao thanh cong ma hoc phan moi " new_hp + +".\n";

program_exe +="[exe] Sua ma hoc phan \n"; string old_hp = ma_hp;

for (hp_node* p = ->head; p != hp NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == ma_hp) {

p->hoc_phan->Ma_hp new_hp;=

} }

program_exe +="[exe] Thay doi ma hoc phan " old_hp + +" ->"

program_exe +="[exe] Thay doi so tin chi cua hoc phan "

+ ma_hp +" tu "

nts(p->hoc_phan->So_tc) + +" -> " nts(new_tc) ++"\n";

cout <<"Da thay doi so tin chi cua hoc phan "<< ma_hp

<<" tu "

<< nts(p->hoc_phan->So_tc) <<" -> "<< nts(new_tc)

p->hoc_phan->So_tc = new_tc; break;

} } break; } case 3: {

program_exe +="[exe] Lua chon THOAT.\n"; break;

}}

Sửa 1 bản ghi điểm thi

// hàm sửa thông tin 1 học phầnvoid edit_dt(DT_List *&dt){

program_exe +="[->] Da di vao ham sua thong tin diem thi!\n"; // nhập vào mã số sinh viên và mã học phần

DT_List* replace = newDT_List; string ip_Ma_hp; ip_MSSV;int

float ip_diem;

cout <<"\nNhap vao ma hoc phan : "; getline(cin, ip_Ma_hp); UPPER(ip_Ma_hp);

for (dt_node* p = ->head; p != dt NULL; p = p->next) {

(ip_Ma_hp if == p->diem_thi->Ma_hp) {

replace->add_dt(p->diem_thi); }

}

cout <<"[->] Day la cac sinh vien co diem cua hoc phan nay : \n";

show_dt(replace); (replace->head == if NULL) {

cout <<"Khong co diem cua hoc phan nay cua sinh vien nao!\n";

} else

cout <<"\n"; do

{ flag = 0;int

// nhập vào mã số của sinh viên

while true ( ) {

cout <<"\t(?) Nhap vao ma so sinh vien muon sua diem: ";

{ break; } else

// sửa đổi nội dung

for (dt_node* p = ->head; p != dt NULL; p = p->next) {

(ip_Ma_hp if == >diem_thi->Ma_hp && ip_MSSV == >diem_thi->MSSV)

{

Trang 35

35 (cin.fail() || ip_MSSV <= 0 || cin.get() != if '\n') //

cin.fail() trả về đúng về nhập sai kiểu dữ liệu

{

cin.clear(); // Xóa trạng thái lỗi của cin

cin.ignore(1000, '\n'); // Xóa bộ nhớ đệm của cin

cout <<"Vui long nhap mot so nguyen duong hop le.\n";

} else

{ break; } }

p->diem_thi->Diem_hp = ip_diem; break;

} }

program_exe +="[exe] Da sua doi diem cua sinh vien " +

nts(ip_MSSV) +" voi ma hoc phan " ip_Ma_hp + +" -> " +

convert_from_number_to_string(ip_diem, 2) +"\n"; cout <<"[V] Da sua doi diem cua sinh vien "<< nts(ip_MSSV)

<<" voi ma hoc phan "<< ip_Ma_hp

<<" -> "<< convert_from_number_to_string(ip_diem, 2)

<<"\n"; }}

Chức năng tính điểm tích lũy trung bình của toàn bộ sinh viên

program_exe +="[->] Di vao chuc nang TINH DIEM TICH LUY TRUNG BINH\n";

string data = ;""

cout <<"[->] Danh sach GPA cua toan bo sinh vien la :\n"; cout <<"\t+ -+ -+\n"; cout <<"\t| MA SO SINH VIEN | GPA |\n"; cout <<"\t+ -+ -+\n"; for (sv_node* p = sv_list->head; p != NULL; p = p->next) {

cout <<"\t+ -+ -+\n";

writeBinaryFile("GPA.bin", data);

cout <<"[!] Da luu GPA cua tat ca sinh vien vao file GPA.bin \n";

program_exe +="[exe] Ket thuc chuc nang TINH DIEM TICH LUY TRUNG BINH va du lieu cua no :\n" data ;+

cin.ignore(); break;

Điểm 1 học phần của toàn bộ sinh viên

program_exe +="[->] Di vao chuc nang TIM DIEM 1 HOC PHAN CUA TOAN BO SINH VIEN\n";

string ip, name; do

{ flag = 0;int

cout <<"\t(?) Nhap vao ma hoc phan can tra cuu diem : "; getline(cin, ip);

UPPER(ip);

for (hp_node* p = hp_list->head; p != NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == ip) {

flag = 1; break; } } (flag = 0)if

{

cout <<"(*) Khong ton tai ma hoc phan nay ! Nhap lai : \n";

} else

{ break; } } while true ( );

{

cout <<"(!!) Ten cua hoc phan nay la : "<< name << endl; cout <<"[->] Day la danh sach diem cua cac sinh vien voi hocphan nay : \n";

cout <<"\t+ -+ -+ -+\n"; cout <<"\t| Ma so sinh vien | Ho ten sinh vien | Diem |\n";

cout <<+ -+\n";

for (dt_node* q = dt_list->head; q != NULL; q = q->next) {

(ip if == q->diem_thi->Ma_hp) {

cout << left;

cout <<"\t|"<< setw(21) << q->diem_thi->MSSV << "|"

<< setw(32) << find_name_sv(sv_list, q->diem_thi->MSSV) << "|"<< setw(10) << q->diem_thi->Diem_hp <<

"|\n"; } }

cout <<+ -+\n";

program_exe +="[exe] Ket thuc chuc nang TIM DIEM 1 HOC PHAN CUA TOAN BO SINH VIEN\n";

cin.ignore(); }

Trang 36

36 flag = 0;int

for (hp_node* p = hp_list->head; p != NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == ip) {

name p->hoc_phan->Ten_hp;=

flag = 1; } } (flag == 1)if

Các sinh viên không đạt 1 học phần

program_exe +="[->] Di vao chuc nang TIM SINH VIEN KHONG DAT 1 HOC PHAN\n";

string ip, name; do

{ flag = 0;int

cout <<"\t(?) Nhap vao ma hoc phan can tra cuu diem : ";

flag = 1; break; } } (flag = 0)if

{

cout <<"(*) Khong ton tai ma hoc phan nay ! Nhap lai : \n";

} else

{ break; } } while true ( ); UPPER(ip); flag = 0;int

for (hp_node* p = hp_list->head; p != NULL; p = p->next) {

(p->hoc_phan->Ma_hp if == ip) {

name p->hoc_phan->Ten_hp;=

flag = 1; } }

(flag == 1)if

{

cout <<"(!!) Ten cua hoc phan nay la : "<< name <<

endl;

cout <<"[->] Day la danh sach diem cua cac sinh vien khong dat hocphan nay : \n";

cout <<+ -+ -+\n";

cout <<"\t| Ma so sinh vien | Ho ten sinh vien | Diem |\n";

cout <<+ -+ -+\n";

for (dt_node* q = dt_list->head; q != NULL; q = >next)

{

(ip if == >Ma_hp && >Diem_hp < 4)

{ cout << left;

cout <<"\t|"<< setw(21) << q->diem_thi->MSSV

<<"|"<< setw(32) << find_name_sv(sv_list, q->diem_thi->MSSV) << "|"<< setw(10) << q->diem_thi->Diem_hp

<<"|\n"; } }

cout <<+ -+ -+\n";

program_exe +="[exe] Ket thuc chuc nang TIM SINH VIEN KHONG DAT 1 HOC PHAN \n";

cin.ignore(); } else

{

cout <<"(*) Hoc phan nay khong ton tai trong danh sachhoc phan !\n";

cin.ignore(); } break;

Danh sách học phần mà 1 sinh viên chưa đạt

Ngày đăng: 11/06/2024, 17:40

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w