您的位置:首页 > 编程语言 > C语言/C++

2015 C++暑期实训(下)

2015-11-01 20:21 302 查看
这个(下)隔了好久,现在也算是秋天了,把以前实训的代码补上吧,虽然没有写的很好,不过还是得了优,可能和一个人做的有关系吧。

实训(上)的链接(代码的功能):http://blog.csdn.net/thehide/article/details/48463183

C++代码(这个代码没有将全局函数封装在school类里面,交上去的代码是封装好的,有兴趣的可以试试。其实是我找不到那个代码了。。。)

#include <windows.h>
#include <iostream>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <algorithm>
#include <fstream>
#include <conio.h>
#define MAXN 11000
using namespace std;
int nOfStaff=0; //初始人员数,置零
string passNumber;
bool Is_updata=false;//判断每次程序信息是否被修改
string st[7]={"admin","教师","实验员","行政人员","教师兼任实验员","教师兼任行政人员"};//以st[number]类型的操作来实现相关职业的输出
//People类的定义
class People
{
public:
People(){key=10;number=0;cardNumber+='#';}
People(string ,string ,int ,int ,int ,int); //构造函数
string getName(){return name;} //以下6个系列函数,返回成员的信息
string getCardNumber(){return cardNumber;}
int getKey()const {return key;}
int getNumber(){return number;}
int getLastWorkload(){return LastWorkload;}
int getWage(){return wage;}
void displayData(int f);
void updataTheNumber(int num){number=num;}
static void addSum(long long addn){sumMoney+=addn;}//静态成员函数,对静态成员的总工资进行加减操作
static long long getSum(){return sumMoney; }//静态成员,提供总工资数
private:
static long long sumMoney;
string cardNumber;
string name; //职工的姓名
int number; //职工的编号,自行产生
int LastWorkload; //上学期工作量
int ClassFee; //课程费=(上学期工作量-基本工作量)*20
int wage; //总月工资=基本工资+课程费
int key; //用st[key]表示职工类型
};
long long People :: sumMoney=0;//静态成员初始化
People :: People(string n,string c,int num,int l,int w,int k)
{
name=n; cardNumber=c ;number=num; LastWorkload=l; wage=w; key=k;
}
//函数功能:输出成员信息
void People :: displayData(int f)
{
printf("\t编号:%06d\n",number);
cout << "\t姓名:"<< name;
if(f) cout << " \t职工类型:" << st[key] <<endl;
else cout <<endl;
cout << "\t月工资:"<< wage <<endl;
cout <<endl;
return ;
}
//重载:按职业进行排序
inline bool operator < (const People &a,const People &b)
{
return a.getKey() < b.getKey();
}
People staff[MAXN];//设置总人数,程序开始设计
//函数功能:输入密码程序
string getPassNumber()
{
string tmp;
char ch;
while((ch=getch())!='\r')
{
if(ch=='\b')
{
putch(ch);
putch(' ');
putch(ch);
if(!tmp.empty())
tmp=tmp.erase(tmp.size()-1,1);
}
else if(isprint(ch))
{
putch('*');
tmp+=ch;
}
}
printf("\n");
return tmp;
}
void updataImformation(); //函数使用次序问题
void inputToFiles(); //同上
void Start();
//函数功能:选择结束
void Finish()
{
system("CLS");
//当选择退出的时候,同样需要更新信息
updataImformation();
cout << "\n\n\n------------------------------欢迎下次使用,再见!------------------------------\n\n\n" <<endl;
exit(1);
}
//函数功能:更新信息到文件
void updataImformation()
{
ifstream is;
is.open ("inPut.txt", ios_base::binary );
is.seekg (0, ios_base::end);
int length = is.tellg();
if(Is_updata||length==0) inputToFiles();
return ;
}
//函数功能:结尾控制函数,选择是否要返回
void Control()
{
cout << "返回开始菜单请按 r ,退出请按 e:";
char ch;cin >>ch;
system("CLS");
if(ch=='r') Start();
else Finish();
}
//函数功能:设置初始密码总程序
void passWordSetting()
{
string tmp;
bool flag=false;
cout << "您好,初次使用本程序,请先设置管理员密码:";
for(;!flag;)
{

passNumber=getPassNumber();
cout << "请再输入一次:" ;
tmp=getPassNumber();
if(tmp==passNumber) {
flag=true;
cout << "设置密码成功!3秒后进入添加菜单・・・・"<<endl;
}
else
{
system("CLS");
cout << "两次输入的密码不同,请重新输入:";
}
}
Sleep(3000);
system("CLS");
}
//函数功能:添加信息程序
void Init()
{
fflush(stdin);
string tname;cout << "姓名:";getline(cin,tname);//防止国外姓名中的空格等

int tLastWorkload=0;cout << "上学期工作量(行政人员请输入0,其余输入总工作量):";cin >> tLastWorkload;

int tclassFee=0;//课程费

char key;cout << "类型:1、教师,2、实验员,3、行政人员,4、教师兼任实验员,5、教师兼任行政人员"<<endl;cin >> key;

int tBasicSalary=0;
while(tBasicSalary==0)
{
//以下根据不同职工类型进行不同的工资计算方法
switch(key){
case '1':tclassFee=(tLastWorkload-150)*20;tBasicSalary=800;break;
case '2':tclassFee=(tLastWorkload- 70)*20;tBasicSalary=650+150;break;
case '3':tBasicSalary=750+250;break;
case '4':tclassFee=(tLastWorkload-150-70)*20;tBasicSalary=800+650+150;break;
case '5':tclassFee=(tLastWorkload - 150)*20;tBasicSalary=800+750+250;break;
default:{
system("CLS");
cout << "输入错误,请重新输入"<<endl;
cout << "1、教师,2、实验员,3、行政人员,4、教师兼任实验员,5、教师兼任行政人员"<<endl;
cin >> key;
}
}
}
fflush(stdin);
//银行卡功能:
cout << "是否需要转入银行卡,如需请输入银行卡号,否则请按任意键继续:" ;string card;cin >> card;
const int len=card.length();
if(len>=15)//一般银行卡卡号位数均大于16位,若小于16,则默认为不需要银行卡
{
char toop;
while(1)
{
cout << "请确认卡号:"<<card <<endl;
cout << "重新输入请按 y ,确认完毕按其他键继续:"<< endl;
cin >> toop;
if(toop=='y') break;
cin >> card;
}
}
else card="#";
fflush(stdin);
//自动生成编号
int tnumber;
if(nOfStaff==0) tnumber=1;
else tnumber=staff[nOfStaff-1].getNumber()+1;//严格保持编号不重复
//进行初始化赋值
People *now = new People(tname,card,tnumber,tLastWorkload,tclassFee+tBasicSalary,key-'0');
staff[nOfStaff++]=*now;
delete now;
staff[nOfStaff-1].addSum(tclassFee+tBasicSalary);
system("CLS");
cout << "添加成功!继续添加请按 y ,按 # 返回" ;char ch;cin >> ch;
if(ch=='y')
Init();
else
return ;
}
//函数功能:删除信息
void Delete()
{
fflush(stdin);
cout << "请输入需要删除人的姓名:" ;
string tname;
getline(cin,tname);
cout << "输入该人员的编号以确认:" ;
int tnumber;
cin >> tnumber;
int i=0;
for(i=0; i<nOfStaff; i++)
{
if(tname==staff[i].getName()&&tnumber==staff[i].getNumber())
break;
}

if(i>=nOfStaff)
{
cout << "查询无此人!即将返回开始菜单・・・・・"<<endl;
Sleep(1000);
Start();
}
else
{
//删除某人信息时,注意在总工资量中减去该人员的工资
long long tmp=-staff[i].getWage();
staff[i].addSum(tmp);
for(int j=i; j<nOfStaff-1; j++)
{
staff[j]=staff[j+1];
}
nOfStaff--;
cout << "删除成功!如需继续删除,请按 y ,按其他键返回:";
char ch;
cin >> ch;
if(ch=='y')
Delete();
else
Start();
}
}
//函数功能:查询单人信息
void funSingle()
{
system("CLS");
cout << "请输入要查询人的姓名:"<<endl;
string tname;
fflush(stdin);
getline(cin,tname);
system("CLS");
int m=0;
People tmp[100];
for(int i=0;i<nOfStaff;i++)
{
if(tname==staff[i].getName())
{
tmp[m++]=staff[i];
}
}
cout << "共找到 "<< m <<" 位该名字职工信息:"<<endl;
for(int i=0;i<m;i++)
tmp[i].displayData(1);
Control();
}
//函数功能:输出单职业信息
void funSubject()
{
system("CLS");
cout << "输入要查询的职工类型:"<<endl;
cout << "1、教师,2、实验员,3、行政人员,4、教师兼任实验员,5、教师兼任行政人员"<<endl;
char key;cin >> key;
int flag = false,t=key-'0';
while(!flag)
{
system("CLS");
if(t>=1&&t<=5)
flag = true;
else{
cout << "输入错误,请重新输入"<<endl;
cout << "1、教师,2、实验员,3、行政人员,4、教师兼任实验员,5、教师兼任行政人员"<<endl;
cin >> key ;
}
}
cout << st[t] << endl;
int sumOfSub=0,sumMon=0;
for(int i=0;i<nOfStaff;i++)
{
if(staff[i].getKey()==t)
{
staff[i].displayData(0);
sumOfSub++;
sumMon+=staff[i].getWage();
}
}
cout << "以上为找到 "<<sumOfSub<<" 位相关人员信息"<<endl;
cout << "该职工类型总计 "<< sumMon << "元" <<endl;
Control();
return ;
}
//函数功能:输出全部成员信息
void funAll()
{
system("CLS");
int cnt=0,count=0;
for(int i=0;i<nOfStaff;i++)
{
if(staff[i].getKey()!=cnt)
{
if(i!=0) cout << "\t以上职工共计 "<<count << " 人"<<endl;
cnt=staff[i].getKey();count=0;
cout <<"|----"<<st[cnt]<< " 月工资情况 ----|" <<endl;
}
staff[i].displayData(0);count++;
}if(nOfStaff!=0 ) cout << "\t以上职工共计 "<<count << " 人"<<endl;
Control();
return;
}
//函数功能:管理员后续操作
void funManagement()
{

system("CLS");
//次循环用于确认密码是否正确
while(1)
{
string s;
cout << "请输入密码:";
cin >> s;
if(s==passNumber)
break;
else{
cout << "按 r 重新输入,其他键返回上一级:";
char ch;
cin >> ch;
system("CLS");
if(ch=='r') continue;
else { Start(); return;}
}
}
Is_updata=true; //进入这一步,程序默认为需要修改信息,在后续退出时,会相应的更正信息
system("CLS");
cout << "密码确认成功!请选择:\n" << endl;
cout << " 1.添加人员 2.删除人员 3.重排编号(此操作会改变原有人员编号) 4.查看费用情况 \n" <<endl;
cout << " 5.返回上一层 6.退出 \n" <<endl;
char ch;bool flag=false;
cin >> ch;
while(!flag)
{
//添加人员信息,调用输入函数
if(ch=='1'){
Init();
cout << "操作成功!";
Control();
flag=true;
}
//删除人员信息
else if(ch=='2')
{
Delete();
flag=true;
}
//更新编号
else if(ch=='3')
{
system("CLS");
for(int i=0;i<nOfStaff;i++)
staff[i].updataTheNumber(i+1);
cout << "编号更新完成,即将返回页面・・・・" <<endl;
Sleep(2000);
Control();
flag=true;
}
//输出总金额
else if(ch=='4')
{
system("CLS");
long long sumOfcardFee=0;
for(int i=0;i<nOfStaff;i++)
{
string str=staff[i].getCardNumber();
if(isdigit(str[0]))
sumOfcardFee+=staff[i].getWage();
}
long long m=staff[0].getSum();
cout << "总共需要 " << m << " 元/月"<< endl;
cout << "其中需要现金 " << m-sumOfcardFee << " 元/月"<< endl;
cout << "共需 " << sumOfcardFee << " 元/月打入职工银行卡中"<< endl;
Control();
flag=true;
}
//返回
else if(ch=='5')
{
Start();
flag=true;
}
else if(ch=='6') Finish();
else{
system("CLS");
cout << "输入错误,请重新输入:\n" << endl;
cout << " 1.添加人员 2.删除人员 3.重排编号(此操作会改变原有人员编号) 4.查看费用情况 \n" <<endl;
cout << " 5.返回上一层 6.退出 \n" <<endl;
cin >> ch;
}
}
return;
}
//函数功能:程序开始界面
void Start()
{
system("CLS");
printf("\n\n");
cout << "-----------------------------------欢迎使用!-----------------------------------" <<endl;
printf("\n\n\n");
cout <<" 1.单人月工资 2.单职业工资 3.全员工资 " <<endl;
cout <<" 4.管理(需密码访问) 5.退出 " <<endl;
printf("\n\n\n");
cout << "--------------------------------------------------------------------------------" <<endl;
printf("请选择:");
char ch;
bool flag=false;
cin >> ch;
while(!flag)
{
switch(ch){
case '1':funSingle();flag=true;break;
case '2':funSubject();flag=true;break;
case '3':funAll();flag=true;break;
case '4':funManagement();flag=true;break;
case '5':Finish();break;
//选择界面拥有容错的能力,输入其他键时提示重新输入
default:{
system("CLS");
cout << "-----------------------------输入错误,请重新输入!-----------------------------" <<endl;
printf("\n\n\n");
cout <<" 1.单人月工资 2.单职业工资 3.全员工资 " <<endl;
cout <<" 4.管理(需密码访问) 5.退出 " <<endl;
printf("\n\n\n");
cout << "--------------------------------------------------------------------------------" <<endl;
cin >> ch;
}
}
}
Control();
}
//函数功能:将每一次修改的信息保存到txt文件中,将程序重启后可以继续以前的信息
void inputToFiles()
{
ofstream outOp;
outOp.open("inPut.txt");
outOp << passNumber <<endl;
outOp << nOfStaff <<endl;
for(int i=0;i<nOfStaff;i++)
{
outOp << staff[i].getName() <<endl;outOp << staff[i].getCardNumber() <<endl;
outOp << staff[i].getKey() <<endl;
outOp << staff[i].getNumber() <<endl;
outOp << staff[i].getWage() <<endl;
outOp << staff[i].getLastWorkload() <<endl;
}
outOp << staff[0].getSum() <<endl;
//结束文件关联
outOp.close();
}
//函数功能:从txt文件中读取已有数据
void getInformationFromFiles()
{
ifstream inOp;
inOp.open("inPut.txt");
inOp >> passNumber;
inOp >> nOfStaff;
//从文件中读入信息,来构建staff[]成员
int key,number,wage,last;
string name,card;
for(int i=0;i<nOfStaff;i++)
{
inOp >> name >>card;
inOp >> key >> number >>wage >>last;
People *now= new People(name,card,number,last,wage,key);
staff[i]=*now;
delete now;
}
long long sum=0;
inOp >> sum;
staff[0].addSum(sum);
inOp.close();
}
//函数功能:判断刚开始启动程序时txt文件中是否有信息
void filesDoing(int length)
{
//若文件信息为空,则判断当前为初次使用
if(length==0)
{
passWordSetting();
cout << "请添加成员信息及上学期成员工作量:" <<endl;
Init();
sort(staff,staff+nOfStaff);
for(int i=0;i<nOfStaff;i++)
staff[i].displayData(1);
printf("以上是全员信息 ");system("pause");
//将修改过的数据输入到文件
inputToFiles();

}
else
{getInformationFromFiles(); sort(staff,staff+nOfStaff);}
}
int main()
{

//文件操作,判断文件是否为空,再判断是否要求读入
ifstream is;
is.open ("inPut.txt", ios_base::binary );//inPut.txt是一个文本文件
// get length of file:
is.seekg (0, ios_base::end);
int length = is.tellg(); // length 为0则文件为空
//文件操作结束
filesDoing(length);
Start();

//如果进行了管理员设置,那么将更.txt中的文件
updataImformation();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++