Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 41

TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN


----------------------

Đỗ Hải Đăng - 2210A02


Nguyễn Văn Hiếu -2210A02
Ninh Nguyên Khoa - 2210A02
Ngô Chí Tình - 2210A02

ĐỀ TÀI: QUẢN LÝ MƯỢN TRẢ SÁCH THƯ VIỆN

BÁO CÁO BÀI TẬP LỚN


MÔN: CẤU TRÚC DỮ LIỆU

Giảng viên hướng dẫn: thS. Trịnh Thị Xuân

Hà Nội, năm 2023

1
MỤC LỤC
I. XÁC ĐỊNH BÀI TOÁN.............................................................................................................3
II. XÁC ĐỊNH CTDL BIỂU DIỄN BÀI TOÁN...................................................................................3
III. XÁC ĐỊNH CÁC THUẬT TOÁN – CÁC CHỨC NĂNG................................................................5
IV. LẬP TRÌNH – CÀI ĐẶT..........................................................................................................6
4.1. Các Thuật Toán Chính Của Đối Tượng SACH:.............................................................................6
4.2. Các thuật toán chính của đối tượng DOCGIA:..........................................................................13
4.3. Các thuật toán chính của PHIEUMUON:...................................................................................20
V. KIỂM THỬ - LẬP BỘ TEST...................................................................................................29
5.1. Bộ test của SACH:...................................................................................................................29
5.2. Bộ test của DOCGIA:...............................................................................................................34
5.3. Bộ test của PHIEUMUON:........................................................................................................37

2
I. XÁC ĐỊNH BÀI TOÁN
Thư viện trường Đại học Mở Hà Nội có rất nhiều đầu sách gồm nhiều thể loại
khác nhau. Sinh viên đến thư viện muốn mượn sách cần cung cấp thông tin cá nhân
và để lại thẻ sinh viên. Thư viện khi cho sinh viên mượn sách sẽ cung cấp 1 phiếu
mượn sách. Đến khi sinh viên trả lại sách cần đưa lại phiếu mượn và số sách đã
mượn, sinh viên sẽ nhận lại thẻ sinh viên.

II. XÁC ĐỊNH CTDL BIỂU DIỄN BÀI TOÁN


Đối tượng cần quản lý của bài toán bao gồm: SÁCH, ĐỘC GIẢ, PHIẾU
MƯỢN.
SÁCH: mã sách, tên sách, tên tác giả, thể loại, nhà xuất bản, số lượng có sẵn.
// Khai bao cau truc DSLK kep
struct SACH
{
char TenSach[30], TenTacGia[30], TheLoai[20], MaSach[10], NXB[30];
int SLCoSan;
};

struct NodeS
{
SACH infor;
struct NodeS *next;
struct NodeS *previous;
};
struct ListS
{
NodeS *Head;
NodeS *Tail;
};

ĐỘC GIẢ: mã thẻ sinh viên, họ tên, sđt, email, lớp.

/Khai bao cau truc danh sach lien ket kep


struct DOCGIA
{
char maSV[15], hoTen[50], SDT[15], email[50], lop[15];
};
struct NodeDocGia
{
DOCGIA info;
struct NodeDocGia *next;

3
struct NodeDocGia *prev;
};
struct ListDocGia
{
NodeDocGia *Head;
NodeDocGia *Tail;
};

PHIẾU MƯỢN: số phiếu, , ngày mượn, số sách mượn, thông tin độc giả
mượn sách, danh sách các sách đã mượn.

//Khai bao cau truc danh sach lien ket don


struct Sach
{
char maSach[10], tenSach[30], ghiChu[30];
int SoLuongMuon;
};
struct PhieuMuon
{
char soPhieu[10];
int ngayMuon, thangMuon, namMuon;
char maSV[15], hoTen[30], soDienThoai[20];
Sach dsSach[50];
int soSach;
};

struct NodePhieuMuon
{
PhieuMuon info;
struct NodePhieuMuon *next;
};

struct ListPhieuMuon
{
NodePhieuMuon *Head;
NodePhieuMuon *Tail;
};

4
III. XÁC ĐỊNH CÁC THUẬT TOÁN – CÁC CHỨC NĂNG

Sơ đồ phân cấp các chức năng dự kiến của chương trình:

