1、沈阳工程学院课程设计报告 摘要随着计算机的普及,信息产业的发展,现在计算机已经被各个领域使用。掌握计算机知识和应用,无疑是培养新型人才的一个重要环节。计算机技术已深入到人类生活的各个角落,与其他学科紧密结合,成为推动各学科飞速发展的有力的催化剂。无论学什么专业。都必须具备计算机的基础知识和应用能力。计算机既是现代科学技术的结晶,又是大众化的工具。学习计算机知识,不仅能够掌握有关的知识,而且能培养人们的信息素养。它是高等学校全面素质教育中极为重要的一部分。以前的工资管理都是人工操作的,它存在着许多的弊端,比如计算方面的误差、整个系统的管理和职工信息的查询等。但是现在工资管理已经信息化、自动化,通
2、过一些编程语言来实现,再经过实践来验证,最后就有一个完整的工资管理系统。他包括对职工信息的输入和显示、对职工信息的插入和删除、对职工信息的保存和复制、按职工的编号和实发工资分别进行排序、按部门分类求和等。程序的设计思想独特,具有一定的逻辑性,语言使用恰当,思路清晰。程序在编写的过程中使用了许多的专业知识,比如双链表的创建和应用、指针的灵活运用、for和while循环的巧妙使用和函数的种种调用等。工资管理程序的产生主要目的是解决一些实际问题,用来方便和准确的管理公司职工的各项纪录,使得公司的管理既方便有完备。当然,以后的公司管理都会采用这种方式,因为它的产生和发展给公司带来了巨大的财富。再说,计
3、算机今后将会应用在各个领域,所以,完善的工资管理程序是很有必要的。它在管理的过程中,对一些数据的存储和计算是相当方便,当然它的误差很小,几乎为零。公司管理程序的操作也是相当方便和快捷的,并且所用的人力也是相当少的。程序设计是为了锻炼我们的实际动手能力,在一定程度上,又增加了我们的各方面的知识,特别是一些联系实际的课程设计,它的完成是需要团体合作、大量的资料和专业知识。公司管理程序运用了大量的资料、专业知识和团体合作的力量才完成的,因此,它应该说是好的课设。关键词 工资管理,双链表,插入,保存 沈阳工程学院课程设计报告 目录摘要第一章 引言11.1题目背景11.2题目目的11.3解决问题1第二章
4、 系统分析与设计22.1系统功能22.2功能设计22.2.1主函数22.2.2 创建双链表62.2.3 显示双链表112.2.4 单条显示数据122.2.5 计算实发工资15第三章 系统功能实现213.1 主菜单显示213.2 创建双链表253.3 显示双链表293.4单条显示数据303.5 计算实发工资32结论36致谢37参考文献38第一章 引言1.1题目背景随着计算机技术的飞速发展,改变了世界,也改变了人类的生活。作为现代科学技术的飞速发展,改变了世界,也改变了人类的生活。新世纪的大学生,应当站在时代发展的前列,掌握现代科学技术知识,调整自己的知识结构和能力结构,以适应社会发展的要求。C语
5、言成了在国内外使用的一种计算机语言。C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好、既具有高级语言的优点,又具有低级语言的许多特点,因此特别适合于编写系统软件。现在大多数的高校都把C语言作为第一门计算机语言进行教学,这是可行的,学生是能够学习好的。人工的工资管理显得十分的落后而且效率低下,尤其在查询和计算方面,效率低且误差大。为了适应现代化的环境,许多的管理事务都由电脑来管理,从而提高了管理的速率和效率。1.2题目目的工资管理程序的产生主要目的是解决一些实际的问题,用来方便和准确的管理公司职工的各项纪录,使得公司的管理既方便有完备。当然,以后的公司管理都会采用这
6、种方式,因为它的产生和发展给公司带来了巨大的财富。再说,计算机今后将会应用在各个领域,所以,完善的工资管理程序是很有必要的。它在管理的过程中,对一些数据的存储和计算是相当方便,当然它的误差很小。公司管理程序的操作也是相当方便和快捷的,并且所用的人力也是相当少的。本程序利用双链表结构实现工资管理,通过这个程序掌握C语言灵活的数据类型以及表示数据和存储数据的方法,深刻体会结构与算法的关系。1.3解决问题本程序采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现。首先声明一些必要的变量,然后作以无限循环程序,循环体为一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的
7、各功能函数。通过本程序,可以快速查找公司职工的信息、计算公司职工的实发工资、保存和追加公司职工的信息、按公司职工的编号、实发工资分别进行排序和按公司各部门分类合计等。第二章 系统分析与设计2.1系统功能工资管理是一个单位最基本的一项财务管理,本程序利用双链表构存储数据,完成工资管理,其基本功能模块如图2.1所示。主程序初始化输入显示单条显示删除查找插入追加保存读入计算工资计算界面拷贝排序索引分类合计建立链表退出图2.1 基本功能模块2.2功能设计2.2.1主函数主函数是程序的入口,采用模块化设计,主函数不宜复杂,功能尽量在各模块中实现。首先声明一些必要的变量,然后作一无限循环程序,循环体为一个
8、开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个出口,即返回值为一定条件时运行exit()函数结束程序,以免造成死循环。下面图2.2是主函数的流程图,本程序用switch语句调用函数,用window函数创建窗口,建立主菜单,制作一个单边框的窗口,窗口背景为蓝色,在窗口中显示光带主菜单,字体颜色为黄色,同时光标默认定位在第一项菜单上,用光标的上下移动即可选中所需的选项,选中项背景为绿色,按回车键进入相应的功能函数,而不必输入数字,真正具有了窗口的特性,方便了操作,这个菜单是光带菜单,通过按键进行选择,而不是输入字符。利用函数bioskey()
9、识别按了什么键,根据光标停留在窗口的行数换算成对的菜单项,作为菜单函数的返回值。根据个人喜好设置文本颜色、背景颜色、以及选中菜单项的背景颜色。开始控制菜单的for循环switc语句调用menu_select函数 /*调用menu函数*/key=0,c=0gotoxy(1,25)输出press any key enter menugetch()etch()设文本为黄色,背景为蓝色gotoxy(10,2)输出左上角边框/*开始制框*/控制上边框水平线的for循环输出右上角边框控制左右两边的垂直线的for循环输出左上角边框控制下边框水平线的for循环输出右下角边框/*制框结束*/制作显示菜单的窗口控
10、制输出菜单项的for循环i=1gotoxy(10,2) 背景色设置为浅绿输出菜单的第一项gotoxy(10,2)Whilek(key!=13)1= Ywhile(bioskey(1)=0)key=bioskey(0) key&0xff NYeskey=key&0xff Ykey=key8gotoxy(10,i+1)textbackground(BLUE)/*设置背景色为蓝色*/输出菜单项 key=72NY NKey=80i=1NNi=17i=17YYi=i-1Ni=i+1i=1 Ygotoxy(10,i+1)textbackground(LIGHTG)R)EEN)输出第i行的菜单项c=i-1t
11、extbackground(BLACK)window(1,1,80,25) /*恢复原窗口大小*/返回c结束图2.2 主函数流程图2.2.2 创建双链表利用光标移动函数gotoxy()定位光标位置,在光标位置显示信息的方式设计成了表格输入形式。初始时,光标停留在职工编号栏上(no),输入编号按回车键,光标跳过到姓名栏(name),在按回车键,光标跳到基本工资栏(jbgz),只输入这三项信息,其他信息通过计算获得。当在输入职工编号首字符为时结束输入返回主函数,双链表创建完毕。每次新输入的结点放在表头,这样最先输入的结点存放在最后。例如输入数据后链表的存储结构如图2.3所示。First lastN
12、ULL200640310920064031122006403120NULL 图2.3 结点的链表存储结构 链表的创建用到两个函数:create()和inputs()。create()完成创建,inputs()进行字符串数据输入验证。首先确认链表是否为空,如果不为空,则调用初始化函数,清空链表。设置从头指针开始,申请内存空间,如果申请不到,则内存空间满,无法保存数据,则返回主程序,否则输入数据。输入时分两种情况:一种情况是输入的是第一个结点,则头指针的尾指针都要做修改,如图2.3所示;令一种情况是输入任意结点,将该结点插入在表头,作为新的头结点,这样不必修改尾指针,如图2.4所示。 First
13、Last NULL2006403109NULL 图2.4插入的是第一个结点 First=info p-prior=info First Last 2006403112NULL2006403120NULL 图2.4 插入任意结点本程序使用双层循环和调用函数建立双链表,在建立的过程中用到了双链表头、尾,前趋和后继指针,输入职工信息也在这体现,图2.5是本程序流程图:开始First!=NULLLLLNY调用init函数First=NULLLast=NULLp=first外for循环flag=1 跳出外循环i=0,x=0 N clrscr()gotoxy(1,3)输出*gongziguanli*got
14、oxy(1,4)输出 -Enter end-gotoxy(1,5)输出 |-|gotoxy(1,7)输出|no | name | jbgz|内for 循环gotoxy(1,7+x)输出|-|-|-|申请一个info空间!inforYinfo-next=NULLinfo-prior=NULL输出nout of memory Nexit(0) 跳出程序 gotoxy(1,8+x)输出|gotoxy(12,8+x)输出|gotoxy(29,8+x)输出|gotoxy(38,8+x)输出|gotoxy(2,8+x)调用inputs(info-no,10)函数 /*inputs函数*/inputs(ch
15、ar *s, int count)函数输入pstrlen(p)countNY输出n too long! nstrlen(p)countN strcpy(s,p)/*inputs结束*/info-no0= 跳出内循环 gotoxy(13,8+x)调用inputs(info-name,14)函数 gotoxy(30,8+x)输入tempinfo-jbgz=temp, info-koukuan=0, info-sfgz=0info-shuijin=0, info-yfgz=0p=NULLinfo-next=pNFirst=Last=info, First-prior=NULL, Last-next=
16、NULLYinfo-prior=p-priorp=infoFirst=infop-prior=infoi=i+2gotoxy(1,8+x)i=i+1i%9=0结束内循环/*内循环结束*/gotoxy(1,8+x)/*外循环结束*/输出|-|-|-|/*create结束*/结束图2.5 创建链表流程图2.2.3 显示双链表工资表建立好后,更频繁的操作是显示和查找记录,本函数实现显示链表中所有数据的功能。由于双链表有两个指针,这就决定了对双链表的访问可以从两个方向进行,但无论从哪个方向,它只能采取顺序访问的方法,定义一个指向SALARY结构体的临时变量p,初值为双链表的头指针First,输出一条记
17、录后,指针后移,p=p-next,直到p指针值为空,则所有记录输出完毕。如果从尾指针开始,则将p的初值设为尾指针last,输出记录数据后,将指针前移一个记录p=p-pripr即可。设计本函数时注意输出格式以二维表格的形式输出,每输出10行,换一页。横线减号“-”,竖线用长冒号“|”实现,实现简单,读者也可以用输出制作表格,美观漂亮,参见主菜单边框的制作。注意调整格式,对齐表格线。下面图2.6是本程序的流程图:本程序用p=p-next和循环语句,输出了职工的所用数据的功能。开始list函数 clrscr() p=First while(i%10=0&p!=NULL)外循环 clrscr() i=
18、0输出nnn输出*SALARY*|nO| name | jbgz | koukuan | yfgz | shuijin |sfg |n|-|-|-|-|-|-|nwhile(p!=NULL)内循环p-no,p-name,p-jbgz,p-koukuan,p-yfgz,p-shuijin,p-sfgzp=p-next i=i+1i%10=0 跳出内循环输出*end*输出 Press any key congtinue.ngetch()/*外循环结束*/*list结束*/结束图2.6 显示双链表流程图2.2.4 单条显示数据由于双链表既有头指针,又有尾指针,且每个结点包括两个指针域,一个指向前趋,
19、一个指向后继,所以给我们查找结点提供了方便,也加快了查询速度。如果按结点序号查找的话,结点序号如果小于等于结点个数的一半,则从头查找:否则,从尾查找,这样平均查找速度可以提高一半。本模块实现的功能为按照提示输入选择项,可以显示任意结点的前趋、任一结点的后继、第一个结点以及最后一个结点。下面2.7是本程序流程图如下,本程序灵活运用双链表和switch函数,显示职工的单条记录。开始 clrscr() p=firstp=NULLY N调用print(p)函数输出 record is empty!n返回到主函数print(SALARY *p)函数P!=NULL clrscr(); printf(nnn
20、)Y输出*SALARY*|nO| name | jbgz | koukuan | yfgz | shuijin |sfg |n|-|-|-|-|-|-|np-no,p-name,p-jbgz,p-koukuan,p-yfgz,p-shuijin,p-sfgz输出*end*for循环输出 nn0. Quit 1. Prior 2.Next 3.First4.Last nn输出nplease select 04:输入chch=0Y结束for循环Nch=1Y Nch=2p=p-priorY Np=p-nextp=NULL Nch=3YYp=NULLp=First p=Lastp=First N Yc
21、h=4YN调用Print(p)函数p=last /*for循环结束display结束*/结束图2.7 显示单条记录流程图2.2.5 计算实发工资从头指针开始,每读一条记录,显示该记录的基本信息,然后输入扣款,系统自动计算应发工资=基本工资-扣款。根据应发工资计算税率,然后计算出实发工资,继续处理下一条记录,直到所有记录处理完毕。格式依然是按照表格形式处理,每9条换一页。 假设税率计算方法如表2.1 所示。 表2.1 税金计算方法 应发工资 税率 1000 010001999 5%20002999 10%30003999 15% 40004999 20% 5000以上 30% 税金=(应发工资-
22、1000)*税率(当应发工资1000)。下面图2.8是本程序流程图如下,本程序输入扣款,通过调用函数计算职工的税金和实发工资。开始i=0,clrscr(),p=First while(p!=NULL)外循环 x=0 clrscr() gotoxy(1,3) gotoxy(1,3)输出*gongziguanli* gotoxy(1,5)输出|-| gotoxy(1,6)|nO| name | jbgz | koukuan | yfgz | shuijin |sfg |nwhile(p!=NULL)内循环 gotoxy(1,7+x)|-|-|-|-|-|-|ngotoxy(1,8+x)输出|got
23、oxy(12,8+x)输出|gotoxy(29,8+x)输出|gotoxy(38,8+x)输出|gotoxy(49,8+x)输出|gotoxy(58,8+x)输出|gotoxy(67,8+x)输出|gotoxy(76,8+x)输出|gotoxy(2,8+x)输出p-nogotoxy(13,8+x)输出p-namegotoxy(30,8+x)输出p-jbgzgotoxy(39,8+x)输入tempp-koukuan=tempp-yfgz=p-jbgz-p-koukuangotoxy(50,8+x)输出p-yfgzgotoxy(59,8+x)p-shuijin=(p-yfgz-1000)*fax(
24、p-yfgz) 调用fax函数返回值给p-shuijinfax函数xshuijin gotoxy(68,8+x)p-sfgz=p-yfgz-p-shuijin输出p-sfgzx=x+2i=i+1i%9=0跳出内循环p=p-next/*内循环结束*/gotoxy(1,7+x)输出|-|-|-|-|-|-|-|n输出 Press any key congtinue.ngetch()/*外循环结束*/*calc结束*/结束图2.8 计算实发工资流程图第三章 系统功能实现 3.1 主菜单显示制作一个单边框的窗口,窗口背景为蓝色,在窗口中显示光带主菜单,字体颜色为黄色,同时光标默认定位在第一项菜单上,用
25、光标的上下移动即可选中所需的选项,选中项背景为绿色,按回车键进入相应的功能函数,而不必输入数字,真正具有了窗口的特性,方便了操作。界面如图3.1所示。 图3.1 菜单界面这个菜单是光带菜单,通过按键进行选择,而不是输入字符。利用函数bioskey()识别按了什么键,根据光标停留在窗口的行数换算成对的菜单项,作为菜单函数的返回值。根据个人喜好设置文本颜色、背景颜色、以及选中菜单项的背景颜色。程序的最后应恢复原窗口,以保证其他函数在原窗口输出的正常显示,返回主函数。本程序源代码如下:#include stdio.h /*I/O函数*/# include bios.h /*ROM基本输入输出函数*/
26、#include dos.h /*dos接口函数*/#include conio.h /*屏幕操作函数*/#include stdlib.h /*其它说明*/#include string.h /*字符串函数*/#include mem.h /*内存操作函数*/#include ctype.h /*字符操作函数*/#include alloc.h /*动态地址分配函数*/*变量定义*/typedef struct z1 /*定义数据结构*/ char no11; /*编号*/ char name15; /*姓名*/ float jbgz; /*基本工资*/ float koukuan; /*扣
27、款*/ float yfgz; /*应发工资*/ float shuijin; /*税金*/ float sfgz; /*实发工资*/ struct z1 *prior;/*前驱指针*/ struct z1 *next;/*后继指针*/SALARY; /*结构体类型名*/struct z1 *First; /*双链表头指针*/struct z1 *Last; /*双链表尾指针*/*函数原型*/void init(); /*初始化*/void create(); /*创建链表*/void calc(); /*计算应发工资*/void delete(); /*删除*/void search();
28、/*查找*/void save(); /*保存文件*/void load(); /*读取文件*/void computer(); /*计算所需各种票面张数*/void insert(); /*插入*/void append(); /*追加*/void copy(); /*复制文件*/void sort(); /*排序*/void index(); /*索引*/void total(); /*分类合计*/void list(); /*显示所有数据*/void print(SALARY *p); /*输出单条记录*/void display(); /*随意逐条显示*/float fax(float
29、 x); /*计算税金*/int menu_select(); /*主菜单*/*主函数开始*/main() int i; clrscr(); for(;) switch(menu_select() /*调用菜单函数返回一个整数值*/ case 0:init();break; /*初始化*/ case 1:create();break; /*输入数据创建双链表*/ case 2:list();break; /*显示所有数据*/ case 3:display();break; /*单条显示*/ case 4:calc();break; /*计算实发工资*/ case 5:search();brea
30、k; /*查找职工信息数据*/ case 6:delete();break; /*删除记录*/ case 7:insert();break; /*插入记录*/ case 8:append();break; /*追加记录*/ case 9:save();break; /*保存文件*/ case 10:load(); break; /*读取文件*/ case 11:copy();break; /*复制文件*/ case 12:sort();break; /*按实发工资升序排序*/ case 13:computer();break; /*计算所需票面数*/ case 14:index();break
31、; /*按职工号索引*/ case 15:total();break; /*按部门求合计*/ case 16:exit(0); /*退出*/ /*菜单函数,函数返回值为整型,代表所选的菜单项*/menu_select() char *f= /*定义菜单字符串数组*/ *MENU*, /*菜单的标题行*/ 0. init list, /*初始化双链表*/ 1. Enter list, /*输入数据,创建双链表*/ 2. List all n, /*显示所有记录*/ 3. Display record by step, /*显示单条记录*/ 4. Calc the salary, /*计算实发工资
32、*/ 5. Search record on name, /*查找记录*/ 6. Delete a record, /*删除记录*/ 7. Insert record to list, /*插入记录*/ 8. Append record to file, /*追加记录*/ 9. Save data to the file, /*保存文件*/ 10. Load data from the file,/*读取文件*/ 11. Copy the file to new file, /*复制文件*/ 12. Sort on sfgz, /*排序*/ 13. Computer ticket number
33、, /*计算所需票面数*/ 14. Index on number, /*索引*/ 15. Total on number, /*分类合计*/ 16. Quit ; /*退出*/ char s80; int i; int key=0; /*记录所压键值*/ int c=0; gotoxy(1,25); /*移动光标*/ printf(press any key enter menu.n);/*压任意键进入主菜单*/ getch(); clrscr(); /*清屏*/ textcolor(YELLOW); /*设置文本颜色为黄色*/ textbackground(BLUE); /*设置背景颜色为
34、兰色*/ gotoxy(10,2); putch(0xda); /*输出左上角边框*/ for(i=1;i44;i+) putch(0xc4); /*输出上边框水平线*/ putch(0xbf); /*输出右上角边框 */ for(i=3;i22;i+)/*输出左右两边的垂直线*/ gotoxy(10,i);putch(0xb3); gotoxy(54,i);putch(0xb3); gotoxy(10,22);putch(0xc0); /*输出左上角边框*/ for(i=1;i44;i+) putch(0xc4); /*输出下边框水平线*/ putch(0xd9); /*输出右下角边框*/
35、window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i8; /*对所压的键进行判断*/ gotoxy(10,i+1); textbackground(BLUE);/*设置背景颜色为蓝色*/ cprintf(%s,fi); /*输出菜单项*/ if(key=72) i=i=1?17:i-1; /*如压向上光标键,i减1,如已到第一行再上移,则到最后一行*/ if(key=80)i=i=17?1:i+1; /*如压向下光标键,i加1,如已到最后一行再下移,则到第一行*/ gotoxy(10,i+1); /*光标移动i的下一项*/ textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/ cprintf(%s,fi); /*输出菜单项*/ c=i-1; /*给代表菜单选项的整数赋值*/
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922