现代软件工程讲义 个人项目和结对项目练习 四则运算

这是构建之法 《现代软件工程》课的作业题之一。

下面的题目, 从简单的命令行处理和数据处理开始开始,让同学们逐步练习,巩固算法,学会松耦合的设计,学会PSP,源代码控制,单元测试,回归测试,增量改进程序,等等。

第一步: 像《构建之法》的人物阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”。

具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:

23 - 3 * 4 = 11

扩展要求:看看小学三、四、五年级的四则运算要求, 逐步实现各个年级的难度。 写博客纪录自己实现每一个扩展的思路。 在扩展的过程种,你是独立开发每个年级的运算题的功能,处理四年级的代码和三年级的代码没有任何联系,还是逐步把一些公共的代码放在一起? 或者你用面向对象的方法,运用基类 (base class) 和子类来管理各种不同的需求和实现的细节?  

第二步, 分别满足下面的各种需求。

从这一步开始,我们要求学生填写个人软件流程 PSP 的耗时估计和实际时间的表格,要求把代码签入到源代码管理服务器上。  

下面这些需求都可以用命令行参数的形式来指定:

a) 一次可以出一千道道题目,并且没有重复的,把题目写入一个文件中。我们大家都知道,(1+2) 和 (2+1) 是重复的题目。 高级要求: 怎么严格定义题目重复呢,请看详细题目要求

和同学们比较一下各自程序的功能、性能、实现方法的异同等等。

b) 当你有多于一个运算符的时候,如何对一个表达式求值?逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目 (最多 10 个运算符,括号的数量不限制):

25 - 3 * 4 - 2 / 2 + 89 = ?1/2 + 1/3 - 1/4 = ? (6 - 4 ) * (3 + 28) =?

提示:很多学生在开始的时候用简单的条件判断来处理运算,如果只有一个运算符,那还是比较简明的,运算符多了之后,怎么办呢?  一些学生就用很多条件判断来处理运算的优先级,这是某学生代码片段:

        public void jisuan(double a, string operation1,double b, string operation2,double c, string rightanswer){bool aa = false;if (operation1 == "+" || operation1 == "-"){if (operation2 == "*" || operation2 == "/"){aa = true;}else{aa = false;}}else{aa = false;}if (aa == true)
...

那如果有 3 个运算符呢?怎么办,继续增加不同的 if/else 来解决?4个运算符呢?... 显然这不是一个好的算法, 一个好的算法,即使问题变得更复杂,算法本身应该依然是简明的, 并且程序本身的代码量并不会变得异常复杂。 我们看看有什么好的数据结构能高效地表示四则运算。

请参考调度场算法: 

          http://hczhcz.github.io/2014/02/27/shunting-yard-algorithm.html

          https://en.wikipedia.org/wiki/Shunting-yard_algorithm  (中文版)

c) 除了整数以外,还要支持真分数的四则运算。 (例如:  1/6 + 1/8 = 7/24  )

d) 让程序能接受用户输入答案,并判定对错。 最后给出总共 对/错 的数量。

e) 到目前为止,这个程序的界面都是中文的, 随着这个应用大受欢迎,别的国家的用户也要用,那么怎么能高效地让这个 App 支持不同文字界面互换呢?你是在程序里面不断插入 if ... else ... 来处理中英文,还是有高效率,可以扩展的办法?这个程序最终会扩展为支持10种语言,而且每个语言的用户需要符合他们文化的图标。请问你还是用 if/else 来解决么?

例如:你的程序已经支持了两种语言,并且中文界面有一个符合中国用户期望的图标,英文界面有一个符合美国用户期望的图标,  现在你要支持第三个语言 - 日文,并且需要一个符合日本用户的图标(假设是富士山的图像)。 然后还有另外 7 个语言 (德国、法国、意大利、...)和不同的图像要支持。那么,这可以用if/else 来解决, 还是有更高效的办法?

当显示文字直接放在代码中,例如像下面这样:

if (isEnglish)UIControl.setText("Welcome to my calculator app");else if (isChinese)UIControl.setText("欢迎使用我的四则运算程序");else if ...

