Advertisement
huutho_96

Untitled

Apr 24th, 2017
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <conio.h>
  5. using namespace std;
  6.  
  7. class NhanVien {
  8. protected:
  9.     string _ma_nv;
  10.     string _ho_ten;
  11.     string _chuc_vu;
  12.     bool _gioi_tinh;
  13.     string _que_quan;
  14.     int _nam_vao_lam;
  15. public:
  16.     string Get_MaNV() {
  17.         return _ma_nv;
  18.     }
  19.     virtual void NhapThongTin_NV() {
  20.         fflush(stdin);
  21.         cout << "Ma nhan vien: ";
  22.         getline(cin, _ma_nv);
  23.         cout << "Ho ten: ";
  24.         getline(cin, _ho_ten);
  25.         cout << "Chuc vu: ";
  26.         getline(cin, _chuc_vu);
  27.         cout << "Que quan: ";
  28.         getline(cin, _que_quan);
  29.         cout << "Nam vao lam: ";
  30.         cin >> _nam_vao_lam;
  31.         cout << "Gioi tinh (1: Nam\t2: Nu): ";
  32.         cin >> _nam_vao_lam;
  33.     }
  34.     virtual void XuatThongTin_NV() {
  35.         cout << "Ma nhan vien: " << _ma_nv << endl;
  36.         cout << "Ho ten: " << _ho_ten << endl;
  37.         cout << "Chuc vu: " << _chuc_vu << endl;
  38.         cout << "Que quan: " << _que_quan << endl;
  39.         cout << "Nam vao lam: " << _nam_vao_lam << endl;
  40.         cout << "Gioi tinh (1: Nam\t2: Nu): " << _nam_vao_lam << endl;
  41.     }
  42.  
  43.     virtual int TinhLuong() = 0;
  44. };
  45.  
  46.  
  47. class NVSanXuat : public NhanVien {
  48.     int _so_sp;
  49. public:
  50.     void NhapThongTin_NV() {
  51.         NhanVien::NhapThongTin_NV();
  52.         cout << "So san pham: ";
  53.         cin >> _so_sp;
  54.     }
  55.     void XuatThongTin_NV() {
  56.         NhanVien::XuatThongTin_NV();
  57.         cout << "So san pham: " << _so_sp << endl;
  58.     }
  59.  
  60.     int TinhLuong() {
  61.         return (_so_sp * 10000 + 100000 + (2017 - _nam_vao_lam) * 20000);
  62.     }
  63. };
  64.  
  65.  
  66. class NVVanPhong : public NhanVien {
  67.     int _muc_luong;
  68.     int _so_ngay_nghi;
  69. public:
  70.     void NhapThongTin_NV() {
  71.         NhanVien::NhapThongTin_NV();
  72.         cout << "Muc luong: ";
  73.         cin >> _muc_luong;
  74.         cout << "So ngay nghi: ";
  75.         cin >> _so_ngay_nghi;
  76.     }
  77.     void XuatThongTin_NV() {
  78.         NhanVien::XuatThongTin_NV();
  79.         cout << "Muc luong: " << _muc_luong << endl;
  80.         cout << "So ngay nghi: " << _so_ngay_nghi << endl;
  81.     }
  82.  
  83.     int TinhLuong() {
  84.         return (_muc_luong + 100000 - _so_ngay_nghi * 10000 + (2017 - _nam_vao_lam) * 20000);
  85.     }
  86. };
  87.  
  88.  
  89. class DSNhanVien {
  90.     vector<NhanVien *> _ds;
  91.     int MenuNV() {
  92.         system("cls");
  93.         int c = 0;
  94.         cout << "---------------MENU--------------" << "\n1. Nhan vien san xuat\n2. Nhan vien van phong";
  95.         while (true) {
  96.             cout << "\n\tLua chon (1|2): ";
  97.             cin >> c;
  98.             if (c == 1 || c == 2)
  99.                 break;
  100.         }
  101.         return c;
  102.     }
  103.     int Menu() {
  104.         system("cls");
  105.         int c = 0;
  106.         cout << "---------------MENU--------------" << "\n1. Them nhan vien\n2. Xem danh sach nhan vien\n3. Tim nhan vien";
  107.         while (true) {
  108.             cout << "\n\tLua chon (1|2|3): ";
  109.             cin >> c;
  110.             if (c == 1 || c == 2 || c == 3)
  111.                 break;
  112.         }
  113.         return c;
  114.     }
  115.     int MenuNhanVien() {
  116.         int c = 0;
  117.         cout << "---------------MENU--------------" << "\n1. Sua nhan vien\n2. Xoa nhan vien\n3. Chen nhan vien\n4. Tiep theo";
  118.         while (true) {
  119.             cout << "\n\tLua chon (1|2|3|4): ";
  120.             cin >> c;
  121.             if (c == 1 || c == 2 || c == 3 || c == 4)
  122.                 break;
  123.         }
  124.         return c;
  125.     }
  126.  
  127. public:
  128.     void NhapDSNV() {
  129.         NhanVien *nv = NULL;
  130.         while (true) {
  131.             switch (MenuNV()) {
  132.             case 1:
  133.                 nv = new NVSanXuat;
  134.                 break;
  135.             case 2:
  136.                 nv = new NVVanPhong;
  137.                 break;
  138.             }
  139.             nv->NhapThongTin_NV();
  140.             _ds.push_back(nv);
  141.  
  142.             cout << "An ESC de ket thuc";
  143.             if (getch() == 27)
  144.                 break;
  145.         }
  146.     }
  147.     // xuất nhân viên từ vị trí iterator truyền vào. ý nghĩa là nếu gọi hàm này cần phải có điểm xuất phát
  148.     void XuatDSNV(vector<NhanVien *>::iterator start) {
  149.         NhanVien *nv;
  150.         for (vector<NhanVien *>::iterator it = start; it != _ds.end(); it++) {
  151.             system("cls");
  152.             // hiển thị thông tin ra màn hình và hiển thị menu option
  153.             (*it)->XuatThongTin_NV();
  154.             cout << "Luong: " << (*it)->TinhLuong() << endl;
  155.             switch (MenuNhanVien()) {
  156.             case 1:
  157.                 // cập nhật lai thông tin
  158.                 (*it)->NhapThongTin_NV();
  159.                 break;
  160.             case 2:
  161.                 // xóa vị trí tứ it, sau khi xóa giảm it đi 1 đơn vị để kết thúc vòng for nó cộng lại 1 đơn vị (it++),
  162.                 // như vậy thì nó quay lại vị trí vứa mới xóa để kiểm tra cái mới được cập nhât thay vị trí xóa
  163.                 _ds.erase(it);
  164.                 it--;
  165.                 break;
  166.             case 3:
  167.                 // kiểm tra loại nhân viên cần nhập
  168.                 switch (MenuNV()) {
  169.                 case 1:
  170.                     nv = new NVSanXuat;
  171.                     break;
  172.                 case 2:
  173.                     nv = new NVVanPhong;
  174.                     break;
  175.                 }
  176.                 // nhập thông tin cho nhân viên đó và chèn vào vị trí của it
  177.                 // để tránh lỗi với it thì return thay cho it-- hay it++
  178.                 nv->NhapThongTin_NV();
  179.                 _ds.insert(it, nv);
  180.                 return;
  181.             }
  182.  
  183.         }
  184.     }
  185.     // trả về vị trí iterator có mã nhân viên bằng mã nhân viên truyền vào
  186.     vector<NhanVien *>::iterator TimNV(string ma_nv) {
  187.         vector<NhanVien *>::iterator it;
  188.         for (it = _ds.begin(); it != _ds.end(); it++) {
  189.             if ((*it)->Get_MaNV() == ma_nv)
  190.                 break;
  191.         }
  192.         return it;
  193.     }
  194.  
  195.     // hàm này sẽ chạy liên tục cho đến khi ấn ESC
  196.     void Loop() {
  197.         while (true) {
  198.             // hiển thị menu chọn
  199.             switch (Menu()) {
  200.             case 1:
  201.                 // nhập lượng nhân viên không giới hạn cho đến khi ấn ESC
  202.                 NhapDSNV();
  203.                 continue;
  204.             case 2:
  205.                 // xuất danh sách nhân viên bắt đầu từ vị trí đầu danh sách
  206.                 XuatDSNV(_ds.begin());
  207.                 break;
  208.             case 3:
  209.                 // Tìm kiếm nhân viên với ma_nv
  210.                 fflush(stdin);
  211.                 string ma_nv;
  212.                 cout << "Ma nhan vien: ";
  213.                 getline(cin, ma_nv);
  214.                 vector<NhanVien *>::iterator start = TimNV(ma_nv);
  215.                 // start == _ds.end tức là không có nhân viên nào trùng với ma_nv cần tìm
  216.                 if (start == _ds.end()) {
  217.                     cout << "Khong tim thay" << endl;
  218.                 }
  219.                 // trường hợp còn lại là tìm thấy và bắt đầu xuất danh sách từ vị trí tìm thấy trở đi
  220.                 else {
  221.                     XuatDSNV(start);
  222.                 }
  223.                 break;
  224.             }
  225.  
  226.  
  227.             cout << "Nhan ESC de ket thuc";
  228.             if (getch() == 27)
  229.                 break;
  230.         }
  231.     }
  232. };
  233.  
  234. void main() {
  235.     DSNhanVien ds;
  236.     ds.Loop();
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement