教师工资管理系统.docx
《教师工资管理系统.docx》由会员分享,可在线阅读,更多相关《教师工资管理系统.docx(27页珍藏版)》请在冰豆网上搜索。
教师工资管理系统
课程设计报告
课程名称C语言课程设计
课题名称教师工资管理系统
专业
班级1191
学号
姓名
指导教师
2012年7月1日
湖南工程学院
课程设计任务书
课程名称C语言课程设计
课题教师工资管理系统
专业班级自动化
学生姓名
学号
指导老师陈世清 黄哲
审批陈世清
任务书下达日期2012年6月25日
任务完成日期2012年7月1日
教师工资管理系统
摘要:
每个教师的信息为:
教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。
注:
应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电费+房租+所得税+卫生费+公积金;实发工资=应发工资-合计扣款。
具体实现如下功能:
A、教师信息处理
(1)输入教师信息
(2)插入(修改)教师信息:
(3)删除教师信息:
(4)浏览教师信息:
提示:
具体功能及操作参考题1。
B、教师数据处理:
(1)按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。
(2)教师实发工资、应发工资、合计扣款计算。
提示:
计算规则如题目。
(3)教师数据管理
提示:
输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件
(4)教师数据查询:
提示:
输入教师号或其他信息,即读出所有数据信息,并显示出来。
(5)教师综合信息输出
提示:
输出教师信息到屏幕。
1.教师工资管理系统开发设计思想
对于一个管理系统而言,主函数,函数以及成员函数是其重要组成部分。
系统开发设计也是从该三方面入手,下面加以详细阐述。
(1)主函数的设计
在做一个系统开发前,一定要明确系统的功能以及功能实现时的输出(屏幕显示)。
编写主函数的主要任务就是确定调用函数以及控制屏幕显示。
①确定调用的函数
根据要求,该系统至少应该实现五种基本功能:
输出工作信息,删除工资信息,修改工资信息,查找工资信息,列出所有信息。
实现以上任何一种功能都必须要调用一个函数,根据标识符的定义规则,依次命名为AddNew(),DoDelete(),DoMotify(),DoFind(),List().
②屏幕显示
一个系统要想处理信息,首先必须要输出菜单及提示信息,通过用户在键盘上的输入来选择某个功能。
本系统的屏幕显示如上。
为实现该屏幕显示,输出语句完全可以放在main()函数中,但为了使主函数清晰明了,我设计了一个菜单函数Main()供其调用。
(2)函数的设计
编写函数的目的就是编写一个能实现某种功能的函数供主函数调用。
根据C++面向对象的特点,函数也可以调用类中的成员函数。
这样主函数,函数以及成员函数之间的层次分明,关系就清晰明了,不会有冗长的感觉。
函数设计的主要任务是确定调用的成员函数以及屏幕显示。
①确定调用的成员函数。
不同的函数调用的成员函数是不尽相同的,基本上每个函数都有一个对应的成员函数,例如AddNew()与AddItem(),DoDelete()与RemoveItem(),DoFind()与Search(),DoMotify()与Replace(),List()与Worker.List()对应,这些成员函数都是共有函数,并且只被其对应函数唯一调用一次。
当然,每个函数不可能只调用一个成员函数,例如AddNew()还调用了另外两个函数Input()和Actualpay()。
②屏幕显示
编写函数也需要控制输出以及功能间的转换,从而每一个函数都需要有一个循环来控制其结束。
结束的条件都是“当输入的编号为0时结束”,循环语句有while也有do…while,例如DoDelete()和DoFind()用的是do…while,AddNew()用到的是while语句。
(3)成员函数的设计。
成员函数是系统的灵魂,因为所有的处理过程的细节都在成员函数中完成的。
编写成员函数实际上就是一个算法的实现。
成员函数的设计包括两方面内容:
成员函数算法的实现和成员函数过程的实现。
①成员函数算法的实现
工资管理系统不能单凭数组来处理数据,因为企业教师数是不确定的,并且数组在删除和查找某条信息是相当繁琐。
所以该系统需要一个全新的数据处理方式——链表。
链表是最简单也是最常用的一种动态数据结构,它是对动态获得的内存进行组织的一种结构。
它不需要实现定义固定的长度,灵活性更强。
链表是算法的关键。
在添加新的数据时,可以表头插入也可以表尾插入,这两种插入方法决定了其他成员函数数据的处理。
本系统中采取的是表尾插入的方法。
在删除某信息时需要判断数据是在表头,表中还是表尾,如果删除的是在表中,则需要将删除的前后链表连接起来。
总之,本系统大量运用了链表的5种基本操作:
建立链表、链表的插入、删除、输入和查找。
②成员函数过程的实现
算法确定后还需要控制屏幕显示、条件的判断以及调用其它成员函数。
成员函数之间是可以相互调用的,例如成员函数List()就调用了成员函数ListCount()来统计当前链表信息的总数,同时还调用了成员函数Print()来输出Worker_pay()的信息。
整个过程中还有一个重要的指针,Worker_pay*Find(),它被Search(),RemoveItem()以及AddItem()所调用。
其次成员函数中大量运用到了程序控制结构。
例如,AddItem()中用if来判断是否是链表的表头,List()中用到了while语句来实现循环输出。
最后屏幕上则需要显示一些完成了某种功能的标志,例如“成功删除编号为xx的信息”,“成功修改编号为xx的信息”等。
(3)系统结构框架
系统的结构框架主要是系统的流程图以及函数之间的调用关系,该图能描述系统清晰准确的表现出系统的功能实现。
教师工资管理系统结构框架
图
添加教师工资信息
删除教师工资信息
修改教师工资信息
输出全体教师工资信息
输出指定教师工资信息
2教师工资管理系统功能及系统设计介绍
该工资管理系统可以分为5个模块,每个模块都有其对应的功能以及其设计。
下面对系统的功能和模块的实现进行简要分析。
(1)输入模块
输入模块的功能是创建存储教师工资信息的存储系统以及添加某教师的工资信息。
其中的信息包括教师编号,基本工资,津贴,房租,交通费以及银行储蓄。
为实现输入的功能,有两个方面的任务:
定义结构体以及建立链表。
定义结构体
结构体的名称为Worker_pay,其中包含的信息有教师编号(num),基本工资(pay[0]),津贴(pay[1]),房租(pay[2]),交通费(pay[3]),储蓄(pay[4])以及个人所得税(tax),应扣数(deduct),实发数(actualpay)。
定义一个pay的数组时为了简化变量的定义,使程序更有条理。
②建立链表
通过从表尾插入的方法来建立链表,首先要先设立一个头指针(head)来存放链表的首地址。
然后,不断用new运算符生成一个新的起点,将这个起点链入已有的链表尾部;如果链表中还没有结点,则这个新结点将是首结点,否则,将新结点的地址赋给原有链表的尾结点的next指针。
(2)删除模块
删除模块的功能是删除某教师的工资信息。
当然,信息包括所有输入的信息,以及程序内部函数计算的信息例如个人所得税,实发数。
从一个链表中删去一个结点,首先从表头开始,找到被删结点后,只要改变链接关系即可,使被删结点的前去结点的指针域指向被删结点的后继结点。
如果删去的结点是首结点,则将第二个结点的地址作为新的链表的首地址返回;如果删去的结点是链尾,则将被删结点的前驱作为新的链尾。
(3)修改模块
修改模块的功能是修改某教师的部分工资信息。
要修改某教师的信息首先必须从表头开始搜寻,当找到指定的编号是,重新对其赋值即可。
(4)查找模块
查找模块的功能就是输出指定编号教师的工资信息。
查找链表中的信息时比较简单的,在上面的模块中也用到了,主要是注意查找叶必须从表头开始。
(5)列表模块
列表模块的功能是输出当月全体教师的工资信息。
列表模块就是依次输出链表中各结点的数据。
首先要知道链表头结点的地址,也就是head的值,然后设一个指针变量p,先指向第一个结点,输出p所指结点的数据与的值,然后使p后移一个结点,再输出其数据与的值;依链表顺序而行,依次输出相应结点数据域的值,直到链表的尾结点。
(5)调试过程中遇到的主要问题及解决办法
①设计初期,先完成初步构思,写出主函数。
然后对主函数所涉及的各个模块进行编程,将各个模块利用指针和链表联系起来。
在环境中进行调试,应一边编译,一边调试,并且要一个模块一个模块的调试。
直至此模块完全没有错误时,在进入下一模块的调试。
不能直接输入全部的代码一次性调,这样错误会很多,并且不易找出和修改。
在完成程序的编译链接后,要用多组数据进行审查,确保做到系统无误。
设计过程中,不应忽视环境提示的警告,有时程序运行不正确与警告也有很大的关系。
这次设计中遇到很多问题都是提示类型不匹配,这时就要认真检查前面的代码,及时改正并且认真仔细,杜绝此类错再次发生。
编写代码时应该少用全局变量,全局变量在编写试看似定义次数少,很方便。
但全局变量出错几率较大,且不易修改,每次修改时都要全面考虑,所以应避免用到。
程序调试中碰到的错误可以使自己学到知识。
养成良好的编程习惯,可以节省很多时间,避免很多不必要的错误。
②在编辑完整个程序后,进行调试阶段总是会数显head无定义。
解决办法:
再类的定义是忘记声明指针Worker_pay*head;。
3总结
经过一周的C++课程实践,我对C++语言设计有了一个更深,更全面的了解,尤其体会到了C++面向对象操作对简化程序的重要作用。
下面是我的几点体会:
①刚拿到课题时,我一脸的茫然,看到如此庞大的工程,不知如何下手。
这个工资管理系统中教师子信息竟然包含15条,以前从来没有遇到过如此多的变量。
和同学讨论很久好,我发现其实可以化繁为简的,信息中15条不一定全都要,因为其中本身就有重复的,例如津贴和补贴。
并且可以有一个pay的数组来处理数据。
所以做任何事情都必须要开动脑筋,积极思考,有时还要学会化繁为简。
②在编程时条理清晰是至关重要的。
主函数,函数,成员函数之间的层次关系,调用关系一定要有一个全面的把握,尤其要体会类的封装性。
另外很重要的一点就是一定要对链表的五种操作熟练的掌握。
③在编译,链接,调试的过程中一定要有耐心。
因为一个程序中会有很多小的错误,甚至有的问题要几个小时才能解决。
遇到问题,一定要全面分析,有时候还要向同学请教。
总得来说,编程时极需要耐心的。
总之,C++课程设计实践为我们提供了一个综合运用所学知识,解决实际问题的平台,增强了我们实践动手的能力和工程实践能力,并且锻炼和培养了我们的自学能力,让我们对C++有了一个更全面的了解。
4输入过程即截图:
附源代码:
//题目:
工资管理系统
//代码如下:
#include
#include
#include
structteacher
{
charname[30];
charID[10];
intsalary1,salary2,salary3;
};
intdq();
voidshow();
voidbc(structteacherte[]);
voidadd();//添加教师信息
voidsee();//查看教师信息
voidsearch();//查找教师信息
voidghcz();//工号查找教师信息
voidxmcz();//姓名查找
voiddel();//删除教师信息
voidxmsc();//按姓名删除教师信息
voidghsc();//按工号删除教师信息
voidstatistics();//统计教师工资
voidmodify();//修改教师信息
voidghxg();//按工号修改
voidxmxg();//按姓名修改
voidreserve();//保存教师信息
voidback();//返回
structteacherte[100];//所有的教师总数
intNumber=0;//记录总的教师人数
intmain()
{
intchoose=0;
Number=dq();
while(true)
{
show();
printf("\t\t==========>请选择:
");
scanf("%d",&choose);
system("cls");
switch(choose)
{
case0:
exit(0);//退出
break;
case1:
add();
back();//添加教师信息
break;
case2:
see();
back();//查看教师信息
break;
case3:
search();
back();//查找教师信息
break;
case4:
del();
back();//删除教师信息
break;
case5:
statistics();
back();//统计教师工资
break;
case6:
modify();
back();//修改教师信息
break;
case7:
reserve();
back();//保存数据
break;
default:
printf("输入错误,重新输入!
");
break;
}
fflush(stdin);
getchar();
system("cls");
}
}
intdq()
{
FILE*fp=NULL;
inti=0;
fp=fopen("D:
//teacher.txt","rb");
while(fread(&te[i],sizeof(structteacher),1,fp))
i++;
fclose(fp);
returni;
}
voidshow()
{system("color3F");
printf("\n");
printf("\t****************欢迎使用教师工资管理系统****************\n\n");
printf("\t*☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆*\n\n");
printf("\t^^^^^^^^^^^^^^^^^^^[1]添加教师信息^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[2]查看教师信息^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[3]查找教师信息^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[4]删除教师信息^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[5]统计教师工资^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[6]修改教师信息^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[7]保存数据^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t^^^^^^^^^^^^^^^^^^^[0]退出系统^^^^^^^^^^^^^^^^^^^^^\n\n");
printf("\t*★★★★★★★★★★★★★★★★★★★★指导老师-陶陶★*\n");
}
voidbc(structteacher*te)
{
FILE*fp=NULL;
fp=fopen("D:
//teacher.txt","ab+");
fwrite(te,sizeof(structteacher),1,fp);
fclose(fp);
}
//添加教师信息
voidadd()
{
intnumberTemp=0;
inti=0,k;
charz;
structteachertemp;
for(i=0;i<100;i++)
{
printf("输入第%d个教师信息\n",Number+1);
printf("姓名:
");
scanf("%s",temp.name);
printf("工号:
");
scanf("%s",temp.ID);
for(k=0;k{if(strcmp(temp.ID,te[k].ID)==0)
{
printf("有工号重复,请重新输入工号:
");
scanf("%s",temp.ID);
}
}
printf("基本工资:
");
scanf("%d",&temp.salary1);
printf("生活补贴:
");
scanf("%d",&temp.salary2);
printf("津贴:
");
scanf("%d",&temp.salary3);
te[Number++]=temp;//写入到数组
bc(&temp);//写入到文件
printf("继续?
YorN\n");
scanf("%s",&z);
if(z!
='Y')
break;
}
printf("添加成功\n");
}
//查看职工信息
voidsee()
{intch;
voidscsa();
voidprin();
prin();
scanf("%d",&ch);
system("cls");
switch(ch)
{
case1:
scsa();
break;
default:
break;
}
intk=0;
doublesum;
printf("以下是全部教师\n");
printf("\t姓名\t工号\t基本工资\t生活补贴\t津贴\t税后总工资\n");
while(k{if(te[k].salary1<1500)
sum=(te[k].salary1)*0.97+te[k].salary2+te[k].salary3;
elseif(te[k].salary1>=1500&&te[k].salary1<4500)
sum=(te[k].salary1)*0.9+te[k].salary2+te[k].salary3;
printf("\t%s\t%s\t%d\t\t%d\t\t%d\t%6.1f\n",te[k].name,te[k].ID,te[k].salary1,te[k].salary2,te[k].salary3,sum);
k++;
}
}
voidprin()
{
printf("\t^^^^^^^^^^^^^^^^^^^[1]按工资排列^^^^^^^^^^^^^^^^^^^^^\n");
printf("\t*★★★★★★★★★★★★★★★★★★★★★★★★★★★*\n");
}
voidscsa()
{
intj,i;
structteacherteacher1;
for(j=0;j<=Number;j++)
{for(i=0;iif(te[i].salary1{teacher1=te[i];
te[i]=te[i+1];
te[i+1]=teacher1;}
}
}
//查找教师信息
voidsearch()
{
intn=0;
printf("1按姓名查找\n");
printf("2按工号查找\n");
scanf("%d",&n);
switch(n)
{
case1:
xmcz();
break;
case2:
ghcz();
break;
default:
printf("输入错误!
\n");
break;
}
}
voidxmcz()//按姓名查找
{
charname[30];
inti=0;
printf("请输入要查找教师姓名:
");
scanf("%s",name);
system("cls");
printf("\t姓名\t工号\t基本工资\t生活补贴\t津贴\n");
for(i=0;i{
if(strcmp(name,te[i].name)==0)
{
printf("\t%s\t%s\t%d\t\t%d\t\t%d\n",te[i].name,te[i].ID,te[i].salary1,te[i].salary2,te[i].salary3);
}
}
}
voidghcz()//按工号查找
{
charid[10];
inti=0;
printf("请输入要查找教师工号:
");
scanf("%s",id);
system("cls");
printf("\t姓名\t工号\t基本工资\t生活补贴\t津贴\n");
for(i=0;i{
if(strcmp(id,te[i].ID)==0)
{
printf("\t%s\t%s\t%d\t\t%d\t\t%d\n",te[i].name,te[i].ID,te[i].salary1,te[i].salary2,te[i].salary3);
}
}
}
//删除教师信息
voiddel()
{
intn=0;
printf("1按姓名删除\n");
printf("2按工号删除\n");
scanf("%d",&n);
switch(n)
{
case1:
xmsc();
break;
case2:
ghsc();
break;
}
}
voidxmsc()//按姓名删除
{
FILE*fp=NULL;
charname[30];
inti=0;
intj=0;
printf("请输入要删除的教师姓名:
");
scanf("%s",name);
for(i=0;i{
if(strcmp(name,te[i].name)==0)
{
for(j=i;j{
te[j]=te[j+1];
}
Number--;
}
}
//将剩余数据写入文件擦除以前的数据
fp=fopen("D:
//