0% found this document useful (0 votes)
3 views28 pages

Employee Management System Code

The document contains C++ code for managing a toy and employee system using structures and linked lists. It includes functionalities for adding, displaying, searching, deleting employees, and managing toys with a stack structure. The code also provides file operations for saving and loading employee data, alongside various statistics and sorting features.

Uploaded by

yenvivuthi0
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views28 pages

Employee Management System Code

The document contains C++ code for managing a toy and employee system using structures and linked lists. It includes functionalities for adding, displaying, searching, deleting employees, and managing toys with a stack structure. The code also provides file operations for saving and loading employee data, alongside various statistics and sorting features.

Uploaded by

yenvivuthi0
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

#include <iostream>

#include <iomanip>
#include <string>
#include <map>
#include <fstream>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
//
====================================================STRUCT=========================
=================================
struct Toy
{
int id;
string name;
double gia;
int soluong;
};

struct Employee
{
string MaNV;
int SDT;
string TenNV;
string ngaysinh;
string Que;
float HSL;
float Luong;
};

struct KhachHang
{
char MaKh[5];
string tenKH;
char SDT[12];
};

struct HoaDon
{
int idHD;
int ngayLap; // Chuyển đổi ngĂ y từ string sang kiểu int
string maNV;
int soLuongSP;
Toy dsDoChoi[20];
double giaTien;
};
//
==================================================NHANVIEN========================
============================
// Cấu trĂºc node danh sĂ¡ch liĂªn kết
struct NodeNV
{
Employee data;
NodeNV *next;
};

// Danh sĂ¡ch liĂªn kết


struct LinkedList
{
NodeNV *head = NULL;
};

// Nháºp thĂ´ng tin nhĂ¢n viĂªn


void nhapThongTin(Employee &emp)
{
cout << "Nhap ma nhan vien: ";
cin >> [Link];

cout << "Nhap so dien thoai: ";


cin >> [Link];

[Link]();
cout << "Nhap ten nhan vien: ";
getline(cin, [Link]);

cout << "Nhap ngay sinh (DD/MM/YYYY): ";


cin >> [Link];

[Link]();
cout << "Nhap que quan: ";
getline(cin, [Link]);

do
{
cout << "Nhap he so luong (>= 0): ";
cin >> [Link];
if ([Link] < 0)
{
cout << "He so luong khong duoc am. Vui long nhap lai!\n";
}
} while ([Link] < 0);

[Link] = [Link] * 1500;


}

// ThĂªm nhĂ¢n viĂªn vĂ o danh sĂ¡ch


void themNhanVien(LinkedList &list, const Employee &emp)
{
NodeNV *newNodeNV = new NodeNV{emp, NULL};
if ([Link] == NULL)
{
[Link] = newNodeNV;
}
else
{
NodeNV *temp = [Link];
while (temp->next != NULL)
{
temp = temp->next;
}
temp->next = newNodeNV;
}
}

// Hiển thị thĂ´ng tin nhĂ¢n viĂªn


void hienThiThongTin(const Employee &emp)
{
cout << "Ma NV: " << [Link] << endl;
cout << "So DT: " << [Link] << endl;
cout << "Ten NV: " << [Link] << endl;
cout << "Ngay sinh: " << [Link] << endl;
cout << "Que quan: " << [Link] << endl;
cout << "He so luong: " << [Link] << endl;
cout << "Luong: " << [Link] << endl;
}

// Hiển thị danh sĂ¡ch nhĂ¢n viĂªn


void hienThiDanhSach(const LinkedList &list)
{
if ([Link] == NULL)
{
cout << "Danh sach trong!" << endl;
return;
}
NodeNV *temp = [Link];
while (temp != NULL)
{
hienThiThongTin(temp->data);
cout << "-----------------" << endl;
temp = temp->next;
}
}

// Tìm kiếm nhĂ¢n viĂªn theo mĂ£


NodeNV *timKiemNhanVien(const LinkedList &list, const string &maNV)
{
NodeNV *temp = [Link];
while (temp != NULL)
{
if (temp->[Link] == maNV)
{
return temp;
}
temp = temp->next;
}
return NULL;
}

// XĂ³a nhĂ¢n viĂªn theo mĂ£


void xoaNhanVien(LinkedList &list, const string &maNV)
{
if ([Link] == NULL)
{
cout << "Danh sach trong!" << endl;
return;
}
if ([Link]->[Link] == maNV)
{
NodeNV *temp = [Link];
[Link] = [Link]->next;
delete temp;
cout << "Da xoa nhan vien co ma: " << maNV << endl;
return;
}
NodeNV *prev = [Link];
NodeNV *curr = [Link]->next;
while (curr != NULL)
{
if (curr->[Link] == maNV)
{
prev->next = curr->next;
delete curr;
cout << "Da xoa nhan vien co ma: " << maNV << endl;
return;
}
prev = curr;
curr = curr->next;
}
cout << "Khong tim thay nhan vien co ma: " << maNV << endl;
}

