当前课程知识点:C语言程序设计(上) > 选择结构的程序设计 > 3.2 路径中的再选择——嵌套判断 > 3.2.1_2三个数排序1029
我们讨论了abc三个数据的交换
大家看见它
前面我们讨论过 它判断了5次
有6组输出
就是6个printf被调用
那我们能不能做一个优化呢
这个流程图是给了一组形式的优化
那么这个优化的总体思路是什么样呢
那么我们知道输入的abc是无序的
如果我们现在要把它从大到小排出序的话
前边的思路是说
谁大我们把谁放在前边
比如说b大我们把b放在前边
而现在我们的思路是说
无论你abc里边谁大
我把最大的放到a里边
次大的放到b里边 最小的放到c里边
所以 输出就变成了
一个函数调用 abc
所以输入的是abc 输出的还是abc
那么经过了什么呢
经过了在这个过程中的
大小的一个交换
使它排的有序
那这样的话
我们的判断就剩下两个if来完成了
我第一个判断 a小于b吗
如果是这样 a与b进行交换
使得保证a一定是大于b的
那好了 这就很简单
这个交换完了以后
a和b构成了有序ab这样的顺序
那接下来 关心的一个问题
那b比c小吗
也就是说 c是在最后
我要确定c是在最后
还是在第二个的位置
如果b小于c
那就把b与c再交换
那如果不是 那就说明了
ab这个序已经排出来了 c又比b小
这个已经构成了输出abc
如果b小于c的话
交换完了这个序确定了吗 没有啊
a与新的这个b再作比较
a小于新的这个被交换过来的这个b吗
如果是的 那就说
目前的a不是最大的 是要跟b再交换
否则 已经构成了新的abc
这次交换完了以后
这条线上 它已经是新的abc
我们看一下这个 在这个流程里边
我们是用交换来解决的问题
每一个交换这里边
实际上构成了不是一个双选择
都是一个单选泽
if做了一次判断 交换吗
交换还是继续往下走
那在这块 蓝颜色标识的这块
也是一样 b小于c吗
如果是的 要进行交换
a再小于新的b吗
如果是的 再进行下一次的交换
也就说蓝颜色标识出来的这个块
是一个大的if块
那对b小于c这个判断来说
这个if块 是一个块
否则else这块 并没有做什么
是顺序往下走的
所以只有两个单选泽的if
好了我们看这个程序是不是这样
按照我们对等过来
这是粉颜色的a小于b吗
如果是的 进行交换
交换完了 到哪去了呢
交换完了 这件事情
到下边的顺序结构的下一个if
那这if里边有一个红颜色的块
你要进行交换吗 还是不交换
如果b不小于c
那就不需要交换了 我们就直接输出
我们看输出printf只有一个
大家看到这个程序 比我们前边的
5次选择的那个就优化了很多
程序就变得简单
那我们运行一下这个程序看一下
这是我们原来没有优化的这个程序
我们应该怎么做修改呢
看是不是应该这样
我们在这块 整个这块的东西就不需要了
不是说a大于b吗
是因为if块里边是需要交换的
换个号 说我假定你a大
a小于b吗 如果是的我们要交换
怎么交换呢 咱们前边知道
交换是需要借助一个中间变量的
比如说我们先把a里边的东西放到t里边
那这样 前边我们是不是要做一个工作
预订一个t 然后这是一个临时变量
下边再做什么呢
把b送到a里边
那下面再做什么呢
把t送回到b里边
这件事情完成了 花括弧在这
那我们下边这个if
是一个顺序结构的 if
那这块应该判断的是 b和c的关系
b小于c吗 按照我们刚才说的
要确定c的位置
那在这里边应该是一个
这个printf也是不要了我们反正只要最后的
所有判断完了 无论是第一个到了下边
还是就是无论是这个过程里
哪个到了下边我们只有一个输出
所以它放在最后的花括弧的外边
那在这里边 我们判断c的
c和b比较的时候
那这里边也是一样 需要一个交换
这时候是 一定是 b和c进行交换的
就说b比c小的话
同样我们借助这个中间变量把它搁在这
然后呢 先把b放进去
然后呢 再把c再放到b里边
然后呢再把c里边 把刚才的t放回来
如果b小于c做了这样的交换
交换完了 现在我们刚才说的有问题呀
新的b产生了 它和a之间需要再一次的判断
那么它和a之间的再一次的判断
跟这个句子是差不多的
我们把它复制下来 先把后边的这个删掉
那这里边判断的是谁呢
是a和b
同样做的是a和b的判断
因为现在有了新的b
那么这时候 我交换的是什么呢
也是借助了t做a与b的交换
和这个句子是一样的
如果咱现在想要的是从大到小
那我们现在要看的是abc了
我给三个数
那现在呢这块都是一个单选泽的结构
而且 去掉了三个判断
只增加了这种赋值的这种交换
就会看上去又简洁
实际上程序的运行效率也提高了很多
-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