VC++课程设计--工资管理Word文件下载.docx

上传人:聆听****声音 文档编号:3691096 上传时间:2023-05-02 格式:DOCX 页数:28 大小:21.31KB
下载 相关 举报
VC++课程设计--工资管理Word文件下载.docx_第1页
第1页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第2页
第2页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第3页
第3页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第4页
第4页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第5页
第5页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第6页
第6页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第7页
第7页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第8页
第8页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第9页
第9页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第10页
第10页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第11页
第11页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第12页
第12页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第13页
第13页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第14页
第14页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第15页
第15页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第16页
第16页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第17页
第17页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第18页
第18页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第19页
第19页 / 共28页
VC++课程设计--工资管理Word文件下载.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VC++课程设计--工资管理Word文件下载.docx

《VC++课程设计--工资管理Word文件下载.docx》由会员分享,可在线阅读,更多相关《VC++课程设计--工资管理Word文件下载.docx(28页珍藏版)》请在冰点文库上搜索。

VC++课程设计--工资管理Word文件下载.docx

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);

修改已

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2