// Sắp xếp danh sĂ¡ch theo tĂªn nhĂ¢n viĂªn


void sapXepTheoTen(LinkedList &list)
{
if ([Link] == NULL)
return;
for (NodeNV *i = [Link]; i != NULL; i = i->next)
{
for (NodeNV *j = i->next; j != NULL; j = j->next)
{
if (i->[Link] > j->[Link])
{
swap(i->data, j->data);
}
}
}
cout << "Da sap xep danh sach theo ten." << endl;
}

// TĂnh tổng lương


float tinhTongLuong(const LinkedList &list)
{
float tongLuong = 0;
NodeNV *temp = [Link];
while (temp != NULL)
{
tongLuong += temp->[Link];
temp = temp->next;
}
return tongLuong;
}

// Tìm nhĂ¢n viĂªn cĂ³ lương cao nhất


Employee timNhanVienLuongCaoNhat(const LinkedList &list)
{
if ([Link] == NULL)
return {"", 0, "", "", "", 0, 0};
NodeNV *maxNodeNV = [Link];
NodeNV *temp = [Link]->next;
while (temp != NULL)
{
if (temp->[Link] > maxNodeNV->[Link])
{
maxNodeNV = temp;
}
temp = temp->next;
}
return maxNodeNV->data;
}

// Thống kĂª nhĂ¢n viĂªn theo quĂª quĂ¡n


map<string, int> thongKeQueQuan(const LinkedList &list)
{
map<string, int> thongKe;
NodeNV *temp = [Link];
while (temp != NULL)
{
thongKe[temp->[Link]]++;
temp = temp->next;
}
return thongKe;
}

// In danh sĂ¡ch nhĂ¢n viĂªn theo quĂª quĂ¡n


void inNhanVienTheoQue(const LinkedList &list, const string &que)
{
NodeNV *temp = [Link];
cout << "Danh sach nhan vien den tu: " << que << endl;
while (temp != NULL)
{
if (temp->[Link] == que)
{
hienThiThongTin(temp->data);
cout << "-----------------" << endl;
}
temp = temp->next;
}
}

// Ghi danh sĂ¡ch nhĂ¢n viĂªn vĂ o file


void ghiFile(const LinkedList &list, const string &filename)
{
ofstream file(filename);
if (!file)
{
cout << "Khong the mo file de ghi!" << endl;
return;
}

NodeNV *temp = [Link];


while (temp != NULL)
{
Employee emp = temp->data;
// Ghi thĂ´ng tin nhĂ¢n viĂªn vĂ o file
file << [Link] << ","
<< [Link] << ","
<< [Link] << ","
<< [Link] << ","
<< [Link] << ","
<< [Link] << ","
<< [Link] << endl;
temp = temp->next;
}

[Link]();
cout << "Da ghi danh sach nhan vien vao file " << filename << endl;
}

// Đọc danh sĂ¡ch nhĂ¢n viĂªn từ file


void docFile(LinkedList &list, const string &filename)
{
ifstream file(filename);
if (!file)
{
cout << "Khong the mo file de doc!" << endl;
return;
}

string line;
while (getline(file, line))
{
stringstream ss(line);
Employee emp;
string temp;

// Đọc vĂ phĂ¢n tĂ¡ch thĂ´ng tin nhĂ¢n viĂªn từ dĂ²ng


getline(ss, [Link], ',');
getline(ss, temp, ',');
[Link] = stoi(temp);
getline(ss, [Link], ',');
getline(ss, [Link], ',');
getline(ss, [Link], ',');
getline(ss, temp, ',');
[Link] = stof(temp);
getline(ss, temp, ',');
[Link] = stof(temp);

// ThĂªm nhĂ¢n viĂªn vĂ o danh sĂ¡ch


themNhanVien(list, emp);
}

[Link]();
cout << "Da doc danh sach nhan vien tu file " << filename << endl;
}