这种用户显示的文字和代码逻辑放在一起的设计,我们称之为紧耦合。 程序员精通代码逻辑,但未必精通各国语言,也不太会设计各种图标,那我们会让懂法语和德语的团队成员(或者临时请来的专家)直接在代码上面改么?似乎他们会觉得代码编辑器的界面好难掌握哦... 改错了,程序编译不过去怎么办?我们可以想象,如果这些和逻辑无关的资源能够放在一个单独的地方, 这样负责文字和图像的人员(他们可能不太懂编程)能去修改,然后在主程序里,我们把各种语言的处理抽象为下面的操作:

    UIControl.setText(GetStringByLanguage(language_Id, string_id);   //根据当前显示的语言,拿到适当的文字,然后显示。 

这样会不会更好?逻辑代码和现实的资源各自分开, 通过良好定义的渠道(language_id, string_id) 结合起来了, 这是一种松耦合。 请看同学的尝试1, 尝试2.

程序可以用很多办法来提高效率保持简明:抽象 (把复杂的操作抽象为一个名字/类/函数,把复杂的处理隐藏在内),循环(高效地把类似的事情做 N 遍),递归(在处理问题的时候,发现这个子问题也是类似的,那我就调用自己来处理),组合(把各个操作组合起来完成复杂任务)... 等

第三步,增加一个运算符,程序应该有怎样的改变?不得不扔掉全部重写么,还是可以只改部分模块?

一些高年级的老师看到这个程序,希望让他们的同学也来用,但是有一个新需求, 要支持乘方 (power) 运算,我们都知道,乘方运算的优先级高于乘除法。如何表示乘方, 有两种表示方法:

1. 4 ^ 2 = 16,   4 的二次方等于 16。  这里, ^ 表示乘方

2. 4 ** 2 = 16,   4 的二次方等于16。这里, **  表示乘方 (** 之间不能有空格,否则是错误的算式)

由于历史的原因, 不同的学校用了不同的表示方法, 老师希望这两种表示方法都要支持,可以通过设置来选择。  

第4步,每个同学选一个方向,把程序扩展一下:

a) 把程序变成一个 Windows/Mac/Linux 电脑图形界面的程序 (取决于你目前使用的电脑),同时增加 “倒计时” 功能, 每个题目必须在 20 秒钟完成,如果完不成,则得0 分并进入下一题。增加“历史纪录” 功能, 把用户做题的成绩记录下来并可以展现历史记录。 

b) 把程序变成一个智能手机程序 (你正在用什么手机, 就写那个手机的程序), 增加倒计时,和历史纪录功能(见上)。

c) 把程序变成一个网页程序, 用户通过设定参数,就可以得到各种题目。

d) 选一个你从来没有学过的编程语言,试一试实现基本功能。

     估计做好这个软件需要的时间,并且写出大概的设计步骤和实现算法。

e)把这个程序的思路变成一个可以一步一步演示的步骤, 可以是命令行的输出, 也可以是图形界面:

  输入:一个正常的四则运算句子

  输出:程序用动画表示分词的过程,后序转换的过程,处理不同运算符优先级的过程, 逐步算出得出结果的过程。

例如:输入是  (6^2 - 4 ) * (3 + 28)

输出是

(36 - 4 ) * (3 + 28) 

32 * (3 + 28) 

32 * 31 

992 

     如果能做到这一步, 这个程序所牵涉到的 “知识点” 就能说 “精通” 了。

可以开始做相关的第二个作业。

第三步,程序理解和扩展

我们说了程序要能输出不重复的题目,大家有不同的实现方法,那么能否比较一下各自的异同? 例如这个实现方法:

https://gist.github.com/vczh/2c058aed996effc0a519ed3d265a3eb5  

1) 能否读一下这个程序,注释一下它的核心设计是什么,写一篇博客分析一下?

2) 如果我们要让这个程序增加一个运算 -- 乘方运算。  你要在现有程序中做什么样的修改,才能让这个程序比较优雅地实现这个新的需求。 

=========================

其他题目:

    - 最大子数组的和 问题及其扩展

    - 单词英语单词频率问题 黄金点游戏

    - 四则运算练习

    - 计算程序文件的行数 WC 

    - 电梯调度

    - 网页前端技术的练习题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程作业 - word count

