职工工资管理系统C语言作业_第1页
职工工资管理系统C语言作业_第2页
职工工资管理系统C语言作业_第3页
职工工资管理系统C语言作业_第4页
职工工资管理系统C语言作业_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【柯泥波特】职工工资信息管理系统设计报告21声明: 本报告主要用于苏科大的学子们完成C语言作业时候进行参考,为下一届的童鞋做点贡献吧,你可以随意使用本程序的代码。这个程序完全出于原创,因为是第一次尝试编写功能比较多的程序(我也是初学者嘛),策划与编程共用了一个星期,有不足之处还望大家指出。 -柯泥波特 2013-4-25苏州科技大学二一二 二一三学年第一学期电子与信息工程系课程设计报告书课程名称: 职工工资信息管理系统 班 级: 通信1211 学 号: 1220119* 姓 名: 柯泥波特 指导教师: 任*教授 二一三年一月目 录一、问题分析3二、设计概要4三、系统功能详细设计5四、调试分析1

2、9五、总结19附录:附录1:代码20附录2:操作手册53附录3:在 MS-DOS下的调试54附录4:参考书籍与平台58一、 问题分析1.1 设计题目职工工资信息管理系统1.2 需求分析 1.2.1 工资会由多个部分构成,如何实现对工资组成的自动管理? 1.2.2 一个单位会有多个部门,如何实现对部门,全体或个人的条件查询? 1.2.3每个人的工资每月都不一样,如何实现对三维数据的管理?人,工资,时间。 1.2.4如何实现对工资的录入,查找,排序,存储打印等基本操作? 1.2.5工资属于个人隐私,如何防止未授权非法访问? 1.2.6如何快速熟悉工资管理系统? 1.2.7如何建立一套完善的报错系统

3、用于系统的维护和保证数据的完整与安全?1.3功能1.3.1信息的录入、增添、修改和删除。1.3.1.1 对某一员工工资信息的一次性完整录入,完整删除。1.3.1.2对某一员工部分信息的录入、增添、修改和删除。1.3.2信息的查找、筛选与显示。1.3.2.1对某个员工工资信息的显示。按员工号查找和按姓名查找1.3.2.2高级查找功能。1.3.2.3对所有有效数据或所查找到的信息进行排序,求和自动报表。1.3.2.4按员工号自动排序整理链表。1.3.3加载,保存。 1.3.3.1加载硬盘上的信息。 1.3.3.2将信息存储。1.3.3.3对已有文件的归零操作。1.3.3其它 1.3.3.1友善的操

4、作界面。 1.3.3.2错误提示。 1.3.3.3授权操作加密,文件加密。 1.3.3.4操作帮助。 1.3.3.5员工报错服务。 1.3.3.6按用户性质分级授权服务。二、设计概要 2.1 数据结构 考虑到每个员工与员工的基础资料之间是平行的关系,而每个员工的工资之间是既平行又与其他员工的工资独立的关系。所以本系统的基础数据结构为:动态链表嵌套动态链表。 第一层动态链表:姓名,员工号,性别,工资信息的链表首地址,下一位员工信息的链表地址。 第二层动态链表:记录,年,月,部门,职务,税后工资,基本工资,奖金,税前工资,最高税率,是否发放,下一条工资信息的地址。 报错文件的基本数据类型:报错的员

5、工号,报错留言,下一条报错信息的地址。 2.2数据储存形态 考虑到信息安全问题与方便数据化读取与存储和避免数据转化之间的损失,本系统采用二进制流文件储存形式。 2.3分级授权禁止非法访问 为了最大化的对信息安全进行保护,本系统采用按密码分级授权。在授权模块遭到损坏之后您将无法使用任何功能,只有联系管理员使用初始化密码重新设置。 在密码服务正常的情况下,输入不同的密码将得到不同的权限。 普通用户权限: 按员工号查询工资,按姓名查询工资,工资报错。 管理员权限:按员工号查询工资,按姓名查询工资,查看工资报错的信息与清零,创建新员工,登记工资,修改工资,删除工资,删除员工,信息筛选,自动生成已排序报