void menuNhanVien()
{
LinkedList ds;
int luaChon;
do
{
cout << "\n=== MENU ===\n";
cout << "1. Them nhan vien\n";
cout << "2. Hien thi danh sach\n";
cout << "3. Tim nhan vien theo ma\n";
cout << "4. Xoa nhan vien\n";
cout << "5. Sap xep danh sach theo ten\n";
cout << "6. Tinh tong luong cua tat ca nhan vien\n";
cout << "7. Tim nhan vien co luong cao nhat\n";
cout << "8. Thong ke so luong nhan vien theo que quan\n";
cout << "9. In danh sach nhan vien theo que quan\n";
cout << "10. Ghi danh sach nhan vien vao file \n";
cout << "11. Doc danh sach nhan vien tu file \n";
cout << "0. Thoat chuong trinh \n";
cout << "Lua chon cua ban: ";
cin >> luaChon;

switch (luaChon)
{
case 1:
{
Employee emp;
nhapThongTin(emp);
themNhanVien(ds, emp);
break;
}
case 2:
{
hienThiDanhSach(ds);
break;
}
case 3:
{
string maNV;
cout << "Nhap ma nhan vien can tim: ";
cin >> maNV;
NodeNV *found = timKiemNhanVien(ds, maNV);
if (found != NULL)
{
cout << "Thong tin nhan vien:\n";
hienThiThongTin(found->data);
}
else
{
cout << "Khong tim thay nhan vien voi ma: " << maNV << endl;
}
break;
}
case 4:
{
string maNV;
cout << "Nhap ma nhan vien can xoa: ";
cin >> maNV;
xoaNhanVien(ds, maNV);
break;
}
case 5:
{
sapXepTheoTen(ds);
break;
}
case 6:
{
cout << "Tong luong cua tat ca nhan vien: " << tinhTongLuong(ds) << endl;
break;
}
case 7:
{
Employee emp = timNhanVienLuongCaoNhat(ds);
if (![Link]())
{
cout << "Nhan vien co luong cao nhat:\n";
hienThiThongTin(emp);
}
else
{
cout << "Danh sach trong." << endl;
}
break;
}
case 8:
{
map<string, int> thongKe = thongKeQueQuan(ds);
cout << "Thong ke so luong nhan vien theo que quan:\n";
for (const auto &kv : thongKe)
{
cout << [Link] << ": " << [Link] << " nhan vien\n";
}
break;
}
case 9:
{
string que;
[Link]();
cout << "Nhap que quan: ";
getline(cin, que);
inNhanVienTheoQue(ds, que);
break;
}
case 10:
{
ghiFile(ds, "[Link]");
cout << "Danh sach nhan vien da duoc ghi vĂ o file '[Link]'";
break;
}
case 11:
{
docFile(ds, "[Link]");
break;
}
case 0:
{
cout << "Thoat chuong trinh." << endl;
break;
}
default:
{
cout << "Lua chon khong hop le. Vui long nhap lai!" << endl;
}
}
} while (luaChon != 11);
}

//
===================================================TOY=============================
========================
struct StackNode
{
Toy info;
struct StackNode *Next;
};

struct Stack
{
StackNode *top;
};
void initS(Stack &s)
{
[Link] = NULL;
}

void EnterToy(Toy &X)


{
cout << "Nhap vao ma cua do choi: ";
cin >> [Link];
cout << "Nhap vao ten cua do choi: ";
[Link]();
getline(cin, [Link]);
cout << "Nhap vao so luong: ";
cin >> [Link];
cout << "Nhap vao gia cua do choi: ";
cin >> [Link];
}

void push(Stack &s, Toy x)


{
StackNode *newNode = new StackNode();
newNode->info = x;
newNode->Next = [Link];
[Link] = newNode;
}

void printToy(Toy X)
{
cout << [Link] << " - " << [Link] << " - " << [Link] << " - " << [Link] << endl;
}

void printSN(StackNode *s)


{
printToy(s->info);
}

bool isEmpty(Stack s)
{
return [Link] == NULL;
}

Toy pop(Stack &s)


{
Toy tg;
if ([Link] == NULL)
exit(1);
else
{
StackNode *p = [Link];
[Link] = [Link]->Next;
tg = p->info;
delete p;
}
return tg;
}
void search(Stack &s, string X)
{
for (StackNode *k = [Link]; k != NULL; k = k->Next)
{
if (k->[Link] == X)
{
printToy(k->info);
}
}
}

double searchPriceMax(Stack &s)


{
double maxGia = [Link]->[Link];
for (StackNode *k = [Link]; k != NULL; k = k->Next)
{
if (k->[Link] > maxGia)
{
maxGia = k->[Link];
}
}
return maxGia;
}

void SumPrice(Stack s)
{
double Sum = 0;
for (StackNode *k = [Link]; k != NULL; k = k->Next)
{
Sum += k->[Link];
}
cout << "Tong gia cua do choi la: " << Sum << endl;
}

void Thongke(Stack s)
{
int count = 0;
for (StackNode *k = [Link]; k != NULL; k = k->Next)
{
if (k->[Link] > 1000000)
{
count++;
printToy(k->info);
}
}
cout << "Co " << count << " do choi co gia lon hon 1.000.000" << endl;
}

