C++语言综合编程案例:简单职工信息管理系统
采用类(class),文本界面,能在Dev-C++运行。具有如下功能
查看全部职工信息
查看职工信息
添加职工信息
查找职工信息
修改职工信息
删除职工信息
第一次使用,使用“添加职工信息”,可自动创建数据文本文件myworker.txt,
数据样式
职工号 姓名 所属部门 性别 年龄 工资
001 王小强 办公室 男 22 3600
002 张萌 财务 女 23 4500
登录账号admin 密码abc123
源码如下:
#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <string>
#include <conio.h>
#include "windows.h"
using namespace std;
//职工类
class Workerinfo
{
private:
char wno[20]; //职工号
char wname[20]; //职工姓名
char cname[20]; //所属部门
char sex[4]; //职工性别
int age; //职工年龄
float wages; //职工工资
public:
//构造函数
Workerinfo()
{ }
Workerinfo(char wno[], char wname[], char cname[], char sex[], int age, float wages)
{
setWno(wno);
setWname(wname);
setCname(cname);
setSex(sex);
setAge(age);
setWages(wages);
}
void setWno(char wno[])
{
strcpy(this->wno,wno);
}
void setWname(char wname[])
{
strcpy(this->wname,wname);
}
void setCname(char cname[])
{
strcpy(this->cname,cname);
}
void setSex(char sex[])
{
strcpy(this->sex,sex);
}
void setAge(int age)
{
this->age = age;
}
void setWages(float wages)
{
this->wages = wages ;
}
void show()
{
cout <<endl<< "\t" << wno << "\t" << wname << "\t" << cname << "\t\t" << sex << "\t" << age << "\t" << wages << "\n\t";
}
char* getWno()
{
return this->wno;
}
};
class Mycontroller
{
public :
void myshowinfo(); //显示系统信息
void mymenu(); //主菜单
void mydatainit(); //初始化数据
bool mylogin(); //用户登录
void showworkerinfo() ; //查看全部职工信息
void addworkerinfo() ; //添加职工信息
void myshow(Workerinfo mywork1); //显示单名职工信息
bool mysave(Workerinfo mywork1); //保存职工信息
void searchworkerinfo(); //查找职工信息
void updateworkerinfo() ; //修改职工信息
bool rewriteworkerinfo() ; //重写职工信息
void deleteworkerinfo() ; //删除职工信息
int CheckNum(int& n); //判断输入的字符串是否为正整数,若是,则合规返归其值 ,否则给出提示
};
//显示系统信息
void Mycontroller::myshowinfo()
{
cout <<endl<<endl<<" 欢迎使用简单职工信息管理系统 "<<endl;
}
//程序主菜单
void Mycontroller::mymenu()
{
int option=0;
int count=0;
myal: system("cls"); //清屏
myshowinfo() ; //调用显示系统信息函数
cout <<endl<<endl<<"\t 程序主菜单 "<<endl;
cout <<endl<<"\t 1.查看全部职工信息 ";
cout <<endl<<"\t 2.查找职工信息 ";
cout <<endl<<"\t 3.添加职工信息 ";
cout <<endl<<"\t 4.修改职工信息 ";
cout <<endl<<"\t 5.删除职工信息 ";
cout <<endl<<"\t 6.退出管理系统 ";
cout <<endl;
//处理输入非数字
int m;
while (true){
cout <<"请输入正确的编号(1~6): ";
option=CheckNum(m);
if(option>=1 && option<=6) //限制是合规的选项
{
break;
}
}
switch(option)
{
case 1: showworkerinfo(); break;
case 2: searchworkerinfo(); break;
case 3: addworkerinfo(); break;
case 4: updateworkerinfo(); break;
case 5: deleteworkerinfo(); break;
case 6: exit(0);break;
}
goto myal;
}
//判断输入的字符串是否为正整数,若是,则合规返归其值 ,否则给出提示
int Mycontroller::CheckNum(int& n)
{
int i;
string x; //用来接受输入
bool flag = false;
while (cin >> x) {
for (i = 0; i < x.size(); ++i) {
//判断是否为中文
if (x[i] & 0x80) {
cout << "\n输入错误,请重新输入正确的数字: ";
break;
}
//判断是否为字母或者其它字符
if (!isdigit(x[i])) {
cout << "\n输入错误,请重新输入正确的数字: ";
break;
}
}
if (i == x.size()) {
break; //如果字符串中所有字符都合法,则退出while循环
}
}
n = atoi(x.c_str()); //将仅含数字的string字符串转化为正整数
return n; //返回值
}
vector<Workerinfo> workerinfos;
//初始化数据
void Mycontroller::mydatainit()
{
fstream file;
file.open("myworker.txt", ios::in | ios::binary) ;
if (file.is_open())
{ // 打开成功
Workerinfo mywork1 ; //创建职工类对象
while(true)
{
file.read((char *)&mywork1, sizeof(Workerinfo));
if(!file)
break;
workerinfos.push_back(mywork1);
}
file.close();
}
}
//用户登录
bool Mycontroller::mylogin()
{
system("cls"); //清屏
int count = 0;
string account;
string cipher;
myshowinfo() ; //调用显示系统信息函数
do
{
count ++;
cout << endl<<endl<<" 请输入登录账号:";
//获取用户输入的账号
cin >> account;
cout <<endl<<endl<<" 请输入密码:";
//获取用户输入的密码
cin>>cipher ;
//判断用户输入的账号和密码是否正确
if( account == "admin" && cipher=="abc123")
{
mydatainit() ; //初始化数据
return true;
}
else
{
if(count==3)
{
cout <<endl<<endl<<"\t对不起,登录失败,系统将自动退出....\n\t";
exit(0);
}
else
{
cout << "\n\t账号或密码错误,请确认后重新输入。<你还有 " << (3-count) << " 次机会,继续>!!!" << endl;
}
}
}while(count > 0);
return false;
}
//查看全部职工信息
void Mycontroller::showworkerinfo()
{
system("cls"); //清屏
myshowinfo(); //显示系统信息
cout <<endl<<endl<<"\t 查看全部职工信息 " << endl;
if (workerinfos.size() <= 0)
{
cout <<endl<<"\t暂无职工信息......";
}
else
{
cout <<endl<<endl<<"\t 共有 " << workerinfos.size() << " 名职工 " << endl;
cout <<endl<<endl<<"\t职工号" << "\t姓名" << "\t所属部门" << "\t性别" << "\t年龄" << "\t工资" << endl;
for(int i=0,len=workerinfos.size(); i<len; i++)
{
workerinfos[i].show();
}
}
cout << "\n\t<请按任意键如(回车)返回>" << endl;
getch() ;
}
//显示单个职工信息
void Mycontroller::myshow(Workerinfo mywork1)
{
cout <<endl<<"\t职工号" << "\t姓名" << "\t所属部门" << "\t性别" << "\t年龄" << "\t工资" << endl;
mywork1.show();
}
//保存职工信息
bool Mycontroller::mysave(Workerinfo mywork1)
{
fstream out ;
out.open("myworker.txt",ios::out | ios::app | ios::binary) ;
if (out.is_open())
{
out.write((char *)&mywork1, sizeof(Workerinfo));
out.close();
return true;
}
else
{
return false;
}
}
//添加职工信息
void Mycontroller::addworkerinfo()
{
system("cls");
int result;
char wno[20]; //职工号
char wname[20]; //姓名
char cname[20]; //所属部门
char sex[4]; // 性别
int age; // 年龄
float wages; //工资
cout << endl<<endl<<"\t 添加职工信息 ";
cout << endl<<endl<<"\t *请输入以下职工信息 "<<endl;
cout << "\n\t请输入职工号:";
cin >> wno;
cout << "\n\t请输入职工姓名:";
cin >> wname;
cout << "\n\t请输入职工所属部门:";
cin >> cname;
cout << "\n\t请输入职工性别:";
cin >> sex;
cout << "\n\t请输入职工年龄:";
cin >> age;
cout << "\n\t请输入职工工资:";
cin >> wages;
Workerinfo mywork1(wno, wname, cname, sex, age, wages);
cout <<endl<<"\t要添加的职工信息如下,请确认:" << endl;
myshow(mywork1); //调用myshow函数显示要添加的职工信息
//提示对话框
result=MessageBox(NULL,"确定要添加此数据吗?","确认提示",MB_YESNO|MB_ICONWARNING);
if(result==6)
{
if (mysave(mywork1)) //调用mysave函数把添加的职工信息添加到文本文件中
{
workerinfos.push_back(mywork1);
cout <<endl<<"\t职工信息添加成功..." << endl;
}
else
{
cout <<endl<<"\t职工信息添加失败..." << endl;
}
}
cout <<endl<<endl<<"\t<请按任意键如(回车)返回>" << endl;
getch() ;
}
//查找职工信息
void Mycontroller:: searchworkerinfo()
{
system("cls"); //清屏
myshowinfo(); //显示系统信息
cout <<endl<<endl<<"\t 查找到的职工信息 ";
if (workerinfos.size() <= 0)
{
cout <<endl<<"\t暂无职工信息......";
}
else
{
char wno[20]; //存放用户要查找的职工号
cout <<endl<<endl<<"\t请输入要查找的职工号:";
cin >> wno;
cout <<endl<<endl<<"\t职工号" << "\t姓名" << "\t所属部门" << "\t性别" << "\t年龄" << "\t工资" << endl;
int count = 0; // 记录满足条件的职工个数
int length = strlen(wno); // \0
int temp = 0, j=0;
char arr[20];
for(int i=0,len=workerinfos.size(); i<len; i++) // 循环所有职工信息
{
strcpy(arr,workerinfos[i].getWno());
temp = strlen(arr);
length = length > temp ? temp : length;
for (j=0; j<length; j++)
{
if(arr[j] != wno[j])
{
break;
}
}
if (j >= length) // 说明满足条件
{
count++;
workerinfos[i].show();
}
}
if (count>0)
{
cout << "\n\t 共有 " << count << " 个基本满足条件 " << endl;
}
else
{
cout << "\n\t没有你要查找的职工信息.......";
}
}
cout << "\n\t<请按任意键如(回车)返回>" << endl;
getch();
}
//重写职工信息
bool Mycontroller:: rewriteworkerinfo()
{
int len ;
if (len <=0) // 说明没有职工信息,则清空文件中的内容
{
fstream file ;
file.open("myworker.txt", ios::out | ios::trunc);
file.close();
}
else
{
fstream out ;
out.open("myworker.txt",ios::out | ios::binary);
if (out.is_open())
{
for(int i=0,len=workerinfos.size(); i<len; i++)
{
out.write((char *)&workerinfos[i], sizeof(Workerinfo));
}
out.close();
return true;
}
else
{
return false;
}
}
return false;
}
//修改职工信息
void Mycontroller:: updateworkerinfo()
{
system("cls"); //清屏
myshowinfo(); //显示系统信息
cout <<endl<<endl<<"\t 修改职工信息 ";
if (workerinfos.empty())
{
cout << "\n\t暂无职工信息......";
}
else
{
char wno[20]; //职工号
cout <<endl<<endl<<"\t请输入你要修改的职工号:";
cin >> wno;
int i, len = workerinfos.size();
for(i=0; i<len; i++)
{
if (strcmp(wno,workerinfos[i].getWno()) == 0)
{
cout <<endl<<"\t你要修改的职工信息如下:";
cout <<endl<<endl<<"\t职工号" << "\t姓名" << "\t所属部门" << "\t性别" << "\t年龄" << "\t工资" << endl;
workerinfos[i].show();
break;
}
}
if ( i >= len )
{
cout << "\n\t对不起!没有要删除的职工信息......";
}
else
{
char wname[20]; //姓名
char cname[20]; //所属部门
char sex[4]; //性别
int age; //年龄
float wages; //工资
cout << "\n\t请输入职工姓名:";
cin >> wname;
cout << "\n\t请输入职工所属部门:";
cin >> cname;
cout << "\n\t请输入职工性别:";
cin >> sex;
cout << "\n\t请输入职工年龄:";
cin >> age;
cout << "\n\t请输入职工工资:";
cin >> wages ;
int result=MessageBox(NULL,"您确定要修改此职工信息吗?","确认提示",MB_YESNO|MB_ICONWARNING);
if(result==6) //确定按钮
{
workerinfos[i].setWname(wname);
workerinfos[i].setCname(cname);
workerinfos[i].setSex(sex);
workerinfos[i].setAge(age);
workerinfos[i].setWages(wages);
//调用重写职工信息函数
if(rewriteworkerinfo())
{
cout << "\n\t职工信息修改成功......" << endl;
}
else
{
cout << "\n\t职工信息修改失败......." << endl;
}
}
}
}
cout << "\n\t<请按任意键如(回车)返回>" << endl;
getch();
}
//删除职工信息
void Mycontroller:: deleteworkerinfo()
{
system("cls"); //清屏
myshowinfo(); //显示系统信息
cout <<endl<<endl<<"\t 删除职工信息 ";
if (workerinfos.empty())
{
cout << "\n\t暂无职工信息......";
}
else
{
char wno[20]; //要删除职工的职工号
cout << "\n\t请输入要删除的职工号:";
cin >> wno;
int i, len = workerinfos.size();
for(i=0; i<len; i++)
{
if (strcmp(wno,workerinfos[i].getWno()) == 0)
{
cout <<endl<<endl<<"\t职工号" << "\t姓名" << "\t所属部门" << "\t性别" << "\t年龄" << "\t工资" << endl;
workerinfos[i].show();
break;
}
}
if (i>=len)
{
cout << "\n\t对不起!没有要删除的职工信息......";
}
else
{
int result=MessageBox(NULL,"确定要删除此职工信息吗?","确认提示",MB_YESNO|MB_ICONWARNING);
if(result==6) //确定按钮
{
workerinfos.erase(workerinfos.begin()+i);
//调用重写职工信息函数
if(rewriteworkerinfo())
{
cout << "\n\t职工信息删除失败......" << endl;
}
else
{
cout << "\n\t职工信息删除成功......" << endl;
}
}
}
}
cout << "\n\t<请按任意键如(回车)返回>" << endl;
getch();
}
//主函数
int main()
{
//创建控制类对象
Mycontroller mycon ;
if (mycon.mylogin() )
{
mycon.mymenu() ;
}
else
{
cout <<endl<<endl<<"\t对不起,登录失败,系统将自动退出....\n\t";
exit(0);
}
}