1中南大学C语言课程设计报告题目教师工资管理系统学生姓名***指导教师***学院信息科学与工程学院专业班级电气信息类***班学号*********2课程设计——教师工资管理系统一、设计环境(1)硬件:一般PC机。(2)软件:操作系统为WindowsXP或Windows2000,设计语言VisualC++或TuboC2.0.二、设计步骤(1)根据问题的描述,设计数据存储方式;(2)分析系统功能,划分功能模块,确定各模块函数名称;(3)主程序算法和各模块算法设计;(4)编程实现;(5)调试与测试。三、课程设计目的和要求A.巩固和加强《c语言程序设计》课程的理论知识。B.掌握c语言的基本概念,语法,语义和数据类型的使用特点。C.掌握c语言程序设计的方法及编程技巧,能正确使用c语言编写程序。D.进一步理解和运用结构化程序设计的思想和放法。E.使学生掌握调试程序的基本方法及上机操作方法。F.通过查询手册和文献资料,培养学生独立分析问题和解决问题的能力。G.初步掌握开发一个小型实用系统的基本方法。H.培养学生的创新能力和创新思维。I.培养学生良好的程序设计风格。进一步理解和运用四、课程设计题目及内容教师工资管理系统每个教师的信息为:3教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。注:应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电费+房租+所得税+卫生费+公积金;实发工资=应发工资-合计扣款。①教师信息处理A、输入教师信息;B、插入(修改)教师信息;C、删除教师信息;D、浏览教师信息;②教师数据处理:A、按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据;B、教师实发工资、应发工资、合计扣款计算;(提示:计算规则如题目。)C、教师数据管理;(提示:输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件。)D、教师数据查询;(提示:输入教师号或其他信息,即读出所有数据信息,并显示出来。)E、教师综合信息输出;(提示:输出教师信息到屏幕。)五、需求分析1、解决问题:教师信息处理,包括输入教师信息、插入修改教师信息、删除教师信息、浏览教师信息2、具体要求:A按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。B教师实发工资,应发工资,合计扣款计算。C教师数据管理D教师数据查询E教师综合信息输出3、限制条件:A、建立教师信息的结构体和链表B、实现教师信息的录入和插入C、实现教师数据的综合输出D、实现教师信息的查询和删除六、总体设计A、总体架构输出界面4选择操作选择0选择2选择1选择3选择5选择4清屏退出结束Break删除数据Break插入数据Break输入数据修改数据查询数据浏览数据选择6BreakBreakBreak输出处理好的数据结束Break5B、建立链表C、删除结点6D、插入结点E、修改7七、详细设计我负责该程序的总体架构,链表建立,程序调试与修改等内容。下面就我的工作内容做出以下详细设计的说明。该函数可以分为九个子函数,可以分为八个模块:链表建立数据输入、插入、删除、修改、查询、浏览、文件储存调用、界面设计。A、链表建立数据输入:主要包括建立一个structteacher的结构体指针,然后将结构体中的next指针指向下一个结构体,定义一个变量n,表示链表中节点的个数即教师人数。然后以此为基础编一个enter函数,依次输入教师的各项数据,同时还要有个循环,一边能够大批量的输入教师数据,在循环中还要设置相应跳出点。B、插入删除修改节点:这涉及到了我们所编写的程序中的三个函数(insert、del、edit)。两个函数思路相似,具体操作就是先判定当前的数据是否为空,如果有数据才能进行插入删除工作。先定义两个指针变量p1、p2,将p1指向head,然后从head开始查找,直到教师号和已输入的教师号相匹配,删除该节点,即将该节点的上一个节点与下一个节点连接起来。而插入函数则要把指向新输入的节点的指针与指定位置的节点连接起来。修改函数则在查询的结果上进行操作,重新输入正确数据调用query函数查找到相关结点地址修改相关结点的值域是否存在该教师信息修改完毕8C、查询函数:对应着我们程序中的query函数,思想与删除教师信息的思想差不多,不同的就是在找到对应的节点后直接输出该节点所包含的信息。D、浏览函数:print函数。就是在屏幕上打印数据E、文件存储调用:save和load函数。Save函数将enter函数所得到的数据保存在teacher_list文件中,load函数则是调用载入该文件,将teacher_list中的数据处理。F、主函数:主函数包括显示欢迎界面和主目录。通过定义变量choice变量并从键盘获得它的值,使用switch函数,通过choice不同的值调用不同的函数。在调用输入插入修改函数是还要注意同时调用save函数以保证将数据保存在相应的文件中:在调用修改查询浏览函数时也要调用load函数将teacher_list中的数据载入,在进行想要执行的操作。八、测试与调试调试方法:子函数各自分开调试,最后汇总调试,多线程调试,设置断点,单步执行,查看个别变量。测试结果分析与讨论,主要问题,解决方法:A、输入死循环,enter函数出现逻辑错误,需要单步执行调试。将while循环中的scanf后加一次判定if(p1-num==0)break,以结束循环。B、数据乱码,数据输入时有问题,需要查阅资料并解决。凡是scanf输入字符型常量,在scanf后加fflush(stdin)清除缓存。C、查询函数没有作用直接跳出,query函数逻辑问题,需要重新修改。定义变量,从键盘获得该变量的值,从链表的开始与该值比对直到遇到和它相同的值,输出该教师的信息。D、欢迎界面和主菜单比较难看,需要修改。九、测试结果欢迎界面9开始菜单输入教师信息10插入数据查询教师数据11浏览教师信息修改教师信息十、心得体会经过了这次为时两周课程设计我学习到了很多东西。首先,我对曾经学过的东西有了更加深刻的了解和掌握。以前所学的函数的调用、结构体链表的建立以及链表中的结点的插入删除等内容只是一知半解,但是经过了这次的课程设计,我已经很深刻的了解和掌握了这些内容,并且能举一反三。12这次的课程设计我在我们小组中主要负责程序的整体脉络,程序的调试修改,对程序的统筹,以及链表的建立和关键变量的命名等内容。因此我充分地运用了我所学知识,建立了一个单向链表,为后面数据的插入删除的操作做了应有的准备和基础。不光如此,在此次课程设计的过程中我遇到了很多问题,在解决这些问题的过程中我学会了很多知识。在调试enter函数时我的输入总是遇到死循环,要不停输入数据,经过我认真思考,我觉得可以在教师号输入错误(即输入非整数)是退出输入函数,回到主菜单,于是我在教师号的scanf后加了一条判定语句【if(p1-num==0)break;/*判断是否要继续输入*/】,这样使输入数据有了更大的灵活性。在调用scanf()函数时,所得的数据经常会出现一堆很难以解释的乱码。经过询问和在网络上查找,我才知道原来在使用scanf()输入字符型常量后要用fflush(stdin)来清除一下缓存,这样可以避免数据的输入错误,这也是我在此次课程设计中所学到的东西。在程序的修改期间我觉得我们的欢迎界面和开始菜单太难看,于是我经过多次调试终于确定了,一行可以输出80个字符。运用这一点让我的输出函数变得更加好看了。另外此程序一开始设计的时候没有把文件处理考虑进去,所以在退出系统后上次输入的信息都没有了。后来我们在程序中添加了save函数和load函数,这两个函数的功能分别为存储和载入数据,这样更增加了我们的管理系统的功能。因此我觉得以后如果能够再次编写程序一定要保证它的功能全面,一个功能不全面的软件是一个废物而已,只能在实验室里使用。但是此次课程设计还有许多问题没有解决。比如在输出信息时,我想用gotoxy()函数来控制输出的位置。但是,这一函数好像在C-Free中不能应用,总是无法编译,但是它可以很好的在turboc使用。为了能够使自己所得到的程序支持汉字我们只能使用C-Free来编辑它,由于没有很好的使用gotoxy()函数我感到了一种遗憾。另外,本来我是想用双向链表来实现数据的输入等工作的,我设计好了双向的链表,但是由于编后面的函数的同学不会使用双向链表,这个计划就搁浅了,这也是我的另外的遗憾。但是总起来说我在这两周的课程设计中学习到了很多东西,也体会到了编程和调试程序的快感。因此我对程序设计更加感兴趣了,并且非常有信心学好程序设计这门课程。十一、附录源程序:#includestdio.h#includestdlib.h#includeconio.h#includedos.h#defineLENsizeof(structteacher)structteacher*enter();/*教师信息的结构体*/structteacher{intnum;13charname[10];charsex[8];charunit[10];charaddress[10];longtelnum;floatsalary_1;floatallowance;floatlife_allow;floatsalary_2;floattel_fee;floattax;floathealth_fee;floatwater_fee;floatrent;floatgrant;floattotal_fee;floatactual_salary;structteacher*next;};intn;structteacher*head;FILE*fp;/*enter函数输入教师信息*/structteacher*enter(void){structteacher*p1,*p2;n=0;p1=p2=(structteacher*)malloc(LEN);printf(教师号:);scanf(%d,&p1-num);fflush(stdin);printf(教师姓名:);gets(p1-name);printf(教师性别:);gets(p1-sex);printf(单位名称:);gets(p1-unit);printf(家庭地址:);gets(p1-address);printf(电话号码:);scanf(%ld,&p1-telnum);fflush(stdin);14printf(基本工资:);scanf(%f,&p1-salary_1);fflush(stdin);printf(津贴:);scanf(%f,&p1-allowance);fflush(stdin);printf(生活补贴:);scanf(%f,&p1-life_allow);fflush(stdin);printf(电话费:);scanf(%f,&p1-tel_fee);fflush(stdin);printf(个人所得税:);scanf(%f,&p1-tax);fflush(stdin);printf(房租:);scanf(%f,&p1-rent);fflush(stdin);printf(公积金:);scanf(%f,&p1-grant);fflush(stdin);printf(水电费:);scanf(%f,&p1-water_fee);fflush(stdin);printf(卫生费:);scanf(%f,&p1-health_fee);fflush(stdin);p1-salary_2=p1-salary_1+p1-allowance+p1-life_allow;p1-total_fee=p1-tel_fee+p1-water_fee+p1-rent+p1-tax+p1-health_fee+p1-