工资管理系统.docx
《工资管理系统.docx》由会员分享,可在线阅读,更多相关《工资管理系统.docx(55页珍藏版)》请在冰豆网上搜索。
![工资管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/2/fcf0eb4a-5822-4d39-bb1a-93e4303f2d07/fcf0eb4a-5822-4d39-bb1a-93e4303f2d071.gif)
工资管理系统
课程设计任务书
学院
信息学院
专业
计算机科学与技术
学生姓名
学号
题目
工资管理系统
内容及要求:
内容:
(列出相应题目)
工资管理:
自己建立数据文件(提示可建立:
职工、工资级别、职工工资)完成:
①数据录入②查询(如:
职工的平均工资查询、某一级别人员的平均工资查询)③插入、删除、修改④排序(将职工姓名按工资额度进行)等功能。
要求:
1.设计数据结构,存储结构;
2.在Turboc或兼容环境完成上述题目的代码编写与调试;
3.程序运行界面交互性好;
4.给出两组测试数据。
任务交付:
1.程序源代码;2课程设计论文及电子文档。
进度安排:
本课程设计时间为16、17教学周。
其中包含设计、代码调试、课程设计论文撰写几个阶段。
第1周查找资料、完成初步设计、代码设计与初步调试;
第2周调试、测试、验收、课程设计论文撰写、答辩。
指导教师(签字):
年月日
学院院长(签字):
年月日
1、功能需求分析及初步设计
(1)在该部分中叙述整体功能及每个模块的功能要求。
(2)所设计文件
在C盘下定义“file.dat”文件,将职工信息写入其中。
2、概要设计
(1)程序中使用的存储结构设计说明
structEmployee//声明职工的结构作为链表节点。
{
intm_Code;//职工代码
charm_Name[20];//职工姓名
unsignedintm_Wage;//职工工资
intm_level;//工资级别
structEmployee*Next;//链表节点的指针域
};
(2)每个部分的算法设计说明。
1、整体算法流程图
2、Add(Head);函数算法流程图
3、Modify(Head)函数算法流程图;
4、Del(Head);函数的算法流程图
5、Search(Head)函数算法流程图;
6、Sort(Head);函数算法流程图
7、Display_List(Head);函数算法流程图
3、详细设计
(1)运行界面截图
主界面(菜单选项)
图3-1-1
职工注册界面(已经注册过两个,此界面为第三个职工注册)
图3-1-2
信息修改界面(修改代码为22222的职工信息)
图3-1-3
信息删除界面(删除代码为11111的职工信息)
图3-1-4
信息查询界面(查询姓名为ww的职工信息)
图3-1-5
排序界面(按工资从高到低排序)
图3-1-6
信息显示界面(显示所有职工信息)
图3-1-7
退出系统界面
图3-1-8
(2)相应算法实现的源程序(有注解说明)
1、职工注册
voidAdd(LinkHead)//前插法添加数据。
{
LinkpNew;//声明一个新节点。
charagain;
charname[20];
intcode,level;
unsignedintwage;
do
{
system("cls");
cout<<"\t*************************用户注册系统**************************\n"<pNew=(Link)newNode;//数据域。
cout<<"请输入第"<cout<<"请输入职工代码:
";
cin>>code;
Clear(code);
cout<";
cin>>name;
cout<";
cin>>wage;
sum+=wage;
n++;
while(cin.fail())
{
cout<<"请输入正确的工资数据。
"<cin.clear();
fflush(stdin);
cin>>wage;
}
cout<";
cin>>level;
Clear(level);
while(4<=level||level<=0)
{
cout<<"工资等级输入错误!
"<cout<<"请重新输入工资级别:
";
cin>>level;
}
switch(level)
{
case1:
sum1+=wage;
n1+=1;break;
case2:
sum2+=wage;
n2+=1;break;
case3:
sum3+=wage;
n3+=1;break;
}
cout<pNew->m_Code=code;
strcpy(pNew->m_Name,name);
pNew->m_Wage=wage;
pNew->m_level=level;//指针域。
pNew->Next=Head->Next;
Head->Next=pNew;
cout<<"数据添加成功!
是否继续添加?
(Y/N)"<cin>>again;
}while(again=='Y'||again=='y');
system("pause");
system("cls");
}
2、信息修改
voidModify(LinkHead)//修改单一个节点。
{
system("cls");
cout<<"\t*************************信息修改系统**************************\n"<Linkptr;
intcode;
charname[20];
ptr=Head->Next;
cout<";
cin>>code;
Clear(code);
while(ptr)
{
if(ptr->m_Code==code)
{
cout<cout<<"\t\t\t"<<<<cout<<"\t================================================================"<Display_Node(ptr);//打印满足条件的节点。
cout<sum-=ptr->m_Wage;
n-=1;
switch(ptr->m_level)
{
case1:
sum1-=ptr->m_Wage;
n1-=1;break;
case2:
sum2-=ptr->m_Wage;
n2-=1;break;
case3:
sum3-=ptr->m_Wage;
n3-=1;break;
}
intlevel;
unsignedintwage;
if(ptr)
{
cout<<"\t==============你现在可以修改此职工的信息了!
================"<cout<<"请输入职工代码:
";
cin>>code;
cout<";
cin>>name;
cout<";
cin>>wage;
sum+=wage;
n++;
while(cin.fail())
{
cout<<"请输入正确的工资数据。
"<cin.clear();
fflush(stdin);
cin>>wage;
}
cout<";
cin>>level;
Clear(level);
while(4<=level||level<=0)
{
cout<<"工资等级输入错误!
"<cout<<"请重新输入工资级别:
";
cin>>level;
}
switch(level)
{
case1:
sum1+=wage;
n1+=1;break;
case2:
sum2+=wage;
n2+=1;break;
case3:
sum3+=wage;
n3+=1;break;
}
cout<ptr->m_Code=code;
strcpy(ptr->m_Name,name);
ptr->m_Wage=wage;
ptr->m_level=level;
cout<<"恭喜你,修改信息成功!
"<system("pause");
system("cls");
}
}
ptr=ptr->Next;//查询下一节点。
if(ptr=NULL)
{
cout<<"没找到此职工的记录,无法修改。
"<system("pause");
system("cls");
}
}
}
3、信息删除
LinkSearch_Unique_Front(LinkHead)//查询满足“职工代码“的职工信息(职工代码必需唯一)。
{
Linkptr;
intcode;
ptr=Head;
cout<<"请输入职工代码:
";
cin>>code;
Clear(code);
cout<cout<<"\t\t\t"<<<<cout<<"\t=========================================================="<while(ptr)
{
if(ptr->Next->m_Code==code)
{
Display_Node(ptr->Next);//打印满足条件的节点。
returnptr;//注意,是返回的查询到的节点的直接前趋节点。
}
ptr=ptr->Next;//查询下一节点。
}
returnptr;
}
voidDel(LinkHead)
{
system("cls");
cout<<"\t*************************信息删除系统**************************\n"<Linkptr;
Linkptr_front;
ptr_front=Search_Unique_Front(Head);
if(ptr_front)
{
sum-=ptr_front->Next->m_Wage;
n-=1;
switch(ptr_front->Next->m_level)
{
case1:
sum1-=ptr_front->Next->m_Wage;
n1-=1;break;
case2:
sum2-=ptr_front->Next->m_Wage;
n2-=1;break;
case3:
sum3-=ptr_front->Next->m_Wage;
n3-=1;break;
}
ptr=ptr_front->Next;
ptr_front->Next=ptr_front->Next->Next;
deleteptr;//删除此节点。
cout<<"恭喜你,删除信息成功!
。
"<}
else
cout<<"没找到此职工的记录,无法删除。
"<system("pause");
system("cls");
}
4、信息查询
boolSearch(LinkHead)
{
system("cls");
cout<<"\t*************************用户查询系统**************************\n"<cout<<"选择查询方式:
1、查询职工信息2、按职工的平均工资查询\n";
cout<<"3、按某一级别人员的平均工资查询"<intlevel;
chari;
cin>>i;
if(i=='1')
{
Linkptr;
charname[20];
ptr=Head->Next;
cout<";
cin>>name;
cout<cout<<"\t\t\t"<<<<cout<<"\t================================================================"<while(ptr)
{
if(strcmp(ptr->m_Name,name)==0)
{
Display_Node(ptr);//打印满足条件的节点。
cout<system("pause");
system("cls");
returntrue;
}
ptr=ptr->Next;//查询下一节点。
}
cout<<"无此职工的信息。
"<cout<system("pause");
system("cls");
returnfalse;
}
elseif(i=='2')
{
doubleaver1;
aver1=sum/n;
cout<<"职工总数为:
"<cout<<"所有职工的工资总数为:
"<cout<<"所有职工的平均工资为:
"<cout<system("pause");
system("cls");
returntrue;
}
elseif(i=='3')
{
doubleaver2;
cout<<"请输入您要查找的级别:
";
cin>>level;
Clear(level);
cout<switch(level)
{
case1:
aver2=sum1/n1;
cout<<"工资级别为"<"<cout<<"所有工资级别为"<"<break;
case2:
aver2=sum2/n2;
cout<<"工资级别为"<"<cout<<"所有工资级别为"<"<break;
case3:
aver2=sum3/n3;
cout<<"工资级别为"<"<cout<<"所有工资级别为"<"<break;
}
cout<<"\n工资级别为"<"<cout<system("pause");
system("cls");
returntrue;
}
else
{
cout<<"选择错误,将返回主菜单!
";
}
cout<system("pause");
system("cls");
returntrue;
}
5、工资排序
LinkSort(LinkHead)//创建带头节点的链表。
用直接插入法。
{
system("cls");
cout<<"\t*************************工资排行系统**************************\n"<if((Head->Next==NULL)||(Head->Next->Next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!
"<returnHead;
}
//-----------第二步;
Linkptr;
Linkptr_F;
Linkptr_N;
ptr=Head->Next->Next;
ptr_F=Head;
Head->Next->Next=NULL;//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->Next;
ptr_F=Head;//ptr_F的归位。
while(ptr_F->Next)
{
if(ptr->m_Wage>ptr_F->Next->m_Wage){
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;
break;
}//if
else
{
ptr_F=ptr_F->Next;
}
}//while(ptr_F->Next)
if(ptr_F->Next==NULL)
{
ptr->Next=ptr_F->Next;
ptr_F->Next=ptr;//表示插到有序链表的最后面了。
}
ptr=ptr_N;//归位,准备下一次排序。
}//while(ptr)
cout<<"从高到低,排序成功!
"<system("pause");
system("cls");
returnHead;
}
6、信息显示
voidDisplay_List(LinkHead)
{
system("cls");
cout<<"\t*************************信息显示系统**************************\n"<Linkptr;
ptr=Head->Next;
cout<<"\t=========================所有职工信息=========================="<cout<<"\t\t\t"<<<<cout<<"\t==============================================================="<while(ptr)
{
Display_Node(ptr);
ptr=ptr->Next;
}
cout<<"\t==============================================================="<system("pause");
system("cls");
}
4、测试数据及结果分析
(1)测试数据,测试输出的结果,时间复杂度分析
输入如下的测试数据:
图4-1-1
输出结果下图所示:
图4-1-2
时间复杂度为O(n),即此例为O
(2)。
(2)每个模块设计和调试时存在问题的思考
1、在删除模块,要删除某个节点,就要把此节点指向下一结点的地址赋给指向此节点的指针,可是如果,直接找到要删除的节点,就得不到指向他打指针。
所以我找到的是要删除的节点的前一个节点。
这样就解决了问题。
2、在文件操作模块,一开始文件只能保存,却读不出来。
后来发现,文件读取过程中需要分配一个结构体大小的存储空间,用以存放读出的数据。
然后,用了一个LinkpNode=newNode;解决了此问题。
(3)算法的改进设想。
1、职工代码应该各不相同,所以可以改进当输入职工代码重复时,提示输入错误,并要求重新输入。
2、职工代码有可能是0开头,如09030501,这里的代码定义为int