5
IV. LẬP TRÌNH – CÀI ĐẶT
4.1. Các Thuật Toán Chính Của Đối Tượng SACH:
//Tim sach co so luong lon nhat
void Sach_SLLonNhat(ListS DQ)
{
NodeS *p, *q;
int SLmax = 0;
char masach[10];
if (DQ.Head == NULL)
{
cout << "\n Danh sach rong!";
return;
}
for (p = DQ.Head; p != NULL; p = p->next)
{
if (p->infor.SLCoSan > SLmax)
SLmax = p->infor.SLCoSan;
}
cout << "\n SACH CO SO LUONG LON NHAT: ";
for (p = DQ.Head; p != NULL; p = p->next)
{
if (p->infor.SLCoSan == SLmax)
InSach(p->infor);
}
}

/// In sach co so luong > 10


void InSach_SL10(ListS DQ)
{
NodeS *p;
int dem = 0;
for (p = DQ.Head; p != NULL; p = p->next)
{
if (p->infor.SLCoSan > 10)
{
dem++;
if (dem == 1)
{
cout << "\n Danh Sach Co So Luong > 10: ";
cout << endl
<< setw(10) << "MA SACH"
<< setw(30) << "TEN SACH";
cout << setw(30) << "TEN TAC GIA";
cout << setw(20) << "THE LOAI";
cout << setw(30) << "NXB";

6
cout << setw(5) << "SL";
}
InSach(p->infor);
}
}
if (dem == 0)
cout << "\n Khong Co Sach Co So Luong > 10";
}

// SX DS SACH theo so luong giam dan


void SXSL_Giam(ListS DQ)
{
NodeS *p, *q;
for (p = DQ.Tail; p != NULL; p = p->previous)
for (q = p->previous; q != NULL; q = q->previous)
if (p->infor.SLCoSan > q->infor.SLCoSan)
swap(p->infor, q->infor);
cout << "\n Danh sach so luong giam dan: ";
InDSSach(DSSach);
}

// Tim kiem thong tin SACH theo ten tac gia


void TK_TenTacGia(ListS DQ)
{
string k;
int dem = 0;
cout << "\n Nhap ten tac gia can tim: ";
fflush(stdin);
getline(cin, k);
NodeS *p;
for (p = DQ.Head; p != NULL; p = p->next)
if (p->infor.TenTacGia == k)
{
dem++;
if (dem == 1)
{
cout << "\n Thong Tin Sach Cua Tac Gia " << k;
cout << endl<< setw(30) << "TEN SACH";
cout << setw(30) << "TEN TAC GIA";
cout << setw(20) << "THE LOAI";
cout << setw(30) << "NXB";
cout << setw(5) << "SL";
}
InSach(p->infor);
}
if (dem == 0)
cout << "\n Khong tim duoc tac gia co ten " << k << '.';

7
}
//Tinh tong so luong sach co trong cua hang
void TinhTongSoSach (ListS DQ)
{
int SoLuong=0;
NodeS *p;
if (DQ.Head == NULL)
{
cout << "\n Danh sach rong!";
return;
}
for(p=DQ.Head; p!=NULL; p=p->next)
{
SoLuong = SoLuong + p->infor.SLCoSan;
}
cout<<"\n TONG SO LUONG SACH TRONG CUA HANG LA: "<<SoLuong;
}

// Them SACH moi vao danh sach


void ThemSach(ListS &DQ)
{
SACH x;
NodeS *p;
int n, i;
cout << "\n Nhap So Luong Sach Can Them: ";
cin >> n;
cout << "\n Nhap Thong Tin Sach Can Them: ";
for (i = 0; i < n; i++)
{
NhapSach(x);
p = Get_Node(x);
ChenCuoi(DQ, p);
}
cout << "\n DS SACH DA THEM ";
InDSSach(DSSach);
}

8
// Sua thong tin SACH dua tren ten
void SuaSach(ListS &DQ)
{
string k;
int dem = 0;
SACH x;
cout << "\n Nhap Ten Sach Can Sua: ";
fflush(stdin);
getline(cin, k);
NodeS *p;
for (p = DQ.Head; p != NULL; p = p->next)
if (p->infor.TenSach == k)
{
dem++;
NhapSach(x);
p->infor = x;
}
if (dem == 0)
cout << "\n Khong tim duoc sach";
else
{
cout << "\n Sua Thanh Cong!";
cout << "\n Danh Sach Da Sua: ";
InDSSach(DSSach);
}
}

