求C++大神改程序
  • 浏览:1079 评论:10 人

  • 职工工资管理
    1. 职工属性:编号,姓名,性别,基本工资,职务工资,水电费。
    2. 要求:
    (1)主菜单设计:按基本要求进行
    (2)记录输入:对每一个职工的编号、姓名、性别、基本工资、职务工资、水电费,进行输入并存储在数据文件中。
    (3)显示记录:以列表方式显示全部记录
    (4)维护记录。能够实现添加、删除、修改职工记录,结果存储到文件中。修改纪录可以对任意记录的数据进行修改并在修改前后对记录内容进行显示;删除记录可以删除文件中的任意一个纪录。
    (5)查询记录。根据编号、姓名等查询职工的信息。如:根据编号显示某个编号的记录;根据姓名显示记录;显示高于平均工资水平的职工,可能有多个记录。
    (6)统计记录。计算每个职工的应发工资(基本工资+职务工资)和实发工资(应发工资-水电费),并以列表的方式显示;计算所有职工的人数。
    (7)设计、输入职工数据记录,基本与实践情况相似,记录数不少于10条,能反应以上所有要求。




    //职工成绩管理系统
    #include <iomanip>
    #include <iostream>
    #include <fstream>
    #include <malloc.h>
    #include <stdlib.h>
    #include <string.h>
    #define NULL 0
    int const N=20;
    #define LEN sizeof(struct epployee)
    using namespace std;
    int n=0; //定义一个全局变量统计职工人数




    //定义一个职工信息的结构体
    struct epployee
    {
    char name[N]; //用来存放姓名
    char sex[N]; //用来存放性别
    long id; //用来存放编号
    float paid[3]; //用来存放工资
    int total; //用来存放总工资
    struct epployee *next;
    };


    //职工类
    class Information
    {
    public:
    Information() ; //构造函数.
    ~Information() ; //析构函数.
    epployee *creat(); //建立链表
    void output(epployee *head); //显示职工信息
    int count(epployee *head); //定义函数count()统计职工总数
    epployee *insert(epployee*head); //指针函数*insert()用来添加职工信息.
    epployee *cancel(epployee *head,long id); //指针函数*cancel()用来删除职工信息.
    epployee *find(epployee *head,long id); //指针函数*find()用来查找职工信息.
    epployee *modify(epployee *head,long id); //指针函数*modife()用来修改职工的信息.
    void sort(epployee *head); //定义paixu()函数将职工的总额从大到小排列并输出
    void average(epployee *head); //定义职工工资平均值的函数
    void save(epployee *head); //保存文件信息
    epployee *Read(); //读取文件信息
    private:
    epployee *p1,*p2,*p3,*head,st;
    };


    Information::Information()
    {cout<<"*********************************************************************\n";
    cout<<"-------------------<<欢迎您使用职工工资管理系统>>-------------------\n";
    cout<<"*********************************************************************\n\n";
    }


    //作者的信息和提示
    void editor()
    {
    cout<<"\n\t\t\t本程序制作者:\n\n\t\t\t hehe \n\n\t\t\tQQ :123456789";
    cout<<"\n\n\t\t\tMade By VC6.0++\n\n\t\t\t2014年7月03日\n\n\t\t\t按<Enter>键进入登陆界面!!";
    }


    Information::~Information()
    { cout<<" *********************************************************************\n";
    cout<<" -----------------<<谢谢您使用职工工资管理系统>>------------------------\n";
    cout<<" **********************************************************************\n";
    }




    //建立链表信息
    epployee *Information::creat(void)
    {//定义一个指向struct epployee的结构体指针函数*creat()用来录入职工信息.
    char ch[N];n=0; //用来存放职工姓名
    p1=p2=(epployee *)malloc(LEN);//调用malloc()函数用来开辟一个新的存储单元
    cout<<" -------------<<请建立职工信息表,在姓名处键以 # 结束输入!>>--------------"<<endl;
    cout<<" 姓名:";
    cin>>ch;
    head=NULL; //给指针head赋初值
    while (strcmp(ch,"#")!=0) //调用字符比较函数strcmp()用来判断是否继续输入
    {
    p1=(epployee *)malloc(LEN); //调用malloc()函数用来开辟一个新的存储单元
    strcpy(p1->name,ch); //将循环结构前面输入的姓名复制到结构体名为p1的数组name中
    cout<<" 性别:";
    cin>>p1->sex;
    cout<<" 编号:";
    cin>>p1->id;
    while((p1->id)<0||(p1->id)>100000) //判断输入的编号是否有效(100000个)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<1000000): ";
    cin>>p1->id;
    }
    cout<<" 基本工资:";
    cin>>p1->paid[0];
    while((p1->paid[0])<0||(p1->paid[0])>100000) //判断输入的分数是否有效(>=0 <=100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->paid[0];
    }
    cout<<" 职务工资:";
    cin>>p1->paid[1];
    while((p1->paid[1])<0||(p1->paid[1])>100000) //判断输入的分数是否有效(>=0 <=100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->paid[1];
    }
    cout<<" 水电费:";
    cin>>p1->paid[2];
    while((p1->paid[2])<0||(p1->paid[2])>100000) //判断输入的分数是否有效(>=0 <=100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->paid[2];
    }
    p1->total=p1->paid[0]+p1->paid[1]+p1->paid[2]; //计算总额
    if(n==0)head=p1; //如果是输入第一组职工信息就将指针p1赋给指针head
    else p2->next=p1; //否则将p1赋给p2所指结构体的next指针
    p2=p1; //将指针p1赋给指针p2
    n++; //将职工人数n的值加1
    cout<<"\n 姓名:";
    cin>>ch; //将输入的姓名存放到字符数组ch中
    }
    p2->next=NULL; //将p2所指结构体的next指针重新赋空值
    return (head);//将输入的第一组职工信息返回
    }


    //定义output()函数将职工的信息从头指针所指内容开始输出
    void Information::output(epployee *head)
    {
    //system("cls");
    if(head==NULL) cout<<" 这是一个空表,请先输入职工信息!\n";
    else{
    cout<<"-------------------------------------------------------------------------------\n";
    cout<<" *职工工资信息表*\n";
    cout<<"-------------------------------------------------------------------------------\n";
    cout<<"|编 号| |姓 名| |性别| |基本工资| |职务工资| |水电费| |总额|\n";
    cout<<"-------------------------------------------------------------------------------\n";
    p1=head; //将头指针赋给p
    do
    {
    cout<<setw(6)<<p1->id
    <<setw(14)<<p1->name
    <<setw(11)<<p1->sex
    <<setw(11)<<p1->paid[0]
    <<setw(15)<<p1->paid[1]
    <<setw(13)<<p1->paid[2]
    <<setw(13)<<p1->total<<endl;
    cout<<"-------------------------------------------------------------------------------\n";
    p1=p1->next; //将下一组职工信息的next指针赋给p
    }while(p1!=NULL); //若指针p非空则继续,目的是把所有的职工信息都传给指针p然后输出.
    }
    }




    /**************************修改职工数据**************************/
    epployee *Information::modify(epployee *head,long id)
    {
    //system("cls");
    cout<<"\t----------------<<请输入须修改的职工工资信息>>----------------\n"<<endl;
    p1=(epployee *)malloc(LEN); //使p1指向输入的结点
    p1=head; //否则将头指针赋给p1
    while(id!=p1->id&&p1->next!=NULL)
    //寻找结点当p1所指的职工编号不是输入的职工编号并且p1所指的next指针不为空
    {
    p1=p1->next; //p2指向原p1指向的结点p1后移一个结点
    }
    if(id==p1->id) //如果要查找的职工编号是p1所指的职工编号
    {
    cout<<"你需要修改的职工信息如下:\n";
    cout<<"------------------------------------------------------------------------------\n";
    cout<<"|编 号| |姓 名| |性别| |基本工资| |职务工资| |水电费| |总额|\n";
    cout<<"------------------------------------------------------------------------------\n";
    cout<<setw(6)<<p1->id
    <<setw(10)<<p1->name
    <<setw(10)<<p1->sex
    <<setw(10)<<p1->paid[0]
    <<setw(15)<<p1->paid[1]
    <<setw(12)<<p1->paid[2]
    <<setw(12)<<p1->total<<endl;
    cout<<"------------------------------------------------------------------------------\n";
    cout<<" 编号:";
    cin>>p1->id;
    while((p1->id)<0||(p1->id)>100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->id; //将输入的编号存放到p1所指结构体的数组id中
    }
    cout<<" 姓名:";
    cin>>p1->name; //将输入的姓名存放到结构体名为p1的数组name中
    cout<<" 性别:";
    cin>>p1->sex;
    cout<<" 基本工资:";
    cin>>p1->paid[0];
    while((p1->paid[0])<0||(p1->paid[0])>100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->paid[0]; //将输入的基本工资存放到p1所指结构体的数组paid中
    }
    cout<<" 职务工资:";
    cin>>p1->paid[1];
    while((p1->paid[1])<0||(p1->paid[1])>100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->paid[1]; //将输入的加班工资存放到p1所指结构体的数组paid中
    }
    cout<<" 水电费:";
    cin>>p1->paid[2];
    while((p1->paid[2])<0||(p1->paid[2])>100000)
    {
    cout<<" 对不起,您的输入错误!请重新输入(>0<100000): ";
    cin>>p1->paid[2]; //将输入的其他奖金存放到p1所指结构体的数组paid中
    }
    p1->total=p1->paid[0]+p1->paid[1]+p1->paid[2]; //计算总分
    }
    else
    cout<<" 需要修改的信息中没有编号为"<<id<<"的职工.\n\n"; //没有想要修改的结点信息
    getchar();
    return(head);
    }
    //查找职工信息
    epployee *Information::find(epployee *head,long id)
    //定义一个指向struct epployee的结构体指针函数*find()用来查找职工信息.
    {
    //system("cls");
    if(head==NULL) //若调用次函数以前的头指针head为空
    {
    cout<<" 这是一个空表,请先输入职工信息!\n";
    return(head);
    }
    else
    {
    p1=head; //否则将头指针赋给p1
    while(id!=p1->id&&p1->next!=NULL)
    //寻找结点当p1所指的职工编号不是输入的职工编号并且p1所指的next指针不为空
    {
    p1=p1->next; //p2指向原p1指向的结点p1后移一个结点
    }
    if(id==p1->id) //如果要查找的职工编号是p1所指的职工编号
    {
    cout<<"------------------------------------------------------------------------------\n";
    cout<<"|编 号| |姓 名| |性别| |基本工资| |职务工资| |水电费| |总额|\n";
    cout<<"------------------------------------------------------------------------------\n";
    cout<<setw(6)<<p1->id
    <<setw(10)<<p1->name
    <<setw(10)<<p1->sex
    <<setw(10)<<p1->paid[0]
    <<setw(14)<<p1->paid[1]
    <<setw(12)<<p1->paid[2]
    <<setw(12)<<p1->total<<endl;
    cout<<"------------------------------------------------------------------------------\n";
    }
    else
    cout<<"信息中没有编号为"<<id<<"的职工.\n"; //结点没找到
    return(head);
    }
    }


    //定义sort()函数将职工的工资总额从大到小排列并输出
    void Information::sort(epployee *head)
    {
    //system("cls");
    int i,k,m=0,j;
    epployee *p[N];//定义一个指向struct epployee的结构体指针数组p
    if(head!=NULL)//如果头指针是空则继续
    { m=count(head);
    cout<<"------------------------------------------------------------------------------\n";
    cout<<" *职工工资统计表*\n";
    cout<<"------------------------------------------------------------------------------\n";
    cout<<"|编号| |姓名| |性别| |基本工资| |职务工资| |水电费| |总额| |名次|\n";
    cout<<"------------------------------------------------------------------------------\n";
    p1=head;
    for(k=0;k<m;k++)
    {
    p[k]=p1;
    p1=p1->next;
    }
    for(k=0;k<m-1;k++) //选择排序法
    for(j=k+1;j<m;j++)
    if(p[k]->total<p[j]->total)
    {
    p2=p[k];
    p[k]=p[j];
    p[j]=p2;
    } //从大到小排列的指针
    for(i=0;i<m;i++)
    {
    cout<<setw(6)<<p->id
    <<setw(8)<<p->name
    <<setw(9)<<p->sex
    <<setw(10)<<p->paid[0]
    <<setw(10)<<p->paid[1]
    <<setw(15)<<p->paid[2]
    <<setw(11)<<p->total
    <<setw(10)<<i+1<<endl;
    cout<<"------------------------------------------------------------------------------\n";
    }
    }
    }




    //求各工资的平均值的函数
    void Information::average(epployee *head)
    {


    int k,m;
    float arg1=0,arg2=0,arg3=0;
    if(head==NULL)//如果头指针是空则继续
    {
    cout<<" 这是一个空表,请先输入职工信息!\n";
    }
    else
    {
    m=count(head);
    p1=head;
    for(k=0;k<m;k++)
    {
    arg1+=p1->paid[0];
    arg2+=p1->paid[1];
    arg3+=p1->paid[2];
    p1=p1->next;
    }
    arg1/=m;arg2/=m;arg3/=m;
    cout<<" *各项工资的平均值*\n";
    cout<<"------------------------------------------------------------------------------\n";
    cout<<"\t\t基本工资的平均值: "<<setw(4)<<arg1<<"\n"<<"\t\t加班工资的平均值: "<<setw(4)<<arg2
    <<"\n"<<"\t\t奖金的平均值: "<<setw(4)<<arg3<<"\n";
    cout<<"------------------------------------------------------------------------------\n";
    }
    }


    //保存函数.
    void Information::save(epployee *head)
    {
    //system("cls");
    ofstream out("data",ios::out);
    out<<count(head)<<endl;
    while(head!=NULL)
    { out<<head->name<<"\t"
    <<head->id<<"\t"<<"\t"
    <<head->sex<<"\t"
    <<head->paid[0]<<"\t"
    <<head->paid[1]<<"\t"
    <<head->paid[2]<<"\t"
    <<head->total<<endl;
    head=head->next;
    }
    }


    //读取文件的信息
    epployee *Information::Read()
    {
    //system("cls");
    int i=0;
    p1=p2=( epployee *)malloc(LEN);
    head=NULL;
    ifstream in("data",ios::out);
    in>>i;
    if(i==0){cout<<" data 文件中的数据为空,请先输入数据!"<<endl; return 0;}
    else {
    cout<<"\n原文件已保存的信息如下:\n";
    cout<<" ………………………………………………………………………………………………"<<endl;
    cout<<"|姓 名| |编 号| |性别| |基本工资| |职务工资| |水电费| |总额|\n";
    cout<<" ………………………………………………………………………………………………"<<endl;
    for(;i>0;i--)
    {
    p1=(epployee *)malloc(LEN);
    in>>st.name>>st.id>>st.sex
    >>st.paid[0]>>st.paid[1]>>st.paid[2]>>st.total;
    strcpy(p1->name,st.name);
    p1->id=st.id;
    strcpy(p1->sex,st.sex);
    p1->paid[0]=st.paid[0];
    p1->paid[1]=st.paid[1];
    p1->paid[2]=st.paid[2];
    p1->total=st.total;
    if(n==0)head=p1; //如果是输入第一组职工信息就将指针p1赋给指针head
    else p2->next=p1; //否则将p1赋给p2所指结构体的next指针
    p2=p1; //将指针p1赋给指针p2
    n++; //将n的值加1
    //显示读入数据
    cout<<" "<<p1->name<<"\t"
    <<p1->id<<" \t"
    << p1->sex <<" \t"
    << p1->paid[0] <<" \t"
    << p1->paid[1] <<" \t"
    << p1->paid[2] <<" \t"
    << p1->total<<endl;
    cout<<" ………………………………………………………………………………………………"<<endl;
    }
    cout<<" 数据已经成功读取完毕!\n\n"<<endl;
    p2->next=NULL;
    return (head);
    }

    }




    @围剿大叔 骚受来看看






         ~来自小米2s世界最强四核机,抢二楼就是这么随意,顺便喷楼下一脸热翔。知道我为什么不喷三楼吗?因为我怕有人单身几十年,手速突破天际,我抢不过。