6、表,整理链表,修改密码。2.4对于输入流的管理 对于输入流中的信息不容忽视,某些函数接收信息之后会清除掉或转化Enter信息,某些函数则会将Enter留在输入流中,这样会影响到下一次信息的输入。有时候需要将已经读入的信息先判断再决定是否放回到数据流中再等待正确的接收信息。 2.5关于循环操作 程序将在每次操作结束之后,自动保存数据,返回主界面,并进行数据检查,读入,初始化数据等操作,等待下一次命令。三、系统功能详细设计总体构思:模块化解决问题。3.1主函数 main()算法:建立变量go_to,调用密码服务password();,将密码服务的返回值赋予go_to, 并根据go_to的值判断用户

7、类型,决定授予的权限和去向。int go_to=0;调用密码服务函数go_to是否为1?是 否打印提示调用主控函数1是否为2?是 否打印提示调用主控函数2打印提示退出3.2普通用户主控程序 void main_control_1()算法:先声明2个变量 struct Member *head1;和char go_where; 利用数据读取函数basic_read_1(1);对head1进行初始化,等待进行下面的操作。在对go_where进行赋值的时候会进行赋值检测,非规定的字符将被视为无效并继续等待新的输入。最后根据用户对go_where的赋值,决定下面的去向。在每实现一次功能之后自动返回本操

8、作界面【除了返回上一级】。struct Member *head1; char go_where;初始化链表调用文件读取函数打印提示选择去向a调用查找函数1 break;x调用查找函数2 break;r返回上一级 main();exit(0);b调用报错函数 break;qExit(0);循环调用 main_control_1();3.3管理员用户主控程序 void main_control_2()算法:先声明2个变量 struct Member *head1;和char to; 利用数据读取函数basic_read_1(1);对head1进行初始化,等待进行下面的操作。在对to进行赋值的时候

9、会进行赋值检测,非规定的字符将被视为无效并继续等待新的输入。最后根据用户对to的赋值,决定下面的去向。在每实现一次功能之后自动返回本操作界面。struct Member *head1; char go_where;初始化链表调用文件读取函数打印提示选择去向a调用密码修改函数 break;b调用查找函数1 break;c调用查找函数2 break;d调用信息录入函数,信息保存函数 break;e调用显示所有信息函数 break;f查看报错 break;g调用删除函数 break;h调用登记信息函数 break;i调用工资修改函数 break;j调用更多功能函数 break;k帮助 break;l

10、Eixt(0);循环调用 main_control_2();3.4密码验证服务函数 int password()该函数先定义4个变量char get_in20,user20,admin20; int i=0; get_in用来接收用户的输入,uesr和admin为从密码文件中读取的数据,用于比对,i为出错检测变量。同时还定义了一个指针变量FILE *fp;算法:先以追加内容的操作打开文件password,随之关闭。该操作防止password文件丢失,如果该文件存在,则不会有任何变化;如果该文件丢失,则该操作会随即创建一个文件,并且文件内容为空。之后,在以二进制读取的形式打开该文件,读取文件并对

11、user和admin赋值,如果读取失败文件为空也会导致读取失败,则错误变量i被标志,如果读取成功,则i仍为0。下面对i进行判断,若i不为0,则代表发生错误,此时将调用紧急情况密码重置服务void jinji_password();,如果i为0,则提示用户输入密码并进行比对,并根据结果返回相应的值。3.5紧急情况密码重置服务函数 void jinji_password()算法:该函数定义变量n用于接收用户输入的输入,并提示用户输入操作手册中的初始化密码,与常量Jinjipassword 进行比对,如果正确则调用密码修改函数change_password();,如果错误,则将自动退出。3.6密码修