// Xoa SACH dua theo ten


void XoaSach_Ten(ListS &DQ)
{
if (DQ.Head == NULL)
{
cout << "\n Danh sach rong!" << endl;
return;
}
NodeS *p;
string k;
cout << "\n Nhap Ten Sach Can Xoa: ";
fflush(stdin);
getline(cin, k);
for (p = DQ.Head; p != NULL; p = p->next)
if (p->infor.TenSach == k)
{
break;
}
if (p == NULL)
cout << "\n Khong Tim Duoc Sach " << k << '.';

9
else
{
if ((p == DQ.Head) && (p == DQ.Tail))
{
DQ.Head = NULL;
DQ.Tail = NULL;
}
else if (p == DQ.Head)
DQ.Head = p->next;
else if (p == DQ.Tail)
{
p->previous->next = NULL;
DQ.Tail = p->previous;
}
else
{
p->previous->next = p->next;
p->next->previous = p->previous;
}
free(p);
cout << "\n Xoa Thanh Cong!";
cout << "\n Danh Sach Da Xoa: ";
InDSSach(DSSach);
}
}

//Ghi danh sach cac sach vao file sach.txt


void GhiFile(ListS &DQ, FILE *df)
{
int n = 0;
NodeS *dp;
df = fopen("Sach.txt", "wb");
for (dp = DQ.Head; dp != NULL; dp = dp->next)
n = n + 1;
fwrite(&n, sizeof(int), 1, df);
for (dp = DQ.Head; dp != NULL; dp = dp->next)
{
fwrite(&(dp->infor), sizeof(SACH), 1, df);
}
fclose(df);
cout << "\n Ghi file thanh cong" << endl;
}

10
//Doc danh sach cac sach tu file sach.txt
void DocFile(ListS &DQ, FILE *df)
{
SACH s;
int i, n;
NodeS *dp;
df = fopen("Sach.txt", "rb");
fread(&n, sizeof(int), 1, df);
for (i = 0; i < n; i++)
{
fread(&s, sizeof(SACH), 1, df);
dp = Get_Node(s);
ChenCuoi(DQ, dp);
}
fclose(df);
cout << "\n Doc file thanh cong!";
InDSSach(DSSach);
}

// Menu cua SACH


void Menu_Sach()
{
FILE *df;
int chon;
do
{
cout << "\n _________QUAN LY SACH_________";
cout << "\n 1.Nhap Danh Sach Sach.";
cout << "\n 2.In Danh Sach Sach.";
cout << "\n 3.Tim Sach Co So Luong Lon Nhat.";
cout << "\n 4.In Danh Sach Sach Co So Luong > 10";
cout << "\n 5.SX Danh Sach Theo So Luong Giam Dan.";
cout << "\n 6.Tim Kiem Sach Theo Ten Tac Gia.";
cout << "\n 7.Tinh Tong So Luong Sach Trong Thu Vien.";
cout << "\n 8.Them Sach Moi.";
cout << "\n 9.Sua Thong Tin Cua Sach.";
cout << "\n 10.Xoa Sach Theo Ten.";
cout << "\n 11.Doc File sach.txt Lay Du Lieu.";
cout << "\n 12.Ghi DS Sach Vao File.";
cout << "\n 0. Quay lai Menu chinh";
cout << "\n Moi Ban Chon: ";
cin >> chon;
switch (chon)
{
case 1:
NhapDSSach(DSSach);

11
break;
case 2:
InDSSach(DSSach);
break;
case 3:
Sach_SLLonNhat(DSSach);
break;
case 4:
InSach_SL10(DSSach);
break;
case 5:
SXSL_Giam(DSSach);
break;
case 6:
TK_TenTacGia(DSSach);
break;
case 7:
TinhTongSoSach(DSSach);
break;
case 8:
ThemSach(DSSach);
break;
case 9:
SuaSach(DSSach);
break;
case 10:
XoaSach_Ten(DSSach);
break;
case 11:
DocFile_Sach(DSSach, df);
break;
case 12:
GhiFile_Sach(DSSach, df);
break;
case 0:
return;
}
} while (chon != 0);
}

