C#基础视频教程4.2 如何编写简单的计算器

用过VB6或者早期代码的人都应该能感觉到,C#目前也没看出来有什么特别之处,所谓的面向对象也没有什么体现。所以我们需要在原有基础上重写一份代码,然后比较两种做法的优缺点。我们在项目上右击添加一个FunctionMath的类。

?

之所以叫做FunctionMath,是讲他专门处理数学运算的(加减乘除之外,开方根,矩阵运算,四元数运算等等都可以认为是Math该做的事情,我们单独做这个类就是为了自己不断扩充这个类,然后越来越强大,以后碰到问题不用百度搜,不用问人,直接看自己写的函数库就完了)。我们还可以给这个类取一个别的namespace,所谓的namespace命名空间就是这个类是哪个门派的(比如前面一堆的using System.XXX,那么这些类库就都是系统自带的属于System下面的子类,我们自己创建一个Functions类库,就认为是自己创建一个门派,以后什么别的项目只要引用了这个类库,就可以使用下面的方法,提高代码的复用程度)

?

基本可以照抄Form1的引用,引用了不一定要用(至少我们增加了using System.Windows.Forms这个DLL),这就方便随时执行MessageBox输出我们要查看的信息(我们已经namespace是Functions里就不需要再引用自己了)

?

这个类一开始就是空的,我们先不要急着写,先要想清楚这个类要干些什么,首先是要完成加减乘除,那么很明显,需要这样四个方法,而且每个方法输入,输出都是可以轻易想通的。注意定义在类里面的方法是跟Form1的交互没有任何关系的,你不要把Form1里面的变量挪到这个FunctionMath里面,要保持这个类的干净整洁(除法的被除数不能为0这些非法情况我们也应该在自定义的类里面实现,不完善的地方发现了就去完善,从而把类越写越完整,现在能想到哪里就写哪里)

?

除了加减乘除,我们还可以想到比如常见的开平方,开平方根,进制转换,角度弧度转换等等(所以很明显,一个完整的数学类会有很多的方法,往后我们还可以添加向量运算,比如点乘,叉乘,求夹角,还可以添加矩阵运算,比如左乘,右乘,转置,求逆),不管怎么样,我们已经学会了构建基础性的东西,并且正在投入使用。

?

这样我们就可以使用自己类的方法来执行具体的功能了(使用的时候也不去判断是否除以0这些非法情况了,那都应该在自定义类里面完善好)。这就是所谓的面相对象的思维方法,把一类功能放到一个Calss里面,每个人该干啥都分得很清楚,比如FunctionMath只负责数学运算(我们会在后面逐渐更新FunctionString负责字符串处理,FunctionCommunication负责通讯处理,FunctionSystem负责系统交互等等) ,而前面讲的Designer.cs只负责界面布局,总而言之就是让一个文件表示一个类,干一件事(一个公司小的时候可能一个人技术,销售,财务,人事的事情都干了,但是目标要是大公司的做法,做技术的不管销售,每个文件职能分的越清楚越好) ,这需要读者慢慢体会,养成这样做的习惯,虽然双击按钮直接在里面写很爽,但那都是面相过程的做法,如果写几万行的代码就吃不消了,你到处在找你之前写过的东西,整个项目里面的重复代码,垃圾代码也到处都是。

?

虽然把具体计算的部分剥离出来了(我们可以不断完善这个FunctionMath的类),但是主程序还是非常乱,是否有可能把代码更加精简,比如点击一个按钮只执行一个功能?这就需要根据实际项目去思考怎么精简了。比如我们目前是写一个简单的计算器(可能也可以做的很复杂),我们可以简单想想按钮无非分成三类,一类是操作数(数字,小数点),一类是操作符(加减乘除,开平方),一类是求结果(计算按钮),可能清除按钮也可以当做一类,但是没什么关系,其实点击任何按钮都可以划归到一个方法去执行,所以主界面我们可以先做成这样一个方法(需要两个参数,第一个是具体按钮内容,第二个是我们自己定义的按钮类型)

?

流程上,我个人简单认为就A和B两个操作数,C是最后结果(不考虑连续运算),为了跟Windows自带的计算器作区分,我们会始终显示两个操作数和操作结果避免输入大量数据的时候不清楚前面输入的内容。那么按下加减乘除这种操作符号按钮之后,就切换了A和B(没有按下操作符之前,我们的数字键始终在操作A,按下操作符之后,A就固定了后面的数字都是B)这是比较简单的逻辑流程,读者也可以想想有没有更好的,更合理的写法。但至少目前为止这样做还没发现什么问题。

?

到这一部分至少我们整个程序结构已经比较完善了,比之前的版本主程序少了50行,同时读者也可以很容易发现修改起来会比之前方便(一个方法,一改全改),在下面一个部分,我们接着优化

?

更多教学视频和资料下载,欢迎关注以下信息:

我的优酷空间:

http://i.youku.com/acetaohai123

?

我的在线论坛:

http://csrobot.gz01.bdysite.com/

?

问题交流:

QQ:910358960

邮箱:[email protected]

?

?

?

时间: 2024-08-11 03:36:43

C#基础视频教程4.2 如何编写简单的计算器的相关文章

C#基础视频教程4.3 如何编写简单的计算器

我们接着往下改,为了让这个计算器更加实用,我们要像官方的计算器一样可以接着计算(你算出来一笔数据之后,可以接着累加累减,我们暂时不考虑加括号,优先级之类的,因为绝大部分情况下我们打开计算器就是为了进行简单的四则运算),当然我们这个需要每次算完之后点击一下接着计算(微软官方的是计算之后,再次按数字键默认就重头开始计算,类似于点击了清除,再次按加减乘除键就接着计算,类似于点击了接着计算),读者可以自己思考如何做到更智能,更自动 ? 再添加撤销按钮(退格键),要做一些处理,因为如果已经没有东西了你就不

