版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目 录一、需求与功能分析 1二、系统总体框架 1三、逻辑设计 1四、类的设计与分析 4五、数据库表结构设计 9六、特色算法分析 9七、功能测试 9 八、存在的不足与对策 11九、程序源代码 11一需求与功能分析该系统主要为一小型的家庭理财系统,可供平时记录开销与收入之用,另外可根据自定义条件显示某一阶段的财务状况和做出简单的统计。1.系统打开是自动显示最近20条财务项目,并统计。2.系统主要有两个大类,分别为收入与支出。3.系统有若干小类,用户可以自己添加。例如:食品支出,它的分类结构应该是“支出-食品支出”。4.用户可以自己添加财务记录,添加数据包括金额,消费类别,发生时间等。5.用户可以根
2、据消费时间段和大类来筛选并统计数据。二系统总体框架家庭理财系统 退出系统查找信息添加分类插入记录显示信息 三逻辑设计1显示信息 2插入记录3.添加分类4.查找信息四类的设计与分析为了储存从sql中读取的数据,因此设计了一个多态链表类,用来储存各种实体数据,要实现该多态链表类,首先应该有一个node节点类,用来封装节点成员和方法,然后才建立list链表类,list类和普通链表类无异,类似的功能有添加节点,删除节点,查找节点,清空链表等,唯一的亮点就是list是个模板类,可以储存各种类型的数据。另外对于一般的查询、添加、删除、修改等数据库操作,封装了若干个类。对数据操作封装在各自的类,是代码复用率
3、更好,程序更优雅。1node类 画出类图class node public:node();node( node &node );/构造函数重载virtual node();node& operator = ( node &node );/重载=操作符inline void value( const t val );/设置该节点的数据inline t value();/返回节点数据inline void last( node* node );/设置最后一个节点inline node* last();/返回最后一个节点inline void next( node* node );/移到后一个节点i
4、nline node* next();/返回下一个节点t m_value;/节点数据 private:node* m_plast;/最后一个节点指针node* m_pnext;/下一节点指针;node类说明表名称属性说明m_value数据成员储存节点数据m_plast数据成员最后一个节点指针m_pnext数据成员下一节点指正node()方法构造函数node(node &node)方法新建节点并赋值value()方法返回节点数据value(const t val)方法设置节点数据last()方法返回最后一个节点next(node *node)方法移到后一个节点next()方法返回下一个节点2li
5、st类画出类图classs list public:list()list( list &list )virtual list()list& operator = ( list &list )/在当前节点后插入一个新的节点,同时新节点成为当前节点void insert( const t val )/移除链表中的当前节点void remove()/清空整个链表节点void clear()/将当前节点的后一节点置为当前节点inline void movenext()/将当前节点的前一节点置为当前节点inline void movelast()/把链表最顶节点作为当前节点void movetop()/
6、把链表最底节点作为当前节点void moveend()/返回当前节点是否处于链表最顶inline bool isbof()/返回当前节点是否处于链表最底inline bool iseof()/返回当前链表是否为空inline bool isempty()/返回当前链表是否为满(依据维护链表的计数器是否已达最大值来判断)inline bool isfull()/返回当前链表内节点数inline unsigned int size()/返回当前链表最多能容纳的节点(依据计数器允许的最大值来判断)inline unsigned int maxsize() private:unsigned int m
7、_nsize;/链表中元数个数计数器unsigned int m_nmaxsize;/计数器最大值node* m_pcurr;/链表的当前节点指针node* m_ptop;/指向链表最顶部节点node* m_pend;/指向链表最底部节点;list类说明表名称属性说明m_nsize数据成员链表中元数个数计数器m_nmaxsizet数据成员计数器最大值m_pcurr数据成员链表的当前节点指针m_ptop数据成员指向链表最顶部节点m_pend数据成员指向链表最底部节点list()方法构造函数list(list &list )方法重载构造函数复制链表insert( const t val )方法在当
8、前节点后插入一个新的节点,同时新节点成为当前节点remove()方法移除链表中的当前节点clear()方法清空整个链表节点movenext()方法将当前节点的后一节点置为当前节点movelast()方法将当前节点的前一节点置为当前节点movetop()方法把链表最顶节点作为当前节点moveend()方法把链表最底节点作为当前节点isbof()方法返回当前节点是否处于链表最顶iseof()方法返回当前节点是否处于链表最底isempty()方法返回当前链表是否为空isfull()方法返回当前链表是否为满size()方法返回当前链表内节点数maxsize()方法返回当前链表最多能容纳的节点2. ac
9、countdataprovider名称属性说明get()方法根据主键取得一条记录update()方法更新3.detaildataprovider名称属性说明get()方法根据主键取得一条记录getwhere()方法根据限定条件查询getcussql()方法自定义sql语句查询insert()方法插入update()方法更新delete()方法删除4.categorydataprovider名称属性说明get()方法根据主键取得一条记录getwhere()方法根据限定条件查询getcussql()方法自定义sql语句查询insert()方法插入update()方法更新delete()方法删除5.
10、adoconn名称属性说明m_pconnection私有成员连接对象指针m_precordset私有成员数据集对象指针adoconn()方法构造函数adoconn()方法析构函数excutesql()方法执行sql语句getrecordset()方法取得数据集open()方法打开数据库连接close()方法关闭数据库连接五数据库表结构设计account表结构如下:account(account varchar(50),amount float )其中account:账户名称,amount:账户资金;detail表结构如下:detail(id int, amount float, date da
11、tetime, amount float, categoryid int);其中id:主键,date:发生日期, amount:发生金额,categoryid:外键);category表结构如下:category(id int, name varchar(50), type int)其中id:主键,name:分类名称,type:消费类型);六特色算法分析无七功能测试程序主界面添加新项添加新分类按条件查询八存在的不足与对策由于设计者水平有限及时间等方面的原因,该系统的功能比较简单,查错能力也不强,对于一些不正确的输入可能会造成一些难以预料的结果,因此,请不要故意输入错误信息。这些不足请老师多多谅
12、解。今后设计者会更多的学习编程技巧,不断的提高程序设计水平。1输入日期时候请按2007-1-1类似格式输入。九程序源代码adoconn.cpp/ adoconn.cpp: implementation of the adoconn class./#include stdafx.h#include adoconn.h#ifdef _debug#undef this_filestatic char this_file=_file_;#define new debug_new#endif/ construction/destruction/adoconn:adoconn()adoconn:adoco
13、nn()/ 初始化连接数据库void adoconn:open()/ 初始化ole/com库环境 :coinitialize(null); try/ 创建connection对象m_pconnection.createinstance(adodb.connection);/ 设置连接字符串,必须是bstr型或者_bstr_t类型_bstr_t strconnect =provider=sqloledb.1;password=;persist security info=true;user id=sa;initial catalog=money25;data source=;
14、m_pconnection-open(strconnect,admodeunknown); / 捕捉异常catch(_com_error e)/ 显示错误信息afxmessagebox(e.description();/ 执行查询_recordsetptr& adoconn:getrecordset(_bstr_t bstrsql)try/ 连接数据库,如果connection对象为空,则重新连接数据库if(m_pconnection=null)open();/ 创建记录集对象m_precordset.createinstance(_uuidof(recordset);/ 取得表中的记录m_p
15、recordset-open(bstrsql,m_pconnection.getinterfaceptr(),adopendynamic,adlockoptimistic,adcmdtext);/ 捕捉异常catch(_com_error e)/ 显示错误信息afxmessagebox(e.description();/ 返回记录集return m_precordset; / 执行sql语句,insert update _variant_tbool adoconn:executesql(_bstr_t bstrsql)/_variant_t recordsaffected;try/ 是否已经连
16、接数据库if(m_pconnection = null)open();/ connection对象的execute方法:(_bstr_t commandtext, / variant * recordsaffected, long options ) / 其中commandtext是命令字串,通常是sql命令。/ 参数recordsaffected是操作完成后所影响的行数, / 参数options表示commandtext的类型:adcmdtext-文本命令;adcmdtable-表名/ adcmdproc-存储过程;adcmdunknown-未知m_pconnection-execute(b
17、strsql,null,adcmdtext);return true;catch(_com_error e)afxmessagebox(e.description();return false;void adoconn:close()/ 关闭记录集和连接if (m_precordset != null)m_precordset-close();m_pconnection-close();/ 释放环境:couninitialize();accountdataprovider.h#include adoconn.h#include account.hclass accountdataprovide
18、rpublic:account get(cstring accoun)cstring strsql = select account, amount from account where account = +accoun+;adoconn con;_recordsetptr& data = con.getrecordset(_bstr_t)strsql);account acc;while(!data-adoeof)acc.accounts = (lpctstr)(_bstr_t)data-getcollect(account);acc.amount = data-getcollect(am
19、ount);data-movenext();data-close();return acc;int update(account acc)cstring strsql;strsql.format(update account set amount = %ld where account = %s, acc.amount,acc.accounts);adoconn con;return con.executesql(_bstr_t)strsql);detaildataprovider.h#include adoconn.h#include detail.h#include tlist.hclas
20、s detaildataproviderpublic:list getwhere(cstring where)cstring strsql = select detail.id, amount, date, memo, categoryid, name, type from detail, category where detail.categoryid = category.id and + where;return getcussql(strsql);detail get(cstring pk)cstring strsql = select detail.id, amount, date,
21、 memo, categoryid, name, type from detail, category where detail.categoryid = category.id and detail.id = + pk;list detlist = getcussql(strsql);return detlist.getcurrdata();list getcussql(cstring where)cstring strsql = where;adoconn con;_recordsetptr& data = con.getrecordset(_bstr_t)strsql);list det
22、list;while(!data-adoeof)detail det;det.id = atoi(_bstr_t)data-getcollect(id);det.amount = atof(_bstr_t)data-getcollect(amount);det.date = (lpctstr)(_bstr_t)data-getcollect(date);det.memo = (lpctstr)(_bstr_t)data-getcollect(memo);det.categoryid = atoi(_bstr_t)data-getcollect(categoryid);det.categoryn
23、ame = (lpctstr)(_bstr_t)data-getcollect(name);det.type = (lpctstr)(_bstr_t)data-getcollect(type);detlist.insert(det);data-movenext();data-close();return detlist;int update(detail e)cstring strsql;strsql.format(update detail set amount = %lf, date = %s, memo = %s, categoryid = %d where id = %d , e.am
24、ount, e.date, e.memo, e.categoryid, e.id);adoconn con;return con.executesql(_bstr_t)strsql);int insert(detail entity)cstring strsql;strsql.format(insert into detail values (%lf,%s,%s,%d), entity.amount,entity.date,entity.memo,entity.categoryid);adoconn con;return con.executesql(_bstr_t)strsql);int d
25、elete(int pk)cstring strsql;strsql.format(delete detail where id = %d,pk);adoconn con;return con.executesql(_bstr_t)strsql);categorydataprovider.h#include adoconn.h#include category.h#include tlist.hclass categorydataproviderpublic:list getwhere(cstring where)cstring strsql = select * from category
26、where + where;return getcussql(strsql);category get(cstring pk)cstring strsql = select * from category where id = + pk;list detlist = getcussql(strsql);return detlist.getcurrdata();list getcussql(cstring where)cstring strsql = where;adoconn con;_recordsetptr& data = con.getrecordset(_bstr_t)strsql);
27、list detlist;while(!data-adoeof)category det;det.id = atoi(_bstr_t)data-getcollect(id);det.name = (lpctstr)(_bstr_t)data-getcollect(name);det.type = atoi(_bstr_t)data-getcollect(type);detlist.insert(det);data-movenext();data-close();return detlist;int update(category e)cstring strsql;strsql.format(u
28、pdate category set name = %s, type = %d where id =%d, e.name, e.type, e.id); adoconn con;return con.executesql(_bstr_t)strsql);int insert(category e)cstring strsql;strsql.format(insert into category values (%s,%d), e.name,e.type);adoconn con;return con.executesql(_bstr_t)strsql);int delete(int pk)cs
29、tring strsql;strsql.format(delete category where id = %d,pk);adoconn con;return con.executesql(_bstr_t)strsql);tlist.h#ifndef _mylist_h_#define _mylist_h_#ifndef null#define null 0#endiftemplate class list/链表中存放元素的节点类template class nodepublic:node()/m_value = 0;m_pnext = null;m_plast = null;node( no
30、de &node )m_value = 0;m_pnext = null;m_plast = null;*this = node;virtual node()public:node& operator = ( node &node )value( node.value() );next( node.next() );last( node.last() );return *this;public:inline void value( const t val )m_value = val;inline t value()return m_value;inline void last( node*
31、node )m_plast = node;inline node* last()return m_plast;inline void next( node* node )m_pnext = node;inline node* next()return m_pnext;t m_value;private:node* m_plast;node* m_pnext;public:list()m_nsize = 0;m_pcurr = null;m_nmaxsize = -1;m_ptop = null;m_pend = null;list( list &list )m_nsize = 0;m_pcur
32、r = null;m_nmaxsize = -1;m_ptop = null;m_pend = null;*this = list;virtual list()clear();public:list& operator = ( list &list )clear();list.movetop();for( int i = 0; i= m_nmaxsize )node* tmp = null;/如果内存申请失败则抛出异常trytmp = new node;catch( . )tmp-value( val );tmp-last( m_pcurr );if( m_nsize != 0 )if( m_
33、pcurr-next() )tmp-next( m_pcurr-next() );m_pcurr-next( tmp );m_pcurr = tmp;/维护top和end节点信息if( !m_pcurr-next() )m_pend = m_pcurr;if( !m_pcurr-last() )m_ptop = m_pcurr;+m_nsize;/移除链表中的当前节点void remove()/检测链表是否为空if( !m_pcurr )return;node* tmp = null;/把前后两个节点互相联接起来/然后删除当前节点,然后把当前节点的指针指向后一个节点(如后节点无则指向前一节点)
34、if( m_pcurr-last() )if( m_pcurr-next() )m_pcurr-last()-next( m_pcurr-next() );tmp = m_pcurr-next();elsem_pcurr-last()-next( null );tmp = m_pcurr-last();elseif( m_pcurr-next() )m_pcurr-next()-last( null );tmp = m_pcurr-next();delete m_pcurr;m_pcurr = tmp;/维护top和end指针if( !m_pcurr )m_ptop = m_pcurr;m_p
35、end = m_pcurr;elseif( !m_pcurr-next() )m_pend = m_pcurr;if( !m_pcurr-last() )m_ptop = m_pcurr;-m_nsize;/清空整个链表节点void clear()movetop();while( !iseof() )m_pcurr = m_pcurr-next();delete m_pcurr-last();delete m_pcurr;m_pcurr = null;m_nsize = 0;m_ptop = null;m_pend = null;/返回当前节点数据t getcurrdata()/如果链表为空则
36、抛出异常if( !m_pcurr )return m_pcurr-value();/返回当前节点数据t* getcurrdataptr()/如果链表为空则抛出异常if( !m_pcurr )return &m_pcurr-m_value;public:/将当前节点的后一节点置为当前节点inline void movenext()if( !m_pcurr )return;if( m_pcurr-next() )m_pcurr = m_pcurr-next();/将当前节点的前一节点置为当前节点inline void movelast()if( !m_pcurr )return;if( m_pcu
37、rr-last() )m_pcurr = m_pcurr-last();/把链表最顶节点作为当前节点void movetop()m_pcurr = m_ptop;/把链表最底节点作为当前节点void moveend()m_pcurr = m_pend;public:/返回当前节点是否处于链表最顶inline bool isbof()if( !m_pcurr )return true;if( m_pcurr-last() )return false;elsereturn true;/返回当前节点是否处于链表最底inline bool iseof()if( !m_pcurr )return tru
38、e;if( m_pcurr-next() )return false;elsereturn true;/返回当前链表是否为空inline bool isempty()if( m_nsize = 0 )return true;elsereturn false;/返回当前链表是否为满(依据维护链表的计数器是否已达最大值来判断)inline bool isfull()if( m_nsize = m_nmaxsize )return true;elsereturn false;/返回当前链表内节点数inline unsigned int size()return m_nsize;/返回当前链表最多能容
39、纳的节点(依据计数器允许的最大值来判断)inline unsigned int maxsize()return m_nmaxsize;private:unsigned int m_nsize;/链表中元数个数计数器unsigned int m_nmaxsize;/计数器最大值node* m_pcurr;/链表的当前节点指针node* m_ptop;/指向链表最顶部节点node* m_pend;/指向链表最底部节点;#endifmoney25dlg.cpp/ money25dlg.cpp : implementation file/#include stdafx.h#include money2
40、5.h#include money25dlg.h#include accountdataprovider.h#include account.h#include detaildataprovider.h#include detail.h#include tlist.h#include category.h#include categorydataprovider.h#ifdef _debug#define new debug_new#undef this_filestatic char this_file = _file_;#endif/ caboutdlg dialog used for a
41、pp aboutclass caboutdlg : public cdialogpublic:caboutdlg();/ dialog data/afx_data(caboutdlg)enum idd = idd_aboutbox ;/afx_data/ classwizard generated virtual function overrides/afx_virtual(caboutdlg)protected:virtual void dodataexchange(cdataexchange* pdx); / ddx/ddv support/afx_virtual/ implementat
42、ionprotected:/afx_msg(caboutdlg)/afx_msgdeclare_message_map();caboutdlg:caboutdlg() : cdialog(caboutdlg:idd)/afx_data_init(caboutdlg)/afx_data_initvoid caboutdlg:dodataexchange(cdataexchange* pdx)cdialog:dodataexchange(pdx);/afx_data_map(caboutdlg)/afx_data_mapbegin_message_map(caboutdlg, cdialog)/afx_msg_map(caboutdlg)/ no message handlers/afx_msg_mapend_message_map()/ cmoney25dlg dialogcmoney25dlg:c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁园林建设合同模板
- 酒店招聘营业员合同模板
- 服装计件合同模板
- 炉具合同模板英文
- 餐厅装饰装修设计合同模板
- 承包修建厕所合同模板
- 轻钢工程外包合同模板
- 顾工劳务合同模板
- 出口小麦合同模板
- 眉山专业保安合同模板
- Unit+2+Lesson+1+The+Underdog高中英语北师大版必修第一册+
- 腹腔镜根治性(扩大)左半结肠切除术-课件
- 模拟法庭剧本
- 各工种岗位危险告知书全
- 振动测量传感器-课件
- 神经外科专科护理质量监测指标
- 造价员岗位标准
- 2023《朝花夕拾》中考真题及典型习题训练(解析版)
- 2022-2023学年部编版道德与法治六年级上册全册知识点汇总
- 旅行社间航班切位协议书(无补贴)
- 《中学教育科研实务》课程教学大纲
评论
0/150
提交评论