家庭记账软件的设计与开发Word格式.docx
《家庭记账软件的设计与开发Word格式.docx》由会员分享,可在线阅读,更多相关《家庭记账软件的设计与开发Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
第一章前言
随着家庭的开支不断变化,家庭的账户也不断的变化,面对每天枯燥乏味让人头疼的数据,如何有效的进行整理,并针对这些数据找到最佳的理财方式,是每个家庭最希望的。
本系统主要用于家庭的记账,总体任务是实现家庭账目的有序化,其主要任务是用计算机对家庭日常的开支数据进行增加,修改和删除。
对开支的分类支持增加,修改和删除,并能统计相应时间内的收入支出情况。
针对这些要求设计了家庭记账软件。
本软件主要包括账目的维护、类目的维护和统计三部分。
其功能主要有:
1、有关账目信息的输入,查询,修改删除等
2、类目的操作,包括查询类目,增加,删除等。
3、整个账目信息的统计。
家庭记账软件讲采用C#作为编程语言,以微软的.Net为环境,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成令用户满意的软件。
第二章绪论
2.1开发工具的介绍
VisualStudio2008提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。
VisualStudio2008包括各种增强功能,例如可视化设计器(使用.NETFramework3.5加速开发)、对Web开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。
VisualStudio2008为开发人员提供了所有相关的工具和框架支持,帮助创建引人注目的、令人印象深刻并支持AJAX的Web应用程序。
开发人员能够利用这些丰富的客户端和服务器端框架轻松构建以客户为中心的Web应用程序,这些应用程序可以集成任何后端数据提供程序、在任何当前浏览器内运行并完全访问ASPNET应用程序服务和Microsoft平台。
VisualStudio是微软公司推出的开发环境。
是目前最流行的Windows平台应用程序开发环境。
目前已正式发布的是9.0版本,也就是VisualStudio2008,而在2008年12月份,一个振奋人心的信息传来:
微软公布了下一代开发工具和平台“VisualStudioTeamSystem2010”以及.NETFramework4.0的相关信息,并透露他们将在2009年底或者2010年正式发布。
2.2开发语言的介绍
简介 Csharp(又被简称为"
C#"
)是微软公司在二OOO年六月发布的一种新的编程语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员AndersHejlsberg的最新成果.C#看起来与Java有着惊人的相似;
它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NETwindows网络框架的主角。
在本文中,我将考察创建一种新计算机语言的一般动机,并将特别指明是什么原因导致了C#的出现.然后我将介绍C#和它与Java,c,c++的相似之处.其次我将讨论一些存在于Java和C#之间的高层次的,和基础的差别.我将以衡量在用多种语言开发大型应用程序的时候所需的知识(或者对这种知识的缺乏程度)来结束本文,而这正是.NET和C#的一个主要战略.目前,C#和.NET还只能以C#语言规则,以及Windows2000的一个"
d预览版本"
还有MSDN上迅速增多的文档集子的形式获得(还没有最终定型)。
2.2.1定义
微软c#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点。
C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说structs),它还增加了自己新的特点(比方说源代码版本定义).但它还太不成熟,不可能挤垮Java、C#还需要进化成一种开发者能够接受和采用的语言。
而微软当前为它的这种新语言大造声势也是值得注意的。
目前大家的反应是:
“这是对Java的反击”。
C#更象Java一些,虽然微软在这个问题上保持沉默。
这也是意料中的事情,我觉得,因为Java近来很成功而使用Java的公司都报告说它们在生产效率上比C++获得了提高。
Java所带来的巨大影响和大家对它的广泛接受已经由工作于这种语言和平台之上的程序员数量明显的说明了(估计世界范围内共有两百五十万程序员使用Java)。
由这种语言写成的应用程序的数量是令人惊讶的并已经渗透了每一个级别的计算,包括无线计算和移动电话(比如日本发明的Java电话)。
C#能够在用户领域获得这样的礼遇吗?
我们必须等待并观望,就象已经由SSI公司的CEO和主席KalpathiS.Suresh指出来的那样:
"
我发现所有这些都是渐进的。
如果C#不存在,我们总能回到Java或C和C++。
这些都不完全是新技术,它们在更大的意义上来说只是大公司制造的市场噱头。
我们必须给他们时间安顿下来看看这些是不是真的对IT工业有什么影响。
2.2.2C#从Java继承而来的特点
类:
在C#中类的申明与Java很相似.这是合理的因为经验告诉我们Java模型工作得很好.C#的关键字import已经被替换成using,它起到了同样的作用.一个类开始执行的起点是静态Main()方法.下面的HelloWorld程序展示了程序基本结构形式:
usingSystem;
classHello{
staticvoidMain(){
Console.WriteLine("
Hello,world"
);
Console.ReadLine();
}
在这个例子中,System这个名字指向一个包括了基本C#实用类集合的命名空间(namespace).这个命名空间包括了Console类,它在这个例子中被用来输出一个字符串.类可以是抽象的和不可继承的:
一个被申明成abstract的类不能被实例化;
它只能被用做一个基类.C#关键字lock就象Java关键字final,它申明一个类不是抽象的,但是它也不能被用做另一个类的基类.界面:
就象在Java中一样,一个界面是一组方法集合的抽象定义.当一个类或结构体实现一个界面的时候,它必须实现这个界面中定义的所有方法.一个单一的类可以实现几个界面.也许以后会出现一些微妙的差别,但是这个特点看起来与Java相比没有变化.布尔运算:
条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量true和false是C#中的关键字.错误处理:
如Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:
由底层.NET框架进行自动内存垃圾回收.
2.2.3C#从C和C++继承的特点
编译:
程序直接编译成标准的二进制可执行形式.如果前面的HelloWorld程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序.
结构体:
一个C#的结构体与C++的结构体是相似的,因为它能够包含数据声明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,与Java相同的是,一个结构体可以实现界面.
预编译:
C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制.可用的预编译指令有:
#define
#undef
#if
#elif
#else
#endif
#warning
#error
#line[]
没有了#include伪指令.你无法再用#define语句对符号赋值,所以就不存在源代码替换的概念--这些符号只能用在#if和#elif伪指令里.在#line伪指令里的数字(和可选的名字)能够修改行号还有#warning和#error输出结果的文件名.
操作符重载:
一些操作符能够被重载,而另一些则不能.特别的是,没有一个赋值运算符能够被重载.能够被重载的单目操作符是:
+-!
~++--truefalse
能够被重载的二元运算符是:
+-*/%&
|^<
<
>
>
==!
=>
<
=<
=
2.2.4C#独有的特点
C#最引人入胜的地方是它和Java的不同,而不是相似的地方.这一节(和这个系列第二部分的大部分地方)讲述了C#实现的和Java不同的地方或者Java根本没有的特点.
动态查阅
C#4.0新增dynamic关键字,提供动态编程(dynamicprogramming),把既有的静态对象标记为动态对象,类似javascript,Python或Ruby。
dynamiccalc=GetCalculator();
intsum=calc.Add(10,20);
具名参数与可选参数publicStreamReaderOpenFile(
stringpath,
intbufferSize=1024)
{
...
调用OpenFile时,顺序可以完全颠倒:
OpenFile(bufferSize:
4096,path:
foo.txt"
中间代码:
微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用C#,VisualBasic,"
ManagedC++"
--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"
解释性的"
Java代码.当然,这一点还需要得到事实证明,因为C#和其他生成MSIL的编译器还没有发布.但是JavaJIT编译器的普遍存在使得Java和C#在性能上相对相同.象"
C#是编译语言而Java是解释性的,"
之类的声明只是商业技巧.Java的中间代码和MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.
命名空间中的申明:
当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.
2.2.5基本的数据类型
C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool,byte,ubyte,short,ushort,int,uint,long,ulong,float,double,和decimal.象Java一样,所有这些类型都有一个固定的大小.又象C和C++一样,每个数据类型都有有符号和无符号两种类型.与Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放28位10进制数字.
两个基本类:
一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.
参数传递:
方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,与ref不同的地方是,它指明这个参数并不需要初始值.
与COM的集成:
C#对Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个已存在的COM组件;
生成的类也能被作为一个COM组件使用,然后又能使用,比方说,JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用任何.NET语言子类化.
索引下标:
一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.
publicclassListBox:
Control{
privatestring[]items;
publicstringthis[intindex]{
get{
returnitems[index];
set{
items[index]=value;
Repaint();
可以用一个循环器来匿名引用字符串内部数组成员,就象下面这样:
ListBoxlistBox=...;
listBox[0]="
hello"
;
Console.WriteLine(listBox[0]);
代理和反馈:
一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明中.
第三章可行性分析
面对社会的快速信息化,一个好的理财系统能有效的节省开支,并且使支出做出效益最大化。
我设计的家庭理财系统,是基于c#的系统,因为目前家庭开支类目的越来越杂。
难以记住各种开支种类,所以一个理财系统是必需的。
数据库采用的是微软的SQlsever2005数据库。
系统主要的功能为,收支管理,数据分析,数据导出。
采用本系统,能够使整个系统内部所有信息的工作简化,提高工作效益。
由于采用统一的数据信息,使相关资料能够快速地查询所需的数据、资料及其它信息的,使信息快速高效运行。
第四章系统整体设计与实现
4.1系统主页面及数据库设计
4.1.1系统主页面预览
展开栏目后的页面预览如下:
这个主页面用了Panel,Button,PictureBox,Label,DataGird,TextBox等控件来完成实现的。
软件刚开始运行时的登入窗口
注册窗口
收支增加窗口
记录删除功能演示
收支分析图表演示
按收入支出方式统计
按支出类型统计
按收入类型统计
数据导出演示
保存后弹出提示
确定后即可保存成功
下面是导出的数据预览
4.1.2数据库设计
数据库预览
数据库包含两张表,一张是Consume消费表,另一张是FamilyUser用户表
Consume表主要列为:
表4.1Consume表结构
编号
字段名称
数据类型
长度
说明
1
Id
int
4
记录编号,主键,不为空
2
ConsumeData
datatime
记录收支时间
3
Type
Char
10
记录(收入还是支出)
Category
Nvarchar
20
记录具体类型的名称
5
Descrition
200
记录备注信息。
可为空
FamilyUser用户表主要列为:
表4.2FamilyUser表结构
UserName
Varchar
记录用户姓名
UserPassword
50
记录密码
4.2具体功能的实现
4.2.1登陆页面的实现
把数据库的连接单独写了一个类DbHelper.cs,用于数据库的连接
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Data.SqlClient;
namespaceFamilyFinance
{
classDbHelper
{
privatestaticstringconnString="
DataSource=.;
InitialCatalog=FamilyFinace;
UserID=sa;
Password=123;
ConnectTimeout=30"
publicstaticSqlConnectionconnection=newSqlConnection(connString);
}
}
登录页面的部分代码如下
privatevoidbtnLogin_Click(objectsender,EventArgse)
boolisEmpty=CheckEmpty();
if(isEmpty==true)
Stringsql=string.Format("
selectcount(*)fromFamilyUserwhereUserName='
+txtName.Text.Trim()+"
'
andUserPassword='
+txtPassword.Text.Trim()+"
SqlCommandcmd=newSqlCommand(sql,DbHelper.connection);
DbHelper.connection.Open();
intcount=(int)cmd.ExecuteScalar();
DbHelper.connection.Close();
if(count==1)
//打开主窗口²
MainFormmForm=newMainForm();
mForm.Show();
this.Hide();
else
lblAllError.Visible=true;
//验证用户输入是否正确
privateboolCheckEmpty()
boolresult=true;
if(txtName.Text.Trim()==string.Empty)
lblNameError.Visible=true;
result=false;
lblNameError.Visible=false;
if(txtPassword.Text.Trim()==string.Empty)
lblPasError.Visible=true;
lblPasError.Visible=false;
returnresult;
4.2.2收支数据新增,修改删除的实现
对此数据表进行数据增加的部分代码是:
stringdate=cboYear.Text+'
-'
+cboMonth.Text+'
+cboDay.Text;
insertintoConsumevalues('
{0}'
'
{1}'
{2}'
{3},'
{4}'
)"
date,cboType.Text,cboCategory.Text,txtMoney.Text.Trim(),txtDescription.Text.Trim());
intcount=cmd.ExecuteNonQuery();
MessageBox.Show("
数据增加成功"
数据修改的部分代码
SqlConnectionconn=newSqlConnection("
stringdate=cboYear.Text+'
+cboMonth.Text+'
+cboDay.Text;
stringsql=string.Format("
updateconsumesetconsumedate='
type='
category='
consumemoney={3},descrition='
whereid={5}"
date,cboType.Text,cboCategory.Text,txtMoney.Text.Trim(),txtDescription.Text.Trim(),txtLiuShui.Text);
SqlCommandcmd=newSqlCommand(sql,conn);
conn.Open();
introwCount=cmd.ExecuteNonQuery();
if(rowCount>
0)
修改成功"
this.consumeTableAdapter.Fill(this.familyFinaceDataSet.Consu