数据结构课程设计工资管理系统.doc

上传人:豆**** 文档编号:17230262 上传时间:2022-05-22 格式:DOC 页数:93 大小:540KB
返回 下载 相关 举报
数据结构课程设计工资管理系统.doc_第1页
第1页 / 共93页
数据结构课程设计工资管理系统.doc_第2页
第2页 / 共93页
点击查看更多>>
资源描述

《数据结构课程设计工资管理系统.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计工资管理系统.doc(93页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流数据结构课程设计工资管理系统.精品文档.海南大学信息科学技术学院数据结构课程设计 题 目: 工资管理系统 学 院:信息科学技术学院 专 业:09 通信工程 姓 名: 学 号: 指导老师:吴泽晖 二零一一年十二月目录一、 设计目的4二、 功能描述4三、 总体设计63.1功能模块设计61. 主控函数执行流程72. 输入记录模块83. 查询记录模块84. 更新记录模块91) 修改记录92) 删除记录93) 插入记录94) 排序记录105. 统计记录模块116. 输出记录模块123.2数据结构设计123.3函数功能描述13四、 程序实现151. 程序

2、预处理152. 主函数main()173. 主菜单界面184. 表格形式显示记录185. 记录查找定位196. 格式化输入数据207. 增加记录218. 查询记录229. 删除记录2310. 修改记录2511. 插入记录2612. 统计记录2813. 排序记录2914. 存储记录315.运行结果1. 主界面312. 输入记录323. 显示记录334. 删除记录345. 查询记录356. 修改记录367. 插入记录368. 统计记录379. 排序记录3710. 保存记录38六 心得体会39七 参考文献39一、 设计目的本程序旨在训练基本的编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和结

3、构数组的各种基本操作。本程序中涉及结构体、数组、文件等方面的知识。通过本程序的训练,使我对C语言的文件操作有了一个更深刻的了解,掌握利用数组存储结构实现工资管理的原理,为进一步开发出高质量的信息管理管理系统打下坚实的基础。二、 功能描述如后图所示,与利用单链表实现的学生管理系统不同的是,此工资管理系统主要利用数组来实现,其数组元素是结构体类型。整个系统由如下几大功能模块组成。(1) 输入记录模块。输入记录模块主要完成将数据存入数组中的工作。在此工资管理系统中,记录可以从以二进制形式存储的数据文件中读入,也可以从键盘逐个输入记录。记录由职工的基本信息和工资信息字段构成。当从数据文件中读入记录时,

4、它就是在以记录为单位存储的数据文件中,将记录逐条复制到数组元素中。(2) 查询记录模块。查询记录主要完成在数组中查询满足相关条件的记录。在此工资管理系统中,用户可以按照职工编号或姓名在数组中进行查找。若找到该记录,则以表格形式打印出此记录的信息;否则,返回一个-1的值,并打印出未找到该记录的提示信息。(3) 更新记录模块。更新记录模块主要完成对记录的维护。在此工资管理系统中,实现对记录的修改、删除、插入、和排序操作。一般而言,系统进行了这些操作之后,需要将修改的的数据存入源数据文件。(4) 统计记录模块。统计记录模块主要完成对公司员工的工资在各等级的人数统计。(5) 输出记录模块。输出记录模块

5、主要完成两个任务。第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。第二,它实现将数组中存储的记录信息以表格的形式在屏幕上打印出来。工资管理系统输出至屏幕输出至文件统计公司员工工资在各等级的人数排序记录插入记录删除记录修改记录按姓名查询按编号查寻从键盘输入从文件读入输出记录模块统计模块更新记录模块查询记录模块输入记录模块三、 总体设计一、 功能模块设计1. 主控main()函数执行流程工资管理系统执行流程如后图所示。它先以可读写的方式打开数据文件,此文件默认为“c:zggz”,如该文件不存在,则新建此文件。当打开文件操作成功后,则从文件中一次读出一条记录,添加到新建

6、的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。在判断键值时,有效的输入为09之间的任意数值,其他输入都被视为错误按键。若输入为0(即变量select=0),则会继续判断是否在对记录进行更新操作之后进行了存盘操作,若未存盘,则全局变量saveflag=1,系统会提示用户是否需要进行数据存盘操作,用户输入Y或y,系统会进行存盘操作。最后,系统执行退出工资管理系统的操作。若选择1,则调用Add()函数,执行增加记录操作;若选择2,则调用Del()函数,执行删除记录操作;若选择3,则调用Qur()函数,执行查询记录操作;若选择4,则调用Modify()函数,执行修改记录操作;若选择5,则

