南京理工大学C++课程设计报告_第1页
南京理工大学C++课程设计报告_第2页
南京理工大学C++课程设计报告_第3页
南京理工大学C++课程设计报告_第4页
南京理工大学C++课程设计报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、南 京 理 工 大 学C+课程设计报告吴立珠程序功能简介个人财政支出的管理程序,将个人财务的目标及当前的存款,支出保存下来,可以随时更新,查看,比较赢余和目标的差距。课程设计的要求1. 将收支的数据与相应的函数封装到类中,并改写主程序,是程序结构化。2. 增加保存每笔收支的记录,并对每闭记录增加日期录入,按日期的顺序保存,查看记录,将每一个记录放入一个文件中,每次运行程序时首先打开这个文件,程序运行完毕是将更新的记录放回文件中。3. 完善程序,补充类中数据成员赢余的计算和输出,要求每笔收入和支出都要重新统计当前情况下的赢余数目。4. 增加程序监控功能,当输入时间发生错误是,要求重新输入正确的时

2、间;当结余的数目为负数时,输出信息,警告已经超支!程序设计思想1. 类的封装远程序的结构比较简单,只保留了每次更新操作的最后结果,达不到财务帐册的要求。若要详细记录下每闭收笔的记录的款项和原因等。于是才用了链表的形式保存了数据,且可以根据实际需要动态开辟空间。链表结构如下:class CFinanceprivate:int nYear,nMonth,nDay; /年月日double dlIncome,dlOutput;/收入,支出数目double dlBalance; /结余char szPurpose20; /用途,目的static double dlPurpose; /目标double d

3、lGap; /据目标的差额public:CFinance()dlIncome=dlOutput=dlBalance=0.0;/缺省的构造函数CFinance(int a,int b,int c,double d,double e,char f,double g,double h);/构造函数CFinance(int a,int b,int c,double d,double e,char g);/构造函数CFinance(int a,int b,int c)nYear=a,nMonth=b,nDay=c;/根据日期生成结点,查找用int Compare(CFinance&);/比较时间的大小v

4、oid Show();/输出类的成员void Showdeposit();/输出收入的时间和目的,用途void Showwithdraw();/输出支出的时间和目的,用途void SetFinance(int,int,int,double,double,char*);/对象赋值void GetPurpose(double purs)dlPurpose=purs;/赋值目标double ShowPur()return dlPurpose;/返回目标void calculatebalance(double dlBal)dlBalance=dlBal+dlIncome-dlOutput;/计算结点的

5、赢余情况,计算下一个结点用double GetBalance()return dlBalance;/返回与目标的差额void ModifyData();/修改结点记录void calculatedlgap();/返回差额friend void Deposit(CFinance *);/定义存款函数为友元函数friend void Withdraw(CFinance *);/定义取款函数为友元函数 friend class Clist;/定义链表类为友元类;class CNode /结点类private:CFinance *pData; /用于指向数据类的指针CNode *pnext; /指向链

6、表的下一个结点的指针public:CNode()pData=0;pnext=0; /结点的构造函数 CNode(CNode &node)pData=node.pData,pnext=node.pnext; /用于拷贝的构造函数void InputData(CFinance *pdata)pData=pdata; /输入数据 void ShowNode()pData-Show(); /结点的输出void modify()pData-ModifyData(); /修该结点的数据CFinance *GetData()return pData; /返回数据类的指针void Getpur(double

7、t)pData-GetPurpose(t); /返回数据类的目标friend class Clist; /定义链表类为友元类 friend void Savefile(); /定义保存函数为友元函数;class Clist /定义链表类protected:CNode *phead; /链表头结点指针public:Clist()phead=0; /链表类的构造函数 Clist()deletelist(); /链表类的析构函数void AddNode(CNode *); /在首部添加结点void DeleteNode(CNode *); /删除一个指定的结点CNode *Lookup(CFinan

8、ce &);/查找一个指定的结点,返回该结点的指针void Showlist(); /打印整个链表void Showlistdeposit(); /打印整个链表的收入情况void Showlistwithdraw(); /打印整个链表的支出情况void deletelist(); /删除整个链表CNode *GetlistHead()return phead; /返回链表的首结点CNode *GetlistNextNode(CNode *p); /返回指定的结点的下一个结点void Insert(CNode *p); /插入排序CNode *GetlastNode(CNode *phead);

