职工信息管理系统设计
第二篇:C语言课程设计报告(企业职工信息管理系统)
课程设计报告
学 院: 信息科学与工程学院
专 业:计算机科学与技术(软件外包)
班 级: 计算机1101
学 号:
学生姓名:
指导教师:
课程名称: 程序设计基础
设计名称: 企业职工人事信息管理系统
一、 设计内容及要求
企业职工人事基本信息包括:职工编号、姓名、性别、出生年份、职称(助工、工程师、高级工程师)、任现职年限、实发工资。
系统的主要功能包括:
1. 创建职工人事基本信息文件,根据提示输入职工的各项信息,将职工信息存储到一个二进制文件中。
2. 增加职工人事基本信息,在原有职工人事基本信息文件的基础上增加新的职工信息,要求保存至原文件,并提示用户选择是否继续进行添加操作。
3. 删除职工人事基本信息,提示用户输入要进行删除操作的职工编号,如果在文件中有该信息存在,则将该编号所对应的职工信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。
4. 修改职工人事基本信息,提示用户输入要进行修改操作的职工编号,如果在文件中有该息存在,则提示用户输入要修改的选项(职称、任现职年限),结果保存至原文件,并提示用户选择是否继续进行修改操作。
5. 按不同条件进行查询操作,输出满足条件的职工信息。
(1) 按职工编号查询,输入一个编号,输出对应的职工信息。
(2) 按姓名查询,输入全名。
6. 按不同条件对职工信息进行统计工作。
(1) 统计各职称岗位的职工人数是多少,计算高级工程师的比例。
(2) 计算企业职工的平均实发工资,并输出。
(3) 统计职工工资低于平均工资的人数,并输出他们的姓名和实发工资。
二、 设计思路
该系统分为六大功能,分别为创建、增加、删除、修改、查询、统计,所以总体上先从界面部分定义了六个函数,这些功能通过定义的函数一步步实现。每一个功能的实现通过字符数组的定义和使用以及各种函数的运用来解决。
三、 设计结果及分析
第一次写的程序虽然说能运行通过,但是没有把按不同条件统计职工信息以及删除工作功能实现,所以继续重做,一遍一遍的改正,结果程序改的乱七八糟,而且出现了许多错误,慢慢努力,总算勉强通过。
四、 总结
忙碌了一个多星期,在大家的共同努力下,我们总算将此程序设计出来。尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。
另外平时扎实的基础也很关键,因为如果你平时学得就不怎么样,那么你面对这么一个比较有难度的程序,你可能会望而却步,看他人的程序都是个难点,更别说让你自己去设计。为了解决此。类问题,最好就是多向同学,老师请教,不要怕难为情。尤其是老师,评他们多年的编写程序的经验,要解决我们的问题,对他们来说只是small case。
在设计这个程序时,我们刚开始是根据老师给我们提供的资料,用画图以及循环将框架设计出来,但是接下去便无从下手了,计算是个关键和难点,我们也查了相应的资料,但是它上面用得是坐标来做的,所以为了方便设计程序,我们也改为坐标来做的,这样计算问题解决了。接下去就是按键问题,我们的资料是用鼠标做的,所以关于按键这个函数就只能我们自己设计,还好手头有类似的资料,经过自己的反复尝试以及与与同学的讨论,这也不难,最好还是被我们搞定了。最后就是闪烁,这个设计的方法很死板,都一个类型,就是算坐标比较烦琐,要确定好它的位置,但是这些只要你自己愿意去尝试,问题都可以迎刃而解的。
从这一个多星期的设计过程中,我看到了大家的拼搏与努力,也让我知道团队精神得难能可贵,在遇到问题时,我们会共同进退,每个人都很慷慨不会因为是通过自己艰辛劳动设计出来的东西而不准他人剽窃了。
总之,这次设计程序让我受益良多,我会好好珍惜像这种难得的机会。
五、附录(源代码)
#include
#include
#include
#define N 50
#define M 2012
int number[N];
char name[N][N];
char sex[N][N];
int birthyear[N];
int workyear[N];
int salar[N];
static int employeenum=1;//定义全局变量来统计录入信息个数
char position[N][N];//职称
void Menu(void);//显示主菜单函数
void Found(void);//创建文件函数
void Look(void);//查看信息函数
void Add(void);//增加信息函数
void Dele(void);//删除信息函数
void Change(void);//修改信息函数
void Tongji(void);//统计信息函数
void Jiewei(void);//用于退出系统时的结束语言
int main(void)
{
char select;
Found();
while(1)
{
Menu();//调用Menu函数显示主菜单
scanf("%d",&select);//输入想选择的功能
fflush(stdin);
switch(select)//对select进行多分支选择
{
case 1: system("cls");Look();break;
case 2: system("cls");Add();break;
case 3: system("cls");Dele();break;
case 4: system("cls");Change();break;
case 5: system("cls");Tongji();break;
case 0: system("cls");printf("\n\t谢谢使用再见\n");Jiewei();exit(0);
default:system("cls");printf("\n\t按键有误,请重新选择!\n");
}
}
return 0;
}
//=====================================================//
//功能:显示系统菜单
//参数:无
//返回值:无
//主要思路:利用printf函数输出菜单
//====================================================//
void Menu(void)
{
printf("\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t※ ※\n");
printf("\t※ ******企业职工人事信息管理系统****** ※\n");
printf("\t※ ※\n");
printf("\t※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("================================================================================\n");
printf(" \t 王栋\t\t计算机1101\n");
printf("================================================================================\n");
printf("\n");
printf("\t请输入您要进行的操作: \n\n");
printf("\t 【**************************】\n");
printf("\t 【1.查询职工信息 】\n");
printf("\t 【2.增加职工信息 】\n");
printf("\t 【3.删除职工信息 】\n");
printf("\t 【4.修改职工信息 】\n");
printf("\t 【5.统计职工信息 】\n");
printf("\t 【0.退出系统 】\n");
printf("\t 【**************************】\n");
printf("\n");
printf("\t 请选择按键(0-5): ");
}
//=================================================//
//功能:创建职工信息文件,根据提示输入职工的各项信息,将职工信息存储到一个二进制文件中.
//主要思路:定义文件指针变量以读写形式创建一个文件,根据提示录入信息.
//================================================//
void Found(void)
{
int n=0;
FILE *fp;
if((fp=fopen("d:\\employee.dat","wb+"))==NULL)
{
printf("Can't open file!");
return;
}
printf("\n");
printf("\n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf(" ※ ※\n");
printf(" ※******欢迎使用企业职工人事信息管理系统******※\n");
printf(" ※ ※\n");
printf(" ※※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\n");
printf("=============================================================================\n");
printf("请按照提示创建职工信息\n");
printf("=============================================================================\n");
printf("\n");
found:
printf("1.输入编号: ");
scanf("%d",&number[0]);
printf("2.输入出生年份: ");
scanf("%d",&birthyear[0]);
printf("3.输入任现职年限: ");
scanf("%d",&workyear[0]);
printf("4.输入工资: ");
scanf("%d",&salar[0]);
fflush(stdin);
if((number[0]>0)&&(birthyear[0]>0&&birthyear[0]<=M)&&(workyear[0]>0&&workyear[0]<=M)&&(salar[0]>0))
{
fwrite(&number[0],4,1,fp);
printf("5.输入姓名: ");
scanf("%s",name[0]);
fwrite(name[0],1,1,fp);
printf("6.输入性别: ");
scanf("%s",sex[0]);
fwrite(sex[0],1,1,fp);
fwrite(&birthyear[0],4,1,fp);
fwrite(&workyear[0],4,1,fp);
fwrite(&salar[0],4,1,fp);
printf("7.输入职称(1.助工、2.工程师、3.高级工程师): ");
scanf("%s",position[0]);
fwrite(position[0],1,1,fp);
rewind(fp);
fread(&number[0],4,1,fp);
printf("%d号\t",number[0]);
fread(name[0],1,1,fp);
printf("姓名:%s\t",name[0]);
fread(sex[0],1,1,fp);
printf("性别:%s\t",sex[0]);
fread(&birthyear[0],4,1,fp);
printf("出生年份:%d\t",birthyear[0]);
fread(&workyear[0],4,1,fp);
printf("任现职年限:%d\t",workyear[0]);
fread(&salar[0],4,1,fp);
printf("工资:%d元\t",salar[0]);
}
else
{
system("cls");
printf("输入的信息中存在错误请重新输入,请注意编号出生年份任现职年限以及工资应大于0以及任现职年限以及出生年份应符合实际\n");
goto found;
}
system("cls");
fclose(fp);
}
//===========================================//
//功能:查找信息
//主要思路:利用循环及数组显示信息
//===========================================//
void Look(void)
{
int j,find,z,i;//find为查询方式的数字,j,z,i用于循环
char ch[2];//接受y/n和回车
char cw[N][N];//储存输入要查询的名字
FILE *fp;
if((fp=fopen("d:\\employee.dat","rb"))==NULL)
{
printf("Can't open file!");
return;
}
look1:;printf("请选择查询方式(按照编号查询请输入1,按照姓名查询请输入2.): ");
scanf("%d",&find);
fflush(stdin);
if((find==1)&&(employeenum>0))
{
do
{
printf("请输入编号进行查询: ");
scanf("%d",&j);
// fflush(stdin);
// printf("您要查找的职工编号为: %d\n",j);
for(i=0;i<=employeenum;i++)
{
if((number[i]==j)&&(number[i]>0))//找到相配匹的编号
{
printf("职工编号:%d\t姓名:%s\t性别:%s\t出生年份:%d\t工作年份:%d\t工资:%d",number[i],name[i],sex[i],birthyear[i],workyear[i],salar[i]);
printf("\n");
goto look;//与skip:相结合,无条件跳到skip,若循环找到编号,剩下的不必要的循环不需继续。
}
}
if(i==(employeenum+1))
{
printf("没查到该编号!");
fflush(stdin);
}
look:
printf("是否继续查询?(y/n):");
scanf("%s",ch);
}while(strcmp(ch,"y")==0);//用来重复查询
}
if(employeenum==0)
{
printf("当前系统中无职工信息,请添加后在进行操作!");
return;
}
if((find!=2)&&(find!=1))
{
printf("请输入1或0进行操作!");
goto look1;
}
if(find==2)
{
do
{
z=0;
printf("请输入姓名进行查询: ");
scanf("%s",cw[0]);
for(i=0;i<=employeenum;z++,i++)
{
if((strcmp(name[z],cw[0])==0)&&(number[z]>0))//找到想匹配的职工姓名,strcmp在头文件#include中
{
printf("您要查找的职工姓名为: %s\n",cw[0]);
printf("职工编号:%d\t姓名:%s\t性别:%s\t出生年份:%d\t任现职年限:%d\t工资:%d",number[z],name[z],sex[z],birthyear[z],workyear[z],salar[z]);
printf("\n");
}
}
if(i==(employeenum+1))
{
printf("没查到该姓名!");
fflush(stdin);
}
printf("是否继续查询?(y/n):");
scanf("%s",ch);
}while(strcmp(ch,"y")==0);
}
system("cls");
fclose(fp);
}
//=================================//
//功能:增加信息
//主要思路:利用do,while循环
//=================================//
void Add(void)
{
char ch[2];
int j,m;//m用于判断是否新输入的编号已经存在
static int i=1;//静态局部变量用于统计信息个数
FILE *fp;
if((fp=fopen("d:\\employee.dat","ab"))==NULL)
{
printf("Can't open file!");
return;//若文件打不开则返回主函数
}
do
{
add1:;
add2:;
m=0;
printf("输入编号: ");
scanf("%d",&number[i]);
printf("输入出生年份: ");
scanf("%d",&birthyear[i]);
printf("输入任现职年限: ");
scanf("%d",&workyear[i]);
printf("输入工资: ");
scanf("%d",&salar[i]);
fflush(stdin);
if(number[i]<=0||birthyear[i]<=0||workyear[i]<=0||salar[i]<=0||birthyear[i]>M||workyear[i]>M)
{
system("cls");
printf("输入信息有误请重新输入");
goto add2;
}
for(j=0;j
if(number[i]==number[j]&&number[i]>0)
{
m++;
goto add;//若存在重复编号结束循环跳到skip0处
}
add:;
if(m==0)//不存在重复编号可继续写入其他信息
{
fwrite(&number[i],4,1,fp);
printf("输入姓名: ");
scanf("%s",name[i]);
fwrite(name[i],1,1,fp);
printf("输入性别: ");
scanf("%s",sex[i]);
fwrite(sex[i],1,1,fp);
fwrite(&birthyear[i],4,1,fp);
fwrite(&workyear[i],4,1,fp);
fwrite(&salar[i],4,1,fp);
printf("输入职称(助工、工程师、高级工程师): ");
scanf("%s",position[i]);
fwrite(position[i],1,1,fp);
i++;
employeenum++;
}
if(m==1)//若有重复编号则跳回skip9,即循环第一步
{
printf("该编号已存在!请重新输入\n");
goto add1;
}
printf("已经录入%d个职工的信息",employeenum);
printf("是否继续添加?(y/n):");
scanf("%s",ch);
}while(strcmp(ch,"y")==0);
system("cls");
fclose(fp);
}
//================================//
//功能:删除信息
//主要思路:利用循环.
void Dele(void)
{
int j,i;
char cw[2];
char ch[2];
FILE *fp;
if((fp=fopen("d:\\employee.dat","rb+"))==NULL)
{
printf("Can't open file!");
return;
}
do
{
dele3:;
printf("请输入编号进行删除: ");
scanf("%d",&j);
fflush(stdin);
if(j<=0)
{
printf("您输入的编号有误,请重新输入\n");
goto dele3;
}
for(i=0;i<=employeenum;i++)
{
if(number[i]==j)
goto dele;
}
if(i==employeenum+1)
{
printf("没有该编号,返回主菜单!");
return;
}
dele:;
printf("您要删除的职工编号为: %d\n",j);
for(i=0;i<=employeenum;i++)
{
if((number[i]==j)&&(number[i]>0))
{
printf("查到该职工信息是否进行删除?(y/n)");
scanf("%s",cw);
if(strcmp(cw,"y")==0)
{
number[i]=0;
name[i][N]=' ';
sex[i][N]=' ';
birthyear[i]=0;
workyear[i]=0;
salar[i]=0;
employeenum=employeenum-1;
}
printf("删除成功!");
goto dele1;
}
if(i==employeenum+1)
{
printf("没查到该编号!");
}
}
if(employeenum==0)
{
printf("当前系统中无信息,请添加后进行操作!");
return;
}
dele1:;
printf("是否继续删除?(y/n)");
scanf("%s",ch);
}while(strcmp(ch,"y")==0);
system("cls");
}
//======================================//
//功能:修改信息
//主要思路:利用循环和数组重新输入信息
//======================================//
void Change(void)
{
int j,i;
char ch[2];
char cw[2];
FILE *fp;
if((fp=fopen("d:\\employee.dat","rb+"))==NULL)
{
printf("Can't open file!");
return;
}
do
{
change2:;
printf("请输入编号进行修改: ");
scanf("%d",&j);
fflush(stdin);
if(employeenum==0)
{
printf("当前系统中无职工信息,请添加后在进行操作!");
return;
}
for(i=0;i<=employeenum;i++)
{
if(number[i]==j)
goto change;
}
if(i==employeenum+1)
{
printf("没有该编号,返回主菜单!");
return;
}
change:;
printf("您要修改的职工编号为: %d\n",j);
if(j<=0)
{
printf("你输入的编号有误请重新输入\n");
goto change2;
}
for(i=0;i<=employeenum;i++)
{
if((number[i]==j)&&(number[i]>0))
{
printf("查到该职工信息是否进行修改?(y/n)");
scanf("%s",cw);
if(strcmp(cw,"y")==0)
{
printf("要修改的姓名为: ");
scanf("%s",name[i]);
fwrite(name[i],1,1,fp);
printf("要修改的性别为: ");
scanf("%s",sex[i]);
fwrite(sex[i],1,1,fp);
printf("要修改的出生年份为: ");
scanf("%d",&birthyear[i]);
fwrite(&birthyear[i],4,1,fp);
printf("要修改的任现职年限为: ");
scanf("%d",&workyear[i]);
fwrite(&workyear[i],4,1,fp);
printf("要修改的工资为: ");
scanf("%d",&salar[i]);
fwrite(&salar[i],4,1,fp);
printf("要修改的职称(助工、工程师、高级工程师)为: ");
scanf("%s",position[i]);
fwrite(position[i],1,1,fp);
goto change1;
}
if(strcmp(cw,"n")==0)
{
return;
}
}
}
change1:;
printf("是否继续修改?(y/n):");
scanf("%s",ch);
}while(strcmp(ch,"y")==0);
system("cls");
fclose(fp);
}
//=====================================//
//功能:统计信息
//主要思路:利用循环选择不同的统计信息
//=====================================//
void Tongji(void)
{
char cs[N][N]={"助工","工程师","高级工程师"};//初始化以便于下边统计信息
int select1,p=0,p1=0,p2=0,f=0,i,z;//select1为选择,p,p1,p2分别代表助工工程师高级工程师的人数,i,z用于循环,f用于计算低于平均工资的人数
int salar1=0;
float a,a1,a2;//用于计算高级工程师的比例
FILE *fp;
if((fp=fopen("d:\\employee.dat","rb+"))==NULL)
{
printf("Can't open file!");
return;
}
tongji:;
printf(" 统计各职称岗位的职工人数是多少,计算高级工程师的比例,请输入1: \n");
printf(" 计算职工的平均工资并输出,请输入2: \n");
printf(" 统计职工工资低于平均工资的人数,并输出他们的姓名和实发工资,请输入3: \n");
printf("您的选择为: ");
scanf("%d",&select1);
fflush(stdin);
if((select1==1)&&(employeenum>0))
{
for(i=0,z=0;i<=employeenum;i++,z++)
{
if(((strcmp(position[z],cs[0]))==0)&&(number[z]>0))//与助工相同p加一
{
p++;
}
if(((strcmp(position[z],cs[1]))==0)&&(number[z]>0))
{
p1++;
}
if(((strcmp(position[z],cs[2]))==0)&&(number[z]>0))
p2++;
}
printf("助工有:%d\t工程师有:%d\t高级工程师有:%d\n",p,p1,p2);
a=(float)p;
a1=(float)p1;
a2=(float)p2;
printf("高级工程师的比例是:%.2f",a2/(a+a1+a2)*100);
printf("%%");
}
else if((select1==2)&&(employeenum>0))
{
for(i=0;i<=employeenum,number[i]>0;i++)
{
salar1=salar1+salar[i];
}
printf("职工平均工资为:%d/%d=%d",salar1,employeenum,salar1/employeenum);
}
else if((select1==3)&&(employeenum>0))
{
for(i=0;i<=employeenum,number[i]>0;i++)
{
salar1=salar1+salar[i];
}
for(i=0;i<=employeenum,number[i]>0;i++)
{
if(salar[i]
{
f=f+1;
printf("姓名:%s\t工资:%d",name[i],salar[i]);
}
}
}
else if(employeenum==0)
{
printf("当前系统中无职工信息,请添加后在进行操作!");
return;
}
else if((select1!=1)&&(select1!=2)&&(select1!=3))
{
printf("您输入的选项有误请重新输入!\n");
goto tongji;
}
fclose(fp);
}
void Jiewei(void)
{
printf("\n");
printf("企业职工人事信息管理系统\n");
printf("王栋 计算机 1101\n");
}