12
4.2. Các thuật toán chính của đối tượng DOCGIA:
// IN DOCGIA co lop = 2210A02
void inLop(ListDocGia DG)
{
NodeDocGia *p;
bool found = false;

for(p = DG.Head; p != NULL; p = p->next)


{
if (strcmp(p->info.lop,"2210A02")==0)
{
inDG(p->info);
cout << "\n ------------------------------" << endl;
found = true;
}
}

if (!found)
{
cout << "\n Khong tim thay DOCGIA co lop 2210A02"<< endl;
}
}

// Tim kiem DOCGIA theo maSV


NodeDocGia *timKiemMa(ListDocGia DG, char maSVcantim[15])
{
NodeDocGia *p;
for(p=DG.Head;p!=NULL;p=p->next)
{
if(strcmp(p->info.maSV,maSVcantim)==0)
break;
}
return p;
}

// Tim kiem DOCGIA theo email


NodeDocGia *timKiemEmail(ListDocGia DG, char emailCantim[50])
{
NodeDocGia *p;
for(p=DG.Head;p!=NULL;p=p->next)
{
if(strcmp(p->info.email, emailCantim)==0)
break;
}
return p;
}

13
// Sap xep danh sach DOCGIA tang dan theo maSV
void SX_DOCGIA_hoTen_tangdan(ListDocGia &DG)
{
NodeDocGia *p, *q;
DOCGIA tg;
for(p=DG.Head;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if (strcmp(p->info.maSV, q->info.maSV) > 0)

{
tg= p->info;
p->info=q->info;
q->info=tg;
}
}
}
cout<<"\n Sap xep danh sach DOCGIA tang dan theo maSV thanh cong"<<endl;
inDSDG(DG);
}

//Them 1 DOCGIA moi


void themDocGiaMoi(ListDocGia &DG)
{
DOCGIA x;
nhapDG(x);
NodeDocGia *p = getNodeDocGia(x);
if (DG.Head == NULL)
{
DG.Head = p;
DG.Tail = p;
}
else
{
p->next = DG.Head;
DG.Head = p;
}
cout << "\n Them doc gia moi thanh cong!" << endl;
}

14
//Xoa 1 DOCGIA theo maSV
void xoaDocGia(ListDocGia &DG, char maSVCanXoa[15])
{
if (DG.Head == NULL)
{
cout << "\n Danh sach doc gia rong!" << endl;
return;
}
NodeDocGia *p = DG.Head;
NodeDocGia *prev = NULL;
bool found = false;

// Tìm độc giả có mã số sinh viên cần xóa


while (p != NULL)
{
if (strcmp(p->info.maSV, maSVCanXoa)==0)
{
found = true;
break;
}
prev = p;
p = p->next;
}

if (found)
{
if (p == DG.Head)
{
DG.Head = DG.Head->next;
}
else if (p == DG.Tail)
{
prev->next = NULL;
DG.Tail = prev;
}
else
{
prev->next = p->next;
}
delete p;
cout << "\n Xoa doc gia co maSV " << maSVCanXoa << " thanh cong!" << endl;
}
else
{
cout << "\n Khong tim thay doc gia co maSV " << maSVCanXoa << " trong danh sach!" << endl;
}
}
//Chinh sua DOCGIA theo maSV

15
void chinhSuaDOCGIA_maSV(ListDocGia &DG, char maSVcansua[15])
{
NodeDocGia *p = timKiemMa(DG,maSVcansua);
if(p==NULL)
{
cout<<"\n Khong tim thay DOCGIA co ma: "<<maSVcansua;
return;
}
//Nhap thong tin DOCGIA moi
DOCGIA x;
nhapDG(x);
//Gan thong tin moi cho DOCGIA
p->info = x;
cout<<"\n Chinh sua DOCGIA theo ma: "<<maSVcansua<<" thanh cong";
}

// Dem so luong DOCGIA


int demSoLuongDOCGIA(ListDocGia DG)
{
int dem = 0;
NodeDocGia *p;
for (p = DG.Head; p != NULL; p = p->next)
{
dem++;
}
return dem;
}

