Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <string>
- #include <conio.h>
- using namespace std;
- class NhanVien {
- protected:
- string _ma_nv;
- string _ho_ten;
- string _chuc_vu;
- bool _gioi_tinh;
- string _que_quan;
- int _nam_vao_lam;
- public:
- string Get_MaNV() {
- return _ma_nv;
- }
- virtual void NhapThongTin_NV() {
- fflush(stdin);
- cout << "Ma nhan vien: ";
- getline(cin, _ma_nv);
- cout << "Ho ten: ";
- getline(cin, _ho_ten);
- cout << "Chuc vu: ";
- getline(cin, _chuc_vu);
- cout << "Que quan: ";
- getline(cin, _que_quan);
- cout << "Nam vao lam: ";
- cin >> _nam_vao_lam;
- cout << "Gioi tinh (1: Nam\t2: Nu): ";
- cin >> _nam_vao_lam;
- }
- virtual void XuatThongTin_NV() {
- cout << "Ma nhan vien: " << _ma_nv << endl;
- cout << "Ho ten: " << _ho_ten << endl;
- cout << "Chuc vu: " << _chuc_vu << endl;
- cout << "Que quan: " << _que_quan << endl;
- cout << "Nam vao lam: " << _nam_vao_lam << endl;
- cout << "Gioi tinh (1: Nam\t2: Nu): " << _nam_vao_lam << endl;
- }
- virtual int TinhLuong() = 0;
- };
- class NVSanXuat : public NhanVien {
- int _so_sp;
- public:
- void NhapThongTin_NV() {
- NhanVien::NhapThongTin_NV();
- cout << "So san pham: ";
- cin >> _so_sp;
- }
- void XuatThongTin_NV() {
- NhanVien::XuatThongTin_NV();
- cout << "So san pham: " << _so_sp << endl;
- }
- int TinhLuong() {
- return (_so_sp * 10000 + 100000 + (2017 - _nam_vao_lam) * 20000);
- }
- };
- class NVVanPhong : public NhanVien {
- int _muc_luong;
- int _so_ngay_nghi;
- public:
- void NhapThongTin_NV() {
- NhanVien::NhapThongTin_NV();
- cout << "Muc luong: ";
- cin >> _muc_luong;
- cout << "So ngay nghi: ";
- cin >> _so_ngay_nghi;
- }
- void XuatThongTin_NV() {
- NhanVien::XuatThongTin_NV();
- cout << "Muc luong: " << _muc_luong << endl;
- cout << "So ngay nghi: " << _so_ngay_nghi << endl;
- }
- int TinhLuong() {
- return (_muc_luong + 100000 - _so_ngay_nghi * 10000 + (2017 - _nam_vao_lam) * 20000);
- }
- };
- class DSNhanVien {
- vector<NhanVien *> _ds;
- int MenuNV() {
- system("cls");
- int c = 0;
- cout << "---------------MENU--------------" << "\n1. Nhan vien san xuat\n2. Nhan vien van phong";
- while (true) {
- cout << "\n\tLua chon (1|2): ";
- cin >> c;
- if (c == 1 || c == 2)
- break;
- }
- return c;
- }
- int Menu() {
- system("cls");
- int c = 0;
- cout << "---------------MENU--------------" << "\n1. Them nhan vien\n2. Xem danh sach nhan vien\n3. Tim nhan vien";
- while (true) {
- cout << "\n\tLua chon (1|2|3): ";
- cin >> c;
- if (c == 1 || c == 2 || c == 3)
- break;
- }
- return c;
- }
- int MenuNhanVien() {
- int c = 0;
- cout << "---------------MENU--------------" << "\n1. Sua nhan vien\n2. Xoa nhan vien\n3. Chen nhan vien\n4. Tiep theo";
- while (true) {
- cout << "\n\tLua chon (1|2|3|4): ";
- cin >> c;
- if (c == 1 || c == 2 || c == 3 || c == 4)
- break;
- }
- return c;
- }
- public:
- void NhapDSNV() {
- NhanVien *nv = NULL;
- while (true) {
- switch (MenuNV()) {
- case 1:
- nv = new NVSanXuat;
- break;
- case 2:
- nv = new NVVanPhong;
- break;
- }
- nv->NhapThongTin_NV();
- _ds.push_back(nv);
- cout << "An ESC de ket thuc";
- if (getch() == 27)
- break;
- }
- }
- // 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
- void XuatDSNV(vector<NhanVien *>::iterator start) {
- NhanVien *nv;
- for (vector<NhanVien *>::iterator it = start; it != _ds.end(); it++) {
- system("cls");
- // hiển thị thông tin ra màn hình và hiển thị menu option
- (*it)->XuatThongTin_NV();
- cout << "Luong: " << (*it)->TinhLuong() << endl;
- switch (MenuNhanVien()) {
- case 1:
- // cập nhật lai thông tin
- (*it)->NhapThongTin_NV();
- break;
- case 2:
- // 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++),
- // 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
- _ds.erase(it);
- it--;
- break;
- case 3:
- // kiểm tra loại nhân viên cần nhập
- switch (MenuNV()) {
- case 1:
- nv = new NVSanXuat;
- break;
- case 2:
- nv = new NVVanPhong;
- break;
- }
- // nhập thông tin cho nhân viên đó và chèn vào vị trí của it
- // để tránh lỗi với it thì return thay cho it-- hay it++
- nv->NhapThongTin_NV();
- _ds.insert(it, nv);
- return;
- }
- }
- }
- // trả về vị trí iterator có mã nhân viên bằng mã nhân viên truyền vào
- vector<NhanVien *>::iterator TimNV(string ma_nv) {
- vector<NhanVien *>::iterator it;
- for (it = _ds.begin(); it != _ds.end(); it++) {
- if ((*it)->Get_MaNV() == ma_nv)
- break;
- }
- return it;
- }
- // hàm này sẽ chạy liên tục cho đến khi ấn ESC
- void Loop() {
- while (true) {
- // hiển thị menu chọn
- switch (Menu()) {
- case 1:
- // nhập lượng nhân viên không giới hạn cho đến khi ấn ESC
- NhapDSNV();
- continue;
- case 2:
- // xuất danh sách nhân viên bắt đầu từ vị trí đầu danh sách
- XuatDSNV(_ds.begin());
- break;
- case 3:
- // Tìm kiếm nhân viên với ma_nv
- fflush(stdin);
- string ma_nv;
- cout << "Ma nhan vien: ";
- getline(cin, ma_nv);
- vector<NhanVien *>::iterator start = TimNV(ma_nv);
- // 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
- if (start == _ds.end()) {
- cout << "Khong tim thay" << endl;
- }
- // 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
- else {
- XuatDSNV(start);
- }
- break;
- }
- cout << "Nhan ESC de ket thuc";
- if (getch() == 27)
- break;
- }
- }
- };
- void main() {
- DSNhanVien ds;
- ds.Loop();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement