当前课程知识点:基于Linux的C++ >  第五讲 程序组织与开发方法 >  5.6 典型软件开发流程(一) >  LinuxCPP0506

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP0506在线视频

LinuxCPP0506

下一节:LinuxCPP0507

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP0506课程教案、知识点、字幕

接下来通过一个实际的例子

给大家展示典型的软件开发流程

应该怎么去操作

从软件工程这个角度来讲

真实的开发程序实际上要通过

需求分析、概要设计、详细设计、

编码实现、系统测试

这样的五个步骤才能完成

如果我真是开发工业强度的程序

没有这些流程

程序的开发实际上是非常非常困难的

软件工程第一个步骤就是要需求分析

要确定软件需要解决什么问题

在这里面起决定因素的实际上是人

软件开发人员需要和用户

进行深入交流

确定整个程序的输入和输出

以及其它附加信息

从设计程序这个角度上来讲

不要轻视任何问题

因为哪怕是最简单的一个问题

用计算机语言来实现它的时候

其实都是非常非常复杂的

有了需求分析以后

实际上就明确了这个程序要解决什么

要输出什么

然后才能够提供我们的方案

从方案设计这个角度来讲

分成两个部分

一个是概要设计 一个是详细设计

概要设计就是给出

整个程序设计的整体方案

形成高层模块的划分

有了概要设计 有了总体方案

那么就可以向总体方案中填充细节

包括每一个模块的输入、输出和算法

都要在概要设计里面完成

有了概要设计之后

其实已经明确了程序中

要设计什么样的函数

设计什么样的模块

如果具体到某一个特定的函数的话

那么每一个函数输入是什么

输出是什么 算法是什么

所有的信息理论上都应该完成

有了它就可以很容易地编写程序代码

程序全部编写完成之后

不能现在就交付 必须要测试

你得保证程序的健壮性、稳定性

和正确性

所有的工作都要通过系统测试来完成

画一个图 从需求分析阶段开始

接下来是方案设计阶段、

编码实现阶段、系统测试阶段

流程一步一步的来

走到方案设计阶段的时候

有可能出现这样的情况

发现方案设定不清晰

原因不是方案没设计好

而是需求分析没做好

这个时候可能就要回过头来

重新去做需求分析

或者补充一些需求

还有一种情况

到了编码阶段发现方案没做好

重新来修改方案也有可能

到方案修改过程中

又发现需求分析分析不好

又要回去重新做需求分析

有没有可能 还是有可能的

所以你看 整个软件开发流程

需求分析、方案设计、编码实现

最后是系统测试

每一个过程都有可能会产生一种反馈

修改原来的设计 原来的分析

原来的实现

形成一个螺旋式的开发流程

这种情况就是最常见的软件开发过程

通过具体的例子向同学们展示

我们怎么从需求分析、方案设计

到编码实现和系统测试

这个程序叫我猜!我猜!我猜猜猜!

题目很简单

编程实现一个简单的猜测价格的游戏

假设我有一件东西

我已知道它的最高价格和最低的价格

然后让游戏参与者就在这个范围内猜

它的实际价格是什么

当然你有一个猜测次数的限制

要写程序来模拟这个过程

先从需求分析开始

我们就要和提出任务那一方进行讨论

别人让你写程序

都会给你提供一系列需求

比如讲游戏运行前

首先应该向游戏参与者

介绍这个游戏的功能

这个叫需求A 然后是需求B

首期这个工程不需要解决游戏难度问题

希望游戏尽快能够跑起来

然后他会说 如果有一个需求C

在每一个游戏回合结束的时候

最后那个玩家啊 你得让它选

继续玩下一局还是不玩了

如果用户说我不玩了 游戏应该结束

如果用户说我继续玩

那么就应该继续玩下去

然后是需求D

要记录游戏参与者的信息

记录这个玩家玩了几个回合

赢了几个回合

我要能够统计这个信息

最后在用户退出游戏的时候

输出胜率是多少

给他一个明确的结论信息

做这个需求分析的时候你就会发现

一开始跟他了解

整个程序需求的时候

跟你说了需求A、B、C、D、E