// Ghi file
void GhiFile_DOCGIA(ListDocGia &DG, FILE *df)
{
int n = 0;
NodeDocGia *p;
df = fopen("DocGia.txt", "wb");
for (p = DG.Head; p != NULL; p = p->next)
n = n + 1;
fwrite(&n, sizeof(int), 1, df);
for (p = DG.Head; p != NULL; p = p->next)
{
fwrite(&(p->info), sizeof(DOCGIA), 1, df);
}
fclose(df);
cout << "\n Ghi file thanh cong" << endl;
}

16
// Doc danh sach cac doc gia tu file Docgia.txt
void DocFile_DOCGIA(ListDocGia &DG, FILE *df)
{
DOCGIA dg;
int i, n;
NodeDocGia *p;
df = fopen("DocGia.txt", "rb");
fread(&n, sizeof(int), 1, df);
for (i = 0; i < n; i++)
{
fread(&dg, sizeof(DOCGIA), 1, df);
p = getNodeDocGia(dg);
chenDauDocGia(DG, p);
}
fclose(df);
cout << "\n Doc file thanh cong!\n";
inDSDG(DG);
}

// Menu cua DOCGIA


void Menu_DocGia()
{
NodeDocGia *p;
FILE *f = nullptr; // Khởi tạo con trỏ FILE
int chon;

do
{
cout << "\n ________QUAN LY DOC GIA_________";
cout << "\n 1. Nhap danh sach hoa DOCGIA:";
cout << "\n 2. In danh sach DOCGIA:";
cout << "\n 3. In DOCGIA co lop = 2210A02";
cout << "\n 4. Tim kiem DOCGIA theo maSV";
cout << "\n 5. Tim kiem DOCGIA theo email";
cout << "\n 6. Sap xep danh sach DOCGIA tang dan theo maSV";
cout << "\n 7. Them 1 DOCGIA moi";
cout << "\n 8. Xoa 1 DOCGIA theo maSV";
cout << "\n 9. Chinh sua DOCGIA theo maSV";
cout << "\n 10. Dem so luong DOCGIA";
cout << "\n 11. Ghi file";
cout << "\n 12. Doc file";
cout << "\n 0. Quay lai Menu chinh";
cout << "\n Moi Ban Chon: ";
cin >> chon;

switch (chon)

17
{
case 1:
nhapDSDG(DG);
break;
case 2:
inDSDG(DG);
break;
case 3:
inLop(DG);
break;
case 4:
{
char maSVcantim[15];
cout << "\n Nhap ma sinh vien cua DOCGIA can tim: ";
cin.ignore();
cin.getline(maSVcantim, 15);
p = timKiemMa(DG, maSVcantim);
if (p == NULL)
{
cout << "\n Khong tim thay ma:" << maSVcantim << endl;
}
else
{
cout << "\n Thong tin DOCGIA co ma: " << maSVcantim << endl;
inDG(p->info);
}
}
break;
case 5:
{
char emailCantim[50];
cout << "\n Nhap email cua DOCGIA can tim: ";
cin.ignore();
cin.getline(emailCantim, 50);
p = timKiemEmail(DG, emailCantim);
if (p == NULL)
{
cout << "\n Khong tim thay email:" << emailCantim << endl;
}
else
{
cout << "\n Thong tin DOCGIA co email: " << emailCantim << endl;
inDG(p->info);
}
}
break;
case 6:
SX_DOCGIA_hoTen_tangdan(DG);

18
break;
case 7:
themDocGiaMoi(DG);
break;
case 8:
{
char maSVCanXoa[15];
cout << "\n Nhap maSV cua DOCGIA muon xoa: ";
cin.ignore();
cin.getline(maSVCanXoa, 15);
xoaDocGia(DG, maSVCanXoa);
}
break;
case 9:
{
char maSVCanchinhsua[15];
cout << "\n Nhap maSV cua DOCGIA can chinh sua: ";
cin.ignore();
cin.getline(maSVCanchinhsua, 15);
chinhSuaDOCGIA_maSV(DG, maSVCanchinhsua);
}
break;
case 10:
cout << "\n So luong DOCGIA la: " << demSoLuongDOCGIA(DG) << endl;
break;
case 11:
GhiFile_DOCGIA(DG, f);
break;
case 12:
DocFile_DOCGIA(DG, f);
break;
case 0:
return;
}
} while (chon != 0);
}