7、调用Insert()函数,执行插入记录操作;若选择6,则调用Tongji()函数,执行统计记录操作;若选择7,则调用Sort()函数,执行按降序排序记录的操作;若选择88,则调用Save()函数,执行将记录记录存入磁盘中的数据文件的操作;若选择9,则调用Disp()函数,执行将记录以表格形式打印输出至屏幕的操作;若输入09之外的值,则调用Wrong()函数,给出按键错误的提示。开 始将此文件的内容读出,并存入一个新的结构体类型的数组中以可读写的方式打开一个数据文件调用menu()菜单函数进入while(1)主循环输入09中的一个数值,选择相应操作输入是否为0 是 否 是否已对修改进行了存盘结束

8、调用Save()函数,进行写数据文件操作判断键值,调用相应函数,完成相应功能. 主控函数流程图2. 输入记录模块输入记录模块主要实现将数据存入数组中。当从数据文件中读出记录时,它调用fread(&gzcount,sizeof(ZGGZ),1,fp)文件读取函数,执行一次从文件中读取一条工资记录信息存入某个数组元素中的操作,并且这个操作在main()中调用执行,即在工资管理系统进入显示菜单界面时,该操作已经执行了。若该文件中没有数据,系统会提示数组为空,没有任何记录可操作,此时,用户应选择1,调用Add()函数,进行记录输入,即完成在数组中添加元素的操作。3. 查询记录模块查询记录模块主要实现在

9、数组中按职工编号或姓名查找满足相关条件的记录。在查询函数Qur()中,为了遵循模块化编程的原则,我们将在数组中进行的记录定位操作设计成了一个单独的函数int Locate(ZGGZ tp,char findmess,char nameornum),参数findmess保存要查找的具体内容,nameornum保存要查找的字段,若找到该记录,则返回指向该记录的数组元素的下标,否则:返回一个-1的值。4. 更新记录模块更新记录模块主要实现对记录的修改、删除、插入和排序操作。因为记录是以数组的结构形式存储的,所以这些操作都在数组中完成。下面分别介绍这4个功能模块。1) 修改记录操作修改记录操作需要对数

10、组中目标元素的数据域中的值进行修改,它分两步完成。第一步,输入要修改的职工编号,输入后调用定位函数Locate()在数组中逐个对职工编号或姓名字段的值进行比较,直到找到该职工编号的纪录;第二步,若找到该记录,则修改除职工编号之外的各字段的值,并将存盘标记变量saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。2) 删除记录删除记录操作完成删除指定职工编号或姓名的记录,它也分两步完成。第一步,输入要修改的职工编号,输入后调用定位函数Locate()在数组中逐个对职工编号或姓名字段的值进行比较,直到找到该职工的编号或姓名的记录,并返回指向该记录的数组元素小标;第二步,若找到记录,则

11、从该记录所在元素的后续元素起,依次向前移动一个元素位置,有值的数组元素个数减1.3) 插入记录插入记录操作完成在指定职工编号的随后位置插入新的记录。首先,它要求用户输入某个员工的职工编号,新的纪录将插入在该记录之后;然后,提示用户输入一条新的纪录的信息,这些信息保存在新结构体类型的数组元素的各字段中;最后,将该元素插入在已经确认位置的职工编号之后。它的具体插入执行过程如后图所示,新元素B1准备插入至已有5个元素的数组中,插入位置为元素A2之后。具体过程为:现调用Locate()函数找到A2在数组中的下标,从A4开始,往后移动,至A2停止移动,然后再远A3的位置插入元素B1。4) 排序记录冒泡排