void writeToyToFile(ofstream &fileout, Toy toy)


{
fileout << [Link] << " ";
fileout << [Link] << " ";
fileout << [Link] << " ";
fileout << [Link] << "\n";
}

void writeToyListToFile(Stack &s)


{
ofstream fileout("[Link]", ios::out);
if (!fileout.is_open())
{
cout << "Khong the mo tep da ghi.\n";
return;
}

for (StackNode *k = [Link]; k != NULL; k = k->Next)


{
writeToyToFile(fileout, k->info);
}

[Link]();
cout << "Danh sach do choi da duoc ghi vao tep [Link]\n";
}

Toy readToy(ifstream &filein)


{
Toy toy;
filein >> [Link];
[Link]();
getline(filein, [Link], ' ');
filein >> [Link] >> [Link];
return toy;
}

void readToyListFromFile(Stack &s)


{
ifstream filein("[Link]", ios::in);
if (!filein.is_open())
{
cout << "Khong the mo tep da doc.\n";
return;
}

while (![Link]())
{
Toy toy = readToy(filein);
if ([Link]())
break;
push(s, toy);
}

[Link]();
for (StackNode *k = [Link]; k != NULL; k = k->Next)
{
printToy(k->info);
}
cout << "Danh sach do choi da duoc doc tu tep [Link]\n";
}

void menuToy()
{
Stack s;
initS(s);
int choice;
do
{
cout << "\nMenu Quan Ly Do Choi:\n";
cout << "1. Nhap thong tin do choi\n";
cout << "2. In danh sach do choi\n";
cout << "3. Tim do choi theo ten\n";
cout << "4. Tinh tong gia do choi\n";
cout << "5. Thong ke do choi co gia lon hon 1.000.000\n";
cout << "6. Ghi danh sach do choi ra tep\n";
cout << "7. Doc danh sach do choi tu tep\n";
cout << "8. Thoat\n";
cout << "Chon thao tac: ";
cin >> choice;
[Link]();
switch (choice)
{
case 1:
{
Toy newToy;
EnterToy(newToy);
push(s, newToy);
break;
}
case 2:
for (StackNode *k = [Link]; k != NULL; k = k->Next)
{
printToy(k->info);
}
break;
case 3:
{
string name;
cout << "Nhap ten do choi can tim: ";
[Link]();
getline(cin, name);
search(s, name);
break;
}
case 4:
SumPrice(s);
break;
case 5:
Thongke(s);
break;
case 6:
writeToyListToFile(s);
break;
case 7:
readToyListFromFile(s);
break;
case 8:
cout << "Thoat chuong trinh.\n";
break;
default:
cout << "Lua chon khong hop le. Vui long chon lai.\n";
break;
}
} while (choice != 8);
}

//
=====================================================HOADON======================
======================================
struct TreeNode
{
HoaDon data;
TreeNode *left;
TreeNode *right;
};

typedef TreeNode *TREE;

void KhoiTaoCay(TREE &t)


{
t = nullptr; // Corrected line
}

void themHoaDonVaoCay(TREE &t, HoaDon x)


{
if (t == nullptr)
{
TreeNode *p = new TreeNode; // Corrected line
p->data = x;
p->left = nullptr;
p->right = nullptr;
t = p;
}
else
{
if (t->[Link] > [Link])
{
themHoaDonVaoCay(t->left, x);
}
else if (t->[Link] < [Link])
{
themHoaDonVaoCay(t->right, x);
}
}
}

void nhapHoaDon(HoaDon &hoaDon)


{
cout << "Nhap so HD : ";
cin >> [Link];
// Nháºp ngĂ y theo định dạng dd/mm/yyyy
int day, month, year;
cout << "Nhap ngay lap (dd/mm/yyyy): ";
cin >> day >> month >> year;
[Link] = year * 10000 + month * 100 + day;
cout << "Nhap ma nhan vien : ";
cin >> [Link];
cout << "Nhap so luong san pham : ";
cin >> [Link];
[Link] = 0;
for (int i = 0; i < [Link]; i++)
{
cout << "Nhap ma toy : ";
cin >> [Link][i].id;
cout << "Nhap ten toy : ";
cin >> [Link][i].name;
cout << "Nhap so luong : ";
cin >> [Link][i].soluong;
cout << "Nhap gia : ";
cin >> [Link][i].gia;
[Link] += [Link][i].gia * [Link][i].soluong;
}
}

void hienThiHoaDon(const HoaDon &hoaDon)


