fork download
  1.  
  2. #include <iostream>
  3. #include <string>
  4. #include <limits>
  5. using namespace std;
  6.  
  7. bool readInt(const string& msg, int& x) {
  8. while (true) {
  9. cout << msg;
  10. if (cin >> x) return true;
  11. if (cin.eof()) return false;
  12. cin.clear();
  13. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  14. cout << "Phai nhap so nguyen!\n";
  15. }
  16. }
  17. bool readDouble(const string& msg, double& x) {
  18. while (true) {
  19. cout << msg;
  20. if (cin >> x) return true;
  21. if (cin.eof()) return false;
  22. cin.clear();
  23. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  24. cout << "Phai nhap so!\n";
  25. }
  26. }
  27. string readLine(const string& msg) {
  28. cout << msg;
  29. string s;
  30. getline(cin >> ws, s);
  31. return s;
  32. }
  33.  
  34. struct Order { int id; string customer; double total; string status; };
  35. Order* findOrder(Order* ds,int n,int id){
  36. for(int i=0;i<n;++i)if(ds[i].id==id)return &ds[i];
  37. return nullptr;
  38. }
  39. void input(Order* ds,int n){
  40. for(int i=0;i<n;++i){
  41. cout<<"\nDon hang "<<i+1<<":\n";
  42. while(true){if(!readInt("ID: ",ds[i].id))return;
  43. if(findOrder(ds,i,ds[i].id)==nullptr)break;
  44. cout<<"ID trung!\n";}
  45. ds[i].customer=readLine("Ma khach hang: ");
  46. do{if(!readDouble("Tong tien: ",ds[i].total))return;
  47. if(ds[i].total<0)cout<<"Tong tien khong duoc am!\n";
  48. }while(ds[i].total<0);
  49. while(true){ds[i].status=readLine("Trang thai NEW/PROCESSING/SHIPPED/CANCELLED: ");
  50. if(ds[i].status=="NEW"||ds[i].status=="PROCESSING"||
  51. ds[i].status=="SHIPPED"||ds[i].status=="CANCELLED")break;
  52. cout<<"Trang thai khong hop le!\n";}
  53. }
  54. }
  55. void printOrder(const Order& o){
  56. cout<<o.id<<" | Customer: "<<o.customer<<" | Total: "<<o.total
  57. <<" | Status: "<<o.status<<'\n';
  58. }
  59. void findAndShow(Order* ds,int n,bool isStaff,const string& currentCustomer){
  60. int id;if(!readInt("ID don hang: ",id))return;
  61. Order* p=findOrder(ds,n,id);
  62. if(!p){cout<<"Khong tim thay!\n";return;}
  63. if(!isStaff&&p->customer!=currentCustomer){cout<<"Khong co quyen xem don nay!\n";return;}
  64. printOrder(*p);
  65. }
  66. void cancelOrder(Order* ds,int n,bool isStaff,const string& currentCustomer){
  67. if(isStaff){cout<<"Chuc nang huy cua khach hang; staff dung chuc nang doi trang thai.\n";return;}
  68. int id;if(!readInt("ID don muon huy: ",id))return;
  69. Order* p=findOrder(ds,n,id);
  70. if(!p){cout<<"Khong tim thay!\n";return;}
  71. if(p->customer!=currentCustomer){cout<<"Khong duoc huy don nguoi khac!\n";return;}
  72. if(p->status!="NEW"){cout<<"Chi duoc huy don NEW!\n";return;}
  73. p->status="CANCELLED";cout<<"Da huy don!\n";
  74. }
  75. void changeStatus(Order* ds,int n,bool isStaff){
  76. if(!isStaff){cout<<"Chi staff duoc doi trang thai!\n";return;}
  77. int id;if(!readInt("ID don hang: ",id))return;
  78. Order* p=findOrder(ds,n,id);
  79. if(!p){cout<<"Khong tim thay!\n";return;}
  80. if(p->status=="CANCELLED"){cout<<"Don da huy, khong doi trang thai!\n";return;}
  81. string status=readLine("Trang thai moi NEW/PROCESSING/SHIPPED/CANCELLED: ");
  82. if(status!="NEW"&&status!="PROCESSING"&&status!="SHIPPED"&&status!="CANCELLED"){
  83. cout<<"Trang thai khong hop le!\n";return;}
  84. p->status=status;cout<<"Da cap nhat trang thai!\n";
  85. }
  86. bool login(Order* ds,int n,bool& isStaff,string& currentCustomer){
  87. int role;if(!readInt("1.Staff 2.Customer: ",role))return false;
  88. if(role==1){string pass=readLine("Mat khau staff: ");
  89. if(pass=="S123"){isStaff=true;currentCustomer="";return true;}}
  90. if(role==2){
  91. // Khong tin ma customer nguoi dung tu khai don thuan.
  92. // PIN mo phong la C + ma khach hang, khong dung cho he thong that.
  93. string customer=readLine("Ma khach hang: ");
  94. string pin=readLine("PIN (demo: C + ma khach hang): ");
  95. bool exists=false;
  96. for(int i=0;i<n;++i)if(ds[i].customer==customer)exists=true;
  97. if(exists&&pin=="C"+customer&&!customer.empty()){
  98. isStaff=false;currentCustomer=customer;return true;
  99. }
  100. }
  101. cout<<"Dang nhap that bai!\n";return false;
  102. }
  103. int main(){
  104. int n;if(!readInt("Nhap n (1..1000): ",n)||n<1||n>1000)return 0;
  105. Order* ds=new Order[n];input(ds,n);
  106. int mainChoice=-1;
  107. do{
  108. if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
  109. if(mainChoice==1){bool isStaff=false;string currentCustomer;
  110. if(!login(ds,n,isStaff,currentCustomer))continue;
  111. int choice=-1;
  112. do{
  113. if(!readInt("\n1.Tim/xem don 2.Huy don cua minh 3.Staff doi trang thai 0.Dang xuat: ",choice))break;
  114. switch(choice){
  115. case 1:findAndShow(ds,n,isStaff,currentCustomer);break;
  116. case 2:cancelOrder(ds,n,isStaff,currentCustomer);break;
  117. case 3:changeStatus(ds,n,isStaff);break;
  118. case 0:break;
  119. default:cout<<"Lua chon sai!\n";
  120. }
  121. }while(choice!=0&&!cin.eof());
  122. }else if(mainChoice!=0)cout<<"Lua chon sai!\n";
  123. }while(mainChoice!=0&&!cin.eof());
  124. delete[] ds;ds=nullptr;return 0;
  125. }
  126.  
  127.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Nhap n (1..1000):