当前课程知识点:基于Linux的C++ >  第四讲 算法 >  4.3 算法描述 >  LinuxCPP0403

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

LinuxCPP0403在线视频

LinuxCPP0403

下一节:LinuxCPP0404

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

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

那么在设计一个算法的时候

怎么描述这个算法

那你说我就写程序呗

可不是这样

如果一个算法没有想清楚 就去写程序

写出来的代码质量基本上是不高的

更有可能的是你压根就写不出来

也就是说这个问题必须在头脑中

就已经完全明确了应该如何去实现

如果不明确

那么这个算法就很难去真正编程

算法描述有很多种方案

其中最常用的为伪代码和流程图

伪代码就是一种混合自然语言

和计算机语言和数学语言的方式

描述算法的过程和步骤

第一步做什么 第二步做什么

总之 你怎么方便怎么来

自然语言也行 计算机语言也行

数学语言也行 混着来也行

你把这个事情讲清楚了

写出来它 这就叫伪代码

优点是什么呢 优点是方便

很容易能够表达设计的意图

能够清晰地描述算法的流程

而且也很容易修改

写的不对划掉重新换张纸再写

缺点在哪里 缺点就是不太美观

因为你一会儿是自然语言

一会儿是计算机语言

一会儿又是数学语言

或者全是自然语言 全是数学语言

全是计算机语言都有可能

你这么写在一起会不美观

别人看的话复杂的算法

就不太容易理解

这是伪代码

第二种方案就是流程图

俗称程序框图

它会有一些特殊的符号

用它来表示算法的执行过程

它优点在哪里呢 优点就是美观

算法表达是非常非常清晰的

缺点就是绘图

本来是为了要美观的

图如果直线画得歪歪扭扭的

它就看起来很丑了

反而还不如写伪代码了

所以它绘制很复杂 不容易修改

要真绘错了怎么办呢

你怎么擦啊 你要重绘

这么复杂的一个算法

那么多个框图 那么多个线

重新绘一遍要耗费大量时间的

所以实际上效率就不高

而且它占用的篇幅很大

有的复杂算法 一张A4的纸

那才210乘上297毫米

很小的一张纸

你要绘这个算法能绘完吗

简单的算法也许成

复杂的算法压根就绘制不完

那我怎么办呢 我换成A3的纸

比它大一倍 成吗 不成

到最后换成A0的纸成吗

好大的一张纸 一米多宽 还是不成

有的复杂算法

我告诉你需要多大的纸呢

需要一张足球场那么大的纸

才能把这个算法绘制完

我怎么去绘它

万一绘错了怎么去修改它

得多大的工作量

所以这种情况

绘制算法流程图的时候

往往都是我们算法都设计完了

最终形成设计文档给别人看的时候

这样绘制觉得漂亮

给别人看 印象深刻

平时写程序的时候

往往使用的都是伪代码

那么在程序里面

伪代码表示的方式非常自由

觉得哪一种方案你比较习惯

你就按照什么方案来表达

比如 顺序结构

如果你能够分解出任务一、任务二

或者任务A、任务B

第一步做什么 第二步做什么

你把它描述清楚就OK了

如果你知道它是个分支结构

或者说你想明确分支结构

所有条件和分支要做什么

那你就可以写if条件表达式

如果是个switch

那就按照switch这种格式写

如果你不是特别了解

当时还没有这么详细

那么你不写它其实也可以

循环结构也一样

如果你知道就描述出来

如果你不知道

或者说不想描述那么清晰

只是描述一个大概

那么不这么写也行

就是用一个自然语言 数学语言

计算机语言 你混合着描写

只要你把这个算法说清楚就行了

至于它是主体框架清晰

还是细节全部清晰 由你

总之你会在此基础上不断地去扩展它

直到它最终完全清晰

可以编写程序就够了

也就是说 书写的过程是自由的

接下来就是流程图

流程图呢 它是有一些固定的符号的

就这么8个符号

常用的是三个

一个是方框 我们称它为处理框

然后是一个条件判断

是一个菱形框 还有一个流程线

这是三个最重要的流程图的记号

像准备、终止、预定义处理、

数据输入输出 这四个呢

严格讲起来必须有

但是真的没有也成

还有一个地方 就那个小圈圈

虽然我们画流程图的时候

可能很少用到

但是真要用到的时候

同学们一定要记住它是个连接符

就是一张纸绘不完我们的流程图怎么办呢

那我们就要分成两张纸

那这两张纸的流程

从哪个地方拼接起来

连接符就干的这个事情

它要完成流程的拼接

我们的幻方流程图

就可以按照这个方式去画

内容里面写的东西并不是特别严谨

我用汉字写的

从开始然后第一步做什么

接下来做什么

你看它的流程 如果这个条件判断

右肩格是不是超出了范围

如果是 就要平移

如果不是我就直接朝那边写了

那么这个过程会出来一个

是和否的一个分支结构

是和否 或者true和false

或者t或f 随便你

反正你要写在那个流程线上

知道这个方式就行了

按照这个方式去绘制流程图

这是幻方

如果是第二个例子

那就是查字典的

这个图其实比刚才还复杂

如果是竖着排的话我排不完

那怎么办呢 我就把它分割成了两半

分割成两半以后

我就要用连接符把它连接起来

因为它不是两个框图

它实际上是一个框图

要从这个地方出来一个否分支的时候

进入一个小圆圈

里面写了一个记号1

这边就从这个1进来

这就意味着这两个流程图

通过1号连接符 连接成了一个

如果你的图很复杂 有很多个连接符

那就是1号连接符、

2号连接符、3号连接符

里边的数字随便你写

只要你知道

它是能从什么地方连接到什么地方

基于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文件

LinuxCPP0403笔记与讨论

也许你还感兴趣的课程:

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