12、序法属于内部排序法中的一种,这是运用数值比较后,依据判断规则对数据位置进行交换,以达到排序的目的。针对数组结构的特点,这里采用这种排序法来实现按实发工资字段的值从高到低对记录进行排序。冒泡排序法的基本思想为:将相邻的两个数组元素的实发工资字段的值进行比较,若左边的值小于右边的值,则将此两个元素的值进行交换;若左边的值大于等于右边的值,则此两个值的位置不变。右边的值继续和下一个值做比较,重复此动作,直到比较到最后一个值。用伪代码描述如下:If(左边的值=右边的值*/此两个元素的位置不变;右边的元素继续和下一个元素比较; 插入B1A0 A1 A2 A3 A4 插入B1前A4A0 A1 A2 B1

13、A3插入B1后如下图所示,假设共有n个ZGGZ结构数组元素gz0至gzn-1,其具体比较过程如下。第一轮:从gz0比到gzn-1,实发工资字段值最小的元素存放在gzn-1中。第二轮:从gz0比到gzn-2,实发工资字段值最小的元素存放在gzn-2中。第n轮:从gz0比到gz1,实发工资字段值最小的元素存放在gz1中。gzn-1gz0 gz1 gz2 . gz3 gzn-2 gzn-1 gzn 数组中对记录排序示意图因为是按实发工资的降序排序,所以每进行一轮比较都会以交换位置的方式将该轮的最小者移向数组的尾端。冒泡排序法的优点是,若数组元素已有部分排好序,则使用冒泡排序法可以快速排序。其缺点则是

14、会反复扫描数据,比较相邻的两个元素,速度不快且没有效率。它属于稳定的快速排序法。5. 统计记录模块该模块的实现比较简单,它主要通过依次读取数组中元素的数据域中的实发工资的值进行比较判断的形式,完成工资在各个等级的人数统计。6. 输出记录模块当把记录输出至文件时,调用fwrite(&tpi,sizeof(ZGGZ),1,fp)函数,将数组元素tpi中各字段的值,写入文件指针fp所指的文件;当把记录输出至屏幕时,调用void Disp()函数,将数组中的存储的记录信息以表格的形式在屏幕上打印出来。二、数据结构设计本程序定义了结构体emplyee ,用于存放职工的基本信息和工资信息。Typedef

15、struct emplyee char num10;char name15;float jbgz;float jj;float kk;float yfgz;float sk;float sfgz; ZGGZ;其各字段的值的含义如下。l num10:保存职工编号。l Name15:保存职工姓名。l Jbgz:保存职工奖金。l kk:保存职工扣款。l yfgz:保存职工税款l sfgz: 保存职工实发工资。三、 函数功能描述1) Printheader()函数原型:void printheader()Printheader()函数用于在以表格形式显示记录时,打印输出表头信息。2) Printdat

16、a()函数原型: void printdata(ZGGZ pp)Printdata()函数用于以表格显示的方式,打印输出单个数组元素pp中的记录信息。3) Disp()函数原型: void Disp(ZGGZ tp,int n)Disp()函数用于显示tp数组中存储的n条记录,内容为emplyee结构中定义的内容。4) Numberinput()函数原型:float numberinput(char *notice)numberinput()函数用于输入数值型数据,notice用于保存printf()中输出的提示信息。该函数返回用户输入的浮点类型数据值。5) Stringinput()函数原型