9、 /返回最后一个结点void Calculatebalance(); /计算链表的赢余情况void Savefile(); /保存文件void OpenFile(); /打开文件void Modify(CNode *); /修改链表的记录void CalculatedlGap(); /计算整个链表与目标的差额; 2. mian 函数结构程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行。在程序一开始运行时首先将财务数据文件读如链表,然后询问是否改动目标款项,若改动了目标款项,接点中的数据中“距目标的差额”都需重新计算,在程序退出时,将链表的数据在写到数据文件中。3. 设计要点1)

10、 为使用户界面更加友好,避免输入数据类型错误导致的程序无限循环,在输入数据时进行判断,对非法的输入予以提示。2) 每次增加的结点或修改结点时都要将数据的赢余部分重新计算,。设计了一个函数,以链表的引用作为参数,从链表首结点开始,依次将整个链表结点的数据重新计算,在增加或修改结点完成后调用该函数即。3) 在输入整个链表的数据后,应计算链表的最后一个结点的赢余,若出现了赤字则输出信息,提示用户注意。题目分析程序的主菜单如又图:请选择以下功能:1-输入收入记录 2-输入支出记录3-输出收入记录4-输出支出记录5-查看收支平衡情况6-按日期查找记录7-按日期删除记录8-按日期修改记录0-退出各功能实现

11、方法:1-输入收入记录 动态产生一个新的数据,调用存款函数输入记录,将指向其的指针加到链表中,并进行排序。2-输入支出记录动态产生一个新的数据,调用取款函数输入记录,将指向其的指针加到链表中,并进行排序。3-输出收入记录 调用了链表类里的Showlistdeposit()函数,其中这个函数指向数据类之中的输出收入记录,定义一个指针,输出指针指向的数据,然后指针指向下一个指针直到链表尾部。4-输出支出记录调用了链表类里的Showlistwithdraw ()函数,其中这个函数指向数据类之中的输出支出记录,定义一个指针,输出指针指向的数据,然后指针指向下一个指针直到链表尾部。5-查看收支平衡情况调

12、用了链表类里的Showlistgetbanlanc ()函数,其中这个函数指向数据类之中向的数据,然后指针指向下一个指针直到链表尾部。6-按日期查找记录在数据类中有一函数可以比较日期,大的返回+1,小的返回-1,相等的返回0。在查找记录时先比较日期与链表中的日期是否有相等的,若有则定义一个指针指向该结点,调用函数输出该结点的所有记录,指针指向下一个指针,继续查找。7-按日期删除记录在数据类中有一函数可以比较日期,大的返回+1,小的返回-1,相等的返回0。在删除记录时先比较输入的日期与链表中存在的日期是否有相等的,若有则定义一个指针指向该结点,调用函数删除该结点的所有记录,指针指向下一个指针,继

13、续查找。8按日期修改记录在数据类中有一函数可以比较日期,大的返回+1,小的返回-1,相等的返回0。在修改记录时先比较输入的日期与链表中存在的日期是否有相等的,若有则定义一个指针指向该结点,调用函数输出该结点的所有记录,指针指向下一个指针,继续查找。0-退出退出时将数据保存在文件data.txt中流程图如下所示:输入帐号,进入界面 询问是否改动目标款项修改目标款项 是 否1通过开头输入帐号来实现,系统供多人使用的功能。2判断日期输入的正确性 设计了三个函数分别判断年,月,日是否正确,然后在设计了一个函数判断输入的日期是否正确。3、屏幕界面问题,处理方法:仔细复习了“C+流程控制”一章,结合了库函

