2015 C++暑期实训(下)

本文介绍了一个教职工薪资管理系统的设计与实现,包括人员信息管理、薪资计算、查询等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

实训(上)的链接(代码的功能):http://blog.youkuaiyun.com/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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值