12、改函数 int change_password()可以进入该函数,说明password文件存在,所以不用对其再进行检测。算法:该函数定义局部变量和指针char user20,admin20; FILE *fp; 将用户的输入赋予user和admin并写入password文件。如果发生错误则返回0并退出,如果修改成功则返回上一级。3.7链表第一层信息输入函数 struct Member *basic_input_1(struct Member *head1)该函数接收一个链表指针参数,在完成信息输入之后,返回该指针参数。int i=0; struct Member *now1; char inp

13、ut20; char charge;请输入员工的姓名:对input赋值并检测:当输入成功或不为Enter时申请新链表空间并对第二层链表初始化为NULL将刚刚的输入复制到姓名这一栏中输入该员工的员工号:接收赋值给员工号并清行调用员工号检测函数进行检查cheak_number(now1-A.number,head1)如果该员工号存在则从新输入输入性别:当输入性别失败或为Enter时输入有误或输入失败,请重新输入性别:临时重置变量charhe=a并提示是否确定创建该员工打印预览接收输入并判断直到输入正确如果输入有误则重新输入清行进行判断r则释放空间返回while循环n则创建失败释放空间并返回head

14、1y则进入第二层链表信息输入将新创建的员工头部插入链表提示创建下一位员工并i自加1打印本次操作的详细信息返回head13.8 第二层动态链表信息输入struct Time_J_M *basic_input_2(struct Time_J_M *head2) 该函数接收一个链表指针参数,在完成信息输入之后,返回该指针参数。int j=0; char input220; char charge; struct Time_J_M *now2;现在您将为该员工登记数据:(无需登记请按Enter退出) 请输入部门进行输入判断(while循环)申请空间将刚才的输入复制到部门这一栏其他信息的输入自动计算生成

15、其它数据打印预览刚刚的输入进行判断R 是释放空间打印提示并 continue;插入该条工资信息操作标识变量自加一提示下一条操作显示操作信息返回 head23.9 税率计算函数float tax(int x) 算法:根据传过来数据进行单纯的判断与计算,再将结果返回。3.10第一层打印函数int basic_output_1(struct Member *head1) 算法:该函数先对传过来的链表进行判断,若链表为空则打印没有数据,若链表不为空,则进入打印循环,没循环一次,重置一次自己的局部变量的指向。int i=0,m=0; struct Member *now1;判断是否为空是 否打印:没有数

16、据返回0局部变量初始化now1=head1;当now1不为空时打印数据重置指针指向打印本次输出有关信息3.11第二层打印函数 int basic_output_2(struct Time_J_M *head2) 算法:同第一层打印函数。3.12检查员工号是否重复函数 int cheak_number(int n,struct Member *head1) 算法:该函数接收2个参数,一个是需要比对的员工号,另一个为员工数据的链表头。先将自身局部变量指向head1,进入while循环,若发现有相同的,则改变标识变量并终止循环,若没有相同的,则将指针指向下一个。最后根据标识变量返回数据。struct

17、 Member *now1; int i=0;判断链表是否为空是 否返回0初始化局部变量当now1不为空的时候比对是 否改变标识变量终止循环修改指针指向判断标识变量并返回一个数据3.13数据保存函数int basic_save_1(struct Member *head1)构思,对于一级链表,只要不是空就可以存入,但对于二级链表,为了读取方便,先存储一个有关二级链表信息条数的标识数据,再进行存储。具体算法如下:int i,j,biaozhi=0; struct Member *now1; struct Time_J_M *now2; FILE *fp1;文件打开检测初始化局部变量 now1=h

18、ead1当now1不为空的时候写入一级链表数据初始化局部变量二级链表判断是否为空是 否写入0写入now2-jilu当now2不为空的时候写入数据修改二级指针指向修改一级指针指向关闭文件3.14数据载入函数struct Member *basic_read_1(intc) 该函数为复合读取函数,根据接收的参数可读取不同文件中按照相同结构存储的数据。构思:先进行一级链表信息的读取,如果读取成功,则申请空间进行存储,如果失败则结束读入。在读取二级链表时候,先读入标识数据,根据标识数据来决定重复二级数据读入的次数,最后返回一个一级链表的开头。 具体算法如下:int i; struct Member *

