南京理工大学C++课程设计报告.docx
- 文档编号:30770871
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:41
- 大小:54.49KB
南京理工大学C++课程设计报告.docx
《南京理工大学C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《南京理工大学C++课程设计报告.docx(41页珍藏版)》请在冰豆网上搜索。
南京理工大学C++课程设计报告
南京理工大学
C++课程设计报告
1010190410吴立珠
程序功能简介
个人财政支出的管理程序,将个人财务的目标及当前的存款,支出保存下来,可以随时更新,查看,比较赢余和目标的差距。
课程设计的要求
1.将收支的数据与相应的函数封装到类中,并改写主程序,是程序结构化。
2.增加保存每笔收支的记录,并对每闭记录增加日期录入,按日期的顺序保存,查看记录,将每一个记录放入一个文件中,每次运行程序时首先打开这个文件,程序运行完毕是将更新的记录放回文件中。
3.完善程序,补充类中数据成员赢余的计算和输出,要求每笔收入和支出都要重新统计当前情况下的赢余数目。
4.增加程序监控功能,当输入时间发生错误是,要求重新输入正确的时间;当结余的数目为负数时,输出信息,警告已经超支!
程序设计思想
1.类的封装
远程序的结构比较简单,只保留了每次更新操作的最后结果,达不到财务帐册的要求。
若要详细记录下每闭收笔的记录的款项和原因等。
于是才用了链表的形式保存了数据,且可以根据实际需要动态开辟空间。
链表结构如下:
classCFinance
{
private:
intnYear,nMonth,nDay;//年月日
doubledlIncome,dlOutput;//收入,支出数目
doubledlBalance;//结余
charszPurpose[20];//用途,目的
staticdoubledlPurpose;//目标
doubledlGap;//据目标的差额
public:
CFinance(){dlIncome=dlOutput=dlBalance=0.0;}//缺省的构造函数
CFinance(inta,intb,intc,doubled,doublee,charf[],doubleg,doubleh);//构造函数
CFinance(inta,intb,intc,doubled,doublee,charg[]);//构造函数
CFinance(inta,intb,intc){nYear=a,nMonth=b,nDay=c;}//根据日期生成结点,查找用
intCompare(CFinance&);//比较时间的大小
voidShow();//输出类的成员
voidShowdeposit();//输出收入的时间和目的,用途
voidShowwithdraw();//输出支出的时间和目的,用途
voidSetFinance(int,int,int,double,double,char*);//对象赋值
voidGetPurpose(doublepurs){dlPurpose=purs;}//赋值目标
doubleShowPur(){returndlPurpose;}//返回目标
voidcalculatebalance(doubledlBal){dlBalance=dlBal+dlIncome-dlOutput;}//计算结点的赢余情况,计算下一个结点用
doubleGetBalance(){returndlBalance;}//返回与目标的差额
voidModifyData();//修改结点记录
voidcalculatedlgap();//返回差额
friendvoidDeposit(CFinance*);//定义存款函数为友元函数
friendvoidWithdraw(CFinance*);//定义取款函数为友元函数
friendclassClist;//定义链表类为友元类
};
classCNode//结点类
{
private:
CFinance*pData;//用于指向数据类的指针
CNode*pnext;//指向链表的下一个结点的指针
public:
CNode(){pData=0;pnext=0;}//结点的构造函数
CNode(CNode&node){pData=node.pData,pnext=node.pnext;}//用于拷贝的构造函数
voidInputData(CFinance*pdata){pData=pdata;}//输入数据
voidShowNode(){pData->Show();}//结点的输出
voidmodify(){pData->ModifyData();}//修该结点的数据
CFinance*GetData(){returnpData;}//返回数据类的指针
voidGetpur(doublet){pData->GetPurpose(t);}//返回数据类的目标
friendclassClist;//定义链表类为友元类
friendvoidSavefile();//定义保存函数为友元函数
};
classClist//定义链表类
{
protected:
CNode*phead;//链表头结点指针
public:
Clist(){phead=0;}//链表类的构造函数
~Clist(){deletelist();}//链表类的析构函数
voidAddNode(CNode*);//在首部添加结点
voidDeleteNode(CNode*);//删除一个指定的结点
CNode*Lookup(CFinance&);//查找一个指定的结点,返回该结点的指针
voidShowlist();//打印整个链表
voidShowlistdeposit();//打印整个链表的收入情况
voidShowlistwithdraw();//打印整个链表的支出情况
voiddeletelist();//删除整个链表
CNode*GetlistHead(){returnphead;}//返回链表的首结点
CNode*GetlistNextNode(CNode*p);//返回指定的结点的下一个结点
voidInsert(CNode*p);//插入排序
CNode*GetlastNode(CNode*phead);//返回最后一个结点
voidCalculatebalance();//计算链表的赢余情况
voidSavefile();//保存文件
voidOpenFile();//打开文件
voidModify(CNode*);//修改链表的记录
voidCalculatedlGap();//计算整个链表与目标的差额
};
2.mian函数结构
程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行。
在程序一开始运行时首先将财务数据文件读如链表,然后询问是否改动目标款项,若改动了目标款项,接点中的数据中“距目标的差额”都需重新计算,在程序退出时,将链表的数据在写到数据文件中。
3.设计要点
1)为使用户界面更加友好,避免输入数据类型错误导致的程序无限循环,在输入数据时进行判断,对非法的输入予以提示。
2)每次增加的结点或修改结点时都要将数据的赢余部分重新计算,。
设计了一个函数,以链表的引用作为参数,从链表首结点开始,依次将整个链表结点的数据重新计算,在增加或修改结点完成后调用该函数即。
3)在输入整个链表的数据后,应计算链表的最后一个结点的赢余,若出现了赤字则输出信息,提示用户注意。
题目分析
程序的主菜单如又图:
请选择以下功能:
1-输入收入记录
2-输入支出记录
3-输出收入记录
4-输出支出记录
5-查看收支平衡情况
6-按日期查找记录
7-按日期删除记录
8-按日期修改记录
0-退出
各功能实现方法:
1-输入收入记录
动态产生一个新的数据,调用存款函数输入记录,将指向其
的指针加到链表中,并进行排序。
2-输入支出记录
动态产生一个新的数据,调用取款函数输入记录,将指向其
的指针加到链表中,并进行排序。
3-输出收入记录
调用了链表类里的Showlistdeposit()函数,其中这个函数指向数据类之中的输出收入记录,定义一个指针,输出指针指向的数据,然后指针指向下一个指针直到链表尾部。
4-输出支出记录
调用了链表类里的Showlistwithdraw()函数,其中这个函数指向数据类之中的输出支出记录,定义一个指针,输出指针指向的数据,然后指针指向下一个指针直到链表尾部。
5-查看收支平衡情况
调用了链表类里的Showlistgetbanlanc()函数,其中这个函数指向数据类之中向的数据,然后指针指向下一个指针直到链表尾部。
6-按日期查找记录
在数据类中有一函数可以比较日期,大的返回+1,小的返回-1,相等的返回0。
在查找记录时先比较日期与链表中的日期是否有相等的,若有则定义一个指针指向该结点,调用函数输出该结点的所有记录,指针指向下一个指针,继续查找。
7-按日期删除记录
在数据类中有一函数可以比较日期,大的返回+1,小的返回-1,相等的返回0。
在删除记录时先比较输入的日期与链表中存在的日期是否有相等的,若有则定义一个指针指向该结点,调用函数删除该结点的所有记录,指针指向下一个指针,继续查找。
8按日期修改记录
在数据类中有一函数可以比较日期,大的返回+1,小的返回-1,相等的返回0。
在修改记录时先比较输入的日期与链表中存在的日期是否有相等的,若有则定义一个指针指向该结点,调用函数输出该结点的所有记录,指针指向下一个指针,继续查找。
0-退出
退出时将数据保存在文件data.txt中
流程图如下所示:
是
否
1`通过开头输入帐号来实现,系统供多人使用的功能。
2`判断日期输入的正确性
设计了三个函数分别判断年,月,日是否正确,然后在设计了一个函数判断输入的日期是否正确。
3、屏幕界面问题,处理方法:
仔细复习了“C++流程控制”一章,结合了库函数,system(“cls”)的功能,程序界面显得比较友好。
4、三个类的关系,各个成员及成员函数的关系,以及如何调用函数
类的基本框架如图:
对设计的感想和心得
对于这次程序设计,我明白了发现问题比解决问题更难,因为不知从何下手,我屡次停滞不前,后来通过加输出语句或注释关键语句来判断问题所在。
通过一次次摸索,尝试,一步步解决问题。
但有时往往是解决了一个,又出现一个,真是太考验耐心了。
同时,我也意识到,虽然读了十几年书,但到实际动手时却是手足无措,实践经验实在是少得可怜,所以要想在竞争日益激烈的时代找到一份好工作,不仅要学好理论知识,更要注重实践,从而真正获取一门知识的精髓。
最后,想说一句,故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身。
。
。
。
。
。
。
源程序
#include
#include
#include
#include
#include
#include
classCFinance
{
private:
intnYear,nMonth,nDay;//年月日
doubledlIncome,dlOutput;//收入,支出数目
doubledlBalance;//结余
charszPurpose[20];//用途,目的
staticdoubledlPurpose;//目标
doubledlGap;//据目标的差额
public:
CFinance(){dlIncome=dlOutput=dlBalance=0.0;}//缺省的构造函数
CFinance(inta,intb,intc,doubled,doublee,charf[],doubleg,doubleh)//构造函数
{
nYear=a,nMonth=b,nDay=c;
dlIncome=d,dlOutput=e;
strcpy(szPurpose,f);
dlBalance=g;
dlGap=h;
}
CFinance(inta,intb,intc,doubled,doublee,charg[])//结构函数
{
nYear=a,nMonth=b,nDay=c;
dlIncome=d,dlOutput=e;
strcpy(szPurpose,g);
}
CFinance(inta,intb,intc){nYear=a,nMonth=b,nDay=c;}//根据日期生成结点,查找用
intCompare(CFinance&);//比较时间的大小
voidShow();//输出类的成员
voidShowdeposit();//输出收入的时间和目的,用途
voidShowwithdraw();//输出支出的时间和目的,用途
voidSetFinance(int,int,int,double,double,char*);//对象赋值
voidGetPurpose(doublepurs){dlPurpose=purs;}//赋值目标
doubleShowPur(){returndlPurpose;}//返回目标
voidcalculatebalance(doubledlBal){dlBalance=dlBal+dlIncome-dlOutput;}//计算结点的赢余情况,计算下一个结点用
doubleGetBalance(){returndlBalance;}//返回与目标的差额
voidModifyData();//修改结点记录
voidcalculatedlgap();//返回差额
friendvoidDeposit(CFinance*);//输入收入记录
friendvoidWithdraw(CFinance*);//输入支出记录
friendvoidSavefile();//打开数据文件
friendostream&operator<<(ostream&,CFinance*);//重载输出流
};
doubleCFinance:
:
dlPurpose=0.0;
voidCFinance:
:
ModifyData()//修改记录
{
inta,b,c;
doubled,e;
char*p=0;
cin>>a>>b>>c>>d>>e>>p;
SetFinance(a,b,c,d,e,p);
}
intCFinance:
:
Compare(CFinance&t)//比较日期,大于返回1,小于返回1,等于返回0
{
if(nYear>t.nYear)return1;
if(nYear else{ if(nMonth>t.nMonth)return1; if(nMonth else{ if(nDay>t.nDay)return1; if(nDay elsereturn0; } } } voidCFinance: : SetFinance(inta,intb,intc,doubled,doublef,char*p) { nYear=a,nMonth=b,nDay=c; dlIncome=d,dlOutput=f; p=(char*)newchar;//动态产生一个字符串 } voidCFinance: : Showdeposit() { cout<<”日期”< } voidCFinance: : Showwithdraw() { cout<<”日期”< } voidCFinance: : Show() { cout<<”\n”<<”日期”< voidCFinance: : calculatedlgap() { dlGap=dlBalance-dlPurpose; } ostream&operator<<(ostream&os,CFinance*p) { os< returnos;} classCNode//结点类 { private: CFinance*pData;//用于指向数据类的指针 CNode*pnext;//指向链表的下一个结点的指针 public: CNode(){pData=0;pnext=0;}//结点的构造函数 CNode(CNode&node){pData=node.pData,pnext=node.pnext;}//用于拷贝的构造函数 voidInputData(CFinance*pdata){pData=pdata;}//输入数据 voidShowNode(){pData->Show();}//结点的输出 voidmodify(){pData->ModifyData();}//修该结点的数据 CFinance*GetData(){returnpData;}//返回数据类的指针 voidGetpur(doublet){pData->GetPurpose(t);}//返回数据类的目标 friendclassClist;//定义链表类为友元类 friendvoidSavefile();//定义保存函数为友元函数 }; classClist//定义链表类 { protected: CNode*phead;//链表头结点指针 public: Clist(){phead=0;}//链表类的构造函数 ~Clist(){deletelist();}//链表类的析构函数 voidAddNode(CNode*);//在首部添加结点 voidDeleteNode(CNode*);//删除一个指定的结点 CNode*Lookup(CFinance&);//查找一个指定的结点,返回该结点的指针 voidShowlist();//打印整个链表 voidShowlistdeposit();//打印整个链表的收入情况 voidShowlistwithdraw();//打印整个链表的支出情况 voiddeletelist();//删除整个链表 CNode*GetlistHead(){returnphead;}//返回链表的首结点 CNode*GetlistNextNode(CNode*p);//返回指定的结点的下一个结点 voidInsert(CNode*p);//插入排序 CNode*GetlastNode(CNode*phead);//返回最后一个结点 voidCalculatebalance();//计算链表的赢余情况 voidSavefile();//保存文件 voidOpenFile();//打开文件 voidModify(CNode*);//修改链表的记录 voidCalculatedlGap();//计算整个链表与目标的差额 }; voidClist: : AddNode(CNode*pnode)//添加一个结点 { if(phead==0)//头结点为空 { phead=pnode; pnode->pnext=0; } else { pnode->pnext=phead; phead=pnode;//指向下一个结点 } } voidClist: : DeleteNode(CNode*Temp) { CNode*p1,*p2;//节点指针变量 charchoice;//找到符合条件的数据后删除之前需要确认,该变量为键入的确认选择 if(phead==NULL)//链表头指针为空,即链表中无数据,不需删除,程序直接返回 { cout<<”数据表为空,无记录可删! \n”;//删除提示信息 return; } if(Temp->pData->Compare(*(phead->pData))==0)//当链表头指针即是要删除的域名时,将头指针后的指针作 //为头指针,然后将该节点删除 { p1=phead;//p1指向头指针 cout<<”存在该记录为: \n”; p1->ShowNode();//输出p1中的数据内容 cout<<”请确定是否删除该记录(y/n)? \n”; cin>>choice;//从键盘输入信息,确定是否真要删除该节点 if(choice==’Y’||choice==’y’)//当输入Y或y时,确定要删除该节点,以下是删除操作 { phead=phead->pnext;//将链表的头指针移后一个节点 deletep1;//删除原头指针所在的节点 cout<<”删除了该记录! \n”;//输出提示信息 } else//若选择不删除该节点 { cout<<”未删除记录! \n”;//输出提示信息 } } else//若链表头节点不满足删除条件,则p2指针顺着链表寻找满足删除条件的节点 { p2=p1=phead;//首先,p1,p2从头指针开始沿链表查找 while(Temp->pData->Compare(*(p2->pData))! =0&&p2->pnext! =NULL) //查找过程是循环过程,当没有找到符合条件的节点且没有查找完整个链表时,循环继续 { p1=p2;//p1跟在p2后面 p2=p2->pnext;//p2接着查找下一个节点 } if(Temp->pData->Compare(*(p2->pData))==0)//找到要删除的目前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南京理工大学 C+ 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)