0% found this document useful (0 votes)
6 views

codebtl

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)
6 views

codebtl

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
You are on page 1/ 28

#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 >> emp.MaNV;

cout << "Nhap so dien thoai: ";


cin >> emp.SDT;

cin.ignore();
cout << "Nhap ten nhan vien: ";
getline(cin, emp.TenNV);

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


cin >> emp.ngaysinh;

cin.ignore();
cout << "Nhap que quan: ";
getline(cin, emp.Que);

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

emp.Luong = emp.HSL * 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 (list.head == NULL)
{
list.head = newNodeNV;
}
else
{
NodeNV *temp = list.head;
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: " << emp.MaNV << endl;
cout << "So DT: " << emp.SDT << endl;
cout << "Ten NV: " << emp.TenNV << endl;
cout << "Ngay sinh: " << emp.ngaysinh << endl;
cout << "Que quan: " << emp.Que << endl;
cout << "He so luong: " << emp.HSL << endl;
cout << "Luong: " << emp.Luong << endl;
}

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


void hienThiDanhSach(const LinkedList &list)
{
if (list.head == NULL)
{
cout << "Danh sach trong!" << endl;
return;
}
NodeNV *temp = list.head;
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 = list.head;
while (temp != NULL)
{
if (temp->data.MaNV == maNV)
{
return temp;
}
temp = temp->next;
}
return NULL;
}

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


