康net实训报告.docx
- 文档编号:6197945
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:10
- 大小:77.95KB
康net实训报告.docx
《康net实训报告.docx》由会员分享,可在线阅读,更多相关《康net实训报告.docx(10页珍藏版)》请在冰豆网上搜索。
康net实训报告
.NET实训报告
项目名称:
多功能计算器的设计与实现
专业:
计算机软件技术
班级:
09级23班
姓名:
康江伟
学号:
090123005
指导老师:
胡媛媛
2011年12月12日
目录
第1部分设计任务与要求………………………………………………………………1
1.1设计任务………………………………………………………………………………1
1.2设计要求………………………………………………………………………………1
第2部分设计方案………………………………………………………………………2
2.1程序设计思路…………………………………………………………………………2
2.2多功能计算器功能类图设计…………………………………………………………3
第3部分多功能计算器的实现………………………………………………………4
3.1程序界面设计…………………………………………………………………………4
3.2程序功能实现…………………………………………………………………………4
第4部分程序调试与测试………………………………………………………………8
4.1程序调试………………………………………………………………………………8
4.2程序测试………………………………………………………………………………9
第5部分小结……………………………………………………………………………11
第1部分设计任务与要求
1.1设计任务
用C#语言编写一个多功能计算器。
1.2设计要求
(1)采用C#过程化程序设计方法,设计一个多功能的计算器,能够进行四则混合运算、开方、幂指数运算,当用户按下一个按键时有语音提示,运算结构也有语音提示,并将运算的结果用大写表示出来。
(2)采用C#面向对象程序设计方法,封装成类,并完成基本操作。
第2部分设计方案
2.1程序设计思路
多功能计算器的主体功能是实现计算,其中主体功能又可以划分为:
计算部分、显示部分、存储部分和输入部分。
计算部分采用面向对象设计方法,可以抽象为对运算类的实例化操作。
抽象类Operation只用写虚方法即可,而其子类用多态实现不同的运算。
在创建实例的时候可以采用不同的设计模式,例如“策略模式”可以实现更为复杂的运算,“工厂模式”可以确定运算方式并完成运算,“贪心模式”可以在子类中完成所有的计算等等。
该部分采用的是“简单工厂模式”,创建一个public公开的工厂类“Factory”用于判断具体实例化哪个子类,优点在于新增功能或修改功能不必更改界面逻辑设计。
降低了逻辑设计和界面设计的耦合度,维护性也有所增强。
显示部分主要采用TextBox显示结果以及输入,并且要求没有光标停靠。
连续输入的时候必须依次按顺序排列数字。
存储部分,在该设计中,存储部分需要3个存储器来实现:
内部累加器(myNum)、输入寄存器(tmp)以及结果暂存器(result)。
在存放数字时,将数字放入tmp里面,当第一次按下数字键时,表示该数字是个位。
当第二次按下数字键时,表示这次输入的是个位,上一次输入的是十位,所以要把第一次输入的数字乘以10再加上第二次输入的数字,来得到最终输入的数字。
当第三次按下数字键时,可以将第一次输入的数字乘以100加上第二次输入的数字乘以10再加上第三次输入的数字,来得到最终输入的数字。
当进行第一次计算时,第一个数字存放在tmp里面。
按下运算符号以后,第二个数字存放在myNum里面。
当再按下运算符号或者等号时,第一次计算的结果将存放在result里面,同时myNum清零,等待下一个数字的输入。
进行第二次运算时,将result里面的结果与tmp里面新输入的数字进行运算,再将运算结果存放在result里面,直到最后按下等号按键结束运算。
输入部分,该部分处理的是按钮的点击事件。
由于按钮数量比较多,事件大多具有共性。
抽象出来按钮可以分为三类:
数字、两个数字运算符、单数字运算符。
数字0到9事件较为简单,点击后判断是否为小数即可。
两个数字的运算符需要判断当前的运算符类型并创建相应的工厂实例对象完成运算。
单数字运算符单独处理自己的事件。
该部分用到了事件委托机制。
数字按钮和操作符按钮事件分别共享的是同一个事件,单数字运算符则独立处理各自的响应事件。
2.2多功能计算器功能类图设计
主要是针对操作类Operation的类图设计,如图2.1所示。
图2.1程序类关系图
第3部分计算器功能的实现
3.1程序界面设计
界面模仿Windows计算器设计,如图3.1所示。
图3.1程序界面图
3.2程序功能实现
程序代码(除运算类外)主要负责截获用户输入,以及完成程序逻辑所需要的信息采集。
0到9数字按钮负责完成输入并在存储变量中保存已输入的内容,十个按钮共享一个事件,其核心代码如下:
///
///数字按钮共有事件
///
///
///
privatevoidbtn_Common_Click(objectsender,System.EventArgse)
{
System.Windows.Forms.ButtonbtnTmp;
doublemyNumber;
btnTmp=senderasSystem.Windows.Forms.Button;
if(btnTmp!
=null)
{
if(dot==NODOT)
{
//不包含小数点
myNumber=double.Parse(btnTmp.Tag.ToString());
tmp=tmp*10+myNumber;
txtDisplay.Text=tmp.ToString();
}
else
{
//包含小数点
dotnum++;
myNumber=double.Parse(btnTmp.Tag.ToString())/Math.Pow(10,dotnum);
tmp=tmp+myNumber;
txtDisplay.Text=tmp.ToString();
}
}//是否按了按钮判断,如果为null,表示没有按下数字按钮
}
操作符按钮主要负责记录当前操作符并对多个操作符之前的运算完成并保留,最终显示在界面上,其核心代码如下所示:
///
///操作符按钮事件
///
///
///
privatevoidbtn_Operate_Click(objectsender,EventArgse)
{
Operation.OperationtmpOpt;
System.Windows.Forms.ButtonbtnOpt;
btnOpt=senderasSystem.Windows.Forms.Button;
if(btnOpt!
=null)
{
oper=btnOpt.Text;
if(num==0)
{
result=tmp;
}
else
{
tmpOpt=Operation.Factory.CreateOperation(oper);
tmpOpt.NumberA=result;
tmpOpt.NumberB=tmp;
try
{
result=tmpOpt.GetResult();
}
catch
{
MessageBox.Show("非法运算!
");
//txtDisplay.Text="非法运算!
";
tmp=0;
result=0;
num=0;
oper="";
dotnum=0;
txtDisplay.Text=result.ToString();
}
}
num++;
tmp=0;
txtDisplay.Text=result.ToString();
}//是否点击了操作符
}
最终用户点击等号的时候会完成计算,并在界面中显示最终结果,其核心代码如下所示:
privatevoidbtnEqual_Click(objectsender,EventArgse)
{
if(num==0)
{
//result=0;
//tmp=0;
//txtDisplay.Text=result.ToString();
return;
}//中间没有按下任何操作符
else
{
Operation.OperationOpt;
Opt=Operation.Factory.CreateOperation(oper);
Opt.NumberA=result;
Opt.NumberB=tmp;
result=Opt.GetResult();
txtDisplay.Text=result.ToString();
Operation.ConvertChineseupper=newOperation.ConvertChinese();
this.statusStrip1.Items[0].Text=upper.convertsum(txtDisplay.Text);
oper="";
tmp=result;//滞空之前,应当还保留当前的结果为下一次运算提供依据
result=0;
num=0;
dotnum=NODOT;
}//按下操作符
}
在程序中还实现了大写转换等功能,其核心代码可以参见源程序。
第4部分程序调试与测试
4.1程序调试
程序调试是程序设计过程中不可缺少的环节,其目的在于测试并修改程序代码,使得程序更符合目标要求。
VisualStudio.NET2005环境支持单步调试程序,并可在调试环境下监控变量值、类的实例对象等。
调试的步骤为:
一、在目标位置插入断点,并编译运行程序,如图4.1所示。
图4.1插入目标断点
二、在即时窗口处输入要监控的变量名,观察变量该时刻的值。
如图4.2所示。
图4.2监控目标变量
通过对目标变量的监控,以及对程序的不断调试,可以检测程序逻辑、流程以及算法的正确性,从而使得程序更贴近实现目标。
4.2程序测试
测试环节主要针对计算功能进行测试,由于语音文件只收集到数字0到9,所以不在测试范围内。
测试用例设计,如表4.1所示。
表4.1测试用例设计
用例编号
用例名称
预期输出结果
1
Ceshi1
用户输入小数,输出正确小数
2
Ceshi2
用户输入整数,输出正确整数
3
Ceshi3
用户输入两个数,输出正确计算结果
经过测试,对程序运算主体功能修改,完成对程序的测试。
其结果如下表4.2所示。
表4.2测试结果
用例编号
测试结果
1
通过测试,输出正确小数
2
通过测试,输出正确整数
3
通过测试,输出正确结果
测试结果表明,程序运算功能良好,达到预期目标。
但在测试过程中发现,连续运算无法区分运算符的优先级,连续运算且不点击等号会造成结果错误的情况出现。
第5部分小结
这次主要是运算方面采用面向对象分析法,对运算进行类的抽象并实现子类方法。
完成后细想一下其实也可以对界面进行抽象分析,如果用GDI+绘制按钮的话,每个按钮的属性以及事件都可以抽象进行类的编写。
当然这属于另一种设计思路了。
要求是发音以及大写转换,大写转换我做完了,发音部分我找不到合适的音频素材所以也就没做完。
实现了按钮发音,结果发音写好了类但是没使用,原因是没有小数点发音的文件。
发音比较简单,用API函数就好了。
转换大写就比较复杂了,费了不少力气还有些bug存在。
以前写代码都是拖控件、改属性、写事件,玩过VS2010之后发现其实这些都用代码可以写的。
所以这次我不再是每个按钮依次写事件,而是采用委托事件机制,共享了很多事件。
这样一来,重复的代码可以省去很多,而且功能也没有偏差。
对于Windows自带的计算器,我是蛮不喜欢的,发现了个小bug而且感觉有些东西还是占资源比较多。
自己很想改写一个好的计算器,但这次也确实没多少新的东西做出来。
在以后的学习中,面向对象方法应当更侧重一些。
毕竟这是现在主流的程序设计思想。
对于我来说,抽象、封装的概念并不陌生,但是从何抽象,怎样将一个实体完整的抽象,或者怎样从复杂的需求中抽象出合理的类关系,这是比较困难的。
参考文献
[1]甄镭..NET设计模式.汽车工程电子工业出版社,2008,7
[2]程杰.大话设计模式.北京:
清华大学出版社,2007.11
[3]叶汶华、程永灵主编,ASP.NET黄金教程,冶金工业出版社
[4]冀振燕,系统分析设计与应用案例[M].北京:
人民邮电出版社.2003.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- net 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)