0508190124帅环宇工资管理.docx
- 文档编号:6813732
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:25
- 大小:22.92KB
0508190124帅环宇工资管理.docx
《0508190124帅环宇工资管理.docx》由会员分享,可在线阅读,更多相关《0508190124帅环宇工资管理.docx(25页珍藏版)》请在冰豆网上搜索。
0508190124帅环宇工资管理
VisulC++课程设计报告
工资管理
动力工程学院
电气工程及其自动化
(1)班
帅环宇
0508190124
2006年09月
一.程序功能简介:
这是一个员工工资管理程序。
工资管理程序的数据文件中存储有员工姓名和工资,该程序可以录入、显示、修改、删除、查找员工姓名和工资。
二.课程设计说明:
(1)用类的形式改写程序。
该程序中共定义了4个类。
第一个为数据类,是用来存储员工姓名和工资数据的类。
该类涉及数据具体的输入格式、输出形式、比较内容的大小等。
该类的结构如下:
classCSalary
{
charszName[20];//姓名
doubledlSalary;//工资
public:
CSalary();
CSalary(char*,double);//构造函数
voidSetSalary(char*,double);//置工资与姓名
char*GetName();//返回姓名
doubleGetSal();//返回工资
intCompare(CSalary&);//比较姓名,供查找用,比较结果1,0
voidShow();//显示工资
voidModifyData();//修改数据函数
};
第二个为结点类,该类涉及结点的输入、输出、复制等。
在结点中,涉及较多的是具体数据的形式,所以将具体数据形式定义成数据类型的指针,所有针对数据的操作都转换为对指针的操作,在数据类中再具体实现。
该类的结构如下:
classCNode//定义结点类
{
CSalary*pData;/*用于指向数据类的指针,这是每个数据的不同部分*/
CNode*pNext;//指向链表的指针
public:
CNode();//结点的构造函数
CNode(CNode&node);//用于拷贝的构造函数
voidInputData(CSalary*pdata);//输入数据
voidShowNode();//显示数据
CSalary*GetData();//返回数据
friendclassCList;//定义链表类为友元类
};
第三个类为链表类,将结点视为类中的数据成员,也即将结点石视为一个整体。
该类涉及结点的插入、输出、删除等操作。
因此在这个链表类中所定义的方法(函数)基本上是通用的。
该类的结构如下:
classCList//定义链表类
{
protected:
CNode*pHead;//链表头结点指针
public:
CList();//构造函数
~CList();//析构函数
voidAddNode(CNode*pnode);//在首部添加结点
voidDeleteNode(CNode*);//删除一个指定的结点,返回该结点的指针
CNode*LookUp(CSalary&);/*查找一个指定的数据,返回该数据所在结点的指针,若未找到返回0*/
voidShowList();//打印整个链表
voidDeleteList();//删除整个链表
CNode*GetListHead();//返回链表首结点
CNode*GetListNextNode(CNode*);//返回链表指定结点的下一个结点
voidInsert(CNode*);//按工资的顺序插入一个结点
CNode*GetLastNode();//返回链表的最后一个结点
};
第四个类为函数类,将主函数所需的函数用类封装起来,实现程序的结构化。
该类的成员数据为链表类的一个成员,涉及添加、显示、查找、删除、修改等功能函数以及读取和保存文件。
该类的结构如下:
classCFunction
{
CListlist;
public:
voidOpenFile();//读取文件函数
voidSaveFile();//保存文件函数
voidAddRecord();//增加数据函数
voidShowRecord();//显示数据函数
voidLookUpRecord();//查找数据函数
voidEditRecord();//修改数据函数
voidDeleteRecord();//删除数据函数
};
(2)显示、修改、删除数据时大小写通用。
为实现该功能,设计了一个大小写转换函数,将输入的姓名数据全部转换为小写存储。
在每次添加、修改、删除时,均在输入姓名后调用该函数,使程序不在区分大小写。
该函数如下:
char*change(char*oldname)//将输入字符状串转换成小写
{
inti;
for(i=0;oldname[i]!
='\0';i++)
{oldname[i]=tolower(oldname[i]);}/*tolower为C++库函数,可将字符串转换成小写*/
returnoldname;
}
(3)工资数据按工资值的大小进行排序存放。
实现该功能的函数为链表类的一个成员函数。
即在插入结点时就按照工资大小的顺序插入。
该函数为:
voidCList:
:
Insert(CNode*pnode)////按工资的顺序插入一个结点
{
CNode*p,*q;
if(pHead==0)
{
pHead=pnode;
pHead->pNext=0;
return;
}
if(pHead->pData->GetSal()>pnode->pData->GetSal())
{
pnode->pNext=pHead;
pHead=pnode;
return;
}
p=pHead;
while(p&&p->pData->GetSal()
{
q=p;
p=p->pNext;
}
q->pNext=pnode;
pnode->pNext=p;
}
(4)修改、删除数据前增加提示信息,用户确认后才能进一步操作,否则操作取消。
该功能的实现较为简单,使用dowhile语句ifelse语句进行嵌套即可。
以修改函数中的提示信息为例,实现该功能的语句如下:
charchoice;
do
{
p->ShowNode();
cout<<"\t\t确认修改?
(Y/N)";//提示功能,确认后再修改
cin>>choice;
if(choice=='N'||choice=='n')break;
else
{
p->GetData()->ModifyData();
break;
}
}while(choice!
='Y'&&choice!
='y'&&choice!
='N'&&edit!
='n');
}
(5)增加程序的文件输入输出功能,在执行程序中首先将工资数据从文件中读出再进行管理,在程序结束时能将工资数据保存在原文件中。
有关文件的操作涉及输入输出流,需使用C++的库函数,这些库函数所在的头文件为
在该程序中,使用一个文本文档data.txt来保存数据。
输入和输出分别用2个功能函数来实现。
这2个函数均包含在函数类中。
函数如下:
voidCFunction:
:
OpenFile()//读取文件
{
ifstreaminfile("data.txt");
charname[20];
doublesalary;
while(infile>>name>>salary)
{
CSalary*psalary=newCSalary;
psalary->SetSalary(name,salary);
CNode*pnode=newCNode;
pnode->InputData(psalary);
list.AddNode(pnode);
}
}
voidCFunction:
:
SaveFile()//保存文件
{
ofstreamoutfile("data.txt");
charname[20];
doublesalary;
CNode*p=list.GetListHead();
while(p)
{
strcpy(name,p->GetData()->GetName());
salary=p->GetData()->GetSal();
outfile< p=list.GetListNextNode(p); } cout<<"\t\t存档成功! \n"; } (6)使程序更加人性化。 对原程序做了部分修改,使程序更加人性化。 添加欢迎和结束界面、修改主菜单样式、添加作者信息功能,等。 修改增加数据函数,使函数实现不断输入,直到使用者确认停止(输入0)停止。 这些修改使程序更加适合人性化使用。 三.关键函数变量说明: charszName[20];//姓名 doubledlSalary;//工资 CNode*pHead;//链表头结点指针 CFunctionPerson;//定义使用的对象 charchoice;/*主菜单中用来选择的变量。 使用字符型变量,避免出现死循环*/ 四.课程设计心得: 该程序的编写遇到以下问题: 1)文件输入输出流。 由于这部分知识比较难,而考试内容又少,因此掌握得比较薄弱。 这个细小的环节使我在程序中无法前进,因此,只能通过自己看以前的课本和C++课程设计书中的案例来弥补。 后来终于通过自己努力将该功能编写好。 2)大小写处理。 在开始编写的时候,我的想法只是设计一个函数,将大写转换成小写。 而在实际过程中,发现大小写不确定,而且可能出现大小写混合输入的可能,极易造成死循环的出现。 后来通过对书中案例的研究,才记起一个可以将大写转换成小写的函数。 3)按顺序存放数据。 这个功能也是我开始考虑的问题,但我的想法是插入数据后在独立编写一个排序函数,但在实际过程中发现,这种做法是极其繁琐的。 后来在书中链表章节里发现可以直接按顺序插入结点才恍然大悟。 该程序存在的不足: 1)该程序在添加新记录的时候不检测是否姓名已存在,如输入的姓名已经存在在文档中,将会同时有两个记录存在,容易造成混乱。 2)在按顺序插入数据以后,则成员数据的顺序已固定不能更改。 如在此时修改人员工资,修改后的工资不再适合原来的顺序,也不能再进行更改。 这时候如果打印数据,将出现工资数据已不再按照大小排序了。 在该程序设计中,我遇到了许多困难。 但是通过这个程序的编写,我对类的封装,和链表的操作有了更深的理解。 我明白了仅仅懂得书本上的知识和考试能通过是不行的。 要想真正学会编写程序,就必须通过实际的案例,一步一步地编写整个程序,在这个过程中,才能真正学会程序语言的真谛。 五.原程序代码: /*VC++课程设计_工资管理程序 姓名: 帅环宇 学号0508190124*/ #include #include #include #include /*************************************************************************/ //转换大小写函数,将字符串全部换成小写存储 char*change(char*oldname)//将输入字符状串转换成小写 { inti; for(i=0;oldname[i]! ='\0';i++) {oldname[i]=tolower(oldname[i]);}/*tolower为C++库函数,可将字符串转换成小写*/ returnoldname; } /*******************************************************************/ //数据类 classCSalary { charszName[20];//姓名 doubledlSalary;//工资 public: CSalary(); CSalary(char*,double);//构造函数 voidSetSalary(char*,double);//置工资与姓名 char*GetName();//返回姓名 doubleGetSal();//返回工资 intCompare(CSalary&);//比较姓名,供查找用,比较结果1,0 voidShow();//显示工资 voidModifyData();//修改数据函数 }; //成员函数 CSalary: : CSalary()//构造函数 { strcpy(szName,""); dlSalary=0.0; } CSalary: : CSalary(char*name,doublesalary)//构造函数 { strcpy(szName,name); dlSalary=salary; } voidCSalary: : SetSalary(char*name,doublesalary)//置工资与姓名 { strcpy(szName,name); dlSalary=salary; } char*CSalary: : GetName()//返回姓名 { returnszName; } doubleCSalary: : GetSal()//返回工资 { returndlSalary; } intCSalary: : Compare(CSalary&salary)//比较姓名 { if(strcmp(szName,salary.szName)==0)return1; elsereturn0; } voidCSalary: : Show()//显示数据 { cout<<"\n\t\t人员姓名: "< "< } voidCSalary: : ModifyData()//修改数据函数 { doubletemp; cout<<"\t\t输入修改后的工资数据: "; cin>>temp; if(temp>0) { cout<<"\t\t修改成功! "< dlSalary=temp; } else { cout<<"\t\t修改失败! "< } } /***************************************************************************/ //结点类 classCNode//定义结点类 { CSalary*pData;//用于指向数据类的指针,这是每个数据的不同部分 CNode*pNext;//指向链表的指针 public: CNode();//结点的构造函数 CNode(CNode&node);//用于拷贝的构造函数 voidInputData(CSalary*pdata);//输入数据 voidShowNode();//显示数据 CSalary*GetData();//返回数据 friendclassCList;//定义链表类为友元类 }; //成员函数 CNode: : CNode() { pData=0; pNext=0; } CNode: : CNode(CNode&node) { pData=node.pData; pNext=node.pNext; } voidCNode: : InputData(CSalary*pdata) { pData=pdata; pNext=0; } voidCNode: : ShowNode() { pData->Show(); } CSalary*CNode: : GetData() { returnpData; } /***********************************************************************/ //链表类 classCList//定义链表类 { protected: CNode*pHead;//链表头结点指针 public: CList();//构造函数 ~CList();//析构函数 voidAddNode(CNode*pnode);//在首部添加结点 voidDeleteNode(CNode*);//删除一个指定的结点,返回该结点的指针 CNode*LookUp(CSalary&);/*查找一个指定的数据,返回该数据所在结点的指针,若未找到返回0*/ voidShowList();//打印整个链表 voidDeleteList();//删除整个链表 CNode*GetListHead();//返回链表首结点 CNode*GetListNextNode(CNode*);//返回链表指定结点的下一个结点 voidInsert(CNode*);//按工资的顺序插入一个结点 CNode*GetLastNode();//返回链表的最后一个结点 }; //成员函数 CList: : CList()//构造函数 { pHead=0; } CList: : ~CList()//析构函数 { DeleteList(); } voidCList: : AddNode(CNode*pnode)//在首部添加结点 { if(pHead==0) { pHead=pnode; pHead->pNext=0; } else { GetLastNode()->pNext=pnode; pnode->pNext=0; } } voidCList: : DeleteNode(CNode*pnode)//删除一个指定的结点,返回该结点的指针 { if(pnode==pHead&&pHead->pNext==0) { deletepHead->pData; deletepHead; pHead=0; } elseif(pnode==pHead) { CNode*p=pnode->pNext; deletepHead->pData; deletepHead; pHead=p; } else { CNode*p=pHead; while(p&&p->pNext! =pnode) p=p->pNext; CNode*q=pnode->pNext; deletepnode->pData; deletepnode; p->pNext=q; } } CNode*CList: : LookUp(CSalary&salary)/*查找一个指定的数据,返回该数据所在结点的指针,若未找到返回0*/ { if(pHead==0)return0; CNode*pn=pHead; while(pn) { if(pn->pData->Compare(salary)==0)returnpn; pn=pn->pNext; } return0; } voidCList: : ShowList()//打印整个链表 { if(! pHead) { cout<<"\t\t当前没有纪录! "< return; } CNode*p=pHead; while(p) { p->ShowNode(); p=p->pNext; } } voidCList: : DeleteList()//删除整个链表 { if(pHead==0)return; CNode*p,*q; p=pHead; while(p) { deletep->pData; q=p; p=p->pNext; deleteq; } pHead=0; } CNode*CList: : GetListHead()//返回链表首结点 { returnpHead; } CNode*CList: : GetListNextNode(CNode*pnode)//返回链表指定结点的下一个结点 { returnpnode->pNext; } voidCList: : Insert(CNode*pnode)//按工资的顺序插入一个结点 { CNode*p,*q; if(pHead==0) { pHead=pnode; pHead->pNext=0; return; } if(pHead->pData->GetSal()>pnode->pData->GetSal()) { pnode->pNext=pHead; pHead=pnode; return; } p=pHead; while(p&&p->pData->GetSal() { q=p; p=p->pNext; } q->pNext=pnode; pnode->pNext=p; } CNode*CList: : GetLastNode()//返回链表的最后一个结点 { if(! pHead) { return0; } CNode*p=pHead; while(p-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 0508190124 环宇 工资管理