{
cout << "========================== HOA DON ==========================" << "\n";
cout << "So HD : " << [Link] << setw(45) << "Ngay lap (yyyy/mm/dd) : " << [Link]
<< "\n";
cout << "Ma NV : " << [Link] << "\n";
cout << "-------------------------------------------------------------\n";
cout << setw(5) << "ID" << setw(20) << "Ten" << setw(10) << "SL" << setw(15) << "Gia tien" <<
setw(15) << "Thanh tien" << "\n";
cout << "-------------------------------------------------------------\n";

for (int i = 0; i < [Link]; i++)


{
const Toy &toy = [Link][i];
double thanhTien = [Link] * [Link];
cout << setw(5) << [Link]
<< setw(20) << [Link]
<< setw(10) << [Link]
<< setw(15) << fixed << setprecision(2) << [Link]
<< setw(15) << thanhTien << "\n";
}

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


cout << "Tong gia tri hoa don: " << setw(40) << [Link] << "\n";
cout << "=============================================================\n";
}

void inCay(TREE t)
{
if (t != nullptr)
{
inCay(t->left);
hienThiHoaDon(t->data);
inCay(t->right);
}
}

TreeNode *timHoaDon(TreeNode *t, int idHoaDon)


{
if (t == nullptr)
{
return nullptr; // KhĂ´ng tìm thấy hĂ³a đơn
}
else if (t->[Link] == idHoaDon)
{
return t; // ÄĂ£ tìm thấy hĂ³a đơn
}
else if (idHoaDon < t->[Link]) // ChĂº Ă½ so sĂ¡nh theo idHD
{
return timHoaDon(t->left, idHoaDon); // Tìm sang cĂ¢y con trĂ¡i
}
else
{
return timHoaDon(t->right, idHoaDon); // Tìm sang cĂ¢y con phải
}
}

HoaDon timHoaDonLonNhat(TreeNode *t)


{
if (t == nullptr)
return HoaDon(); // Trả về một đối tượng HoaDon khởi tạo mặc định
(hĂ m khởi tạo rá»—ng)

HoaDon hoaDonMax = t->data;


if (t->right != nullptr)
{
HoaDon hoaDonMaxRight = timHoaDonLonNhat(t->right);
if ([Link] > [Link])
{
hoaDonMax = hoaDonMaxRight;
}
}
return hoaDonMax;
}

HoaDon timHoaDonNhoNhat(TreeNode *t)


{
if (t == nullptr)
return HoaDon(); // Trả về một đối tượng HoaDon khởi tạo mặc định
(hĂ m khởi tạo rá»—ng)

HoaDon hoaDonMin = t->data;


if (t->left != nullptr)
{
HoaDon hoaDonMinLeft = timHoaDonNhoNhat(t->left);
if ([Link] < [Link])
{
hoaDonMin = hoaDonMinLeft;
}
}
return hoaDonMin;
}

void themPhanTuVaoHoaDon(HoaDon &hoaDon)


{
Toy toy;
cout << "Nhap ma toy: ";
cin >> [Link];
cout << "Nhap ten toy: ";
cin >> [Link];
cout << "Nhap so luong: ";
cin >> [Link];
cout << "Nhap gia: ";
cin >> [Link];
[Link][[Link]++] = toy;
[Link] += [Link] * [Link];
}

void xoaPhanTuKhoiHoaDon(TreeNode *t)


{
if (t->[Link] == 0)
{
cout << "Khong co sp nao de xoa !";
return;
}

int idCanXoa;
[Link]();
cout << "Nhap ID san pham can xoa: ";
cin >> idCanXoa;
int viTriCanXoa = -1;
for (int i = 0; i < t->[Link]; i++)
{
if (t->[Link][i].id == idCanXoa)
{
viTriCanXoa = i;
break;
}
}

if (viTriCanXoa == -1)
{
cout << "Khong tim thay san pham trong hoa don !";
return;
}

t->[Link] -= t->[Link][viTriCanXoa].gia * t->[Link][viTriCanXoa].soluong;

for (int i = viTriCanXoa; i < t->[Link] - 1; i++)


{
t->[Link][i] = t->[Link][i + 1];
}

t->[Link]--;
}

void luuHoaDonTuCay(TreeNode *t, vector<HoaDon> &hoaDon)


{
if (t != nullptr)
{
luuHoaDonTuCay(t->left, hoaDon);
hoaDon.push_back(t->data);
luuHoaDonTuCay(t->right, hoaDon);
}
}
void sapXepHoaDonTheoGiaTien(vector<HoaDon> &dsHoaDon)
{
int n = [Link]();
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (dsHoaDon[j].giaTien < dsHoaDon[j + 1].giaTien)
{
HoaDon temp = dsHoaDon[j];
dsHoaDon[j] = dsHoaDon[j + 1];
dsHoaDon[j + 1] = temp;
}
}
}
}

void hienThiDSHoaDonGiamDan(TreeNode *t)


{
vector<HoaDon> dsHoaDon;
luuHoaDonTuCay(t, dsHoaDon);
sapXepHoaDonTheoGiaTien(dsHoaDon);
for (HoaDon &hd : dsHoaDon)
{
hienThiHoaDon(hd);
}
}

double tongHoaDon(TreeNode *t)


{
if (t == nullptr)
{
return 0;
}
double tongTrai = tongHoaDon(t->left);
double tongPhai = tongHoaDon(t->right);
return tongTrai + tongPhai + t->[Link];
}

void thongKeHoaDon(TreeNode *t)


{
if (t == nullptr)
{
return;
}
if (t->[Link] > 1000000)
{
hienThiHoaDon(t->data);
}
thongKeHoaDon(t->left);
thongKeHoaDon(t->right);
}

void luuHoaDonRaFile(TreeNode *t, ofstream &outFile)


{
if (t != nullptr)
{
// Ghi thĂ´ng tin hĂ³a đơn vĂ o file
outFile << t->[Link] << " "
<< t->[Link] << " "
<< t->[Link] << " "
<< t->[Link] << " "
<< t->[Link] << "\n";

// Ghi thĂ´ng tin từng sản phẩm trong hĂ³a đơn vĂ o file
for (int i = 0; i < t->[Link]; i++)
{
outFile << t->[Link][i].id << " "
<< t->[Link][i].name << " "
<< t->[Link][i].soluong << " "
<< t->[Link][i].gia << "\n";
}

// Đệ quy ghi dữ liệu cho cĂ¡c nĂºt con trong cĂ¢y
luuHoaDonRaFile(t->left, outFile);
luuHoaDonRaFile(t->right, outFile);
}
}

void luuDanhSachHoaDonVaoFile(TreeNode *t, const string &filename)


{
ofstream outFile(filename, ios::out);
if (!outFile)
{
cout << "Khong the mo file de ghi.\n";
return;
}

// Duyệt cĂ¢y nhị phĂ¢n vĂ ghi dữ liệu vĂ o file


luuHoaDonRaFile(t, outFile);

[Link]();
cout << "Da luu danh sach hoa don vao file.\n";
}

void docDanhSachHoaDonTuFile(TreeNode *&t, const string &filename)


{
ifstream inFile(filename, ios::in);
if (!inFile)
{
cout << "Khong the mo file de doc.\n";
return;
}

HoaDon hoaDon;
while (inFile >> [Link]) // Đọc id hoa don đầu tiĂªn
{
inFile >> [Link] >> [Link] >> [Link] >> [Link];

// Đọc thĂ´ng tin từng sản phẩm


for (int i = 0; i < [Link]; i++)
{
inFile >> [Link][i].id >> [Link][i].name >> [Link][i].soluong
>> [Link][i].gia;
}

// ThĂªm hĂ³a đơn vĂ o cĂ¢y


themHoaDonVaoCay(t, hoaDon);

// In hĂ³a đơn vừa đọc được


cout << "Hien thi hoa don ID: " << [Link] << "\n";
hienThiHoaDon(hoaDon); // Hiển thị hĂ³a đơn
}

[Link]();
cout << "Da doc danh sach hoa don tu file.\n";
}

void menuHoaDon()
{
TREE t;
KhoiTaoCay(t);

int luaChon;
do
{
cout << "\n=== QUAN LY HOA DON ===\n";
cout << "1. Them hoa don\n";
cout << "2. In danh sach hoa don\n";
cout << "3. Them do choi vao hoa don\n";
cout << "4. Xoa san pham trong hoa don\n";
cout << "5. Hien thi hoa don giam dan theo thanh tien\n";
cout << "6. Tong cac hoa don\n";
cout << "7. Thong ke hoa don tren 1.000.000\n";
cout << "8. Luu danh sach hoa don vao file\n";
cout << "9. Doc danh sach hoa don tu file\n";
cout << "0. Thoat\n";
cout << "Nhap lua chon: ";
cin >> luaChon;

switch (luaChon)
{
case 1:
{
HoaDon hd;
nhapHoaDon(hd);
themHoaDonVaoCay(t, hd);
cout << "Da them hoa don vao cay.\n";
break;
}

case 2:
{
cout << "Danh sach hoa don:\n";
inCay(t);
break;
}

case 3:
{
int idHDCanTim;
cout << "Nhap ID hoa don can tim: ";
cin >> idHDCanTim;
TreeNode *node = timHoaDon(t, idHDCanTim);
if (node != nullptr)
{
themPhanTuVaoHoaDon(node->data);
}
else
{
cout << "Khong tim thay hoa don co ID: " << idHDCanTim << ".\n";
}
break;
}

case 4:
{
int idHDCanTim;
cout << "Nhap ID hoa don can tim: ";
cin >> idHDCanTim;
TreeNode *node = timHoaDon(t, idHDCanTim);
if (node != nullptr)
{
xoaPhanTuKhoiHoaDon(node);
}
else
{
cout << "Khong tim thay hoa don co ID: " << idHDCanTim << ".\n";
}
break;
}

case 5:
{
cout << "Danh sach hoa don giam dan theo tong tien:\n";
hienThiDSHoaDonGiamDan(t);
break;
}

case 6:
{
cout << "Tong gia tri cac hoa don: " << tongHoaDon(t) << "\n";
break;
}

case 7:
{
cout << "Danh sach hoa don co gia tri tren 1.000.000:\n";
thongKeHoaDon(t);
break;
}
case 8:
{
luuDanhSachHoaDonVaoFile(t, "[Link]");
break;
}
case 9:
{
docDanhSachHoaDonTuFile(t, "[Link]");
break;
}

case 0:
cout << "Thoat chuong trinh.\n";
break;

default:
cout << "Lua chon khong hop le! Vui long thu lai.\n";
break;
}
} while (luaChon != 0);
}

