VC++课程设计--工资管理Word文件下载.docx
《VC++课程设计--工资管理Word文件下载.docx》由会员分享,可在线阅读,更多相关《VC++课程设计--工资管理Word文件下载.docx(28页珍藏版)》请在冰点文库上搜索。
classCList //定义链表类
{
protected:
CNode*pHead;
//链表头结点指针public:
CList(){pHead=0;
} //赋值
~CList(){DeleteList();
} //析构函数
voidAddNode(CNode*pnode);
//在首部添加结点
CNode*DeleteNode(CNode*);
//删除一个指定的结点,返回该结点的指
针
CNode*LookUp(CSalary&
);
//查找一个指定的数据,返回该数据所在结
点在链表中的指针,若没找到返回0
voidShowList();
//打印整个链表voidDeleteList();
//删除整个链表
CNode*GetListHead(){returnpHead;
} //返回链表首结点
CNode*GetListNextNode(CNode*);
//返回链表指定结点的下一个结点voidInsert(CNode*);
//按工资的顺序插入一个结点
};
classCNode //定义结点类
private:
CSalary*pData;
//用于指向数据类的指针,这是每个数据的不同部分CNode*pNext;
//指向链表的指针
public:
CNode(){pData=0;
pNext=0;
} //结点类构造函数CNode(CNode&
node) //用于拷贝的构造函数
pData=node.pData;
//私有成员的互相赋值
pNext=node.pNext;
}
voidInputData(CSalary*pSal){pData=pSal;
} //输入数据
voidShowNode(){pData->
Show();
CSalary*GetData(){returnpData;
} //返回工资地址friendclassCList;
//定义链表类为友元类
classCSalary //定义数据类
charszName[20];
//存放姓名doubledlSalary;
//工资
CSalary(){strcpy(szName,"
\0"
dlSalary=0.0;
} //数据初始化CSalary(char*name,doublesalary) //构造函数重载
strcpy(szName,name);
dlSalary=salary;
//赋值
voidSetSalary(char*,double);
//置工资与姓名
doubleGetSal(){returndlSalary;
} //返回工资
intCompare(CSalary&
//比较姓名,供查找用,比较结果为1,0voidShow();
//显示工资
成员函数:
Node*DeleteNode(CNode*);
//删除一个指定的结点,返回该结点的指针CNode*LookUp(CSalary&
//查找一个指定的数据,返回该数据所在结点在链表中的指针,若没找到返回0
voidAddSalary(CList&
SalaryList)//将记录添加到链表中,链表是唯一的voidDeleteData(CList&
list)//根据姓名找到要删除的结点,再进行删除结点操作
voidLookUpData(CList&
list)//寻找所要找的姓名的结点
int OpenFile(CList&
list)//打开文件并建立有序链表对文件中的数据进行排序,最后输出
voidmain(void)//主函数
voidOutfun(void)//输出主菜单
intSaveFile(CList&
List)//输入结点,保存文件voidSetNewData(CList&
list)//修改工资数据
voidShowSalary(CList&
list)//输出链表中的数据,显示员工的工资数据
四.程序设计思想
数据管理类程序的数据用链表的形式存储,将链表定义成一个
类,将结点视为类中的数据成员,也即将结点视为一个整体,涉及结点的插入、输出、删除等操作。
将结点也定义成一个类,涉及结点数据的输入和输出、复制等。
在结点中,涉及较多的是具体数据的形式,所以将具体的数据形式定义成数据类型的指针,所有针对数据的操作都转换为对指针的操作,在数据类再具体实现。
结点的操作也像链表一样通用。
将数据具体形式定义成一个类,涉及数据的输入、输出、比较等。
那么,针对不同的数据管理,只要改动这部分就可以了。
这样,就实现程序的结构化。
四.关于程序的思考
1.输入密码的时候是不是可以把输入的字符都显示为“*”。
2.还要想想和其他函数间的关系,有的函数可以调用,那就很方便,少编一些代码,还会减少出错的几率。
3.整个过程中对类的封装性进行了充分了解,特别是在调试的时候,对象成员的调用、参数的传递、函数的衔接遇到了不少麻烦。
链表部分还是不太清楚。
4.要输入数字的地方输入字母会出现错误。
五.附源程序#include<
string.h>
#include<
iostream.h>
#include<
fstream.h>
stdlib.h>
voidMenu(void)
cout<
<
"
**************************************\n"
;
*
欢迎使用工资管理程序
*\n"
请选择以下功能
a:
l:
f:
d:
e:
q:
退出系统
cout<
0910190231 刘凯强\n"
\n"
请输入功能代码:
//数据类:
classCSalary //定义数据类
CSalary(){ strcpy(szName,"
} //数据初始化
CSalary(char*name,doublesalary) //构造函数重载
voidSetSalary(char*,double);
//置工资与姓名doubleGetSal(){returndlSalary;
//比较姓名,供查找用,比较结果为1,0
voidShow();
voidCSalary:
:
SetSalary(char*name,doublesalary=0.0)
intCSalary:
Compare(CSalary&
Salary)
CSalarysal1,sal2;
strcpy(sal1.szName,szName);
strcpy(sal2.szName,Salary.szName);
strlwr(sal1.szName);
strlwr(sal2.szName);
if(strcmp(sal1.szName,sal2.szName)==0)
Salary.dlSalary=dlSalary;
return1;
elsereturn0;
Show()
姓名:
"
szName<
'
\n'
工资:
dlSalary<
endl;
//结点类
//用于指向数据类的指针,这是每个数据的不同部分
CNode*pNext;
//指向链表的指针public:
} //结点类构造函数
CNode(CNode&
//私有成员的互相赋值pNext=node.pNext;
} //输入数据voidShowNode(){pData->
} //返回工资地址
friendclassCList;
//链表类
classCList //定义链表类
//删除一个指定的结点,返回该结点的指针
//打印整个链表voidDeleteList();
//返回链表指定结点的下
一个结点
voidInsert(CNode*);
CNode*CList:
DeleteNode(CNode*node)
CNode*pnode,*p1,*p2;
pnode=pHead;
if(pHead==node)
p1=pHead;
pHead=pHead->
pNext;
deletep1->
pData;
deletep1;
else
p2=p1=pHead;
while(p2!
=node&
&
p2->
pNext!
=0)
p1=p2;
p2=p2->
if(p2==node)
p1->
pNext=p2->
deletep2->
deletep2;
elsecout<
无节点"
returnnode;
LookUp(CSalary&
salary)
CNode*pnode;
while(pnode)
if(pnode->
pData->
Compare(salary))returnpnode;
pnode=pnode->
return0;
voidCList:
ShowList()
CNode*plist;
plist=pHead;
if(plist==0){
没有数据,请先添加数据!
while(plist)
plist->
ShowNode();
plist=plist->
DeleteList()
CNode*P1,*P2;
P2=pHead;
while(P2)
deleteP2->
P1=P2;
P2=P2->
deleteP1;
CNode*CList:
GetListNextNode(CNode*pnode)
returnpnode->
//返回链表指定结点的下一个结点
Insert(CNode*node)
CNode*p1,*p2;
if(pHead==0)
pHead=node;
node->
return;
if(pHead->
GetSal()>
=node->
GetSal())
node->
pNext=pHead;
pHead=node;
while(p2->
pNext&
GetSal()<
pData-
>
if(p2->
pNext=node;
pNext=p2;
p1->
return;
intOpenFile(CList&
list)
ifstream file("
EMP.txt"
ios:
binary,ios:
nocreate);
//
以二进制读取方式打开已存在文件EMP.txtif(!
file) //打开文件发生错误,程序退出
打开失败!
return0;
//定义一个结点类的对象指针CSalary*salary;
//定义一个数据类的对象longcurpos,length;
//记录文件长度的变量
curpos=file.tellg();
//文件指针当前位置(头文件)file.seekg(0L,ios:
end);
//将文件指针移到文件尾length=file.tellg();
//文件指针当前位置(文件尾),length
为文件长度
file.seekg(0L,ios:
beg);
//文件指针移到文件头longnum=length/sizeof(*salary);
//数据个数
for(longl=0;
l<
num;
l++) //循环查找
pnode=newCNode;
//动态开辟一个结点
salary=newCSalary;
//动态开辟一个数据类的对象file.read((char*)salary,sizeof(*salary));
//读取数据
salary
pnode->
InputData(salary);
//结点赋值list.Insert(pnode);
//把结点插入链表
file.close();
//关闭文件return1;
List)
ofstream file("
binary);
//以二进制写入方式打开文件EMP.txt
if(!
file)
保存失败!
CNode *pnode=List.GetListHead();
//将链表头指针赋给
pnode
CSalary*salary;
salary=pnode->
GetData();
//取出结点类指针file.write((char*)salary,sizeof(*salary));
//写入数
据salary
pnode=List.GetListNextNode(pnode);
//取下一个结点,形成循环
文件已保存!
SalaryList)
CNode*pNode;
CSalary*pSal;
charszName[20];
doubledlPlaceSalary;
添加工资记录\n"
姓名(输入0结束):
cin.getline(szName,20);
while(strcmp(szName,"
0"
))
工资:
cin>
dlPlaceSalary;
cin.ignore();
pSal=newCSalary;
pSal->
SetSalary(szName,dlPlaceSalary);
pNode=newCNode;
pNode->
InputData(pSal);
SalaryList.Insert(pNode);
显示工资记录\n"
list.ShowList();
根据姓名查找工资\n"
请输入要查找人的姓名(输入0结束):
cin.getline(szName,20);
CSalarypSal;
pSal.SetSalary(szName,0);
pNode=list.LookUp(pSal);
if(pNode)pNode->
elsecout<
您要找的人不存在\n"
请输入姓名(输入0结束):
voidDeleteData(CList&
根据姓名删除工资\n"
charname[20];
请输入要删除人的姓名(输入0结束):
cin.getline(name,20);
while(strcmp(name,"
CSalarypSal;
chara;
pSal.SetSalary(name,0);
是(Y)否(N)确定删除?
cin>
a;
cin.get();
//跳过回车键if((a=='
Y'
||a=='
y'
)&
pNode==0)cout<
您要找的人不
存在\n"
if((a=='
pNode!
list.DeleteNode(pNode);
pNode=list.GetListNextNode(pNode);
数据已删除!
cin.getline(name,20);
voidSetNewData(CList&
根据姓名修改工资\n"
chara;
请输入要修改的人的姓名(输入0结束):
while(strcmp(name,"
SetSalary(name,0);
pNode=list.LookUp(*pSal);
是(Y)否(N)确定修改?
pNode==0)cout<
请输入新的工资:
doubledlsal;
dlsal;
cin.ignore();
//跳过回车键
SetSalary(name,dlsal);
pNode->
list.Insert(pNode);
修改已