《C语言课程设计小型企业人事管理系统 .doc》由会员分享,可在线阅读,更多相关《C语言课程设计小型企业人事管理系统 .doc(23页珍藏版)》请在三一办公上搜索。
1、唐 山 学 院 C语言程序设计 课 程 设 计 题 目 小型企业人事管理管理系统 系 (部) 信息工程系 班 级 通信工程2班 姓 名 学 号 4070214218 指导教师 2009年 6 月 29 日至 7 月 3 日 共 1 周 2009年 7 月 3 日1 需求分析在对小型企业人事管理管理系统进行需求分析的过程中,需要确定系统的主要功能,对软件开发的主要目的、软件的使用领域和有关该软件开发的软硬件环境进行详细的分析。下面从系统功能、运行环境、功能模块描述等几个方面进行需求分析。1.1 系统概述小型企业人事管理系统是运行于Windows系统下的应用软件,主要用于对企业人员基本管理,包括工
2、人基本信息如工号、姓名以及职称、工资进行增加、删除、修改、查询、插入、排序、统计、存盘等基本操作。1.2 功能需求小型企业人事管理系统软件为企业的管理人员提供了一个对职工基本信息进行管理以及对应发工资、税率进行计算的平台,给用户提供了一个简单明了的用户接口,功能需求如下:1.2.1 输入用户根据提示输入职工的的工号、姓名、基本工资、奖金、职称,软件可自动计算出该职工的应发工资和税率,并自动与该职工的基本信息存在一起。该软件可一次性输入多条职工基本信息记录。1.2.2 添加可在原有职工基本信息文件的基础上增加新的职工基本信息记录。在增加新职工基本信息的过程中,系统提示用户输入工号、姓名、职称、基
3、本工资、奖金,最终税款和应发工资要求系统自动计算获得。1.2.3 删除 删除职工基本信息:提示用户输入要进行删除操作的工号,如果在文件中有该职工的信息存在,则将该工号所对应的姓名、工号、基本工资、职称等在对应文件中加以删除。1.2.4 修改 修改职工信息:提示用户输入要进行修改操作的工号,如果在文件中有该职工的信息存在,则将提示用户输入该工号对应的职工姓名、职称、基本工资等需要修改的选项。1.2.4 查询 查询职工信息:可根据姓名或工号查询两个具体需求,提示用户输入要查询职工信息的工号或姓名,如果在磁盘文件中有对应的职工信息,则提示用户已找到,并逐项列出对应职工的基本信息,方便用户对职工管理。
4、1.2.5 浏览逐条显示全部职工信息。1.2.6 排序该项需求要求根据职工的姓名、工号或职称进行排序,以便用户对职工基本状况有较为直观方便的了解。1.2.7 插入该项需求要求根据职工的工号确定插入位置,根据提示逐项输入职工的基本信息,工号不能重复,如有重复,系统要求重新入。1.2.8 存盘 该项需求要求将用户修改后的信息存入指定文件,以长期保存,以备以后使用。1.2.9 统计该项需求要求根据职称或工资对已存职工信息进行统计,最后显示统计出的各项职工的基本信息,并且算出总的条数。2 总体设计 进行总体设计的目标是用比较抽象概括的方式确定系统如何完成预定的任务,进而确定组成系统的每个程序的结构。2
5、.1 系统功能结构图职工信息管理输入职工信息删除职工信息修改职工信息浏览职工信息查询职工信息排序职工信息插入职工信息统计职工信息图1系统功能结构图2.2开发与设计的总体思想 本系统主要应用结构化的设计思想实现职工信息管理系统的增加、删除、修改、插入和查找等典型管理功能。各主要模块的数据均存储在文件中,因此包含对文件的读、写等基本操作。在软件开发过程中应用了高级语言程序设计中的基本控制结构,如选择、循环、顺序结构。 系统的设计方法是结构化设计方法,采用C语言进行开发。3 详细设计3.1 构体设计本程序中结构体包括职工基本信息,字符串的工号和姓名,字符的职称,浮点型的基本工资、奖金、税款、应发工资
6、,具体结构如下:typedef struct employee char num10; /*职工编号*/ char name15; /*职工姓名*/ char posit; /*职工职称*/ float jbgz; /*基本工资*/ float jj; /*奖金*/ float yfgz; /*应发工资*/ float sk; /*税款*/ float sfgz; /*实发工资*/ZGGZ;3.2 单界面设计菜单界面将程序的功能以直观清楚的展现在用户面前,菜单中的每项功能与各个函数相连,通过用户的选择调用与其相关的函数,以实现系统的功能。具体菜单设计如下: The Employee Salar
7、y Management System *Menu* * 1 输入记录 2 删除记录 * * 3 查找记录 4 修改记录 * * 5 插入记录 6 统计记录 * * 7 排序记录 8 保存记录 * * 9 显示记录 0 退出系统 * * * * 3.3 主函数设计在主函数中打开文件,把文件中的每个结构体放在内存中的结构体数组中,各个函数都是对于内存中的这些数组的操作,最后再把内存中的数组存回文件中,以实现对职工的信息管理。主函数把各个输入、删除、查找等基本操作联系在一起,通过主函数对各个功能函数的调用,实现了整个系统的管理功能。3.4 功能函数设计3.4.1 输入函数设计输入函数中调用了显示函
8、数,先将文件中的职工信息显示出来,以方便用户将新的职工信息输入。此函数可提示用户将职工信息逐条输入,输入0表示输入结束,返回主函数。新输入的信息将放在以前信息的后面。 3.4.2 删除函数根据用户输入的工号或姓名找到被删除的元素,将此元素后面的每一个元素向前移,则被删除的元素被覆盖,实现删除功能。若没有找到被删除元素,则提示记录中没有要删除的项。3.4.3 查找函数提示用户输入查找方式,根据用户确定的查找方式和用户输入的职工信息,从结构体数组中找出相对应的项,并显示出来。如果没有找到,则提示记录中没有要查找的项。3.4.4 修改函数提示用户输入要修改项的工号,查找对应的项显示出该项的职工信息,
9、提示用户输入要修改的信息,将修改后的信息覆盖以前信息。如果没有找到对应工号,则提示记录中没有要修改的项。3.4.5 插入函数提示用户选择方式然后输入工号,根据工号确定插入位置,再提示用户输入要插入的职工信息,工号不能用与以前的职工工号重复,如果重复则提示重新输入工号。将数组中其他元素相应移动,实现插入功能。3.4.6 统计函数 提示用户输选择项目,然后输入统计条件,函数根据条件筛选,并显示出符合条件的各项,算出总的项数。3.4.7 排序函数 提示用户选择排序项目,函数根据用户排序的项目对数组重新排序,排序完毕提示注意存盘。3.4.8 保存函数当用户要退出系统时,提示用户是否要存盘。如果存盘此函
10、数则将数据写入文件中,以保存下次使用。3.4.9 显示函数此函数显示内存中的所有员工的信息。4 总结初见这个程序要求觉得有点难,因为要用的结构体数组或琏表,平时的小程序从来没用过这些,这些对我来说很是生疏,虽然程序的整体构架和各个函数的功能早已心里有数,但迟迟写不出代码。直到陈老师把一个程序的模板给我们,里面包括主函数和输入输出函数,整个程序是用的结构体数组,思想是在主函数中打开文件,把文件中的每个结构体放在内存中的结构体数组中,各个函数都是对于内存中的这些数组的操作,最后再把内存中的数组存回文件中。我一下子豁然开朗,对于我来说数组是相当熟悉的,查找、排序、修改、统计这些都不太难,不就是对数组
11、的一些基本处理吗?我一下子信心倍增,全身心开始自己写程序。刚写出来的程序不免有很多错误,经过一番改正,改正完语法错误,编译总算通过了,但是在程序运行中还有不少逻辑错误,但在陈老师的帮助和我的努力终于也都改正了。举个小例子:在输入函数中,有一个字符型的职称输入,但每次运行时都无法输入,调用显示函数显示的信息中都没有职称,经过仔细检查输入函数,scanf(%c,&(tpn.posit);终于发现在输入职称前不可避免的摁了一下换行键,scanf将换行符放在职称中了。针对这种现象我在scanf前面放了getchar,这样换行符就放在了getchar中,csanf就接收到换行符后面的表示职称的字符。再举
12、个例子:在查找函数中,如果找到对应项则显示出来,但是每次显示闪一下就回到主函数,根本就来不及看清楚,于是我在查找函数的return前面加了两个getchar();这样只有显示完让用户看清记录后再输入两个字符才能返回主函数,使系统更加实用方便。这样的例子很多,每一次改正都是一次进步,都有一些收获,还有一点启发。通过每次的一点一点地完善,终于把整个系统做完了,看着自己做的系统真的能实现那么多功能,心理有说不出的高兴和开心。但我的能力还是有限的,这个职工管理系统还有很多不足。一方面这个程序是将文件中所有结构体复制到内存的数组中,这将占用大量内存空间,同时内存中的数组是个数限制的,如果文件中的内容过多
13、,数组将够用。另一方面,用数组实现插入或删除等功能很是不方便,插入或删除一个元素需要移动很多数组中的内容,程序代码长,运行时间长。总得来的说这次c语言课程设计让我更深刻认识了c语言,同时也培养了我综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力。这也是对我们实际工作能力的具体训练和考察过程。参考文献1 谭浩强,张基温C语言程序设计教程(第3版)M北京:高等教育出版社,20062 吕凤煮C语言基础教程基础理论与案例M北京:清华大学出版社,20053 黄明、梁旭、万洪莉C语言课程设计M北京:电子工业出版社,20064 郭宁,郑小玲管理信息系统M北京:人民邮电出版社,20065 赵池龙
14、,杨林,陈伟实用软件工程M北京:电子工业出版社,2006附录程序清单:#include stdio.h /*标准输入输出函数库*/#include stdlib.h /*标准函数库*/#include string.h /*字符串函数库*/#include conio.h /*屏幕操作函数库*/#define FORMAT %-8s%-10s%-6c%-10.2f%-8.2f%-10.2f%-10.2f%-8.2fn#define DATA p-num,p-name,p-posit,p-jbgz,p-jj,p-yfgz,p-sk,p-sfgz#define N 60#define Head p
15、rintf(工号 姓名 职称 基本工资 奖金 应发工资 税款 实发工资 n)int saveflag=0; /*是否需要存盘的标志变量*/char sss15;typedef struct employee char num10; /*职工编号*/ char name15; /*职工姓名*/ char posit; float jbgz; /*基本工资*/ float jj; /*奖金*/ float yfgz; /*应发工资*/ float sk; /*税款*/ float sfgz; /*实发工资*/ZGGZ;int f1(ZGGZ tp,int count);void f2(ZGGZ t
16、p,int count);void f3(ZGGZ tp,int count);void f5(ZGGZ tp,int count);void f6(ZGGZ tp,int count);int Insert(ZGGZ tp,int count);void ArrDisp(ZGGZ tp,int n);int EleAdd(ZGGZ tp,int n);void Save(ZGGZ tp,int n);void menu(void);void Wrong(void);void main(void) ZGGZ gzN; /*定义ZGGZ结构体*/ FILE *fp; /*文件指针*/ int s
17、elect; /*保存选择结果变量*/ char ch; /*保存(y,Y,n,N)*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen(C:zggz,ab+); /*以追加方式打开二进制文件c:zggz,可读可写,若此文件不存在,会创建此文件*/ if(fp=NULL) printf(n文件打开失败!n); exit(0); while(!feof(fp) if(fread(&gzcount,sizeof(ZGGZ),1,fp)=1) /*一次从文件中读取一条职工工资记录*/ count+; fclose(fp); /*关闭文件*/ while(1)
18、menu(); printf(n 输入您的选择(09):); /*显示提示信息*/ scanf(%d,&select); if(select=0) if(saveflag=1) /*若对数组的数据有修改且未进行存盘操作,则此标志为1*/ getchar(); printf(n是否保存文件?(y/n):); scanf(%c,&ch); if(ch=y|ch=Y) Save(gz,count); printf(n 谢谢使用!); getchar(); break; switch(select) case 1:count=EleAdd(gz,count);break; case 2:count=f
19、1(gz,count);break; case 3:f2(gz,count);break; case 4:f3(gz,count);break; case 5:count=Insert(gz,count);break; case 6:f5(gz,count);break; case 7:f6(gz,count);break; case 8:Save(gz,count);break; case 9:system(cls);ArrDisp(gz,count);break; default: Wrong();getchar();break; void menu(void) /*主菜单*/ syste
20、m(cls); /*调用DOS命令,清屏.与clrscr()功能相同*/ printf( The Employee Salary Management System n); printf( *Menu*n); printf( * 1 输入记录 2 删除记录 *n); printf( * 3 查找记录 4 修改记录 *n); printf( * 5 插入记录 6 统计记录 *n); printf( * 7 排序记录 8 保存记录 *n); printf( * 9 显示记录 0 退出系统 *n); printf( *n);void ArrDisp(ZGGZ tp,int n) /*显示函数*/ Z
21、GGZ *p; int i; if(n=0) /*表示没有职工工资记录*/ printf(n没有记录!n); getchar(); return; printf(nn); Head; i=0; while(in) /*逐条输出数组中存储的职工信息*/ p=&tpi; printf(FORMAT,DATA); i+; getchar(); getchar();void Wrong(void) printf(n 输入错误,按任意键继续!n); getchar(); getchar();int EleAdd(ZGGZ tp,int n) /*输入函数*/ char ch; int i,flag=0;
22、 system(cls); ArrDisp(tp,n); /*先打印出已有的职工工资信息*/ while(1) /*一次可输入多条记录,直至输入职工编号为0的记录才结束添加操作*/ while(1) /*输入职工编号,保证该编号没有被使用, 若输入编号为0,则退出添加记录操作*/ printf(输入工号(0返回):); scanf(%s,sss); flag=0; if(strcmp(sss,0)=0) /*输入为0,则退出添加操作,返回主界面*/ return n; i=0; while(iopen file error!n); getchar(); return ; for(i=0;i0)
23、 getchar(); printf(nnn文件保存成功!记录总数为:%dn,i); getchar(); saveflag=0; else system(cls); printf(没有记录!n); getchar(); fclose(fp); /*关闭此文件*/int f1(ZGGZ tp, int count)/*删除函数*/ int i,old=count,flage=0;char del20;printf(原有纪录如下:n);ArrDisp(tp,count);printf(请输入要删除的工号或姓名:n); scanf(%s,del);for(i=0;icount;i+)if(strc
24、mp(tpi.num,del)=0|strcmp(tpi.name,del)=0)count-; flage=1;break;if(flage=0) printf( 记录中没有要删除的项!n);getchar();getchar();return count;for(;iold;i+)tpi=tpi+1;printf( 注意存盘! n);printf(任意键返回主菜单);getchar();getchar();return count;void f2(ZGGZ tp,int count) /*查找函数*/int i,choice,flage=0;char numb10,nam15;ZGGZ *
25、p;printf(原有纪录如下:n);ArrDisp(tp,count);printf(请输入要查找的项n);printf( 1 姓名 n); printf( 2 工号 n);scanf(%d,&choice);switch(choice)case 1: printf(请输入要查找的姓名n);scanf(%s,nam);for(i=0;icount;i+)if(strcmp(tpi.name,nam)=0)p=&tpi;flage=1;Head;printf(FORMAT,DATA);if(flage=0) printf( 没有记录 n);getchar();getchar();break;c
26、ase 2:printf(请输入要查找的工号n);scanf(%s,numb); for(i=0;icount;i+)if(strcmp(tpi.num,numb)=0) p=&tpi; flage=1; Head;printf(FORMAT,DATA); if(flage=0)printf( 没有记录 n);getchar(); getchar();break; default: Wrong();getchar();break;printf(任意键返回主菜单);void f3(ZGGZ tp,int count) /*修改函数*/int change,flage=0,i,fla=0;char
27、 pos;ZGGZ *p;float jb,jjj;printf(原有记录如下:n);ArrDisp(tp,count);printf(请输入要修改的工号n);scanf(%s,sss);for(i=0;iposit=pos; printf(修改成功,请注意存盘!n); break; case 3: printf(请输入修改后的基本工资n); scanf(%f,&jb); p-jbgz=jb; printf(修改成功,请注意存盘!n); break;case 4: printf(请输入修改后的奖金n); scanf(%f,&jjj); p-jj=jjj; printf(修改成功,请注意存盘!n
28、); break;default :Wrong();tpi.yfgz=tpi.jbgz+tpi.jj; /*计算应发工资*/ tpi.sk=(float)(tpi.yfgz*0.12); /*计算税金,这里取应发工资的百分之一十二*/ tpi.sfgz=tpi.yfgz-tpi.sk;getchar();getchar();printf(任意键返回主菜单);void f5(ZGGZ tp,int count) /*统计函数*/char pomax,pomin;float jbmax,jbmin;float yfmax,yfmin;int t,n=0,i;ZGGZ *p;printf(请选择要统
29、计的项n);printf(1职称 2基本工资 3应发工资 n);scanf(%d,&t);switch(t)case 1:getchar();printf(请输入统计的上限职称n); scanf(%c,&pomax); getchar();printf(请输入统计的下限职称n);scanf(%c,&pomin);for(i=0;i=pomax&tpi.posit=pomin) p=&tpi; n+; printf(FORMAT,DATA);printf(统计完毕,共有%d个记录!n,n); getchar();getchar();break;case 2:printf(请输入统计的最高基本工资
30、n);scanf(%f,&jbmax);printf(请输入统计的最低基本工资n);scanf(%f,&jbmin);for(i=0;i=jbmin&tpi.jbgz=jbmax) p=&tpi; n+; printf(FORMAT,DATA);printf(统计完毕,共有%d个记录!n,n);break;case 3:printf(请输入统计的最高应发工资n);scanf(%f,&yfmax);printf(请输入统计的最低应发工资n);scanf(%f,&yfmin);for(i=0;i=yfmin&tpi.yfgz=yfmax) p=&tpi; n+; printf(FORMAT,DATA);printf(统计完毕,共有%d个记录!n,n);break;default :Wrong(); getchar();getchar();printf(任意键返回主菜单);void f6(ZGGZ tp,int count) /*排序函数*/int px,i,j;ZGGZ tmp;printf(原有纪录如下:n);ArrDisp(tp,count);prin