现代软件工程讲义 个人项目和结对项目练习 地铁

很多老师反映教软件工程和程序设计的时候没有合适的题目,《构建之法》提供了下面的题目,都是从简单的解题思路入手,逐步增量改进。学生们可以复习基本的编程技能,然后逐步加入模块化,文件处理,单元测试,信息隐藏,面向对象的分析,MVC 等概念和实践。  大家可以选用:

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

    - 四则运算练习

    - 计算程序文件的行数,及其扩展问题

    - 电梯调度

    - 网页前端技术的练习题

下面的题目, 从简单的数据结构开始,让同学们逐步练习。

0. 请上网搜到最新的北京地线路图。

1. 把这个图的各个线路,各个站点,换乘信息等用文本文件  (假设名字叫 beijing-subway.txt)的形式保存起来,应该保存的信息有 {线路号,线路的各个站名,车站的换乘信息}, 应用程序可以读取这个文件,就能掌握关于北京地铁线路的所有信息,应该用什么样的格式呢?  在我们生活中,我们用自然语言,或者图表来表示信息, 当一个有足够生活经历的成年人看到上面的线图路,她马上可以理解  “两个小白圆点中间有一条线表示这两个车站是相邻的”。 当你要让电脑程序来处理这些信息,但是程序只知道一行,一个字,一个字节地处理信息, 怎么办,怎么表示 “这个车站可以转 5 号线”?

2. 写一个命令行程序 (不妨叫 subway.exe),这个程序启动的时候, 会读取beijing-subway.txt 的信息,然后这个程序就等待用户的输入, 用户可以输入地铁的线路编号,然后程序就输出此地铁线路的所有站名(按某一方向顺序输出即可)。 输出站名后,程序又进入等待状态。

3. 能否进一步, 找到两点之间的最有效线路? 请实现下面这个需求:

  subway.exe   /b 知春路   中关村

  返回经历的站名的个数,和路径,如果有换乘,请列出换乘的线路, 例如:

  4

  知春路

  知春里

  海淀黄庄  换乘10号线

  中关村

3.1 抽象

      在我们做测试的过程中,我们可以比较具体的车站的名字,已验证算法的正确性, 但是我们实际上并不在乎这个具体名字是 "知春路", 还是 "惠新西街南口",我们只要知道它们相同就好了。 能否给每个车站一个数字的标识,这样便于比较?  请修改你的 beijing-subway.txt 地图文件,把车站的唯一标识ID 加上,然后再修改程序中读取文件的部分,让它能处理ID,而不是仅仅车站名字。修改程序之后,请保证程序依然能够完成它原有的功能。

4. 既然有了地图和 “返回两个站点之间最短路径” 的功能, 我们怎么知道程序员实现的这个功能是正确的呢? 我们可以抽样调查,但是不能确保。能否测试这个模块呢? 这个模块可能是程序中的一个类,或几个相关的类,我们可以通过给它写单元测试,或模块测试的办法。

    请把subway 程序中 “返回两个站点之间最短路径” 的功能独立出来,成为一个DLL,或者一个类,那么我们就可以用《构建之法》 提到的单元测试, 或者 四则运算练习题 提到的测试模块的方法测试了。

 请把这个exe 分解为几个独立的模块,然后用你所在的平台的单元测试工具来测试。

5. 如果乘客有钱又有闲,那么,怎样才能尽可能快地遍历地铁的所有车站呢(只用经过一次,不用下车,就算经过车站)。 例如,注意到13号线 和 10 号线相交的知春路地铁站,我们选它作为一个起始站,从这个站出发,要经历多少站(换乘不出地铁系统,即不能从一个地铁口走到路面,然后从另一个站进去),才能把所有地铁站都遍历呢?

   扩展命令行程序,让它接受一个地铁站名。  例如这个格式: subway.exe /a  知春路  

程序输出总共经历多少站, 以及经历的站名, 举一个特例,假如地铁系统只有知春路, 西土城两个站, 那么这个程序应该输出:

  3

  知春路

  西土城

  知春路

5.1 从现实生活中我们知道,在地铁系统中换乘是比较麻烦的一件事情,花费额外的时间和体力 (下车,步行到下一个线路,等车,挤上车,再找座位),我们上一个遍历算法没有考虑到这一点,有点不接地气。 如果我们做一个改进, 每次换乘,相当于额外经历了 3 个车站, 我们还是要求遍历所有车站的最优线路,我们的程序应该怎么修改呢?  总的车站数量 = 实际经过的车站数量 + 换乘等价的车站数量

我们在前面几步的修改中, 把数据格式,程序的功能,程序的结构都稍稍修改了一些,但是整体程序还能按原来的需求运行。 希望初学者在每一步都只改一个方面,修改之后,能测试程序,保证没有引入其它错误。 有基础的同学可以用源代码管理工具来管理各个版本的代码。

5.2 既然有程序能输出解答, 那么我们怎么验证呢? 睁大眼睛一个一个地数么?  我们不是会写程序么? 来一个:

  subway.exe  /z filename 

      filename 指向一个文本文件,里面放了 /a  参数的答案 (就是题目 3 的输出, 一个数字加上站名)

  这个 /z  参数要求在命令行输出

      true: 如果filename 文件中的数据的确覆盖了整个地铁的所有站点至少一次,并且车站的数量是对的,车站的遍历次序是合理的。

  false: 车站的遍历次序仍然合理,但是有遗漏的站点,或者车站的数量错误。 如果有遗漏的站点,这个程序要至少输出一个遗漏的车站名。

  error: 如果车站的遍历次序不合理(例如直接从“知春路” 站到了“中关村” 站), 打印出出错的两个站名。

