C++實現職工信息管理系統
本文實例為大傢分享瞭c++實現職工信息管理系統的具體代碼,供大傢參考,具體內容如下
1、項目需求
2、功能實現的具體思路為:
(1) 經行職工信息的讀入,用while循環進行讀入,對於職工信息類型的設定方便起見除年齡和薪資用int類型其他信息都用string類型,職工信息用ostream 流寫入txt並將信息保存在txt文件中,打印職工信息由於c++讀文件方式不方便所以用c語言方式讀文件,文件讀取以後將文件中讀取的信息加載到vector容器中後打印在終端窗口,其他功能的實現也是將文件中的信息讀取到vector容器中,後用vector容器中的重載函數進行功能的實現;
3、頭文件的編寫的具體實現
#pragma once #include<string> #include<vector> using namespace std; class Worker { public: Worker(string workNumber, string name, string gender, string education, string addr, string phoneNumber, int age, int salary); Worker(); ~Worker(); //職工信息描述 string description(); //錄入職工信息 static void addWorkerInformation(vector<Worker>&worker); void addWorkerInformations(); //職工信息瀏覽 void putWorkerInformation(); //查詢 按籍貫或學歷查詢職工信息 void lookWorkerInformation(); //按工資高低排序 void sortWorkerInformation(); //刪除職工信息 按姓名刪除 void deleteWorkerInformation(); //修改職工信息 把研究生薪資增加 500 void addWorkerSalary(); friend ostream& operator<<(ostream& os, const Worker& worker); //友元函數直接輸出對象的信息 Worker& operator=(const Worker& worker); //賦值構造函數 private: string workNumber; //職工號 string name; //名字 string gender; //性別 string education; //學歷 string addr; //籍貫 string phoneNumber; //電話號碼 int age; //年齡 int salary; //薪資 void loadWorkerInformation(); void printWorkerInformation(); vector<Worker>worker; };
ostream& operator<<(ostream& os, const Worker& worker); //使用重載函數直接輸出對象的信息進行輸出
4、對頭文件中函數的具體實現
#include<string> #include<sstream> #include<iostream> #include<fstream> #include<vector> #include"worker.h" #define NAME "workerInformation.txt" #define ZERO "0" #define MONEY 500 #define STUDENT "研究生" Worker::Worker(string workNumber, string name, string gender, string education, string addr, string phoneNumber, int age, int salary){ this->addr = addr; this->age = age; this->gender = gender; this->name = name; this->phoneNumber = phoneNumber; this->education = education; this->salary = salary; this->workNumber = workNumber; } Worker::Worker(){ } Worker::~Worker(){ } //職工信息描述 string Worker::description(){ stringstream ret; ret << "職工號:" << workNumber << " 性別:" << gender << " 名字:" << name << " 年齡:" << age << " 學歷:" << education << " 籍貫:" << addr << " 薪資:" << salary << " 電話號碼:" << phoneNumber; return ret.str(); } void Worker::addWorkerInformation(vector<Worker>& worker){ string workNumber; //職工號 string name; //名字 string gender; //性別 string education; //學歷 string addr; //籍貫 string phoneNumber; //電話號碼 int age; //年齡 int salary; //年齡 while (1) { cout << "輸入職工號[輸入 0 結束輸入];"; cin >> workNumber; if (workNumber == ZERO) { break; } cout << "輸入名字:"; cin >> name; cout << "輸入性別:"; cin >> gender; cout << "輸入學歷:"; cin >> education; cout << "輸入籍貫:"; cin >> addr; cout << "輸入電話號碼:"; cin >> phoneNumber; cout << "輸入年齡:"; cin >> age; cout << "輸入薪資:"; cin >> salary; worker.push_back(Worker(workNumber, name, gender, education, addr, phoneNumber, age, salary)); } return; } void Worker::addWorkerInformations(){ ofstream outFile; outFile.open(NAME,ios::app); Worker::addWorkerInformation(this->worker); for (int i = 0;i < worker.size();i++) { outFile << worker[i].description()<<endl; } worker.clear(); outFile.close(); } //職工信息瀏覽 void Worker::putWorkerInformation(){ loadWorkerInformation(); printWorkerInformation(); } //查詢 按籍貫或學歷查詢職工信息 void Worker::lookWorkerInformation(){ string addr; string education; cout << "輸入要查詢的職工籍貫:"; cin >> addr; cout << "請輸入要查詢的職工學歷:"; cin >> education; loadWorkerInformation(); for (int i = 0;i < worker.size();i++) { if ((worker[i].addr == addr)&&(worker[i].education == education)){ cout << worker[i] << endl; } } } //按工資高低排序 void Worker::sortWorkerInformation(){ loadWorkerInformation(); Worker workers; for (int j = 0;j < worker.size() ;j++) { for (int i = j + 1;i < worker.size();i++) { if (worker[j].salary > worker[i].salary) { workers = worker[i]; worker[i] = worker[j]; worker[j] = workers; } } } printWorkerInformation(); } //刪除職工信息 按姓名刪除 void Worker::deleteWorkerInformation(){ ofstream outFile; string name; cout << "請輸入你要刪除人的姓名:"; cin >> name; loadWorkerInformation(); outFile.open(NAME); for (int i = 0;i < worker.size();) { if (worker[i].name == name) { worker.erase(worker.begin() + i); } else { outFile << worker[i] << endl; i++; } } } //修改職工信息 把研究生薪資增加 500 void Worker::addWorkerSalary(){ loadWorkerInformation(); int salary; ofstream outFile; outFile.open(NAME); for (int i = 0;i < worker.size();) { if (worker[i].education == STUDENT) { salary = worker[i].salary + MONEY; outFile<<Worker(worker[i].workNumber,worker[i].name,worker[i].gender, worker[i].education, worker[i].addr, worker[i].phoneNumber, worker[i].age, salary)<<endl; worker.erase(worker.begin()+i); } else { outFile << worker[i] << endl; i++; } } worker.clear(); } Worker& Worker::operator=(const Worker& worker) { addr = worker.addr; age = worker.age; gender = worker.gender; education = worker.education; name = worker.name; phoneNumber = worker.phoneNumber; salary = worker.salary; workNumber = worker.workNumber; return *this; } void Worker::loadWorkerInformation(){ char workNumber[32]; //職工號 char name[32]; //名字 char gender[32]; //性別 char education[32]; //學歷 char addr[32]; //籍貫 char phoneNumber[32]; //電話號碼 int age; //年齡 int salary; //年齡 string line; ifstream inFile; inFile.open(NAME); if (!inFile.is_open()) { cout << "----職工數據庫打開失敗----"; inFile.close(); exit(1); } while (1) { getline(inFile, line); if (inFile.eof()) { break; } if (line == "")continue; sscanf_s(line.c_str(), "職工號:%s 性別:%s 名字:%s 年齡:%d 學歷:%s 籍貫:%s 薪資:%d 電話號碼:%s", workNumber, sizeof(workNumber), gender, sizeof(gender), name, sizeof(name), &age, education, sizeof(education), addr, sizeof(addr), &salary, phoneNumber, sizeof(phoneNumber)); worker.push_back(Worker(string(workNumber), string(name), string(gender), string(education), string(addr), string(phoneNumber), age, salary)); } } void Worker::printWorkerInformation(){ for (int i = 0;i < worker.size();i++) { cout << worker[i] << endl<<endl; } worker.clear(); } ostream& operator<<(ostream& os, const Worker& worker){ os<< "職工號:" <<worker.workNumber << " 性別:" << worker.gender << " 名字:" << worker.name << " 年齡:" << worker.age << " 學歷:" << worker.education << " 籍貫:" << worker.addr << " 薪資:" << worker.salary << " 電話號碼:" << worker.phoneNumber; return os; }
5、main函數的具體實現
#include<stdlib.h> #include<iostream> #include<conio.h> #include"worker.h" #define ONE '1' #define TWO '2' #define THREE '3' #define FOUR '4' #define FIVE '5' #define SIX '6' #define SEVEN '7' int main(void) { Worker work; cout << "輸入【1】根據籍貫和學歷對職工信息進行查詢" << endl; cout << "輸入【2】按薪水對職工信息進行排序" << endl; cout << "輸入【3】打印職工信息" << endl; cout << "輸入【4】增加職工信息" << endl; cout << "輸入【5】增加研究生薪水" << endl; cout << "輸入【6】刪除信息" << endl; cout << "輸入【7】退出功能" << endl << endl; bool quit = false; do { if (_kbhit()) { char ch = _getch(); switch(ch){ case ONE: work.lookWorkerInformation();//根據籍貫和學歷對職工信息進行查詢 cout << "---已完成該功能---" << endl << endl; break; case TWO: work.sortWorkerInformation();//按薪水對職工信息進行排序 cout << "---已完成該功能---" << endl << endl; break; case THREE: work.putWorkerInformation();//打印職工信息; cout << "---已完成該功能---" << endl << endl; break; case FOUR: work.addWorkerInformations();//增加職工信息 cout << "---已完成該功能---" << endl << endl; break; case FIVE: work.addWorkerSalary();//增加研究生薪水 cout << "---已完成該功能---" << endl << endl; break; case SIX: work.deleteWorkerInformation();//刪除信息 cout << "---已完成該功能---" << endl << endl; break; case SEVEN: quit = true;//退出循環 break; default: cout << "----無其他功能選項----"; break; } } } while (quit == false); system("pause"); return 0; }
6、功能3,4,5,6,的實現都是將文件中的信息加載到vector中,並且使用的都是保存瞭worker這個類對象的同一個容器(假如先實現工能3,將信息加載到vector中後功能3結束以後,功能3使用到的職工信息依然在vector這個容器中,所以使用完一個函數後要將vector中的信息清理完全,不然會影響下一個函數的使用)。
7、在實現功能5的時候會使用到vector容器的重載函數( worker.erase(worker.begin()+i);)使用完以後返回的是下一個迭代器指向下一個對象,所以在使用使用for循環遍歷容器的時候因註意for (int i = 0;i < worker.size();i++) 中i++具體放在哪個位置比較合適。
8、這是本人在編寫程序的時候發現的坑如果有什麼錯誤請批評指正。
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。