void xoaNhanVien(LinkedList &list, const string &maNV)
{
if (list.head == NULL)
{
cout << "Danh sach trong!" << endl;
return;
}
if (list.head->data.MaNV == maNV)
{
NodeNV *temp = list.head;
list.head = list.head->next;
delete temp;
cout << "Da xoa nhan vien co ma: " << maNV << endl;
return;
}
NodeNV *prev = list.head;
NodeNV *curr = list.head->next;
while (curr != NULL)
{
if (curr->data.MaNV == 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 (list.head == NULL)
return;
for (NodeNV *i = list.head; i != NULL; i = i->next)
{
for (NodeNV *j = i->next; j != NULL; j = j->next)
{
if (i->data.TenNV > j->data.TenNV)
{
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 = list.head;
while (temp != NULL)
{
tongLuong += temp->data.Luong;
temp = temp->next;
}
return tongLuong;
}

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


Employee timNhanVienLuongCaoNhat(const LinkedList &list)
{
if (list.head == NULL)
return {"", 0, "", "", "", 0, 0};
NodeNV *maxNodeNV = list.head;
NodeNV *temp = list.head->next;
while (temp != NULL)
{
if (temp->data.Luong > maxNodeNV->data.Luong)
{
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 = list.head;
while (temp != NULL)
{
thongKe[temp->data.Que]++;
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 = list.head;
cout << "Danh sach nhan vien den tu: " << que << endl;
while (temp != NULL)
{
if (temp->data.Que == 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 = list.head;


while (temp != NULL)
{
Employee emp = temp->data;
// Ghi thĂ´ng tin nhĂ¢n viĂªn vĂ o file
file << emp.MaNV << ","
<< emp.SDT << ","
<< emp.TenNV << ","
<< emp.ngaysinh << ","
<< emp.Que << ","
<< emp.HSL << ","
<< emp.Luong << endl;
temp = temp->next;
}

file.close();
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, emp.MaNV, ',');
getline(ss, temp, ',');
emp.SDT = stoi(temp);
getline(ss, emp.TenNV, ',');
getline(ss, emp.ngaysinh, ',');
getline(ss, emp.Que, ',');
getline(ss, temp, ',');
emp.HSL = stof(temp);
getline(ss, temp, ',');
emp.Luong = stof(temp);

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


themNhanVien(list, emp);
}

file.close();
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 (!emp.MaNV.empty())
{
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 << kv.first << ": " << kv.second << " nhan vien\n";
}
break;
}
case 9:
{
string que;
cin.ignore();
cout << "Nhap que quan: ";
getline(cin, que);
inNhanVienTheoQue(ds, que);
break;
}
case 10:
{
ghiFile(ds, "nhanvien.txt");
cout << "Danh sach nhan vien da duoc ghi vĂ o file 'nhanvien.txt'";
break;
}
case 11:
{
docFile(ds, "nhanvien.txt");
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)
{
s.top = NULL;
}

void EnterToy(Toy &X)


{
cout << "Nhap vao ma cua do choi: ";
cin >> X.id;
cout << "Nhap vao ten cua do choi: ";
cin.ignore();
getline(cin, X.name);
cout << "Nhap vao so luong: ";
cin >> X.soluong;
cout << "Nhap vao gia cua do choi: ";
cin >> X.gia;
}

void push(Stack &s, Toy x)


{
StackNode *newNode = new StackNode();
newNode->info = x;
newNode->Next = s.top;
s.top = newNode;
}

void printToy(Toy X)
{
cout << X.id << " - " << X.name << " - " << X.soluong << " - " << X.gia << endl;
}

void printSN(StackNode *s)


{
printToy(s->info);
}

bool isEmpty(Stack s)
{
return s.top == NULL;
}

Toy pop(Stack &s)


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

double searchPriceMax(Stack &s)


{
double maxGia = s.top->info.gia;
for (StackNode *k = s.top; k != NULL; k = k->Next)
{
if (k->info.gia > maxGia)
{
maxGia = k->info.gia;
}
}
return maxGia;
}

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

void Thongke(Stack s)
{
int count = 0;
for (StackNode *k = s.top; k != NULL; k = k->Next)
{
if (k->info.gia > 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 << toy.id << " ";
fileout << toy.name << " ";
fileout << toy.gia << " ";
fileout << toy.soluong << "\n";
}

void writeToyListToFile(Stack &s)


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

for (StackNode *k = s.top; k != NULL; k = k->Next)


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

fileout.close();
cout << "Danh sach do choi da duoc ghi vao tep Dochoi.TXT\n";
}

Toy readToy(ifstream &filein)


{
Toy toy;
filein >> toy.id;
filein.ignore();
getline(filein, toy.name, ' ');
filein >> toy.gia >> toy.soluong;
return toy;
}

void readToyListFromFile(Stack &s)


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

while (!filein.eof())
{
Toy toy = readToy(filein);
if (filein.fail())
break;
push(s, toy);
}

filein.close();
for (StackNode *k = s.top; k != NULL; k = k->Next)
{
printToy(k->info);
}
cout << "Danh sach do choi da duoc doc tu tep Dochoi.TXT\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;
cin.ignore();
switch (choice)
{
case 1:
{
Toy newToy;
EnterToy(newToy);
push(s, newToy);
break;
}
case 2:
for (StackNode *k = s.top; k != NULL; k = k->Next)
{
printToy(k->info);
}
break;
case 3:
{
string name;
cout << "Nhap ten do choi can tim: ";
cin.ignore();
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->data.ngayLap > x.ngayLap)
{
themHoaDonVaoCay(t->left, x);
}
else if (t->data.ngayLap < x.ngayLap)
{
themHoaDonVaoCay(t->right, x);
}
}
}

void nhapHoaDon(HoaDon &hoaDon)


{
cout << "Nhap so HD : ";
cin >> hoaDon.idHD;
// 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;
hoaDon.ngayLap = year * 10000 + month * 100 + day;
cout << "Nhap ma nhan vien : ";
cin >> hoaDon.maNV;
cout << "Nhap so luong san pham : ";
cin >> hoaDon.soLuongSP;
hoaDon.giaTien = 0;
for (int i = 0; i < hoaDon.soLuongSP; i++)
{
cout << "Nhap ma toy : ";
cin >> hoaDon.dsDoChoi[i].id;
cout << "Nhap ten toy : ";
cin >> hoaDon.dsDoChoi[i].name;
cout << "Nhap so luong : ";
cin >> hoaDon.dsDoChoi[i].soluong;
cout << "Nhap gia : ";
cin >> hoaDon.dsDoChoi[i].gia;
hoaDon.giaTien += hoaDon.dsDoChoi[i].gia * hoaDon.dsDoChoi[i].soluong;
}
}

void hienThiHoaDon(const HoaDon &hoaDon)


{
cout << "========================== HOA DON ==========================" << "\n";
cout << "So HD : " << hoaDon.idHD << setw(45) << "Ngay lap (yyyy/mm/dd) : " << hoaDon.ngayLap
<< "\n";
cout << "Ma NV : " << hoaDon.maNV << "\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 < hoaDon.soLuongSP; i++)


{
const Toy &toy = hoaDon.dsDoChoi[i];
double thanhTien = toy.gia * toy.soluong;
cout << setw(5) << toy.id
<< setw(20) << toy.name
<< setw(10) << toy.soluong
<< setw(15) << fixed << setprecision(2) << toy.gia
<< setw(15) << thanhTien << "\n";
}

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


cout << "Tong gia tri hoa don: " << setw(40) << hoaDon.giaTien << "\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->data.idHD == idHoaDon)
{
return t; // ÄĂ£ tìm thấy hĂ³a đơn
}
else if (idHoaDon < t->data.idHD) // 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 (hoaDonMaxRight.giaTien > hoaDonMax.giaTien)
{
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 (hoaDonMinLeft.giaTien < hoaDonMin.giaTien)
{
hoaDonMin = hoaDonMinLeft;
}
}
return hoaDonMin;
}

void themPhanTuVaoHoaDon(HoaDon &hoaDon)


{
Toy toy;
cout << "Nhap ma toy: ";
cin >> toy.id;
cout << "Nhap ten toy: ";
cin >> toy.name;
cout << "Nhap so luong: ";
cin >> toy.soluong;
cout << "Nhap gia: ";
cin >> toy.gia;
hoaDon.dsDoChoi[hoaDon.soLuongSP++] = toy;
hoaDon.giaTien += toy.soluong * toy.gia;
}

void xoaPhanTuKhoiHoaDon(TreeNode *t)


{
if (t->data.soLuongSP == 0)
{
cout << "Khong co sp nao de xoa !";
return;
}

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

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

t->data.giaTien -= t->data.dsDoChoi[viTriCanXoa].gia * t->data.dsDoChoi[viTriCanXoa].soluong;

for (int i = viTriCanXoa; i < t->data.soLuongSP - 1; i++)


{
t->data.dsDoChoi[i] = t->data.dsDoChoi[i + 1];
}

t->data.soLuongSP--;
}

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 = dsHoaDon.size();
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->data.giaTien;
}

void thongKeHoaDon(TreeNode *t)


{
if (t == nullptr)
{
return;
}
if (t->data.giaTien > 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->data.idHD << " "
<< t->data.ngayLap << " "
<< t->data.maNV << " "
<< t->data.soLuongSP << " "
<< t->data.giaTien << "\n";

// Ghi thĂ´ng tin từng sản phẩm trong hĂ³a đơn vĂ o file
for (int i = 0; i < t->data.soLuongSP; i++)
{
outFile << t->data.dsDoChoi[i].id << " "
<< t->data.dsDoChoi[i].name << " "
<< t->data.dsDoChoi[i].soluong << " "
<< t->data.dsDoChoi[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);

outFile.close();
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 >> hoaDon.idHD) // Đọc id hoa don đầu tiĂªn
{
inFile >> hoaDon.ngayLap >> hoaDon.maNV >> hoaDon.soLuongSP >> hoaDon.giaTien;

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


for (int i = 0; i < hoaDon.soLuongSP; i++)
{
inFile >> hoaDon.dsDoChoi[i].id >> hoaDon.dsDoChoi[i].name >> hoaDon.dsDoChoi[i].soluong
>> hoaDon.dsDoChoi[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: " << hoaDon.idHD << "\n";
hienThiHoaDon(hoaDon); // Hiển thị hĂ³a đơn
}

inFile.close();
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, "hoadon.txt");
break;
}
case 9:
{
docDanhSachHoaDonTuFile(t, "hoadon.txt");
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->data.MaKh << ", ";
cout << "Ten khach hang: " << temp->data.tenKH << ", ";
cout << "So dien thoai: " << temp->data.SDT << endl;
temp = temp->next;
}
}

// Tim kiem khach hang theo ten


Node *searchByName(const string &name)
{
Node *temp = head;
while (temp != nullptr)
{
if (temp->data.tenKH == 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->data.tenKH > j->data.tenKH)
{
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->data.MaKh << ","
<< temp->data.tenKH << ","
<< temp->data.SDT << endl;
temp = temp->next;
}
file.close();
}

// 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 = line.find(',');
size_t pos2 = line.find(',', pos1 + 1);

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


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

kh.tenKH = line.substr(pos1 + 1, pos2 - pos1 - 1);

strncpy(kh.SDT, line.substr(pos2 + 1).c_str(), sizeof(kh.SDT) - 1);


kh.SDT[sizeof(kh.SDT) - 1] = '\0';

addLast(kh);
}
}
file.close();
}
};

// Ham nhap khach hang


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

cout << "Nhap ten khach hang: ";


getline(cin, kh.tenKH);

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


cin.getline(kh.SDT, sizeof(kh.SDT));
if (strlen(kh.SDT) > 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;
cin.ignore(); // Xu ly newline sau khi nhap so

switch (choice)
{
case 1:
nhapKhachHang(kh);
if (choice == 1 || choice == 6)
danhSach.addLast(kh);
else
danhSach.addFirst(kh);
break;
case 2:
danhSach.display();
break;
case 3:
danhSach.saveToFile("khachhang.txt");
cout << "Danh sach da duoc luu vao file khachhang.txt\n";
break;
case 4:
danhSach.loadFromFile("khachhang.txt");
cout << "Danh sach da duoc doc tu file khachhang.txt\n";
break;
case 5:
// Them khach hang vao dau danh sach
cout << "Nhap ma khach hang (4 ky tu): ";
cin.getline(kh.MaKh, sizeof(kh.MaKh));
cout << "Nhap ten khach hang: ";
getline(cin, kh.tenKH);
cout << "Nhap so dien thoai: ";
cin.getline(kh.SDT, sizeof(kh.SDT));
danhSach.addFirst(kh);
break;
case 6:
// Them khach hang vao cuoi danh sach
cout << "Nhap ma khach hang (4 ky tu): ";
cin.getline(kh.MaKh, sizeof(kh.MaKh));
cout << "Nhap ten khach hang: ";
getline(cin, kh.tenKH);
cout << "Nhap so dien thoai: ";
cin.getline(kh.SDT, sizeof(kh.SDT));
danhSach.addLast(kh);
break;

case 7:
cout << "Nhap ten khach hang can tim: ";
getline(cin, kh.tenKH);
if (Node *found = danhSach.searchByName(kh.tenKH))
{
cout << "Khach hang tim thay: Ma khach hang: " << found->data.MaKh
<< ", Ten khach hang: " << found->data.tenKH
<< ", So dien thoai: " << found->data.SDT << endl;
}
else
{
cout << "Khong tim thay khach hang voi ten " << kh.tenKH << endl;
}
break;
case 8:
danhSach.deleteFirst();
cout << "Da xoa khach hang o dau danh sach.\n";
break;
case 9:
danhSach.deleteLast();
cout << "Da xoa khach hang o cuoi danh sach.\n";
break;
case 10:
danhSach.sortByName();
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