19、head1,*now1,*pre1;struct Time_J_M *head2,*now2,*pre2;FILE *fp2;根据传过来的数据判断打开的文件c=1?是 否打开文件save_date打开文件baobiao_linshi一级局部变量初始化head1=NULL 并打印提示数据申请一级链表空间当一级读取成功时候二级链表初始化 二级数据容量检测当标识数据不为0时申请二级链表空间读入数据插入该条数据标识数据自减1插入该条数据释放已申请的一级空间关闭文件返回一级链表的头3.15查找函数int find(struct Member *head1) 构思:该函数接收全体员工数据的链表头,并将自己

20、的局部变量指向该地址。提示用户输入数据,进入循环比对。比对成功则输出该条信息,比对失败这重置该指针指向下一条员工信息的地址。 具体算法如下:int biaozhi=0,n; char charge; struct Member *now1; struct Time_J_M *now2;判断数据是否为空,如果是则打印提示并终止查找局部变量初始化 now1=head1;提示用户输入查找信息now1不为空的时候进行比对是 否修改标识变量并终止循环修改指针指向now1=now1-next1;判断标识变量是否为0是 否打印提示:没有找到数据打印找到的员工的数据是否重新查找?是 否调整指针重新调用该函数结

21、束调用打印函数3.16员工报错函数void user_baocuo() 该函数主要实现员工自我报错,该函数建立在链表型的数据结构之上。函数调用时,先检查报错储存文件是否存在?读取文件内容,添加新的内容,保存文件。 具体算法如下:FILE *fp; struct baocuo *head3,*now3,*now;初始化链表头,并检测文件是否存在申请空间当读取文件成功时将该条数据插入链表 now-next=head3; head3=now;申请空间释放没用的空间并关闭文件申请新空间信息输入插入该链表调用文件保存函数baocuo_save(head3);3.17 报错文件写入函数int baocuo

22、_save(struct baocuo *head3) 算法:该函数先以二进制流写入模式打开文件baocuo,将局部变量struct baocuo *now3;指向传过来的地址,之后进入循环数据写入,每写入一次数据,指针就向下移一次,直到为空。调出循环,关闭文件。3.18管理员报错信息展示void basic_output_4()该函数先检测文件是否存在,然后打开该文件,初始化链表的头为空。接着申请空间,如果读取成成,则将信息插入链表,再申请空间,直到读取文件失败,此时释放申请到的无用空间,关闭文件。将读取到的链表的头赋予局部变量,now=head;如果链表还是空,则打印提示并结束。如果链表不

23、为空,则进入循环打印阶段,每打印一次,该局部变量的指向就会往下移动一次,直到while循环检测该局部变量为空。最后提示,是否清空报错文件信息。若否,则退出该函数。若确定,则重置该链表为空,并将空链表以只写的形式写入文件。3.19主删除程序int remove(struct Member *head1) 该函数将根据用户的输入再次判断,是删除某一员工的所有信息还是尽是删除员工的某一条工资信息,或是不做任何操作返回上一级。3.20删除某一员工全部信息struct Member *remove_1(struct Member *head1)构思:该删除函数根据员工号进行查找与删除。先确认链表的第一项

24、数据是否符合,若符合,则直接将链表的头指向下一个员工的地址,并释放要删除员工的数据,并返回链表首地址。若要删除的数据不在链表的头,则定义pre指向链表的头,now指向pre的下一级地址参与进行判断,删除时,只需将pre的下一级地址指向now的下一级地址,释放now的数据,并返回链表首地址。struct Member *pre,*now; int n,i=0; char go;提示输入要删除的员工的工号:链表头是否为所需信息是 否打印基本信息【等待进行下面的操作】选择去向y修改链表释放空间返回头指针q返回头指针数据初始化pre=head1; now=head1-next1;当now不为空的时候是