19
4.3. Các thuật toán chính của PHIEUMUON:
// IN DOCGIA co masv theo yeu cau
void inMaSV(ListPhieuMuon Q)
{
NodePhieuMuon *p;
bool found = false;
string h;
cout<<"Nhap masv can in: "; cin>> h;
for (p = Q.Head; p != NULL; p = p->next)
{
if (p->info.maSV == h)
{
inPhieuMuon(p->info);
cout << "\n ------------------------------" << endl;
found = true;
}
}
if (!found)
{
cout << "\n Khong tim thay DOCGIA co ma sv 22A1001D0048" << endl;
}
}

// Tim kiem phiue muon theo so phieu


NodePhieuMuon *timKiemSoPhieu(ListPhieuMuon Q, string soPCT)
{
NodePhieuMuon *p;
for (p = Q.Head; p != NULL; p = p->next)
{
if (p->info.soPhieu == soPCT)
break;
}
return p;
}

// Tim kiem phieu muon theo masv


NodePhieuMuon *timKiemMaSV(ListPhieuMuon Q, string Masv)
{
NodePhieuMuon *p;
for (p = Q.Head; p != NULL; p = p->next)
{
if (p->info.maSV == Masv)
break;
}
return p;
}

20
// Sap xep danh sach SV trong Phieu Muon tang dan theo So Luong Sach Muon
void SXSV_PHIEUMUON_soLuongSM_tangdan(ListPhieuMuon &Q)
{
NodePhieuMuon *p, *q;
PhieuMuon tg;
for (p = Q.Head; p != NULL; p = p->next)
{
for (q = p->next; q != NULL; q = q->next)
{
if (p->info.soSach > q->info.soSach)
{
tg = p->info;
p->info = q->info;
q->info = tg;
}
}
}
cout << "\n Sap xep danh sach SV trong PHIEUMUON tang dan theo So Luong Sach Muon thanh cong" << endl;
inDSPhieuMuon(Q);
}

//Sap xep danh sach SV trong Phieu Muon giam dan theo So Luong Sach Muon
void SXSV_PHIEUMUON_soLuongSM_giamdan(ListPhieuMuon &Q)
{
NodePhieuMuon *p, *q;
PhieuMuon tg;
for (p = Q.Head; p != NULL; p = p->next)
{
for (q = p->next; q != NULL; q = q->next)
{
if (p->info.soSach < q->info.soSach)
{
tg = p->info;
p->info = q->info;
q->info = tg;
}
}
}
cout << "\n Sap xep danh sach SV trong PHIEUMUON giam dan theo So Luong Sach Muon thanh cong" << endl;
inDSPhieuMuon(Q);
}

21
//Them 1 Phieu Muon moi
void themPhieuMuonMoi(ListPhieuMuon &Q)
{
PhieuMuon x;
nhapPhieuMuon(x);
NodePhieuMuon *p = GetNode(x);
if (Q.Head == NULL)
{
Q.Head = p;
Q.Tail = p;
}
else
{
p->next = Q.Head;
Q.Head = p;
}
cout << "\n Them PHIEU NHAP moi thanh cong!" << endl;
}

// Chinh sua PHIEU MUON theo maSV

void SuaPhieuMuon_SoPhieu(ListPhieuMuon &Q)


{
string k;
int dem = 0;
PhieuMuon x;
cout << "\n Nhap Masv cua phieu muon Can Sua: ";
fflush(stdin);
getline(cin, k);
NodePhieuMuon *p;
for (p = Q.Head; p != NULL; p = p->next)
if (p->info.maSV == k)
{
dem++;
nhapPhieuMuon(x);
p->info = x;
}
if (dem == 0)
cout << "\n Khong tim duoc phieu muon";
else
{
cout << "\n Sua Thanh Cong!";
cout << "\n Danh Sach Da Sua: ";
inDSPhieuMuon(dsPhieuMuon);
}
}

