2017《面向对象程序设计》课程作业四

作业要求:

  • 本次作业不要求编码实现。发布一篇博客,图文并茂。
  • 请设计四则运算的各个类的类图。并对图加以描述。
  • 有编码实现的同学附加10分。
  • 作图软件推荐ProcessOn,也可以提供手工画图的照片。

类图

流程图

具体问题

  1. 采取面向对象的方法,四则运算自动出题软件,根据需求可以划分为几个类?每个类具有什么属性?每个类具有什么行为?
  • 可以分为四个类:表达式,运算器,计数器,交互窗口。属性以及行为如类图所示。
  1. 类与类之间是如何进行协作的?谁给谁发送消息?谁持有谁的引用?
  • 类与类之间通过消息来协作,交互窗口告诉表达式题目数量,表达式告诉运算器表达式,运算器告诉计数器正确题数。具体如类图所示。
  1. 该自动出题软件采取何种算法或者是如何实现的?可以采用流程图描述的方法。
  • 如流程图所示。

代码

代码github地址
代码分为三个部分:main函数,头文件(包括用到的头文件,符号常量,类),成员函数的定义。

  • 代码结构:

运行示例

完成体会

  • 这次作业,我把原来用C语言写的四则运算程序用c++改写了一下,从面向对象的角度重新审视这个程序(也许做的结果并不是正宗的面向对象)。由于思考的角度变了,所以这次代码几乎是一次“翻工”,所有的函数都得重新写,得重新定义结构。
  • 联想到上课讲的晚会的例子,我从一个晚会举行的过程来思考,到晚会举行需要什么对象,对象有什么性质,需要什么功能,和四则运算作类比,抽象出四则运算器的四个对象:交互窗口、表达式、二元运算器和计数器。然后给他们加上属性,想它们需要什么功能,再给他们添上函数。
  • 我在作出类图以后,才开始重新编写代码。写的过程中,把功能不断细化,想尽量把对象封装得“牢”一些,连一些简单获取数据,赋值也用函数完成。感觉这个过程虽然繁琐了一些,但是程序更加独立、清晰。写代码的时候,只要思考如何把这个对象写好,不需要过多去思考运行的过程,和整个面向过程的方式相比,这样做可以很大程度上简化思维量,有一种把大问题分解成小问题、小问题逐个击破的感觉。用了类以后,也不需要编出很多不同名字的变量,方便了许多。
  • 这次表达式,使用了栈的知识,因为涉及到把数字转化成字符的问题,所以对每个数字都逐一使用了sprintf()来转化,虽然实现了表达式的生成,但是觉得略显繁琐,并不是十分令人满意,有些强行用栈的感觉。但是在这个过程中,至少对栈的原理、后进先出特点更加熟悉,用得更加熟练。
  • 清除了所有的全局变量,都使用传参的方式完成。
  • 编码以后才发现,写的类图还是有一些不够完善的地方,比如在一开始并没有想到交互窗口这个类,写完交互窗口以后,就让所有零散的函数都“各得其所”了。要是没有编码,就有些纸上谈兵的感觉,写的类图未必能真正实现。编码以后,收获还是很大的。
posted @ 2017-05-13 22:46  范加索尔拉  阅读(268)  评论(3编辑  收藏  举报