员工工资管理(综合训练) (实训4)
2012-06-27 21:46
323 查看
4、员工工资管理(综合训练)
有N个员工,每个员工的数据包含工号(不重复)、姓名、两部分工资(基本工资、奖金)及平均工资,试设计一个员工工资管理系统,使之具备以下功能:
(1)主菜单
(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;
}
有N个员工,每个员工的数据包含工号(不重复)、姓名、两部分工资(基本工资、奖金)及平均工资,试设计一个员工工资管理系统,使之具备以下功能:
(1)主菜单
|
(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;
}
相关文章推荐
- 用C++编写一个简单的员工工资管理系统~
- c++实训报告之高校工资管理系统
- C# WindowsForm 员工管理系统五【查看工资】
- 【雪野实训记录】Oracle宾馆管理系统-L2综合项目案例
- C++实现员工工资管理系统
- “中软综合项目实训”——把学生当员工培养
- Swing企业员工工资管理系统v1.4(java毕业设计)
- 3.6 考试管理系统——类图综合训练
- C++面向对象,泛型编程 文件流综合应用-公司员工管理系统
- 客运综合管理系统项目—报班统计(员工报班)
- 纯C实现员工工资管理系统
- 《火球——UML大战需求分析》(第3章 分析业务模型-类图)——3.6 考试管理系统(类图综合训练)
- B/S架构实现员工工资管理系统(含源码)
- 客运综合管理系统项目—附加(员工图片的上传)
- 小蓝退出舞台,谁能挺过O2O的第一个寒冬?小蓝单车素来以“体验好、管理精细”自居。此前,先是有员工在某职场社交平台发布消息,称小蓝单车宣布解散,拖欠员工工资至2018年2月10日。随后,不时有这家公司
- java swing mysql实现的员工工资管理系统项目源码附带视频教程
- (C++)员工工资管理系统
- 中高层管理者的现代管理综合技能提升训练
- 中高层管理者的现代管理综合技能提升训练
- 员工工资管理系统