//
===================================================KHACHHANG=====================
=======================================
struct Node
{
KhachHang data;
Node *next;
Node *prev;
};

struct DoublyLinkedList
{
Node *head;
Node *tail;

DoublyLinkedList() : head(nullptr), tail(nullptr) {}

// Xoa danh sach


void clear()
{
while (head != nullptr)
{
deleteFirst();
}
}

// Them khach hang vao dau danh sach


void addFirst(const KhachHang &kh)
{
Node *newNode = new Node{kh, nullptr, nullptr};
if (head == nullptr)
{
head = tail = newNode;
}
else
{
newNode->next = head;
head->prev = newNode;
head = newNode;
}
}

// Them khach hang vao cuoi danh sach


void addLast(const KhachHang &kh)
{
Node *newNode = new Node{kh, nullptr, nullptr};
if (head == nullptr)
{
head = tail = newNode;
}
else
{
tail->next = newNode;
newNode->prev = tail;
tail = newNode;
}
}

// Hien thi danh sach khach hang


void display() const
{
Node *temp = head;
while (temp != nullptr)
{
cout << "Ma khach hang: " << temp->[Link] << ", ";
cout << "Ten khach hang: " << temp->[Link] << ", ";
cout << "So dien thoai: " << temp->[Link] << endl;
temp = temp->next;
}
}

// Tim kiem khach hang theo ten


Node *searchByName(const string &name)
{
Node *temp = head;
while (temp != nullptr)
{
if (temp->[Link] == name)
{
return temp;
}
temp = temp->next;
}
return nullptr;
}

// Xoa khach hang o dau danh sach


void deleteFirst()
{
if (head == nullptr)
return;
Node *temp = head;
if (head == tail)
{ // Neu chi co 1 phan tu
head = tail = nullptr;
}
else
{
head = head->next;
head->prev = nullptr;
}
delete temp;
}

// Xoa khach hang o cuoi danh sach


void deleteLast()
{
if (tail == nullptr)
return;
Node *temp = tail;
if (head == tail)
{ // Neu chi co 1 phan tu
head = tail = nullptr;
}
else
{
tail = tail->prev;
tail->next = nullptr;
}
delete temp;
}

// Sap xep danh sach theo ten


void sortByName()
{
if (head == nullptr)
return;
for (Node *i = head; i != nullptr; i = i->next)
{
for (Node *j = i->next; j != nullptr; j = j->next)
{
if (i->[Link] > j->[Link])
{
swap(i->data, j->data);
}
}
}
}

// Luu danh sach vao file


void saveToFile(const string &filename)
{
ofstream file(filename);
if (!file)
{
cout << "Khong the mo file " << filename << " de ghi.\n";
return;
}

Node *temp = head;


while (temp != nullptr)
{
file << temp->[Link] << ","
<< temp->[Link] << ","
<< temp->[Link] << endl;
temp = temp->next;
}
[Link]();
}

// Doc danh sach tu file


void loadFromFile(const string &filename)
{
clear(); // Xoa danh sach hien tai truoc khi doc
ifstream file(filename);
if (!file)
{
cout << "Khong the mo file " << filename << endl;
return;
}

string line;
while (getline(file, line))
{
size_t pos1 = [Link](',');
size_t pos2 = [Link](',', pos1 + 1);

if (pos1 != string::npos && pos2 != string::npos)


{
KhachHang kh;
strncpy([Link], [Link](0, pos1).c_str(), sizeof([Link]) - 1);
[Link][sizeof([Link]) - 1] = '\0';

[Link] = [Link](pos1 + 1, pos2 - pos1 - 1);

strncpy([Link], [Link](pos2 + 1).c_str(), sizeof([Link]) - 1);


[Link][sizeof([Link]) - 1] = '\0';

addLast(kh);
}
}
[Link]();
}
};