25、否为所需信息?是 否打印基本信息和提示【等待进行下面的操作】选择去向y修改链表释放空间修改标识1q修改标识2标识变量是否为0?是 否修改指针调出循环返回头指针head13.21删除某一员工的某条工资引导函数struct Member *remove_2(struct Member *head1) 该函数查找原理仍是按照员工号进行查找。若没有查找到该员工,则打印提示信息。若找到该员工,则先将其基本信息进行打印。若二级链表没有信息则提示无信息可以删除;若有数据,则继续调用删除执行函数。最后返回链表首地址。3.22删除某一员工的某条工资执行函数struct Time_J_M *remove_3(st

26、ruct Time_J_M *head2)该函数先提示用户输入要删除的工资的记录编号。如果用户没有想要删除的,则按0就可以退出。因为一条工资记录的被删除,会影响到其他记录编号的连续性,进而影响到数据的存储和装载。所该函数先检查所要删除的记录是否为第一条记录,如果是,则直接链表的首地址下移一位即可。若不是,则进入循环查找。 在进入循环查找之前,先进行局部变量初始化,pre2=head2; now2=head2-next2;且pre2所携带的jilu数据自减1 。如果找到了,则pre2-next2=now2-next2即可,并终止循环。若不是,则改编指针指向,并且新的pre2所携带的jilu数据自

27、减1,再次进入循环。循环结束后,返回新的二级链表首地址。 具体算法如下:struct Time_J_M *now2,*pre2; int jilu;输入要删除的工资记录的编号若取消该操作请按0:如果判断为0,则原封不动返回head2判断二级链表第一条内容是否符合?是 否改变链表指向【等待下一步操作】释放空间返回新地址初始化 pre2=head2; now2=head2-next2; -(pre2-jilu);当now2不是空的时候Now-jilu?是 否pre2-next2=now2-next2;pre2=now2; now2=now2-next2;结束循环-(pre2-jilu);返回hea

28、d23.23工资登记/修改引导函数void add(int a,struct Member *head1)该函数是一个多功能引导函数,它接收一个int型的变量参数,并根据它来决定它所执行的部分功能。如果参数为1则引导用户登记员工工资此时调用前面的已有函数basic_input_2(now-head2); 二级链表信息输入函数,若参数不为1,则引导用户修改员工的工资记录此时调用工资修改函数gongzi_change(now-head2);。具体算法如下:struct Member *now; int n,j,i=0;判断功能参数是否为1是 否打印提示: 输入要登记的员工号:打印提示:输入要修改工

29、资的员工号:接收用户输入初始化局部变量now=head1;当now不为空的时候now-A.number=n?是 否打印基本员工信息修改一级指针指向改编标识变量的值判断功能参数是否为1是 否打印提示打印提示接收用户输入接收用户输入是否开始操作是 否是否开始操作是 否登记函数退出循环修改函数退出循环判断操作标识变量是否为1?是 否打印提示:您没有任何更改操作保存更改3.24工资修改执行函数struct Time_J_M *gongzi_change(struct Time_J_M *head2) 该函数接收一个二级链表首地址地址参数。根据用户所输入的工资记录编号来查找要修改的工资记录。先初始化局部

30、变量,进入循环。若找到,则实际上进入类似工资登记的界面,只不过是用新的数据来覆盖老的数据而已,修改结束直接返回地址,结束大循环;若没有找到,则修改局部变量的指向,再次查找。直到找到或检测为空为止。3.25管理员主控程序2 void more_task(struct Member *head1) 该函数同普通用户主控函数与管理员主控函数工作原理相同。它可以引导用户使用2项高级功能:生成全体员工时间工资报表功能和综合条件筛选功能和按员工号排序整理链表。或是不做任何操作返回上一级。3.26全体/时间/报表-主控函数 void Q_T_B(struct Member *head1)该函数的查询对象为全

