当前课程知识点:基于Linux的C++ > 第四讲 算法 > 4.3 算法描述 > LinuxCPP0403
那么在设计一个算法的时候
怎么描述这个算法
那你说我就写程序呗
可不是这样
如果一个算法没有想清楚 就去写程序
写出来的代码质量基本上是不高的
更有可能的是你压根就写不出来
也就是说这个问题必须在头脑中
就已经完全明确了应该如何去实现
如果不明确
那么这个算法就很难去真正编程
算法描述有很多种方案
其中最常用的为伪代码和流程图
伪代码就是一种混合自然语言
和计算机语言和数学语言的方式
描述算法的过程和步骤
第一步做什么 第二步做什么
总之 你怎么方便怎么来
自然语言也行 计算机语言也行
数学语言也行 混着来也行
你把这个事情讲清楚了
写出来它 这就叫伪代码
优点是什么呢 优点是方便
很容易能够表达设计的意图
能够清晰地描述算法的流程
而且也很容易修改
写的不对划掉重新换张纸再写
缺点在哪里 缺点就是不太美观
因为你一会儿是自然语言
一会儿是计算机语言
一会儿又是数学语言
或者全是自然语言 全是数学语言
全是计算机语言都有可能
你这么写在一起会不美观
别人看的话复杂的算法
就不太容易理解
这是伪代码
第二种方案就是流程图
俗称程序框图
它会有一些特殊的符号
用它来表示算法的执行过程
它优点在哪里呢 优点就是美观
算法表达是非常非常清晰的
缺点就是绘图
本来是为了要美观的
图如果直线画得歪歪扭扭的
它就看起来很丑了
反而还不如写伪代码了
所以它绘制很复杂 不容易修改
要真绘错了怎么办呢
你怎么擦啊 你要重绘
这么复杂的一个算法
那么多个框图 那么多个线
重新绘一遍要耗费大量时间的
所以实际上效率就不高
而且它占用的篇幅很大
有的复杂算法 一张A4的纸
那才210乘上297毫米
很小的一张纸
你要绘这个算法能绘完吗
简单的算法也许成
复杂的算法压根就绘制不完
那我怎么办呢 我换成A3的纸
比它大一倍 成吗 不成
到最后换成A0的纸成吗
好大的一张纸 一米多宽 还是不成
有的复杂算法
我告诉你需要多大的纸呢
需要一张足球场那么大的纸
才能把这个算法绘制完
我怎么去绘它
万一绘错了怎么去修改它
得多大的工作量
所以这种情况
绘制算法流程图的时候
往往都是我们算法都设计完了
最终形成设计文档给别人看的时候
这样绘制觉得漂亮
给别人看 印象深刻
平时写程序的时候
往往使用的都是伪代码
那么在程序里面
伪代码表示的方式非常自由
觉得哪一种方案你比较习惯
你就按照什么方案来表达
比如 顺序结构
如果你能够分解出任务一、任务二
或者任务A、任务B
第一步做什么 第二步做什么
你把它描述清楚就OK了
如果你知道它是个分支结构
或者说你想明确分支结构
所有条件和分支要做什么
那你就可以写if条件表达式
如果是个switch
那就按照switch这种格式写
如果你不是特别了解
当时还没有这么详细
那么你不写它其实也可以
循环结构也一样
如果你知道就描述出来
如果你不知道
或者说不想描述那么清晰
只是描述一个大概
那么不这么写也行
就是用一个自然语言 数学语言
计算机语言 你混合着描写
只要你把这个算法说清楚就行了
至于它是主体框架清晰
还是细节全部清晰 由你
总之你会在此基础上不断地去扩展它
直到它最终完全清晰
可以编写程序就够了
也就是说 书写的过程是自由的
接下来就是流程图
流程图呢 它是有一些固定的符号的
就这么8个符号
常用的是三个
一个是方框 我们称它为处理框
然后是一个条件判断
是一个菱形框 还有一个流程线
这是三个最重要的流程图的记号
像准备、终止、预定义处理、
数据输入输出 这四个呢
严格讲起来必须有
但是真的没有也成
还有一个地方 就那个小圈圈
虽然我们画流程图的时候
可能很少用到
但是真要用到的时候
同学们一定要记住它是个连接符
就是一张纸绘不完我们的流程图怎么办呢
那我们就要分成两张纸
那这两张纸的流程
从哪个地方拼接起来
连接符就干的这个事情
它要完成流程的拼接
我们的幻方流程图
就可以按照这个方式去画
内容里面写的东西并不是特别严谨
我用汉字写的
从开始然后第一步做什么
接下来做什么
你看它的流程 如果这个条件判断
右肩格是不是超出了范围
如果是 就要平移
如果不是我就直接朝那边写了
那么这个过程会出来一个
是和否的一个分支结构
是和否 或者true和false
或者t或f 随便你
反正你要写在那个流程线上
知道这个方式就行了
按照这个方式去绘制流程图
这是幻方
如果是第二个例子
那就是查字典的
这个图其实比刚才还复杂
如果是竖着排的话我排不完
那怎么办呢 我就把它分割成了两半
分割成两半以后
我就要用连接符把它连接起来
因为它不是两个框图
它实际上是一个框图
要从这个地方出来一个否分支的时候
进入一个小圆圈
里面写了一个记号1
这边就从这个1进来
这就意味着这两个流程图
通过1号连接符 连接成了一个
如果你的图很复杂 有很多个连接符
那就是1号连接符、
2号连接符、3号连接符
里边的数字随便你写
只要你知道
它是能从什么地方连接到什么地方
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口