// Ham nhap khach hang


void nhapKhachHang(KhachHang &kh)
{
cout << "Nhap ma khach hang (4 ky tu): ";
[Link]([Link], sizeof([Link]));
if (strlen([Link]) > 4)
{
cout << "Ma khach hang qua dai! Thu lai.\n";
return;
}

cout << "Nhap ten khach hang: ";


getline(cin, [Link]);

cout << "Nhap so dien thoai (toi da 11 so): ";


[Link]([Link], sizeof([Link]));
if (strlen([Link]) > 11)
{
cout << "So dien thoai qua dai! Thu lai.\n";
return;
}
}

void menuKhachHang()
{
DoublyLinkedList danhSach;
int choice;
KhachHang kh;

do
{
cout << "\n===== Menu =====\n";
cout << "1. Nhap danh sach khach hang\n";
cout << "2. Hien danh sach khach hang\n";
cout << "3. Luu danh sach vao file\n";
cout << "4. Doc danh sach tu file\n";
cout << "5. Them khach hang vao dau danh sach\n";
cout << "6. Them khach hang vao cuoi danh sach\n";
cout << "7. Tim kiem khach hang theo ten\n";
cout << "8. Xoa khach hang o dau danh sach\n";
cout << "9. Xoa khach hang o cuoi danh sach\n";
cout << "10. Sap xep danh sach khach hang theo ten\n";
cout << "0. Thoat\n";
cout << "Chon chuc nang: ";
cin >> choice;
[Link](); // Xu ly newline sau khi nhap so

switch (choice)
{
case 1:
nhapKhachHang(kh);
if (choice == 1 || choice == 6)
[Link](kh);
else
[Link](kh);
break;
case 2:
[Link]();
break;
case 3:
[Link]("[Link]");
cout << "Danh sach da duoc luu vao file [Link]\n";
break;
case 4:
[Link]("[Link]");
cout << "Danh sach da duoc doc tu file [Link]\n";
break;
case 5:
// Them khach hang vao dau danh sach
cout << "Nhap ma khach hang (4 ky tu): ";
[Link]([Link], sizeof([Link]));
cout << "Nhap ten khach hang: ";
getline(cin, [Link]);
cout << "Nhap so dien thoai: ";
[Link]([Link], sizeof([Link]));
[Link](kh);
break;
case 6:
// Them khach hang vao cuoi danh sach
cout << "Nhap ma khach hang (4 ky tu): ";
[Link]([Link], sizeof([Link]));
cout << "Nhap ten khach hang: ";
getline(cin, [Link]);
cout << "Nhap so dien thoai: ";
[Link]([Link], sizeof([Link]));
[Link](kh);
break;

case 7:
cout << "Nhap ten khach hang can tim: ";
getline(cin, [Link]);
if (Node *found = [Link]([Link]))
{
cout << "Khach hang tim thay: Ma khach hang: " << found->[Link]
<< ", Ten khach hang: " << found->[Link]
<< ", So dien thoai: " << found->[Link] << endl;
}
else
{
cout << "Khong tim thay khach hang voi ten " << [Link] << endl;
}
break;
case 8:
[Link]();
cout << "Da xoa khach hang o dau danh sach.\n";
break;
case 9:
[Link]();
cout << "Da xoa khach hang o cuoi danh sach.\n";
break;
case 10:
[Link]();
cout << "Danh sach da duoc sap xep theo ten.\n";
break;
case 0:
cout << "Thoat chuong trinh.\n";
break;
default:
cout << "Chuc nang khong hop le. Vui long chon lai.\n";
}
} while (choice != 0);
}

//
=======================================================MENU=======================
===================================
void menuChinh()
{
int choice;
do
{
cout << "\n===== MENU CHUNG =====\n";
cout << "1. Quan ly khach hang\n";
cout << "2. Quan ly hoa don\n";
cout << "3. Quan ly do choi\n";
cout << "4. Quan ly nhan vien\n";
cout << "0. Thoat\n";
cout << "Chon chuc nang: ";
cin >> choice;

switch (choice)
{
case 1:
menuKhachHang();
break;
case 2:
menuHoaDon();
break;
case 3:
menuToy();
break;
case 4:
menuNhanVien();
break;
case 0:
cout << "Thoat chuong trinh.\n";
break;
default:
cout << "Lua chon khong hop le! Vui long chon lai.\n";
break;
}
} while (choice != 0);
}

int main()
{
menuChinh(); // Gọi hĂ m menu chĂnh
return 0;
}

You might also like