面向对象程序设计课程设计家庭财务管理系统.doc
河南城建学院面向对象程序设计课程设计设计说明书课程名称: 面向对象程序设计课程设计 设计题目: 家庭财务管理系统 指导教师: 班 级: 学 号: 学生姓名: 同组人员: 计算机科学与工程系2011年6月23日目 录第1章 选 题21.1 题目背景21.2系统实现的具体分工21.2.1 选题21.2.2 团队分工31.3开发环境3第2章 设计内容32.1实现功能32.2 概要设计(涉及类的框图)42.3 界面设计6第3章 系统实现63.1 涉及知识点63.2 系统运行(主要运行界面抓图)73.3 源程序清单(关键代码)7第4章 测试与实验结果16第5章 结束语17参考文献17第1章 选 题1.1 题目背景近几年来,随着我国城乡居民收入的增加和生活水平的提高,家庭理财已成为人们居家过日子的重要内容。社会学家细心的观察到,时下家庭的“小九九”比之计划经济年代,开始发生微妙的变化。现在的城乡家庭生活发生了明显的变化,人们的收入逐渐拉开档次,消费水平也高了。大多数家庭关注的是提高生活质量,一方面精打细算,量入为出,把钱用在刀刃上;另一方面保证适当的娱乐活动、社会交际、智力开发等方面的开支。为此,不少家庭就有中长期财务预算,有基本建设规划。总的说来,家庭理财必须以量入为出为原则,以财产保值增值为目标,处理好积累和消费的关系。因此,应树立以下四个观念:第一,资金运动质量观。资金(包括现金,有价证券,存款等)运动,是家庭经济活动的价值反应,家庭理财应管好用活资金,加速资金周转,提高资金利用效果,力争做到结构合理、偿债能力强、经济效益高,家庭财务做为资金的载体,应力争实现其保值增值。第二,资金使用责任观。家庭财产作为社会资源的一部分,有责任创造社会财富,履行社会责任,为适应我国经济发展的要求,家庭可根据自身状况,适当投资,适度超前消费。第三,经济效益观。家庭经济生活的基本目标,是在满足生活最佳需要的基础上,实现家庭财力的最大化。因此家庭理财要与经济效益挂钩,必须处理好投入与产出的关系,规避各种经济风险,堵塞各种经济漏洞,增收节支,当好家理好财,不断提高经济效益。第四,利益协调观。家庭作为社会的细胞,它无疑又是一个利益结合体。从该意义上讲,家庭理财实质就是处理协调家庭内部及与各有关的经济方面的经济利益关系。在理财实践中,要坚持公正、公平、诚实和守信的原则,妥善处理好家庭内部利益关系、家庭与国家及有关经济单位的利益关系。1.2系统实现的具体分工家庭财务的中心内容账务管理。人们几乎每一天都会经过许多次货币活动。其中包括了买入卖出实物,娱乐消费,起居饮食消费,还有发放工资,收缴保费等。如果能把各类不同的活动进行分类,建立不同的账户,分别对活动进行管理,那么无论现在还是将来,你的账务就会清楚明白了。每天,我们对自己账务的操作有如下几类:添加新的数据项,比如今天我卖出了多少元,生活中,我们就要对自己还有多少元。现在我们把这些工作放到程序里去实现,就是这样的操作。某账户今天是添加还是减少,比如对元的操作就是减少。做到程序里,把它存放到一个数据表里就可以了。归结后,账户的操作一般如下:新添,删除,增加,减少,查找,统计。对重要的数据表记录还可以打印。 1.2.1 选题现代社会家庭的理财观念进一步提高,理财手段变得更加丰富。随着生活水平和文化水平的提高,家庭购买电脑的能力和应用电脑的能力开始提高。电脑及其应用的普及化,人们应用电脑进行家庭财务管理的观念增强,因此,开发一个通用性家庭理财软件已经成为社会需求。本系统是一个家庭通用型理财软件,系统目标是把适合家庭化管理的各种理财手段及家庭日常收支管理实现计算机化管理,使对家庭及家庭成员的收支活动更好地进行记录并加以统计分析成为可能,也使家庭理财变得方便,快捷,全面。1.2.2 团队分工表1.1 项目分工一览表角色姓名承担的具体任务组长周广敬程序的整体构架,功能实现。组员郭黎阳功能的实现。组员时兴平调试运行程序,查错,改错。1.3开发环境编程工具:Visual C+ 6.0机型:方正电脑处理器名称:Intel(R)Core(TM)2 Duo CPU E7200 2.53GHz硬盘驱动器:WDC WD1600AAJS-22WAAO系统内存:金士顿内存2GB显示卡:NVIDIA GeFORCE 9400 GT显示器:方正科技FG981-W9操作系统:Microsoft Windows XP Professional第2章 设计内容2.1实现功能家庭财务的中心内容账务管理。人们几乎每一天都会经过许多次货币活动。其中包括了买入卖出实物,娱乐消费,起居饮食消费,还有发放工资,收缴保费等。如果能把各类不同的活动进行分类,建立不同的账户,分别对活动进行管理,那么无论现在还是将来,你的账务就会清楚明白了。每天,我们对自己账务的操作有如下几类:添加新的数据项,比如今天我卖出了多少钱,生活中,我们就要对自己还有多少钱,今天所得的利润进行统计。现在我们把这些工作放到程序里去实现,就是这样的操作。某账户今天是添加还是减少,比如对钱的操作就是减少,如果与这个操作相关的账户是现金。做到程序里,把它存放到一个数据表里就可以了。归结后,账户的操作一般如下:新添,删除,增加,减少,查找,转账,统计。2.2 概要设计(涉及类的框图)Finance类private: 私有成员变量int tag;/删除标记 1:已删 0:未删 int no;/财务编号 char name20;/姓名 int acount;int ontag;/ int date;/财务日期public: 公共函数声明Finance() char *getname() return name; /获取姓名 int getno() return no; /获取财务编号 int getacout()return acount; int gettag() return tag; /获取删除标记 int getontag() return ontag; int getdate() return date; /获取日期 void setname(char na);/设置 void delfinance() tag=1;/删除财务 void addfinance(int da,int n,char *na,int nu);/增加财务 int borrowfinance();/支出操作 void retfinance();/收入操作 void disp();/输出财务 BDatabase类private: 私有成员变量int top; /财务记录指针 Finance financeMaxb; /财务记录 public: 公共函数声明BDatabase();/构造函数,将finance.txt读到finance中 void clear();/全部删除int addfinance(int da,int n,char *na,int nu);/增加收入 Finance *query(int financeid);/查找财务 void financedata();/财务维护 void financecount();/ 财务统计void financecount(int data); / 按月财务统计void disp(); /显示财务BDatabase();/析构这个类 表1 业务流程图符号符号名称说明实体数据的源点/终点输入/输出表示输入或输出的报表处理能改变数据值或数据位置的加工或部件数据流用来连接其他符号,指明数据流动方向存储表示任何种类的联机存储收入支出表收入支出帐簿账务设置信息收入支出管理用户时间类型总计统计文件记录2.3 界面设计在用户界面部分,根据需求分析结果,用户需要一个友善界面。在界面设计上,应做到简单明了,易于操作,并且要注意到界面的布局,应突出的显示重要以及出错信息。在界面设计部分,本系统为用户提供友好、方便、直观、简洁的操作环境。可供用户选择的项目主要有:退出,新增账务,删除账务,查找账务,显示所有账务,总计。第3章 系统实现3.1 涉及知识点类封装、面向对象程序设计、数组的应用、循环语句的使用、过程化设计的思想等。3.2 系统运行(主要运行界面抓图)图3.1 系统主界面系统功能实现3.3 源程序清单(关键代码)/程序主函数/#include <iostream> #include <iomanip> #include <string> #include <fstream>#include "Finance.h"#include "BDatabase.h"using namespace std; void BDatabase:financedata() char choice; char bname40; int danum;int financeid;int acount;int date;Finance *b; while (choice!='0') cout<<" "<<endl;cout<<"nntt_欢迎进入家庭财务收支系统_ "<<endl;cout<<" "<<endl; cout<<" 菜单 "<<endl; cout<<" "<<endl; cout<<" 0.退出 "<<endl; cout<<" 1.新增账务 "<<endl; cout<<" 2.更改账务 "<<endl; cout<<" 3.删除账务 "<<endl; cout<<" 4.查找账务 "<<endl;cout<<" 5.显示所有账务 "<<endl;cout<<" 6.总计 "<<endl;cout<<" 7.按时间统计 "<<endl;cout<<" 8.全部删除 "<<endl; cout<<" 9.将信息存入文件 "<<endl; cout<<" "<<endl; cout<<" "<<endl; cout<<" 请选择您要服务的类别: " ; cin >> choice; switch (choice) case '1': cout << "输入财务编号:"<<endl; cin >> financeid; cout << "输入家庭成员名:"<<endl; cin >> bname; cout << "输入金额:"<<endl; cin >> acount; cout<<"输入时间:如2010年7月写成20107"<<endl; cin >>danum;addfinance(danum,financeid,bname,acount); break; case '2': cout << "输入财务编号:"<<endl; cin >> financeid; b=query(financeid); if (b=NULL) cout << " 该财务不存在 "<<endl; break; cout << "输入新的家庭成员名:"<<endl; cin >> bname; b->setname(bname); break; case '3': cout <<" 读入财务编号:"<<endl; cin >> financeid; b=query(financeid); if (b=NULL) cout <<" 该财务不存在" << endl; break; b->delfinance(); break; case '4': cout << " 读入财务编号:"<<endl; cin >> financeid; b=query(financeid); if (b=NULL) cout <<" 该财务不存在"<< endl; break; b->disp(); break; case '5': cout << setw(6) <<"时间"<<setw(6) <<"编号"<< setw(18) <<"家庭成员名"<< setw(10)<<"收支类别" << setw(10)<<"金额"<<endl; disp(); break;case '6': financecount(); break; case '7':cout<<"请输入年月"<<endl;cin>>date;financecount(date); break; case '8': clear();cout<<"删除成功!"<<endl;break; case '9': break; default:cout<<"请重新输入:" /main() 函数的实现,程序的主界面的引导 void main() char choice; int financeid; BDatabase BookDB; while(choice!='0') system("cls");cout<<"nttO(_)O欢迎使用家庭理财管理系统 n"cout<<" "<<endl; cout<<" 主菜单 "<<endl; cout<<" "<<endl; cout<<" 1.进入家庭理财管理系统 "<<endl; cout<<" "<<endl; cout<<" 0.退出 "<<endl; cout<<" "<<endl; cout<<" 请选择您要服务的类别: " ; cin >> choice; switch (choice) case '1': BookDB.financedata(); break; case '0': break; default:return; /BDatabase.h头文件BDatabase类的声明#include <iostream> #include <iomanip> #include <string> #include <fstream>#include "Finance.h"#ifndef BDATABASEH#define BDATABASEHconst int Maxb=10000;class BDatabase private: int top; /财务记录指针 Finance financeMaxb; /财务记录 public: BDatabase();/构造函数,将finance.txt读到finance中 void clear();/全部删除int addfinance(int da,int n,char *na,int nu);/增加收入 Finance *query(int financeid)/查找财务 for (int i=0;i<=top;i+) if (financei.getno()=financeid &&financei.gettag()=0) return &financei; return NULL; void financedata();/财务维护 void financecount();/ 财务统计void financecount(int data); / 按月财务统计void disp(); BDatabase(); /析构函数,将finance写到finance.txt文件中 ; #endif/BDatabase.cpp BDatabase功能函数#include <iostream.h> #include <iomanip.h> #include <string.h> #include <fstream.h>#include "Finance.h"#include "BDatabase.h"BDatabase:BDatabase()/构造函数,将finance.txt读到finance中 Finance b; top=-1; fstream file("finance.txt",ios:in); while (1) file.read(char *)&b,sizeof(b); if (!file) break; top+; financetop=b; file.close(); void BDatabase:clear()/全部删除 top=-1; int BDatabase:addfinance(int da,int n,char *na,int nu)/增加收入 Finance *p=query(n); if (NULL=p) top+; financetop.addfinance(da,n,na,nu); return 1; return 0; void BDatabase:financecount()/ 财务统计int Bnum=0;int Rnum=0;int Mcout=0;int Bcout=0;int Rcout=0;for(int i=0;i<=top;i+)if(financei.getontag()=1)Bcout+=financei.getacout();Bnum+;financei.disp();elseRcout+=financei.getacout();Rnum+;financei.disp(); Mcout=Bcout-Rcout; cout<<"收入总金额"<<Bcout<<endl; cout<<"支出总金额:"<<Rcout<<endl; cout<<"收支结余:"<<Mcout<<endl;void BDatabase:financecount(int data) / 按月财务统计int da=data;int Bnum=0;int Rnum=0;int Mcout=0;int Bcout=0;int Rcout=0;for(int i=0;i<=top;i+)if(financei.getdate()=da)if(financei.getontag()=1)Bcout+=financei.getacout();Bnum+;financei.disp();elseRcout+=financei.getacout();Rnum+;financei.disp(); Mcout=Bcout-Rcout; cout<<"收入总金额"<<Bcout<<endl; cout<<"支出总金额:"<<Rcout<<endl; cout<<"收支结余:"<<Mcout<<endl;void BDatabase:disp() for (int i=0;i<=top;i+) if (financei.gettag()=0) financei.disp(); BDatabase:BDatabase() /析构函数,将finance写到finance.txt文件中 fstream file("finance.txt",ios:out); for (int i=0;i<=top;i+) if (financei.gettag()=0) file.write(char *)&financei,sizeof(financei); file.close(); /Finance.h Finance头文件Finance类的声明#include <iostream>#include <iomanip> #include <string> #include <fstream>#ifndef FINANCEH#define FINANCEHclass Finance private: int tag;/删除标记 1:已删 0:未删 int no;/财务编号 char name20;/姓名 int acount;int ontag;/ int date;/财务日期public: Finance() char *getname() return name; /获取姓名 int getno() return no; /获取财务编号 int getacout()return acount; int gettag() return tag; /获取删除标记 int getontag() return ontag; int getdate() return date; /获取日期 void setname(char na);/设置 void delfinance() tag=1;/删除财务 void addfinance(int da,int n,char *na,int nu);/增加财务 int borrowfinance() if (ontag=1) ontag=0; return 1; return 0; /支出操作 void retfinance();/收入操作 void disp();/输出财务 ; #endif/Finance.cpp Finance函数的功能实现#include <iostream.h>#include <iomanip.h> #include <string.h> #include <fstream.h>#include "Finance.h"#include "BDatabase.h"void Finance:setname(char na)/设置 strcpy(name,na); void Finance:addfinance(int da,int n,char *na,int nu)/增加财务 char ch;tag=0; date=da;no=n; strcpy(name,na);acount=nu;ontag=1; cout<<" 记录为支出按(y),收入(其他键)"<<endl;cin>>ch;if(ch='Y'|ch='y')ontag=0; void Finance:retfinance()/收入操作 ontag=1; void Finance:disp()/输出财务 cout << setw(6) << date <<setw(6) << no << setw(18) << name << setw(10)<<(ontag=1? "收入":"支出") << setw(10)<<acount<<endl; 第4章 测试与实验结果我在这次课程设计中种主要负责程序的整体架构和财务库类的功能实现。通过思考,我发现针对本题目对账目进行处理比对用户进行管理要简便许多,于是我选定了对账目进行管理的设计思路。建立Finance类 作为一个账目的对象。建立BDatabase类 作为整体账目库类并对两个类的声明与功能进行了整体的封装,实现了面向对象程序设计的最基本优化,使程序的可读性与可维护性得到了显著提高。在函数功能的实现方面,我尽量利用面向对象程序设计的思路进行设计,尽量减少代码的从重复。并利用友元等特性设计函数。实验结果与预想相符,设计的功能全部实现。但是对于类的继承,友元的使用等方面还不忽视非常纯熟。在今后的学习中我要加强这方面的锻炼。第5章 结束语这次课程设计历经一个星期左右,通过这一个星期的学习,发现了自己的很多不足,自己知识的很多漏洞,也有很多闻所未闻的东西,理解实践的能力急需提高。但是对于类的继承,友元的使用等方面还不忽视非常纯熟。在今后的学习中我要加强这方面的锻炼。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.。在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。在这次设计过程中,体现出自己单独设计程序的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。在此感谢我们的陈红军老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次程序设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。 由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢参考文献1钱能. C+程序设计教程(修订版).清华大学出版社2 严蔚敏 吴伟民.数据结构(C语言版).清华大学出版社3 C+入门经典(清华大学出版)ut2ApOdfXXc02GyBKsKCWw97MrqqWhoj5TL15Zt6jIPYytYCummtARp3v1N5luizi3xh3BhWYreKO8d9g7nmZQoWPJeTLDrw08gVS8DsDQQYGC3cE7moO2tLF0Jf1gK74IUXyBmtIVR97CkrfVqULT5fn2t6MpJR6rbzVPSortZvIj5NB5ndVvSr4iWr1TwLFKgLSPzuhRjQ3CmZU98eUOuijdLSZqPmvrw9zKupxf8WFUG9l2G9277g2rTipa1YpCZEuqxpKBhtVDCooQOzxUz3vJrZmOcijyM62zchmeooTYes8EBMm932tbz2Yo09RtsZEYS8Zrd2Yktj8l6jEAzVAjnfbtryLvsm6oFbfToXVRFFn7OwIYgJlamkUNXJYbz5Rrb7r4VsuR9zpfZFMfsjhcfCA37lNW2VVLRKN7R8psz1BN6oRic5hU5Z6HCxAYqyNPOG8duYbAwqSl20CSg06Dh2sM8HLtgPkIcSkrgOPDpuHBj1LmPk7lYdvC6NNMwL3fwhZFTFVYAARY7lHSSxJ10V3pH3Y19BxYR77Ib7CpZSu2tijqe3hKqkKAu9KSkCpHKXUIKvvyJZpg2YijRkqfbGgOvyqKuxNWI9oMnJtt6QilZxtyrF7d20FbmabcfiixrQKUsVNXBPPFUXyQ1fJSKFSUbkgs2DUVQC9sz4JkbgN4Qqv66pyoARjurNFJ3TxyfclZiEePtwFJthphEipDFNqnR2HjQKV2DzWtMPDJQkBcXmovdsjqCTJagjMdLsKPgaD2s0H0vmZGAHt36gyUEZ7UmANk1ndREuBeqdgrx0venqGnsyIB2ilq3SIQrNL4m56t7Z8Y8da5K0KUpn5Nzg4JvjdtfFHyt82AoGQkXo4VBLmLEiy2P7HtHBho07rCfttxodYDPPdtQsO7wxD0J6fKKlGm4woDzplhtRr2XgqN13hqy59zU1GegDyQniHNTaVSieueFQcYfUCJwd3vk5I7YKmhunDmIZ ut2ApOdfXXc02GyBKsKCWw97MrqqWhoj5TL15Zt6jIPYytYCummtARp3v1N5luizi3xh3BhWYreKO8d9g7nmZQoWPJeTLDrw08gVS8DsDQQYGC3cE7moO2tLF0Jf1gK74IUXyBmtIVR97CkrfVqULT5fn2t6MpJR6rbzVPSortZvIj5NB5ndVvSr4iWr1TwLFKgLSPzuhRjQ3CmZU98eUOuijdLSZqPmvrw9zKupxf8WFUG9l2G9277g2rTipa1YpCZEuqxpKBhtVDCooQOzxUz3vJrZmOcijyM62zchmeooTYes8EBMm932tbz2Yo09RtsZEYS8Zrd2Yktj8