当前课程知识点:C语言程序设计(上) > 从问题到C语言程序设计 > 1.1 计算机的问题求解方法 > 1.1.3-2关于算法——算法的表示
通常来说
算法的描述方法有这么六种
自然语言的方法
我们刚才说的几乎就是自然语言的方法
如果怎么样否则怎么样
还有程序语言
那就是得拿程序说事了
直接拿计算机语言
和计算机去对话
还有一种我们刚才画了一个一圈二圈
那好像又是自然语言
好像又搁上了一个if
又写成否则
看上去这像什么呢
我们把这种描述方法
又有自然语言又好像有代码
但是这种东西计算机又没法执行
但是人写起来又比较方便
叫伪代码
伪代码的方式计算机是
不能执行的
人交流起来
也还是会有一定的困难
他的困难不在于人写的不方便
他的困难是在于说
你表达的不过准确
比如说我们刚才上边
把算法描述了两次
这两次里边都有不准确的成分
大家下去仔细看一下
都有 不太尽人意的地方
那么 通常
描述算法用什么方法呢
有两种 一种叫流程图
一种叫N-S图
这两个的区别是什么呢
流程图是一种传统的方法
大家比较喜欢用的方法
因为他有明确的一个
流程的一个指引
那N-S图是什么呢
是结构化程序设计里边
提倡用的一种方法
那我们在前边
出现过的流程
基本上都是用流程图的
就是传统流程图的方法
这两者差什么呢
我们后边会讨论
现在我们先看什么是流程图
我们在咱们的课程里边
后边多数要用到是流程图
那N-S图看上去说
结构化程序设计需要的方法
很重要
这是一个工程化的
比较规范的比较标准的方法
但是 对大家是
初次学习程序设计的话
流程图 还是一个比较好的描述的方式
流程图有这么七种符号
很简单 他们分别表达的是
在接下来
这个东西是一个注释
你有什么要对自己说的
要对其他 可以做交流的
那个同行说的
你就在这个符号里边
去写你的注视
计算机是不去识别这个的
在接下来是 最重要的
流程线 四个方向都能去
无所不能去
所以呢 这就是我们说的
N-S图 就是要把他取缔了
是因为他太方便哪都能去
他会构成了
程序结构的不良好
在下面那个小圆圈
是一个连接线
因为我们不管是纸也罢
还是你的计算机屏幕
你要表达这个流程的时候
有时会不够 流程很长
我们用这个小圆圈
把他两个接上
比如我这个圆圈边写个一
在那张纸上那个圆圈里也写个一
这两个必然是接在一起的
咱还拿
两个任意数交换的这个问题
来 说例子
我们说任何程序
都有 我把他叫三部曲
都有三部曲这三部曲
什么呢
我们在这个算法的五个特征里边说
输入可以有可以没有
是的 但是大多数情况下还是有的
但是输出是绝对不能没有的
那输入 处理 输出
通常来说是程序必须有的三个部分
我们还拿这两个数
交换的这个流程来说
我们来看这个流程是不是这样
输入 然后粉颜色表达的是 处理
就是 我们这里边要做的交换
接下来是输出
那我们要把这个在细化一步呢
给它加上
任何流程必须有一个明确地开始
明确地结束
这是表达算法必须要的
有穷 就必须有结束
再下来我们再把它细化
处理呢 没这么简单
尤其是
我们对复杂问题处理是一个
比较麻烦的比较重要的过程
所有的对问题的求解
是在处理这一块完成的
好了 那我们就
两任意数交换这件事情
他的处理有三部
我们把他细化成这三个步骤
那好了我们把
两个任意数交换的流程
用这么完整的一个形式表达出来
大家是不是看到了
从开始 到 给计算机提供a b两个数
然后这两个数的交换
分三步完成
最后把他交换完了的数据输出
算法结束
那我们看用这个流程图来表达算法
是不是他最明显的一个优势是
直观
非常的直观大家交流也方便
这时候我们跟语言没有关系
我们只是表达了
解决这个问题
什么问题呢
任意两数交换的这么一个算法
那这个结构
任意两数交换的这个流程
是一个顺序结构
什么叫顺序结构
陈开始到结束
顺序执行
没有任何第二条路线可以走
也就说流程是从上往下
一步一步的在执行
我们还拿前面所说过的
计算函数的这个问题来说
它是不是也是一个顺序结构呢
我们来看一下 从大的方面来说
我们看
123456这是我们原来描述的那个算法
也是用自然语言描述的这个算法的过程
我们现在用流程图描述是不是可以这样说
开始
然后输入
你给计算机输入四个你要的数计算机需要的数
然后你就来做判断并计算
最后把结果输出结束
这里什么东西不明确呢
判断并计算
计算机没有得到确切的是怎么做
我们把它细化一下就是这么一个过程
怎么判断呢
x和a去做比较
x要小于等于a
我们做yes 这个处理
否则我们做另一处理
但是无论做了哪一个处理
流程都接着往下走
输出得到的M的值
最后流程结束
这个结构是顺序的吗
大家看 总体看
从开始到结束一定是顺序的
这是程序必须是顺序的
但是这个过程里边
有一个什么结构呢
选择结构
所以这个程序我们把他叫做
选择结构的一个流程
我们还看第三个问题
刚才我们说到的三个任意数排序的那个问题
我们纠结了那么半天 if了那么多
如果把这个问题在简化到
从开始到结束你给输入
你要排序的这三个原始的数据
计算机在粉颜色的这个筐里做什么呢
判断并排序
然后把你排好序的东西输出
流程结束 一样的
这里边我们在细化一步
细化什么呢粉颜色这个框
我们刚才的判断是不是这样
a大于b 是这样判断的
如果是的
我们做yes的这个框
否则我们做no这个框
好了 这样流程能执行了吗
大家看肯定还是不能执行
我们需要再进一步的细化
再细化谁呢
细化yes no这两个框
我们先看a大于b的情况
如果a大于b 我们刚才说了我们需要决断
有三个 步骤
需要决定c在哪里
c可能在哪里呢
第一个位置
中间位置
最后一个位置
所以我们还需要两次判断
三个结果两次判断
我们这里边给的是c大于a吗
yes 那定下来了
cab否侧我们还需要再做一次判断
c大于b吗
如果是acb否侧abc
这是说a大于b的情况
a不大于b的情况我们把它细化下来
跟刚才的道理是一样的
也是要决定c在哪里
c可能在第一个 中间 最后
无论现在是什么样的一个排列
得到了六种组合
这六种组合最后都要从一个出口出来
我们让这个流程
再细化在这里边 大家看
这个判断和输出合在一起拉
是因为判断结束得到结果它就可以直接输出
所以这个处理里包括了判断和输出
这个结构是个什么结构呢
总体上看是不是也是一个
从开始到结束
从输入数据到做后的输出
从选择结构上来说呢
我们刚才用到了N多个选择结构
刚才看到这个图
平常大家学程序设计的时候
的确有这么一个问题
我们宁肯直接拿程序写
都不愿意画这个图 觉得太罗嗦
可是呢
这个话流程图和直接写程序
打个比方它相当于什么呢
相当于盖房子
是直接拿砖头直接盖呢
还是先设计图纸
然后把图纸交给施工队去干
只是我们在程序设计这一块
有点不同
我们即是设计图纸的
也是施工队
我们既要设计这个算法流程
并且要表达这个流程
然后在这个过程里我们可以展开讨论
展开合作
把一个大的复杂的事情
我们可以分解
分工合作
最终再去完成程序的实现
所以在程序实现之前
这个设计算法以及正确的表达算法
这是我们必须做的一件事
无论喜欢还是不喜欢
对复杂问题不可能拿上代码就去写程序
即便是这样写出来的程序
也会让自己无从下手
怎么去修改怎么跟别人去讨论
所以正确的表达你的算法
流程图或者NS图
都是比较好的表达工具
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html