14、数, system(“cls”)的功能,程序界面显得比较友好。4、三个类的关系,各个成员及成员函数的关系,以及如何调用函数 类的基本框架如图:类:Clist(链表类)(指针成员指向类cnode的对象CNode(指针成员指向CFinance的对象)类Clist的各数据成员以及成员函数类CFinance的数据成员以及成员函数类cnode各数据成员以及成员函数对设计的感想和心得对于这次程序设计,我明白了发现问题比解决问题更难,因为不知从何下手,我屡次停滞不前,后来通过 加输出语句 或 注释关键语句 来判断问题所在。通过一次次摸索,尝试,一步步解决问题。但有时往往是解决了一个,又出现一个,真是太考验耐

15、心了。 同时,我也意识到,虽然读了十几年书,但到实际动手时却是手足无措,实践经验实在是少得可怜,所以要想在竞争日益激烈的时代找到一份好工作,不仅要学好理论知识,更要注重实践,从而真正获取一门知识的精髓。 最后,想说一句,故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身。源程序 #include #include #include #include #include#includeclass CFinanceprivate:int nYear,nMonth,nDay; /年月日double dlIncome,dlOutput;/收入,支出数目double dlBalance; /

16、结余char szPurpose20; /用途,目的static double dlPurpose; /目标double dlGap; /据目标的差额public:CFinance()dlIncome=dlOutput=dlBalance=0.0;/缺省的构造函数CFinance(int a,int b,int c,double d,double e,char f,double g,double h)/构造函数nYear=a,nMonth=b,nDay=c;dlIncome=d,dlOutput=e;strcpy(szPurpose,f);dlBalance=g;dlGap=h;CFinanc

17、e(int a,int b,int c,double d,double e,char g)/结构函数nYear=a,nMonth=b,nDay=c;dlIncome=d,dlOutput=e;strcpy(szPurpose,g);CFinance(int a,int b,int c)nYear=a,nMonth=b,nDay=c;/根据日期生成结点,查找用int Compare(CFinance&);/比较时间的大小void Show();/输出类的成员void Showdeposit();/输出收入的时间和目的,用途void Showwithdraw();/输出支出的时间和目的,用途voi

18、d SetFinance(int,int,int,double,double,char*);/对象赋值void GetPurpose(double purs)dlPurpose=purs;/赋值目标double ShowPur()return dlPurpose;/返回目标void calculatebalance(double dlBal)dlBalance=dlBal+dlIncome-dlOutput;/计算结点的赢余情况,计算下一个结点用double GetBalance()return dlBalance;/返回与目标的差额void ModifyData();/修改结点记录void

19、calculatedlgap();/返回差额friend void Deposit(CFinance *);/输入收入记录friend void Withdraw(CFinance *);/输入支出记录friend void Savefile();/打开数据文件friend ostream& operatorabcdep;SetFinance(a,b,c,d,e,p);int CFinance:Compare(CFinance &t) /比较日期,大于返回1,小于返回1,等于返回0if(nYeart.nYear) return 1;if(nYeart.nMonth) return 1;if(n

20、Montht.nDay) return 1;if(nDayt.nDay) return -1;else return 0;void CFinance:SetFinance(int a,int b,int c,double d,double f,char*p)nYear=a,nMonth=b,nDay=c;dlIncome=d,dlOutput=f;p=(char*)new char; /动态产生一个字符串void CFinance:Showdeposit()cout”日期”nYear”/”nMonth”/”nDay” “”收入”dlIncome” “”用的目的是”szPurpose” “end

21、l;void CFinance:Showwithdraw()cout”日期”nYear”/”nMonth”/”nDay”支出”dlOutput” “”用的目的是”szPurpose” “endl;void CFinance:Show()cout”n”日期”nYear”/”nMonth”/”nDay”n”收入”dlIncome” “”支出”dlOutput”n”用的目的是”szPurpose”n”盈余为”dlBalance” “”距目标的差额”dlGapendl;void CFinance:calculatedlgap()dlGap=dlBalance-dlPurpose;ostream& op

22、erator (ostream&os,CFinance *p)osnYear” “nMonth” “nDay” “dlIncome” “dlOutput” “szPurpose” “dlBalance” “dlGapShow(); /结点的输出void modify()pData-ModifyData(); /修该结点的数据CFinance *GetData()return pData; /返回数据类的指针void Getpur(double t)pData-GetPurpose(t); /返回数据类的目标friend class Clist; /定义链表类为友元类friend void Sa

23、vefile(); /定义保存函数为友元函数;class Clist /定义链表类protected:CNode *phead; /链表头结点指针public:Clist()phead=0; /链表类的构造函数 Clist()deletelist(); /链表类的析构函数void AddNode(CNode *); /在首部添加结点void DeleteNode(CNode *); /删除一个指定的结点CNode *Lookup(CFinance &);/查找一个指定的结点,返回该结点的指针void Showlist(); /打印整个链表void Showlistdeposit(); /打印整

24、个链表的收入情况void Showlistwithdraw(); /打印整个链表的支出情况void deletelist(); /删除整个链表CNode *GetlistHead()return phead; /返回链表的首结点CNode *GetlistNextNode(CNode *p); /返回指定的结点的下一个结点void Insert(CNode *p); /插入排序CNode *GetlastNode(CNode *phead); /返回最后一个结点void Calculatebalance(); /计算链表的赢余情况void Savefile(); /保存文件void OpenF

25、ile(); /打开文件void Modify(CNode *); /修改链表的记录void CalculatedlGap(); /计算整个链表与目标的差额;void Clist:AddNode(CNode *pnode) /添加一个结点if(phead=0) /头结点为空phead=pnode; pnode-pnext=0;else pnode-pnext=phead;phead=pnode; /指向下一个结点void Clist:DeleteNode(CNode *Temp) CNode *p1,*p2; /节点指针变量char choice; /找到符合条件的数据后删除之前需要确认,该变

26、量为键入的确认选择if ( phead = NULL ) /链表头指针为空,即链表中无数据,不需删除,程序直接返回cout pData-Compare(*(phead-pData)=0 ) /当链表头指针即是要删除的域名时,将头指针后的指针作/为头指针,然后将该节点删除p1=phead; / p1指向头指针coutShowNode(); /输出p1中的数据内容coutchoice; /从键盘输入信息,确定是否真要删除该节点if(choice=Y|choice=y) /当输入Y或y时,确定要删除该节点,以下是删除操作phead = phead-pnext; /将链表的头指针移后一个节点delet

27、e p1; /删除原头指针所在的节点cout ”删除了该记录!n”; /输出提示信息else /若选择不删除该节点coutpData-Compare(*(p2-pData)!=0 & p2-pnext != NULL )/查找过程是循环过程,当没有找到符合条件的节点且没有查找完整个链表时,循环继续p1 = p2 ; /p1跟在p2后面p2 = p2-pnext;/p2接着查找下一个节点if ( Temp-pData-Compare(*(p2-pData)=0 ) /找到要删除的目前正是p2所指向的节点coutShowNode();coutchoice; /输入用户的选择if(choice=Y|

28、choice=y) /如果确认为真的要删除p1-pnext = p2-pnext; /将p2指向节点的下一个节点的尾部连接p1所指向的节点,/即将p2所指向的节点从链表中断开delete p2; /删除p2所指向的节点cout ”删除了该记录!n”;else /如果用户选择不删除cout”未删除记录!n”; /删除提示信息else coutpData-Compare(t) return pn; /比较时间pn=pn-pnext; /继续查找return 0;void Clist:Calculatebalance()CNode *p=phead;double t;int i=1;while(p)

29、if(i=1)p-pData-calculatebalance(0);t=p-pData-GetBalance();p=p-pnext;if(p)p-pData-calculatebalance(t);+i;void Clist:CalculatedlGap()CNode *p=phead;while(p)p-pData-calculatedlgap();p=p-pnext;void Clist:Showlistdeposit()CNode *p=phead;while(p)p-pData-Showdeposit();p=p-pnext;void Clist:Showlistwithdraw(

30、)CNode *p=phead;while(p)p-pData-Showwithdraw();p=p-pnext;void Clist:Showlist()CNode *p=phead;while(p)p-pData-Show();p=p-pnext;void Clist:deletelist()CNode *p,*q;p=phead;while(p)delete p-pData;q=p;p=p-pnext;delete q;CNode *Clist:GetlistNextNode(CNode*p)CNode *pn=phead;while(pn=p)pn=pn-pnext;return pn

31、;void Clist:Insert(CNode *p)CNode *p1,*p2;if(phead=0)phead=p;p-pnext=0;elseif(p-pData-Compare(*(phead-pData)pnext=phead;phead=p;elsep2=p1=phead;while(p-pnext&p-pData-Compare(*(p2-pData)0)p1=p2;p2=p2-pnext;if(p-pData-Compare(*(p2-pData)0)p2-pnext=p;p-pnext=0;elsep-pnext=p2;p1-pnext=p;CNode *Clist:Get

32、lastNode(CNode *phead)CNode *p=phead;while(p-pnext)p=p-pnext;return p;void Clist:OpenFile(void) ifstream infile; CNode *pt1,*pt2;pt2=phead; infile.open(“data.txt”); if(!infile) coutpnext) pt2=pt2-pnext;int a,b,c;double d, e;char f20;double g, h; while(infileabcdefgh)CFinance *p;p=new CFinance(a,b,c,

33、d,e,f,g,h);pt1=new CNode;pt1-InputData(p);Insert(pt1); /将此数据排序插入链表中infile.close(); return;void Clist:Savefile() ofstream outfile; /接受文件名outfile.open(“data.txt”); /以输出的方式打开数据文件if(!outfile) /打开文件错误,输出提示信息,退出程序cout”打开文件错误!n”;CNode *pt; /节点指针,指向链表中的各个节点pt=phead; /从链表头开始向数据文件中输入数据while(pt) /当指针没有找到链表尾时ou

34、tfilepData; /输出键入域名的时间数据pt=pt-pnext; /顺着链表依次指向下一节点cout”文件存储完毕n”; void Withdraw(); /存款 void depositDisplay(); void mainDisplay();void withdrawDisplay();void setgoalDisplay();void viewtotalDisplay();void Savefile();int checkyear(int); /判断年 月 日的正确性int checkmonth(int);int checkday(int,int,int);int check

35、date(int,int,int);int main()CFinance *p;CNode *pn,node;Clist list;char select;list.OpenFile();char aselect;cout”-“”n”;coutaselect;while(aselect!=y&aselect!=Y&aselect!=n&aselect!=N)cout”t输入有误 请重新输入”;coutaselect;cout”n”;if(aselect=y|aselect=Y)double t;coutt;CFinance A;A.GetPurpose(t);list.Calculatebal

36、ance();list.CalculatedlGap();label: cout”t*n”;cout” 欢迎使用个人财政管理系统n”;cout” 请选择以下功能 n”;cout” *1.输入收入记录 *n”;cout” *2.输入支出记录 *n”;cout” *3.查看收入记录 *n”;cout” *4.查看支出记录 *n”;cout” *5.查看收支平衡状况 *n”;cout” *6.根据日期查找记录 *n”;cout” *7.根据日期修改记录 *n”;cout” *8.根据日期删除记录 *n”;cout” *0.退出 *nn”;cout”t*n”;cout”n”;coutselect;sw

37、itch(select)case 1: p=new CFinance();Deposit(p);pn=new CNode;pn-InputData(p);list.Insert(pn);goto label;case 2:p=new CFinance();Withdraw(p);pn=new CNode;pn-InputData(p);list.Insert(pn);goto label;case 3:list.Calculatebalance();list.CalculatedlGap();list.Showlistdeposit();goto label;case 4:list.Calcu

38、latebalance();list.CalculatedlGap();list.Showlistwithdraw();goto label;case 5:list.Calculatebalance();list.CalculatedlGap();list.Showlist();goto label;case 6:int a,b,c;CNode *pp;list.Calculatebalance();cout”输入你要寻找的日期”abc;CFinance t(a,b,c);pp=list.Lookup(t);if(pp)pp-ShowNode();elsecout”没有记录”endl;goto

39、 label; case 7:int a,b,c;coutabc;CFinance *pcf;pcf=new CFinance(a,b,c);CNode *pcn;pcn=new CNode;pcn-InputData(pcf);list.Modify(pcn); /修改结点goto label; case 8:int a,b,c;coutabc;CNode *pcn;CFinance *pt;pt=new CFinance(a,b,c); /输入一个日期pcn=new CNode;/产生新的动态的结点pcn-InputData(pt);list.Calculatebalance();list

40、.DeleteNode(pcn); /删除结点goto label;case 0: list.Calculatebalance(); list.CalculatedlGap(); list.Savefile(); exit(0); default: cout”输入有误,请重新输入:nn”;goto label; return 0; void Deposit(CFinance *p)double dAmt = 0;char ans;coutdAmt;if(dAmt = 0)cout”nnnnn”endl; cprintf(“ 这是个无效款项 请重新输入:”);getch();main(); coutp-nYearp-nMonthp-nDay;whil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论