17、 :void stringinput(char*t,int lens,char*notice)Stringinput()函数用于输入字符串,并进行字符串长度验证(长度num,p-name,p-jbgz,p-jj,p-kk,p-yfgz,p-sk,p-sfgz#define END - n#define N 60int saveflag=0; /*是否需要存盘的标志变量*/*定义与职工有关的数据结构*/typedef struct employee /*标记为employee*/char num10; /*职工编号*/char name15; /*职工姓名*/float jbgz; /*基本工资

18、*/float jj; /*奖金*/float kk; /*扣款*/float yfgz; /*应发工资*/float sk; /*税款*/float sfgz; /*实发工资*/ZGGZ;2. 主函数main()Main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。void main() ZGGZ gzN; /*定义ZGGZ结构体*/ FILE *fp; /*文件指针*/ int select; /*保存选择结果变量*/ char ch; /*保存(y,Y,n,N)*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen(c:ZGGZ,a

19、b+);/*以追加方式打开二进制文件c.ZGGZ,可读可写,若次文件不存在,会创建此文件*/ if(fp=NULL) printf(n=can not open file!n); exit(0); while(!feof(fp) if(fread(&gzcount,sizeof(ZGGZ),1,fp)=1) /*一次从文件中读取一条职工工资记录*/ count+; fclose(fp); /*关闭文件*/ printf(n=open file success,the total records number is :%d.n,count); getchar(); menu(); while(1

20、) system(cls); menu(); printf(n please Enter your choice(09):); scanf(%d,&select); if(select=0) if(saveflag=1) /*若对数组的数据有修改且未进行存盘操作,此标志为1*/ getchar(); printf(n=whether save the modified record to file?(y/n):); scanf(%c,&ch); if(ch=y|ch=Y) Save(gz,count); printf(n=thank you for useness!); getchar();

21、break; switch (select) case 1:count=Add(gz,count);break; /*增加职工工资记录*/ case 2:count=Del(gz,count);break; /*删除职工工资记录*/ case 3:Qur(gz,count);break; /*查询职工工资记录*/ case 4:Modify(gz,count);break; /*修改职工工资记录*/ case 5:count=Insert(gz,count);break; /*插入职工工资记录*/ case 6:Tongji(gz,count);break; /*统计职工工资记录*/ case

22、 7:Sort(gz,count); break; /*排序职工工资记录*/ case 8:Save(gz,count);break; /*保存职工工资记录*/ case 9:system(cls);Disp(gz,count);break; /*显示职工工资记录*/ default: Wrong();getchar();break; /*按键有误,必须数值 09*/3. 主菜单界面用户进入工资管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码main()函数调用。void menu() /*主菜单*/ system(cls); /*调用DOS命令清屏*/ textcolor(

23、8); /*在文本模式中选择新的字符颜色*/ gotoxy(8,5); cprintf( The Employee salary Management System n); gotoxy(8,8); cprintf(*Menu*n); gotoxy(8,9); cprintf( * 1 input record 2 delete record * n); gotoxy(8,10); cprintf( * 3 search record 4 modify record * n); gotoxy(8,11); cprintf( * 5 insert record 6 count record *

24、n); gotoxy(8,12); cprintf( * 7 sort record 8 save record * n); gotoxy(8,13); cprintf( * 9 display record 0 quit system * n); gotoxy(8,14); cprintf( *n); /*cprintf()送格式化输出至文本窗口屏幕中*/ 4. 表格形式显示记录由于记录显示操作经常进行,所以我们将这部分有独立的函数来实现,以减少代码的重复。过程如下。(1) 调用Disp(ZGGZ tp,int n)函数,它将显示从数组tp第一个元素开始的n条记录。(2) 调用printda

25、ta(ZGGZ pp)函数,它将显示数组元素pp中的记录信息。void printheader() /*格式化输出表头*/ printf(HEADER1); printf(HEADER2); printf(HEADER3); void printdata(ZGGZ pp) /*格式化输出表中的数据*/ ZGGZ* p; p=&pp; printf(FORMAT,DATA); void Disp(ZGGZ tp, int n) /*显示数组tp中存储的记录,内容为employee结构中定义的内容*/ int i; if(n=0) /*表示没有职工工资记录*/ printf(n=Not emplo

26、yee record!n); getchar(); return; printf(nn); printheader(); /*输出表头部*/ i=0; while (iNot find this employee record!n);5. 记录查找定位用户进入工资管理系统时,在对某个记录进行处理前,需要按照条件找到这条记录,Locate()函数完成了记录定位的功能。这里可以按照职工编号或职工姓名进行记录查找定位。int Locate(ZGGZ tp,int n,char findmess,char nameornum) int i=0; if(strcmp(nameornum,num)=0)

27、/*按职工编号查找*/ while(in) if (strcmp(tpi.num,findmess)=0) /*若找到findmess值的职工编号*/ return i; i+; else if(strcmp(nameornum,name)=0) /*按职工姓名查找*/ while(ilens) printf(n exceed the required length! n); while(strlen(n)lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/ float numberinput(char *notice) float t=0.00; do printf

28、(notice); /*显示提示信息*/ scanf(%f,&t); if(t=0!n); while(t0); return t;7. 增加记录调用Add(ZGGZ tp,int n)函数,完成在数组tp中添加职工工资记录的功能。若在刚进行工资管理系统时数据文件为空,则将从数组的头部开始增加记录;否则,将此记录添加在数组尾部。 int Add(ZGGZ tp,int n) char ch,num10; int i,flag=0; system(cls); Disp(tp,n); while(1) while(1) stringinput(num,10,input number (press

29、0return menu):); flag=0; if(strcmp(num,0)=0) /*输入为0,则退出添加操作,返回主界面*/ return n; i=0; while (ithe number %s is existing, try again?(y/n):,num); scanf(%c,&ch); if(ch=y|ch=Y) continue; else return n; else break; strcpy(tpn.num,num); stringinput(tpn.name,15,Name:); tpn.jbgz=numberinput(jbgz:); tpn.jj=numberinput(jiangjin:); tpn.kk=numberinput(koukuan:); tpn.yfgz=tpn.jbgz+tpn.jj-tpn.kk; tpn.sk=tpn.yfgz*0.12; tpn.sfgz=tpn

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