22
// Xoa 1 PHIEU MUON theo soPhieu
void xoaPhieuMuon_soPhieu(ListPhieuMuon &Q, string soPCX)
{
if (Q.Head == NULL)
{
cout << "\n Danh sach phieu muon rong!" << endl;
return;
}

NodePhieuMuon *p = Q.Head;
NodePhieuMuon *prev = NULL;
bool found = false;

while (p != NULL)
{
if (p->info.soPhieu == soPCX)
{
found = true;
break;
}
prev = p;
p = p->next;
}

if (found)
{
if (p == Q.Head)
{
Q.Head = Q.Head->next;
}
else if (p == Q.Tail)
{
prev->next = NULL;
Q.Tail = prev;
}
else
{
prev->next = p->next;
}
delete p;
cout << "\n Xoa phieu muon co soPhieu " << soPCX << " thanh cong!" << endl;
}
else
{
cout << "\n Khong tim thay phieu muon co soPhieu " << soPCX << " trong danh sach!" << endl;
}
}
// Xoa 1 PHIEU MUON theo MaSV

23
void xoaPhieuMuon_Masv(ListPhieuMuon &Q, string Masv)
{
if (Q.Head == NULL)
{
cout << "\n Danh sach phieu muon rong!" << endl;
return;
}

NodePhieuMuon *p = Q.Head;
NodePhieuMuon *prev = NULL;
bool found = false;

while (p != NULL)
{
if (p->info.maSV == Masv)
{
found = true;
break;
}
prev = p;
p = p->next;
}

if (found)
{
if (p == Q.Head)
{
Q.Head = Q.Head->next;
}
else if (p == Q.Tail)
{
prev->next = NULL;
Q.Tail = prev;
}
else
{
prev->next = p->next;
}
delete p;
cout << "\n Xoa phieu muon co Masv " << Masv << " thanh cong!" << endl;
}
else
{
cout << "\n Khong tim thay phieu muon co Masv " << Masv << " trong danh sach!" << endl;
}
}
//Ghi danh sach cac sach vao file sach.txt
void GhiFile(ListPhieuMuon &Q, FILE *df)

24
{
int n = 0;
NodePhieuMuon *dp;
df = fopen("Phieumuon.txt", "wb");
for (dp = Q.Head; dp != NULL; dp = dp->next)
n = n + 1;
fwrite(&n, sizeof(int), 1, df);
for (dp = Q.Head; dp != NULL; dp = dp->next)
{
fwrite(&(dp->info), sizeof(PhieuMuon), 1, df);
}
fclose(df);
cout << "\n Ghi file thanh cong" << endl;
}

//Doc danh sach cac sach tu file sach.txt


void DocFile(ListPhieuMuon &Q, FILE *df)
{
PhieuMuon pm;
int i, n;
NodePhieuMuon *dp;
df = fopen("Phieumuon.txt", "rb");
fread(&n, sizeof(int), 1, df);
for (i = 0; i < n; i++)
{
fread(&pm, sizeof(PhieuMuon), 1, df);
dp = GetNode(pm);
chenDau(Q, dp);
}
fclose(df);
cout << "\n Doc file thanh cong!";
inDSPhieuMuon(dsPhieuMuon);
}