(编程和软件工程作业系列) 实践最简单的项目:WC 实践是理论的基础和验证标准,希望读者贯彻“做中学”的思想,动手实现下面的项目,并和别人的成绩相比较,分析产生差距的原因。 1. 实现一个简单而完整的软件工具(源程序特…

软件工程课, 编程课 助教的工作介绍

在用 "做中学 (Learning By Doing) " 方式讲授编程和软件工程课的时候,我们认为助教在其中起了很大的作用。 费曼学习方法的精髓是 “以教代学” 。如果不能向其他人简单地解释一件事,那么你就还没有真正弄懂它。 我们课程的各位助教&#xff…

软件工程资料 - 优秀的大学怎么教程序开发和软件工程课

他山之石,可以攻玉 世界上很多大学都有不错的教学方法, 例如我们曾经的助教总结他在国外的学习经历,可以看出老师和学校对于如何教好课是花了心思, 有很多投入的。 一门课怎么上: https://zhuanlan.zhihu.com/p/206103…

第二届构建之法论坛预告(草案)

(草案) 时间:2018年7月初 (暂定 7/9 - 7/11) 地点: 北京航空航天大学 活动:为期三天的软件工程教案设计培训和软件专业教育方法的讨论 时间内容工具备注第一天上午 1. 论坛主题演讲 “构建之法教学改进” 构建之法的教学是如何演进到目前的形态的&#x…

AI应用开发实战系列之一: 从零开始配置环境

AI应用开发实战 - 从零开始配置环境 与本篇配套的视频教程请访问:https://www.bilibili.com/video/av24421492/ 零、前提条件 一台能联网的电脑,使用win10 64位操作系统请确保鼠标、键盘、显示器都是好的 建议和反馈,请发送到 https://g…

usb连接不上 艾德克斯电源_第十二届(深圳)新能源汽车核心电源技术研讨会成功举办...

2019年4月26日,由大比特主办的第十二届(深圳)新能源汽车核心电源技术研讨会在深圳登喜路国际大酒店成功举办。本次会议受到了法雷奥、长安铁雪龙、比亚迪、蔚来汽车、麦格米特、科陆电子、欣锐、英威腾、晶福源、英可瑞、瀚美特、航嘉驰源、核达中远通、永联、优优绿…

AI应用开发实战系列之二:从零开始搭建macOS开发环境

AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 零、前提条件 一台能联网的电脑,使用macOS操作系统请确保鼠标、键盘、显示器都是好的 建议和反馈,请发送到 https…

安卓能硬改的手机机型_手机后盖材质,金属比塑料的好,玻璃比金属的好,是这样么?...

从2000年至今,18年手机发生了巨大变化到现在,人们不再唯性能至上屏幕、拍照、材质、工艺等等也成了人们选购手机的标准手机后盖材质的发展史很好的见证了人们喜好的变化接下来我们来看手机后盖材质的演变史从手机的创造到手机的普及作为一个材料人我们经…

AI应用开发实战系列之三:手写识别应用入门

AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等。但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手。本文从简单的MNIST训练出来的模型开始,和…

重力加速度换算_中考物理重难点汇总——公式换算大全

初中物理中最重要的部分就是公式了,在这之中公式的换算可以说是一个难点,也是一个重点。力学部分一、速度公式火车过桥(洞)时通过的路程s=L桥+L车声音在空气中的传播速度为340m/s 光在空气中的传播速度为3108m/s二、密度公式(ρ水…

[人工智能教程] 人工智能暑期课实践项目建议

哈工大人工智能暑期课实践项目建议 这个博客介绍了暑期课实践作业的建议。 时间:7/10 - 7/22. 一周上课, 一周项目实践。 要求:项目实践的过程请用公开的博客记录。 项目的源代码请放到 github 中。 每4 ~ 5 人一个小组,从下…

新手一小时就写出人工智能应用 - 看图识熊

来不及了,先上车: 人工智能开发案例 熊的分类 如何安装必要的工具并配置环境呢,请看这个详细的解说 今后会有更详细的文字版在这个专题出现。 如果有对这个教程有疑问,请在这里留言。

c++ 线性回归_模型之母:简单线性回归的代码实现

模型之母:简单线性回归的代码实现关于作者:饼干同学,某人工智能公司交付开发工程师/建模科学家。专注于AI工程化及场景落地,希望和大家分享成长中的专业知识与思考感悟。0x00 前言 在《模型之母:简单线性回归&最小…

AI应用开发实战系列之四 - 定制化视觉服务的使用

AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型。 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 https://github.com/Microsoft/vs-tools-for-…

server sql 众数_sql 语句系列(众数中位数与百分比)[八百章之第十五章]

众数众数就是出现最多的那个数。select sal,count(*) as cntfrom empwhere DEPTNO20group by sal通过分组把他们的行数计算出来。那么最关键的部分在于,你如何知道最大值。是的我们可以查出当前最大值,然后再取出最大值的sal。但是这肯定要用到两个临时视…

【干货】快速部署微软开源GPU管理利器: OpenPAI

介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力。除此之外,还要压榨出硬件的所有潜力来加快模型训练。OpenPAI作为GPU管理的利器,不管是一块GPU,还是上千块GPU,都能够做好调度&a…

python调用ansysworkbench_Workbench通过Python设定材料参数

微信公众号:CAE技术分享以下一段代码是在Workbench中通过Python设定材料的弹性模量和泊松比参数:# encoding: utf-8# Release 16.0SetScriptVersion(Version"16.0.361")template1 GetTemplate(TemplateName"EngData")system1 temp…

现代软件工程 结对/团队作业 - 汉字的 2048 + 俄罗斯方块

一个很有趣的软件工程/编程作业,如果把汉字构成的规律运用在 2048 俄罗斯方块这样的游戏中,会有什么效果呢? (链接1, 链接2) 既然是软件工程的作业, 那就要体现出一些工程的特性: 作业要求: 1) 学生自行…

invoke 按钮点击_h5+ app内点击按钮实现复制功能 实现方法

在项目中由于要实现点击按钮复制功能,我用的是H5APP,实现代码如下(包括安卓IOS):/*** //参数copy是要复制的文本内容* tip 复制成功后的提示语,可空*/function copy_fun(copy,tips) {if(!tips){tips"已成功复制到剪贴板"…

机器学习平台建设

本文从机器学习平台的架构开始,再到具体的功能,然后从需求的角度带给读者思考,找到合适的机器学习平台建设之路。最后,推荐了微软开源开放的机器学习平台OpenPAI,是可私有部署的机器学习训练平台。 本文不少要点都可以…