6. 我们前面的练习都是基于命令行的,能否做成图形界面呢? 首先我们要给每个站点一个坐标信息。

    1)请修改 beijing-subway.txt 文件,加入适当的信息,为实现图形界面做准备。 你要如何设计这些坐标呢?

    2)请改进 subway.exe,  加一个  /g  的命令行参数, 让它根据你提供的坐标画出各个地铁站,线路,以及换乘站。

    我们看到,所有要展现的信息都要存储起来,存储还要有一定的规则,这样程序才好正确地,高效地读出来。 存储有下面三个方案:

    a) 用文本文件, 用自定义的格式存放

    b) 用XML 格式存放

    c) 还可以用数据库的方式来存放, 例如 sqlite

    d) 还可以用自己定义的二进制的格式来存放。

    请比较几种方式的优缺点,特别是,这些方式如何应对变化的内部,外部因素。 例如,在 d) 方案中, 如果要增加一个地铁站,或者修改一个地铁站的名字,我们应该怎么做呢?

7. 现在我们回过头来,把遍历的解法搬到GUI (图形界面)来。 

    1)扩展 subway.exe,  处理下面参数的时候,

             subway.exe /g  知春路

         程序在图形界面中显示地铁地图 (各个站点的相对位置和官方地图类似即可),然后用一个小亮点表示乘客,乘客正在经过的车站就会闪亮,乘客走过的路用不同的颜色标识,同时在适当的地方有数字表明乘客已经经过车站的数目。

8. 前面几步都做好了,下面就是工程问题了:

    8.1 请让程序能处理上海的地铁地图,或者其它城市的地图。把程序由 “固定处理一个地图” 升级为 “能处理多个地图”, 程序的什么模块需要变化?

    8.2 请把程序移植到网页/手机,用户指定起点和终点,程序就报告这两个点的最优路径。  把程序从 PC 平台搬到 Web 或 Mobile,  原来写的所有代码都要扔掉么?  还是有很多部分可以重用? 怎样重用?

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

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

相关文章

最新软件工程总结,项目模板,软工作业下载

(改了标题吸引目标用户) 老师教课,学生上课,首先要讲明师生关系。 其次,就是要说明这门课的底线是什么。 我们假设所有人写作业都独立思考,认真实践,不断改进,勇于创新... 这个假设通常是不全面的&#xf…

构建之法 第三版 17 章 部分草稿

构建之法 17 章  人&#xff0c;绩效和职业道德 (<构建之法> 第三版草稿) 2016/12/23 17.1 领导力 在软件开发过程中&#xff0c;有很多平等合作&#xff0c;但是也有上下之分的领导/被领导关系&#xff0c;即使都是平级的员工之间&#xff0c;也有老师傅/新人&#xf…

构建之法 第三版 第3章 部分草稿 (剪牦牛毛、老程序员去金融公司的故事)...

/* * 这是 《构建之法》 第三版的草稿 */ 3.2 软件工程中的几种思维误区 正如我们在第一章讲的那样&#xff0c;软件有很多特性&#xff0c;软件开发有它自己独特的规律&#xff0c;如果不了解这些特性&#xff0c;软件工程师就会产生不符合实际的想法&#xff0c;在开发过程中…

现代软件工程作业 – 计算最长英语单词链

结对编程 – 计算最长英语单词链 《构建之法》练习题 大家经常玩成语接龙游戏&#xff0c;我们试一试英语的接龙吧&#xff1a;一个文本文件中有N 个不同的英语单词&#xff0c; 我们能否写一个程序&#xff0c;快速找出最长的能首尾相连的英语单词链&#xff0c;每个单词最多只…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

机器学习平台建设

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

型管件的作用_管道工程基础 - 管件和管道附件的布置规定

概述1.1 管件的用途1.2 管件的种类根据管件的端部连接形式可将管件分为对焊连接管件、承插焊连接管件、螺纹连接管件、法兰连接管件以及其它管件。管件和管道附件的布置2.1管件的布置(1)弯头宜选用曲率半径等于1.5倍公称直径的长半径弯头&#xff1b;输送气固、液固两相流物料的…

java grpc 客户端处理 go 服务端多返回值_grpc基础实践(二)

在此篇中我们将简要介绍关于grpc对java客户端的实现。在开始开发前&#xff0c;我们需要先导入io.grpc grpc-netty 1.11.0io.grpc grpc-protobuf 1.11.0io.grpc grpc-stub 1.11.0如果是Android除了这几个包外&#xff0c;你可能还需要一个javax.annotation:javax.annotation-ap…

asp.net 文本框显示xml格式数据_Excel 办公小技巧,查找和替换数据,您值得拥有...

在数据处理的过程中&#xff0c;有时需要在工作表中查找一些数据&#xff0c;以便查看或修改数据。若工作表的数据能一目了然&#xff0c;则可手动进行查找&#xff0c;但在记录繁多的工作表中查找所需数据并替换&#xff0c;效率比较低&#xff0c;而且极易出现遗漏。这时就可…

微软认知服务应用秘籍 – 与机器人聊知识

在本篇博客中&#xff0c;我们将会学习到零代码情况下&#xff0c;如何利用已有的技术建立自己的知识问答系统&#xff0c;这种系统的可以广泛适用于学校、企业、客服、政府公开信息等领域&#xff0c;代替传统的电话咨询、电子邮件沟通等高人工负荷的方式。 建立知识库 什么…

.net 开发怎么实现前后端分离_ASP.NET Core模块化前后端分离快速开发框架介绍

源码地址GitHub&#xff1a;https://github.com/iamoldli/NetModular演示地址地址&#xff1a;http://118.24.75.170:6220/账户&#xff1a;admin密码&#xff1a;admin前端框架演示地址(临时)地址&#xff1a;http://progqx5cu.bkt.clouddn.com/skins/index.html#/账户&#x…