




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 在编程的时候,对问题要尽可能的考虑全面,不要急于去写代码,要先把
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东深圳大学弋泽龙教授团队招聘1名研究助理模拟试卷完整参考答案详解
- 2025年萍乡创新发展投资集团有限公司招聘6人模拟试卷及参考答案详解1套
- 2025吉林白山市浑江区事业单位招聘高层次人才和工作人员(含专项招聘高校毕业生)57人考前自测高频考点模拟试题(含答案详解)
- 2025年阜阳颍上县人民医院公开招聘社会化用人48人模拟试卷及参考答案详解
- 2025广西百色市人民医院人才招聘38人(第二批)考前自测高频考点模拟试题参考答案详解
- 2025江西省中小学教师及特岗教师招聘笔试有关事项提示模拟试卷含答案详解
- 2025北方人才(蒙东)国家标准化考试基地招聘28人考前自测高频考点模拟试题及答案详解(网校专用)
- 2025内蒙古大唐锡林浩特电厂招聘消防车驾驶员1人模拟试卷及1套完整答案详解
- 2025内蒙古自治区农牧业科学院招聘控制数人员93人考前自测高频考点模拟试题及一套完整答案详解
- 2025年白山市浑江区事业单位公开招聘高层次人才和工作人员(含专项招聘高校毕业生)(57人)考前自测高频考点模拟试题及答案详解一套
- 研学活动合同协议书模板
- 医疗器械售后服务团队的职责说明
- 食品配料人员培训
- 工程勘察设计收费标准(2002年修订本)
- 规范团费账户管理制度
- 消防救援队伍灭火救援作战训练安全专题授课
- 公安审讯技巧培训
- 人教版2025初中物理实验室安全使用指南
- 销售团队组建方案-
- 考古调查勘探辅助工程方案投标文件(技术方案)
- 物业服务提升方案模板
评论
0/150
提交评论