您的位置:首页 > 产品设计 > UI/UE

员工工资管理(综合训练) (实训4)

2012-06-27 21:46 323 查看
4、员工工资管理(综合训练)

有N个员工,每个员工的数据包含工号(不重复)、姓名、两部分工资(基本工资、奖金)及平均工资,试设计一个员工工资管理系统,使之具备以下功能:

(1)主菜单

员工工资管理系统

1、  工资录入

2、  工资查询

3、  工资统计

4、  退    出

 
 
(2)各菜单项功能

① 工资录入:输入员工的工号、姓名及两部分工资;

② 工资查询:按工号查询员工记录;

③ 工资统计:计算员工的平均工资;

根据员工的平均工资高低,对员工的数据进行排序后输出;

④ 退出:退出整个系统,即主菜单。

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

 

#define JOD_NUM    12               //工号为十二位;

#define NAME       10               //姓名最多五位;

 

typedef struct  personnel

{

         charjod_num[JOD_NUM];                      //工号;

         charname[NAME];                           //名字;

         doublebase_pay;                            //基本工资;

         doublebonus;                             //奖金;

         doubleave_pay;                           //平均工资;

        

         struct  personnel * next;

}Staff, *pStaff;

 

 

void jod_num_insert(pStaff ls, pStaff p)

{       

     if (NULL == ls->next)       

         {

                   ls->next= p;

         }

        

         else

         {

                   pStaffmiddle;           //中间交换;     

                   middle= ls;

                   ls= ls->next;

                  

                   while((NULL != ls) && (strcmp(ls->jod_num, p->jod_num) < 0))

                   {

                            middle= ls;                 //保存ls的值;      

                            ls= ls->next;

                   }

 

                   if(NULL == ls)

                   {

                            if(0 != strcmp(middle->jod_num, p->jod_num))        //不存在相同工号的两人;

                            {

                                     middle->next= p;

                            }

                            else

                            {

                                     printf("不得存在相同工号的家伙!\n");   

                            }

                   }

                   else

                   {

                            if(0 != strcmp(ls->jod_num, p->jod_num))

                            {       

                                     if(NULL != ls->next)                               //当前的下一个结点不为空,要比较是否与下一个结点相等;

                                     {

                                               if(0 != strcmp(ls->next->jod_num, p->jod_num))

                                               {

                                                        middle= ls->next;               //middle用作交换;

                                                        ls->next= p;

                                                        p->next= middle;           

                                               }

                                               else

                                               {

                                                        printf("不得存在相同工号的家伙!\n");

                                               }

                                     }

                                     else

                                     {          

                                               ls->next= p;

                                     }

                            }

                            else

                            {

                                     printf("不得存在相同工号的家伙!\n");      

                            }

                           

                   }

         }

 

}

 

 

 

 

void new_list(pStaff ls)             //新建链表;可以使用pStudent newlist(void),然后返回一个指针!