25
//Menu cua Phieu Muon
void Menu_PhieuMuon()
{
FILE *f;
NodePhieuMuon *p;
int chon;

do
{

cout << "\n___________QUAN LY PHIEU MUON SACH____________";


cout << "\n 1. Nhap danh sach PHIEU MUON:";
cout << "\n 2. In danh sach PHIEU MUON:";
cout << "\n 3. In danh sach PHIEU MUON co Ma SV theo yeu cau:";
cout << "\n 4. Tim kiem PHIEU MUON theo soPhieu";
cout << "\n 5. Tim kiem PHIEU MUON theo maSV";
cout << "\n 6. Sap xep danh sach SV trong Phieu Muon tang dan theo So Luong Sach Muon";
cout << "\n 7. Sap xep danh sach SV trong Phieu Muon giam dan theo So Luong Sach Muon";
cout << "\n 8. Them 1 PHIEU MUON moi";
cout << "\n 9. Xoa 1 PHIEU MUON theo soPhieu";
cout << "\n 10. Xoa 1 PHIEU MUON theo Masv";
cout << "\n 11. Sua PHIEU MUON theo Masv";
cout << "\n 12. Doc file Phieumuon.txt lay du lieu";
cout << "\n 13.Ghi du lieu vao file Phieumuon.txt";
cout << "\n 0. Quay lai Menu chinh";
cout << "\n Moi Ban Chon: ";
cin >> chon;

switch (chon)
{
case 1:
nhapDSPhieuMuon(dsPhieuMuon);
break;
case 2:
inDSPhieuMuon(dsPhieuMuon);
break;
case 3:
inMaSV(dsPhieuMuon);
break;

case 4:
{
string soPCT;
cout << "\n Nhap so phieu cua PHIEU MUON can tim: ";
cin.ignore();
getline(cin, soPCT);
p = timKiemSoPhieu(dsPhieuMuon, soPCT);
if (p == NULL)

26
{
cout << "\n Khong tim thay so phieu:" << soPCT << endl;
}
else
{
cout << "\n Thong tin PHIEU MUON co so phieu: " << soPCT << endl;
inPhieuMuon(p->info);
}
}
break;
case 5:
{
string Masv;
cout << "\n Nhap Masv cua PHIEU MUON can tim: ";
cin.ignore();
getline(cin, Masv);
p = timKiemMaSV(dsPhieuMuon, Masv);
if (p == NULL)
{
cout << "\n Khong tim thay so phieu:" << Masv << endl;
}
else
{
cout << "\n Thong tin PHIEU MUON co so phieu: " << Masv << endl;
inPhieuMuon(p->info);
}
}
break;

case 6:
SXSV_PHIEUMUON_soLuongSM_tangdan(dsPhieuMuon);
break;

case 7:
SXSV_PHIEUMUON_soLuongSM_giamdan(dsPhieuMuon);
break;

case 8:
themPhieuMuonMoi(dsPhieuMuon);
break;

case 9:
{
string soPCX;
cout << "\n Nhap soPhieu cua PHIEU NHAP muon xoa: ";
cin.ignore();
getline(cin, soPCX);
xoaPhieuMuon_soPhieu(dsPhieuMuon, soPCX);

27
}
break;
case 10:
{
string Masv;
cout << "\n Nhap Masv cua PHIEU NHAP muon xoa: ";
cin.ignore();
getline(cin, Masv);
xoaPhieuMuon_Masv(dsPhieuMuon, Masv);
}
break;

case 11:
SuaPhieuMuon_SoPhieu(dsPhieuMuon);
break;
case 12:
DocFile_PhieuMuon(dsPhieuMuon, f);
break;
case 13:
GhiFile_PhieuMuon(dsPhieuMuon, f);
break;
case 0:
return;
}

} while (chon != 0);


}

28
V. KIỂM THỬ - LẬP BỘ TEST
5.1. Bộ test của SACH:
//Chọn quản lý Sách trong thư viện

//In danh sách Sách

//Tìm Sách có số lượng lớn nhất

29
//In DS Sách có số lượng lớn hơn 10

//Sắp xếp DS theo số lượng giảm dần

//Tìm Sách theo tên Tác Giả

30
//Tính tổng số sách có trong thư viện

//Thêm Sách mới

31
//Sửa thông tin của 1 Sách

//Xoá 1 Sách

32
//Ghi dữ liệu vào file

//Đọc dữ liệu từ file

33
5.2. Bộ test của DOCGIA:
//Nhập danh sách Độc Giả:

//In danh sách Độc Giả:

34
//In Độc Giả có Lớp là 2210A02:

//Tìm kiếm Độc Giả theo maSV:

//Tìm kiếm Độc Giả theo email

//Sắp xếp danh sách Độc Giả tăng dần theo maSV

//Thêm 1 Độc Giả mới:

35
//Xóa 1 Độc Giả theo maSV:

//Chỉnh sửa Độc Giả theo maSV:

//Đếm số lượng Độc Giả:

//Ghi file:

//Đọc file:

36
5.3. Bộ test của PHIEUMUON:
//Nhập DS PHIEUMUON

37
//In DS PHIEUMUON

//In PHIEUMUON có mã sinh viên nhập từ bàn phím

//Tìm kiếm theo soPhieu

38
//Tìm kiếm theo maSinhVien

//SX tăng dần theo số Sách mượn

39
//SX giảm dần theo số Sách mượn

//Thêm 1 PHIEUMUON mới

//Xoá 1 PHIEUMUON theo soPhieu

40
//Xoá 1 PHIEUMUON theo mã Sinh Viên

// Sửa1 PHIEUMUON theo mã Sinh Viên

//Ghi dữ liệu vào file

//Lấy dữ liệu ra từ file

41

You might also like