C#基础视频教程4.1 如何编写简单的计算器

要学会基本的窗体控件(button,textbox,label这种,以及他们的重要属性),每个控件的命名要符合规范(例如一般文本框都会重命名txtXXXXX,按钮都会重命名btnXXXXX) ? 为了防止出错,文本框可以设置为只读(选中textbox之后把ReadOnly属性改为True) ? 为了提高用户体验,运行的时候显示到屏幕正中央(选中整个Form之后把StartPosition设置为CenterScreen) ? 每一个控件本质上都只是一堆代码(你往窗体上拖放一个控件,其实就是在窗体F

C#基础视频教程5.1 如何编写简单的超级热键

我们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,肯定能做的比微软自带的计算器好用).这一节介绍做简单的超级热键(所谓的超级热键是指自定义快捷键的功能) 超级热键的最关键一步是绑定键盘钩子,就是键盘按下一组快捷键,主窗体能够响应(自己做不了或者想不到怎么做,就要百度搜别人有没有成熟的可以借鉴),先来看别人的范例程序(了解什么是带类库输出的项目,右击可以修改成Demo测试运行,直接运行报错) ? 也要学会能生成类库和使用类库,例如我们新建一个类库的项目,看起来跟传统C#

C#基础视频教程5.3 如何编写简单的超级热键

跟前面一章讲解计算器一样,到最后一小节,我们总是要把代码规整好,让整个程序显得非常简洁,先做个文件夹把我们自定义的类库都放进去 ? 然后我们开始整理Form1里面的代码,为了实现超级热键的功能,我们应该完善FunctionMouseKeyboardHook这个类(因为现在叫做超级热键,可能后面我们需要用鼠标键盘来触发干一些别的事情,到时候如果也能拿着代码直接移植就会很有意义,不改变业务的框架,WIN+A/Z的字母应该已经够用了,而且考虑不跟系统自带的快捷键冲突,例如WIN+L是系统自带的锁定计算

C#基础视频教程7.2 如何编写简单游戏

前面一小节我们实现了简单的碰撞检测,但是实际上游戏的对象并不是一个标准的矩形(小鸟是一个不规则的物体,其实碰撞的管道也是不规则物体),所以如果真的要做的比较完美,我们自己要写一个方法,能够导入一个图像,然后自己照着图像描绘一个不规则的轮廓,然后把这个轮廓提取出来点,以后判断的时候只要判断所有A图形轮廓的点是否在B区域就可以了.所以前面的矩形和椭圆已经不够用了,我们要用一个自定义的点位数组point[]来构建不规则多边形Polygon,当需要的判断点的时候就遍历这个point数组即可. ? 为了提

C#基础视频教程5.2 如何编写简单的超级热键

我们前面已经理解了如何使用官方的代码实现鼠标键盘的监控,其实还差一点,因为他的代码只能捕捉单个的按键,而其实我们要的是组合键.什么是组合键呢?比如我想定义同时按下WIN+C是去执行屏幕截图.这只要理解为WIN键按下且没有弹起,C键也被按下,然后去执行一个EXE程序即可. ? 我们需要写一个类把之前的封装起来 ? 这样就比较简洁,初始化和添加绑定都只用了一行(+=就是添加绑定,读者也可以测试多次+=的效果,-=就是取消绑定,这样做可以让主程序显得比较干净) ? 我们来思考一下如何实现捕捉一组按键,

C#基础视频教程7.5 如何编写简单游戏

有一些BUG需要处理,比如小鸟太高或者太低都应该报错(不然直接掉到窗口下面去了),这个方法跟前面的HitTest应该独立开来,而不是掺和在一起 ? 测试确实可以检测是否超过边界(如果要非常精确,那么就不仅仅是判断跟窗体宽度和高度的比对了,要去掉小鸟本身的宽度和高度) ? 此外小鸟和管子都应该用一些背景图片代替,而不是只有填充的颜色,这里只是简单的用了普通的图片(尤其是管子会被随时缩放,还是效果不够理想,如果要把游戏做的很精致,需要仔细研究如何在自定义多边形中放图片) ? 借着这个机会,我把绘制,

C#基础视频教程7.3 如何编写简单游戏

前面我们大致实现了鸟的一圈轨迹(其实如果你不做这个,就用两个矩形块的碰撞检测代替也可以),跟所有前面的教程一样,草稿打完了就要设计封装成一个类.至少到目前为止我们已经知道了鸟的属性和方法,先不要管方法具体如何实现,也不管方法输入输出,我们先要设计大概有几个方法. 鸟的初始化方法-根据前面一节导入导出一些多边形点(这里初始化只需要导入一堆点就行了) 鸟的销毁方法-比如鸟撞到管子上或者地底下,整个游戏重新开始,那么鸟肯定也要重新开始 运行方法-比如你可以定义鸟的运行是受重力影响往下掉,也可以定义是不

C#基础视频教程7.4 如何编写简单游戏

接下来我们实现整个的游戏流程,当点击开始游戏,则需要三个事情开始运行 1 小鸟初始化并往下掉(当然还是可以用按钮让他飞一下) 2 每隔一定时间从左侧产生一个管子(宽度和高度随机,产生周期2000ms左右) 3 每隔一定时间检测是否鸟撞到了管子(这个时间周期要50ms左右,也可以更大或者更小) ? 跟上一节不同的地方在于,小鸟是唯一的,而管子不唯一.我们之前只是判断一个小鸟和一个管子是否有碰撞,随着管子的不断生成,要检测小鸟和每个管子是否有碰撞.所以我们把生成管子放在了GameSense的一个li