{       

         pStafffront;        //用于创建新的结点;

 

         while(true)

         {       

                   front= (pStaff)malloc(sizeof(Staff));  //动态分配;    

        

                   printf("请依次输入工号、姓名、基本工资和奖金\n");

                   scanf("%s",front->jod_num);

                   scanf("%
4000
s",front->name);

                   scanf("%lf",&front->base_pay);

                   scanf("%lf",&front->bonus);

                   front->next= NULL;

                  

                   while( 0 != fflush(stdin) )  //用于消除上诉输入过程中产生的流的影响,即输入过多的影响!                   

                   {                            

                   }                            

       

                   jod_num_insert(ls,front);     //插入算法;

                  

                   front= NULL;

 

                   charis_not;

                   printf("是否继续? n/y \n");

 

                   while(true)

                   {

                            scanf("%c",&is_not);

     

                            while(0 != fflush(stdin))    //清除流;

                            {

                            }

 

                            if(is_not == 'n')   //否就返回;

                            {

                                     return;

                            }

                            elseif (is_not== 'y') //是就返回1;

                            {

                                     break;

                            }

                            else

                            {

                                     printf("你的输入有误!请重新选择是否继续! n/y\n ");

                            }

                                                       

                   }

 

         }

}

 

 

void jod_num_query(pStaff ls)    //按工号查询信息;

{  

 

         if(NULL == ls->next)

         {

                   printf("员工为空!\n");

         }       

         else

         {

                   charjod_num[JOD_NUM];

                   printf("请输入要查询的工号\n");

                   scanf("%s",jod_num);

                   while( 0 != fflush(stdin) )                         

                   {                            

                   } 

                  

                   for(ls = ls->next; NULL != ls; ls = ls->next)

                   {

                            if(0 == strcmp(ls->jod_num, jod_num))

                            {

                                     printf("工号:%s\n", ls->jod_num); 

                                     printf("姓名:%s\n", ls->name);

                                     printf("基本工资:%.2lf\n", ls->base_pay);

                                     printf("奖金:%.2lf\n", ls->bonus);

 

                                     return;      //工号的单一性,无法输入相同的工号;

                            }

                   }

 

                   printf("找不到此人\n");

         }

}

 

 

void pay_statistics(pStaff ls)  //统计函数;

{       

         if(NULL == ls->next)

         {

                   printf("员工为空!\n");

         }

         else

         {       

                   pStaffmiddle;

                   middle= ls->next;

                   pStaffp;

                   pStaffpp;   //p的前一个结点;

                   pStaffpmiddle; //middle的前一个结点;

                   pStaffppp;  //p的后一个结点;

 

                   doubleave_pay;

                  

                   while(NULL!=middle)         //求总工资;

                   {

                            middle->ave_pay= middle->bonus + middle->base_pay; 

                            middle= middle->next;

                   }

 

                   for(pmiddle = ls, middle = ls->next; NULL!=middle->next; pmiddle=middle,middle=middle->next)   //排序算法;

                   {       

                            for(pp = middle, p=middle; NULL!=p; pp = p, p=p->next)

                            {

                                     if(middle->ave_pay < p->ave_pay)

                                     {

                                               if(middle->next!=p)     //不相邻两结点的交换;应该可以不分开,没时间了..

                                               {

                                                        pmiddle->next= p;    

                                                        pp->next= middle;

                                                        ppp= p->next;       //保存p的下一结点;

                                                        p->next= middle->next;

                                                        middle->next= ppp;

                                                       

                                                        p= pp->next;

                                                        middle= pmiddle->next;

                                                       

                                               }

                                               else

                                               {

                                                        pmiddle->next= p;

                                                        ppp= p->next;

                                                        p->next= middle;

                                                        middle->next= ppp;

 

                        p = p->next;     

                                                        middle= pmiddle->next;

                                                       

                                               }

                                     }

                                    

                            }

                   }

                   for(middle = ls->next; NULL!=middle; middle=middle->next)   //输出;

                   {

                            printf("工号:%s\n", middle->jod_num);

                            printf("姓名:%s\n", middle->name);

                            printf("基本工资:%.2lf\n", middle->base_pay);

                            printf("奖金:%.2lf\n", middle->bonus);

                            printf("平均工资:%.2lf\n", middle->ave_pay);

                   }

         }

        

}

 

int main(void)

{       

         pStaffls;

         ls= (pStaff)malloc(sizeof(Staff));      

         ls->next= NULL;                                                     //创建时,malloc不初始化!

 

 

   while(true)

    {

       printf("\t\t>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");

       printf("\t\t\t\t员工工资管理系统\n");

       printf("\t\t<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n\n");

       printf("\t\t\t1、工资录入\n\n");

             printf("\t\t\t2、工资查询\n\n");   

       printf("\t\t\t3、工资统计\n\n");

       printf("\t\t\t4、退出\n\n");

 

       char choice;

       printf("请选择操作:");

       scanf("%c", &choice);

                   while(0 != fflush(stdin))    //清除流;

                   {

                   }

 

       switch (choice)

       {

                            case'1':

                                     {

                                               new_list(ls);        //添加;

                                     }

                                     break;

                                       

            case '2':

                {

                                               jod_num_query(ls);     //工号查询;        

                }  

                                     break;

 

           case '3':

                {                

                                               pay_statistics(ls);    //平均工资统计函数;

                                     }

                                break;

                                      

           case '4':

                                     {

                                               exit(0);               //退出函数,可以用return 0;

                                     }

                                     break;      

 

            default:

                                      {

                                                printf("输入错误,返回主菜单!\n");                     

                 }

                                 break;

       }

       

    }

 

         return0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息