五个需求

这里边有很多地方都没有明确

什么叫最简单情形啊

说“我这个程序一开始不用考虑难度

你给我做简单一点”

这个程序能写吗 不能写的

你要和用户再次沟通 要明确这个东西

我们的物品最低价100块 最高价200块

用户最多只能猜6次

物品实际价格在100块钱到200块钱之间

随机生成一个

如果游戏者猜想的价格

比实际价格高了

你就提示他 价格高了

如果用户猜测价格

比它的实际价格又低了

你就提示他低了

这样的话最后玩家要能够有的放矢

修改他的价格

这就是细化出来的四个需求

想到这个地方啊

你的用户就可能一拍脑门

“哎呦 刚才忘了说 有个新的需求

你得给我弄一个

游戏初始化这样一个动作

程序必须过去留一个

调整游戏难度的接口”

这就是我们的需求分析

现在要做方案设计了

首先来做概要设计

响应需求A、E、F

将游戏分成四个模块

一个游戏的欢迎信息显示模块

一个游戏的初始化模块

一个游戏模块

还有一个游戏的结束模块

然后就可以设定整个程序的主框架

程序有“main.cpp”

还有程序主体的文件

“guess.h”和“guess.cpp”

另外还需要刚才使用到随机数库zyrandom

我们可以将每一个模块都抽取出来

形成单独的函数

有一个PrintWelcomeInfo

一个InitializeGane 一个PlayGame

还有一个PrintGameOverInfo

总共四个函数 前三个函数都没参数

返回值两个void 一个是double

最后一个函数

要带一个胜率的浮点数

返回值是个void

写到新的文件里

然后把文件命名为“guess.h”

这个头文件就算写完了

有了这个头文件

就可以写“main.cpp”了

主程序就包含这个头文件就行了

主函数里边

要做的就是这么几件事情

第一个要定义胜率的浮点数

然后打印欢迎信息

初始化这个游戏

然后开始玩这个游戏

结果就把它的胜率赋值到prevailed_ratio

这个变量里边

然后PrintGameOverInfo结束

这个就是“main.cpp”

就这道题来说“guess.h”、“main.cpp”

这两个文件其实就写完了

因为有了概要设计其实就已经决定了

程序的主体框架是什么

响应需求

比如讲这个游戏怎么玩

搞一个无限的循环 弄一个哨兵

一个回合结束就问用户“你还玩不玩”

他说“我不玩了” 退出游戏模块

这是一个基本的响应需求C的动作

响应具体需求细节 比如说B2

每一个回合物品的实际价格

是随机生成的

100到200之间

因为价格是随机生成的

那就意味着在生成第一个随机数值前

必须有一个初始化的动作

那么 初始化的动作在哪里做

理论上来讲 不应该把它放在PlayGame

玩游戏的模块里边做

你应该把它放在InitializeGame

初始化游戏的模块里

但是你发现一个非常重要的地方

是什么呢

实际上这个游戏要玩很多个回合

每一个回合都要对游戏

进行明确的初始化

每一个回合再弄一个

初始化回合的函数

把生成随机的物品价格的函数

放到InitializeBout函数里

返回值就是给你随机生成物品的

实际价格

这是一个好方案

接下来响应需求D

我要统计获胜的回合数

和全部的回合数

然后我好用它来算胜率

所以这个简单 定义两个量就完事了

玩游戏分成好多个回合

每一个游戏回合也把它抽象成函数

称它为PlayBout

再抽取出一个函数Again

我就问你 要不要再玩

Again这个函数的返回值就是bool量

这一点倒和PlayBout那个函数是一样的

为什么Again要返回bool量呢

这是要问用户还要不要继续玩

他说“我还要玩”那返回值就是true

如果“我不玩了” 返回值就是false

回到PlayBout

为什么返回值是bool量

游戏这一回合都做完了

猜对了返回true 否则返回false

这个就是标准的PlayBout和Again

接下来响应需求B1和B3

完成标准的数据初始化工作

就是它的最低价、最高价

他猜测的次数

我们把它定义成常量

放在我们的代码里

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP0506笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。