UML与面向对象实验报告-信息101班-刘敏华.doc

上传人:jian****018 文档编号:9069569 上传时间:2020-04-02 格式:DOC 页数:6 大小:34KB
返回 下载 相关 举报
UML与面向对象实验报告-信息101班-刘敏华.doc_第1页
第1页 / 共6页
UML与面向对象实验报告-信息101班-刘敏华.doc_第2页
第2页 / 共6页
UML与面向对象实验报告-信息101班-刘敏华.doc_第3页
第3页 / 共6页
点击查看更多>>
资源描述
UML与面向对象实验报告信息101班 16号 刘敏华题目:请用C+,Java,C#,或VB,.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。问题处理:看到这个问题,首先想到的是可以通过设立四个变量A,B,C,D来分别表示两个数字,运算符号及运算结果,然后通过if语句来判断用户输入的运算符号,从而进行数学计算,另外在计算中需要将用户输入的数字在字符型与数值型之间进行转换来实现计算和显示。这样可以写出如下的代码:class Program static void Main(string args) Console.WriteLine(请输入第一个数字); int A = Convert.ToInt32(Console.ReadLine( ); /输入字符串转化为整形 Console.WriteLine(请输入第二个数字);int B = Convert.ToInt32(Console.ReadLine( );Console.WriteLine(请输入运算符);string C = Console.ReadLine( ); string D = ; if (C = +) D = Convert.ToString(A + B); if (C = -) D = Convert.ToString(A - B); if (C = *) D = Convert.ToString(A * B); if (C = /) D = Convert.ToString(A / B); Console.WriteLine (运算结果是: + D); 但是对代码进行仔细分析后,就会发现里面存在着许多明显的问题:1. 代码里面的命名很不规范,A,B,C,D让人看起来一下子很难理解代码代表的含义,代码标识符应该采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确。2. 在代码里面,If判断语句用了四次,这样会导致每个条件都必须进行判断,这样下来,就会导致计算机做许多的无用功。3. 进行除法运算时,没有判断字符是否为0,如果是0就会导致不符合运算规则,导致计算错误。为了解决这些问题,可以采取以下措施:1. 关于命名不规范的问题,可以采用新的命名,数字可以分别用NumberA和NumberB来表示,运算符号则可以用strOperate来表示,运算的结果可以用str2. 针对运算符的判断,可以采用switch开关语句来进行判断,这样就会少做许多的无用功3. 可以采用if语句来判断是否为0,如果是则提示错误。经过修改,可以得到下面的结果:class Program static void Main(string args) Console.WriteLine(请输入第一个数字); Int NumberA = Convert.ToInt32(Console.ReadLine( ); Console.WriteLine(请输入第二个数字);int NumberB = Convert.ToInt32(Console.ReadLine( );Console.WriteLine(请输入运算符);string strOperate = Console.ReadLine( );string strResult = ;switch(strOperate) Case +: strResult = Convert.ToString(NumberA + NumberB); break; case -: strResult = Convert.ToString(NumberA - NumberB); break; case *: strResult = Convert.ToString(NumberA * NumberB); break; case /: if (strNumberB != 0) strResult=Convert.ToString(NumberA / NumberB); else strResult = 除数不能为0; break; Console.WriteLine(运算结果是: + strResult); Console.ReadLine( ); 老师给出针对被除数为零的情况可以加一个trycatch语句来捕获异常,对问题进行处理,用法如下:static void Main(string args) try- -/相关的输入输出运算代码 catch (Exception ex) Console.WriteLine(您的输入有错: + ex.Message); 这样这个计算器完成基本的加、减、乘、除运算就没有问题了。但是这个程序竟仍然不满足要求!因为题目中要求的是面向对象!面向对象有三大机制:面向对象的三大机制:封装性、继承性以及多态性。1封装性:所谓封装就是把对象的属性和行为结合成一个独立的单位,使外界不能直接访问或修改这些数据和代码,外界只能通过对象提供的接口函数来改变或获取对象的属性数据,这就实现了消息的隐蔽。2继承性:如果在一个已定义的类上增加一些特殊属性或操作可以形成一个新的类,这个类不仅继承了前一个类的全部特征,而且具有新的特性,因此可看作前一个类的特例是对前一个类的继承。前一个类成为父类,新产生的类叫做子类。通过继承关系可形成一种类层次结构,叫做继承结构。3多态性:在类层次结构的不同类中可用相同的函数名实现功能不同的函数。多态即程序中同名的不同方法共存的情况。常见的两种多态方式为:子类对父类方法的覆盖利用重载在同一个类中定义多个同名的不同方法。另外,编程应该尽可能具有以下特性:1. 可维护:修改细节方面不会导致原有软件的结构混乱,方便进行维护。2. 可复用:复用不是复制粘贴,而是软件要有较高的效率和质量,可以不用做过多的修改而移植到其他的平台。3. 可扩展:可以很容易的加入新的模块,不会影响原有的模块,比如计算器中要加入平方等运算,要能很容易的实现。4. 灵活性好:修改移植方便,不能过于死板。另外要通过面向对象的三大特性使得程序的耦合度尽量的降低。也就是说编程的时候要尽可能的避免重复,就可以考虑前面的代码那些与控制台无关?而只是和计算器有关?这样就可以考虑把计算与显示分开来,来分别设计类,就是通过封装性原则来把功能实现模块化。另外可以通过继承把各种运算继承到运算类。这样就可以设计一个如下的运算类:public class Operation private double _numberA = 0; private double _numberB = 0; public double NumberA /输入数字 get return _numberA; set _numberA = value; public double NumberB get return _numberB; set _numberB = value; public virtual double GetResult() /获取结果 double result = 0; return result; 然后可以把各种运算规则继承到运算类:class OperationAdd : Operation /加法运算 public override double GetResult() double result = 0; result = NumberA + NumberB; return result; class OperationSub : Operation /减法运算 public override double GetResult() double result = 0; result = NumberA - NumberB; return result; class OperationMul : Operation /乘法运算 public override double GetResult() double result = 0; result = NumberA * NumberB; return result; class OperationDiv : Operation /除法运算 public override double GetResult() double result = 0; if (NumberB=0) /解决0问题 throw new Exception(除数不能为0。); result = NumberA / NumberB; return result; 这样基本上就满足了面向对象的要求了,需要添加新的运算方法时可以直接新继承一个类,不会对其他的产生影响。之后老师又讲了一个采用工厂模式的方法,通过这个来解决去实例化对象的问题,也就是用一个单独的类来做这个创造实例。这样的代码如下:public class OperationFactory public static Operation createOperate(string operate) Operation oper = null; switch (operate) case +: oper = new OperationAdd(); break; case -: oper = new OperationSub(); break; case *: oper = new OperationMul(); break; case /: oper = new OperationDiv(); break; return oper; namespace ConsoleApplication1class Program static void Main(string args) Operation oper;oper = OperationFactory.createOperate(“+”);oper.NumberA = 1;oper.NumberB = 2;double result = oper.GetResult();Console.Write(result);Console.ReadLine( )个人总结:通过这个面试问题,也给了我好多启发:1. 在编程的时候,对问题要尽可能的考虑全面,不要急于去写代码,要先把问题给分析好,考虑可能出现的特殊情况(如本题中的被除数为零),然后针对问题设计出解决方法。2. 在编程的时候要注意细节,代码不只是你自己这一时要看,别人可能也需要看,后期也需要维护,这就要求在编程的时候语言要尽可能的规范化,做到让人一下子就很容易看懂。3. 面向对象编程的时候一定要想到面向对象的三大特性,然后考虑如何将这三大特性运用到所要解决的问题,使得代码的耦合度尽可能的低,使代码具有良好的扩展性可移植性和灵活性,这样代码就是高质量的代码了!
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!