C语言人事管理.docx
《C语言人事管理.docx》由会员分享,可在线阅读,更多相关《C语言人事管理.docx(14页珍藏版)》请在冰豆网上搜索。
C语言人事管理
题目:
某高校主要人员有:
在职人员(行政人员,教师,一般员工),退休人员和临时工。
现在需要存储这些人员的人事档案信息,内容包括变好,姓名,性别,年龄,职务,职称,政治面貌,最高学历,任职时间,来院时间,人员类别。
其中人员编号唯一,不能重复。
(1)添加删除功能:
能根据学院人事的变动情况,添加删除记录
(2)查询功能:
能根据编号和姓名进行查询
(3)编辑功能(高级):
根据查询对相应的记录进行修改并存储
(4)统计功能:
能根据多种参数进行人员的统计(在职人员,党员人数,女工人数,高学历高学历人员(硕士学位以上或者副教授以上)),统计要求同时显示被统计者的信息。
(5)排序功能:
按照年龄,来院时间进行排序。
(6)保存功能:
能对输入的数据进行相应的存储。
程序代码:
#include/*根据实际存放位置修改此路径*/
/*初始化双链表*/
voidinit()
{
First=(TEACHER*)malloc(sizeof(TEACHER));/*为头结点申请空间*/
Last=First;/*将尾指针指向头结点*/
First->prior=Last;/*设置头结点的前驱指针*/
Last->next=First;/*设置头结点的后继指针*/
p=First;/*设置当前记录指针为头结点*/
}
/*创建教师信息循环双链表*/
voidcreate()
{
intunit,flag=0;
floattemp;
TEACHER*info;/*新增结点*/
init();
for(;;)
{
if(flag==1)break;/*标志为1,不再输入*/
clrscr();/*清屏*/
printf("Pleaseenterteacherinfomation\n");
printf("input@endenter\n");
info=(TEACHER*)malloc(sizeof(TEACHER));/*为新增结点申请空间*/
if(!
info)/*没有空间出错处理*/
{
printf("\noutofmemory");
exit(0);
}
printf("No:
");/*开始提示输入*/
scanf("%s",info->no);
if(info->no[0]=='@')/*输入@结束输入*/
{
flag=1;break;}
printf("Name:
");
scanf("%s",info->name);
printf("Sex:
");
scanf("%s",info->sex);
printf("Profess:
");
scanf("%s",info->profess);
printf("Dept:
");
scanf("%s",info->dept);
printf("Class:
");
scanf("%s",info->class);
printf("Workload:
");
scanf("%f",&temp);
info->workload=temp;
if(strcmp(info->profess,"prof"))unit=25;/*教授*/
if(strcmp(info->profess,"aprof"))unit=20;/*副教授*/
if(strcmp(info->profess,"lect"))unit=15;/*讲师*/
if(strcmp(info->profess,"ass"))unit=10;/*助教*/
info->lessonf=unit*info->workload;/*根据职称计算代课费*/
info->next=Last->next;/*新插入结点插在表末尾*/
info->prior=Last;/*新结点的前驱为原来的尾结点*/
Last->next=info;/*原来尾结点的后继为新结点*/
Last=info;/*新的尾结点为新结点*/
First->prior=Last;/*头结点的前驱为尾指针*/
}
return;
}
/*显示第一条记录*/
voidfirstr()
{
if(First==Last)return;
clear();
p=First->next;
print(p);
}
/*显示最后一条记录*/
voidlastr()
{
if(First==Last)return;
clear();
p=Last;
print(p);
}
/*显示前一条记录*/
voidpriorr()
{
if(First==Last)
return;
if(p->prior!
=First)
p=p->prior;
else
p=Last;
clear();
print(p);
}
/*显示下一条记录*/
voidnextr()
{
if(First==Last)
return;
if(p==Last)
p=First->next;
else
p=p->next;
clear();
print(p);
}
/*从文件读数据*/
voidload()
{
TEACHER*p1;
FILE*fp;
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("cannotopenfile\n");
return;
}
while(First->next!
=First)/*如果当前表不空,删除当前表*/
{
p1=First->next;
First->next=p1->next;
free(p1);
}
free(First);
First=(TEACHER*)malloc(sizeof(TEACHER));/*创建头结点*/
if(!
First)
{
printf("outofmemory!
\n");
return;
}
Last=First;
First->prior=Last;
Last->next=First;
p=First;
while(!
feof(fp))/*当文件不为空时读数据*/
{
p1=(TEACHER*)malloc(sizeof(TEACHER));
if(!
p1)
{
printf("outofmemory!
\n");
return;
}
if(1!
=fread(p1,sizeof(TEACHER),1,fp))
break;/*读数据*/
p1->next=Last->next;/*将新读出的数据链在当前表尾*/
p1->prior=Last;
Last->next=p1;
Last=Last->next;
First->prior=Last;
}
fclose(fp);/*关闭文件*/
}
/*保存数据到磁盘文件*/
voidsave()
{
FILE*fp;/*定义指向文件的指针*/
TEACHER*p1;/*定义移动指针*/
if((fp=fopen("data.txt","wb"))==NULL)/*为输出打开一个文本文件,如没有则建立*/
{
printf("cannotopenfile\n");/*如不能打开文件,显示提示信息,结束程序*/
return;/*返回*/
}
p1=First;/*移动指针从头指针开始*/
while(p1->next!
=First)/*如p1不为空*/
{
fwrite(p1->next,sizeof(TEACHER),1,fp);/*写入一条记录*/
p1=p1->next;/*指针后移,处理下一条记录*/
}
fclose(fp);/*关闭文件*/
}
/*删除记录*/
voiddelete()
{
TEACHER*p1;
if(First==Last)
return;/*表为空*/
if(p==First)/*p为头结点*/
p=First->next;
if(p==Last)/*p为尾结点*/
Last=p->prior;
p1=p;/*一般情况*/
p=p->next;
p1->prior->next=p1->next;
p1->next->prior=p1->prior;
free(p1);
}
/*输出记录*/
voidprint(TEACHER*p)
{
intx1=70,y1=100;
charstr[20];
outtextxy(x1+110,y1+75,p->no);
outtextxy(x1+360,y1+75,p->name);
outtextxy(x1+110,y1+105,p->sex);
outtextxy(x1+360,y1+105,p->profess);
outtextxy(x1+110,y1+135,p->dept);
outtextxy(x1+360,y1+135,p->class);
sprintf(str,"%f",p->workload);
outtextxy(x1+110,y1+165,str);
sprintf(str,"%f",p->lessonf);
outtextxy(x1+360,y1+165,str);
}
/*****清除界面显示信息******/
voidclear()
{
intx1=70,y1=100,m,n;
for(m=0;m<4;m++)
for(n=0;n<2;n++)
{
setfillstyle(1,WHITE);/*白色覆盖原有信息*/
bar(x1+n*250+100,y1+50+m*30+20,x1+n*250+200,y1+50+m*30+40);
}
}
/*sort排序函数*/
voidsort()
{
TEACHER*p0,*p00,*p1,*p11,*templast;
if(First->next==First||First->next->next==First)return;
p00=First;/*作排好序表的表头和第一个结点*/
p0=First->next;
p1=p0->next;
First->prior=p0;
p0->next=First;
templast=p0;
while(p1!
=First)/*当p1没有转回到表头时*/
{
p11=p1;/*将p11作为待插入结点*/
p1=p1->next;/*p1指向下一个待排序结点*/
p00=First;/*从头结点开始寻找插入位置*/
p0=p00->next;/*p0是p00的后继*/
while(p0!
=First&&p11->workload>p0->workload)
{
p00=p0;/*当新插入结点比当前表结点大时,指针后移*/
p0=p0->next;
}
if(p0==First)/*如果p0移到了头结点*/
{
p11->next=p00->next;
p11->prior=p00;