31、体,范围限定为时间,功能为引导其它函数,实现对每一个月全体员工税后工资排序与展示的自动报表功能。该函数接收全体员工信息的链表首地址,根据用户输入的时间调用筛选函数ShaiXuan(y,m,head1);,筛选函数负责信息筛选和储存。信息筛选之后,再调用信息读取函数new_head1=basic_read_1(2);,读取筛选好的信息,最后传给排序打印函数PaiXuBaoBiao(new_head1);,由此便生成了排序报表。具体算法如下:int y,m; struct Member *new_head1;请输入要生成的报表的年/月如:201201:接收用户输入调用筛选函数ShaiXuan(y,

32、m,head1);打印筛选提示初始化局部变量new_head1=NULL;调用信息读取函数 new_head1=basic_read_1(2)判断是否有信息是 否打印边框打印提示调用PaiXuBaoBiao(new_head1);结束该函数3.27筛选函数void ShaiXuan(int y,int m,struct Member *head1)该函数根据时间为筛选条件。进入循环筛选的时候,先检测该员工是否有需要的数据,如果有,则将该员工的基础信息写入文件baobiao_linshi,并将二级链表的读取次数标识数据记录为1,再写入二级链表的内容。如果发现该员工没有要找的信息,则不写如该员工的

33、任何信息。具体算法如下:struct Member *now1; struct Time_J_M *now2;FILE *fp; int i=0,b=1;打开文件baobiao_linshi 初始化局部变量now1=head1;打印检测信息:开始筛选当now不为空时i=0 初始化二级链表的局部变量该员工二级链表是否为空?是 否修改一级链表局部变量指向开始下一次循环当二级指针不为空的时候是否为所需数据?是 否修改标识变量i+结束二级查找改变指针指向进入下一次二级循环判断标识变量是否为1?是 否写入一级基础数据修改一级链表局部变量指向开始下一次循环写入二级读取标识数据初始化二级链表局部变量当now

34、2不为空的时候是否为所需数据?是 否写入数据结束循环改变指针指向进入下一次二级循环关闭文件3.28报表排序函数void PaiXuBaoBiao(struct Member *head1)该函数的原理是,找到最大的数据,打印之后便删除,然后再找新链表中最大的数据再打印,再删除,直到链表为空。这样便在显示器上形成了从大到小的排序报表。采用打印即删除的算法,而不是采用先排序后打印算法的原因:1,动态链表长度具有不可预知性;2,若先检测长度,根据长度决定排序运行次数,逐一排序,之后打印,计算表明,这种先排序后打印算法的步骤会长于打印即删除算法的步骤。3,因为任务的性质是生成每月的报表,文件不需要保存

35、,排好序的链表最终会消失在内存之中。具体算法如下:struct Member *now1,*max,*pre; float a=0,b=0,c=0,d;初始化数据当now1不为空的时候计算有关数据now1=now1-next1;计算有关数据打印表头当一级链表不为空的时候初始化pre=head1; max=head1; now1=head1-next1;now1是否为空?打印信息【等待下一步操作】结束大循环当now1不为空的时候now1-head2-aftertaxmax-head2-aftertax?是 否max=now1; pre=head1;now1=now1-next1;当pre!=NU

36、LL时候pre-next1-A.number=max-A.number是 否结束循环pre=pre-next1;now1=now1-next1;max=head1?是 否head1=head1-next1;pre-next1=max-next1;打印信息打印其他信息3.29按姓名查找函数void name_find(struct Member *head1) 该函数算法与按员工号查找函数算法一样。不同之处在于员工号查找只需比对数字即可,按姓名查找需要比对字符串的前4个字符的编码。3.30高级查找函数void other_find(struct Member *head1)构思:该函数通过接收的

37、输入是否为Enter智能判断用户是否有条件输入,如果是Enter则吸收该输入,若不是Enter则再放回到输入流中,等待正确的变量接收,并将标识变量改为1,最后统计所有标识变量的和。因为初始化的标识变量都是0,只要是用户输入了条件,对应的标识表变量就变成了1,所以最后的和也就是条件的数目。在条件筛选的时候,初始化筛选动态变量为0,根据对应的标识变量是否为1或0来判断是否增减该条件的筛选,每检查完一条项目之后,检查筛选动态变量是否和上面的和相等,若相等,则打印该条信息。直到大循环结束。3.31帮助函数void help() 该函数为单纯的信息展示函数。3.32链表排序整理函数void paixu_

38、zhengli(struct Member *head1) 该函数根据员工号的大小自动排序整理链表; 该函数先统计链表的长度决定冒泡排序次数。改变链表的排序由2个局部变量实现。 具体算法如下:struct Member *now1,*pre; int i=0;初始化局部变量 并打印提示当now1不是空的时候统计链表长度 +i;now1=now1-next1;打印提示当i不是0的时候now1=head1; pre=head1;准备排序当now1-next1不是空的时候now1-A.numbernow1-next1-A.number?是 否now1=head1?是 否pre=now1; now1=

39、now1-next1;head1=now1-next1; now1-next1=head1-next1; head1-next1=now1; pre=head1;pre-next1=now1-next1;now1-next1=now1-next1-next1; pre-next1-next1=now1; pre=pre-next1;-i;保存链表打印提示原理图:四、调试分析4.1 为了方便调试和发现错误,本程序增添了很多用于显示状态的提示。如:正在读取;读取成功;正在写入;写入成功;筛选成功;没有数据,数据如下 这些提示的显示,可以表明程序的正常运行,若不能显示,也可以说明错误发生在何处,方便

40、以后的维护和查错。4.2 关于本程序的调试。虽然在编写过程中会发生一些错误,但因为有一系列的报错机制和运行提示,所有错误均已排除,现在程序整体运行正常。五、总结通过本次编程联系,收获很多,现在总结如下:1. 在写程序之前,一定要有一个总体的构思。这些构思包括:要实现什么功能,选择什么样的数据结构,如何去控制数据,每个模块要负责什么功能。2. 在写模块函数程序的时候,也一定要有一个构思。这些构思包括:本函数的算法,本函数要接收什么参数,返回什么数据,如何调用本函数,是否能将函数写的更为通用,功能更强大,而不是只能调用一次。3. 键盘缓冲槽中的数据不容忽视,要随时清行来避免自动触发其它操作,又不能

41、进入死循环或是删除了正确的命令,这是我编程的最大体会,也是本次收获的一个最大技巧。4. 要有一个良好的排版风格,不好的风格在写多重循环嵌套的时候很容易眼花。5. 注意输入字体,减慢输入速度,来减少错别字的输入。6. 要注重给用户一个好的体验,好的界面。要有高效的算法,要加密信息以保障安全。多从用户的角度考虑问题,这样才能写出有用的程序,而不是一些虚而无用的代码。附录1:代码/*头文件*/#include#include#include#include#define TAX1 0#define TAX2 0.05#define TAX3 0.1#define TAX4 0.2#define Ji

42、njipassword 111111/*数据类型*/21struct Basic_info int number; char name20; char sex4;struct Member struct Basic_info A; struct Time_J_M *head2; struct Member *next1;struct baocuo int n; char mess100; struct baocuo *next;struct Time_J_M int jilu; int year; int month; char bumen20; char zhuwu20; float aft

43、ertax; int total; int jiben; int jiangjing; float tax; char fafang; struct Time_J_M *next2;【柯泥波特】职工工资信息管理系统设计报告/*函数原型*/int password();int change_password();void jinji_password();void main_control_1();void main_control_2();void user_baocuo();struct Member *basic_input_1(struct Member *head1);struct T

44、ime_J_M *basic_input_2(struct Time_J_M *head2);int baocuo_save(struct baocuo *head3);float tax(int x);int basic_output_1(struct Member *head1);int basic_output_2(struct Time_J_M *head2);void basic_output_4();int cheak_number(int n,struct Member *head1);int basic_save_1(struct Member *head1);struct Member *basic_read_1(int c);int find(struct Member *head1);int remove(struct Member *head1);struct Member *remove_1(struct Member *head1);struct Member *remove_2(st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论