当前课程知识点:C语言程序设计(上) > 从问题到C语言程序设计 > 1.1 计算机的问题求解方法 > 1.1.3-1关于算法-算法的特征
接下来
我们讨论关于算法
什么是算法
算法的特性是什么呢
算法怎么表示呢
这是我们是讨论的问题
下面咱们用一个简单的
加法 来说明什么是算法
我们看
对于这个加法问题输入了两个参数
通过这个算法
来求解问题得到的一个结果
这就是算法
对算法我们可以总结成
我们对两个数相加的算法
可以这样描述
这里边强调了步骤
这个问题很简单
当然不是所有问题都这么简单
有些问题本身有它的复杂性
有些是实际生活里的问题
无论这两个哪一个
我们都要需要做一个工作
对实际问题抽象
和形式化的表达
或者是说复杂问题的话
我们需要对它分解
所以我们对一般的问题来说需要有三部分工作
第一部分 对这个问题分析
其次有是从实际问题里边
把这个问题抽象出来
然后给它建模
这是必须的
我们用一个例子
也是用一个非常简单的例子
再来说明抽象是什么
建模又是什么
我们看这有两杯水
如果我现在要这样做
我把这两杯果汁喝可乐
去交换它
我不能直接这样倒
我需要怎么做呢
我需要拿起
另一个 中间的空杯子
然后呢
把果汁倒进去
然后我的下一个步骤
要做到是
我把 可乐 倒进来
最终我要做的一件事情是
我把果汁倒过来
大家看见了
这两个 两杯水
实现了交换
这个交换的过程几个步骤呢
大家看见刚才的过程
是在做了
两杯水的交换
也就是说
我们这样描述问题计算机就听不懂的
我们需要把这个实际问题
抽象出来
抽象成一般的问题
一般的 把两杯水交换
抽象成一般的两数交换的问题
我们把这三个瓶子A B C来表达
这样两个数交换的算法
就可以表达成说
把A里的数送到C里边
再把B里的数送到A里边
然后把C再送回到B里面
交换结束
这就是一个
两数交换的算法的描述过程
关于算法的特征
我们再来看第二个例子
我们看这个数学式子
它分别执行了两个不同的运算
我们把这个问题
用一个算法来表示的话
应该是下边这六个步骤
这个过程
我们可以看到
在这个算法的描述过程里边
有几件事情大家看一下
在我们写数学式子的时候
a括号c减x括号
这个大家一看就非常明确
a和这个括号的关系是相乘的关系
但是
我们要在算法里边描述这件事情的时候
要非常确切的对于它
是什么样的一个也是关系
所以对算法的基本特征
有这么五点
什么样的会有二义性呢
很多表达里边含有二义性的
我可以理解 但是计算机就不可以理解了
还有一个有效性
什么东西无效
比如说
被零除这件事情 是一个无效的操作
如果有这样的事情发生
在算法里边是不可以的
输入和输出
输出是必须的
输入和输出是提供了
计算机和人相互交流的一种方式
如果计算机做完一件事情只藏在它里边
没有输出
这个算法是没有意义的
至于输入
是可以没有
有些问题
它是可以不提供收入
计算机也能完成一件工作
这种事情是比较少的
通常情况下是有输入和输出的
算法的基本特征
这五个特征在我们的算法里都是要遵守的
接下来我们讨论的问题是
我们经常会有困惑
计算机是智能的
它应该比人更聪明
但是 这里要强调的是
计算机的思维其实是人的思维
就按照计算机的工作原理
和它所能够提供的能力
所以算法就人的思维不是计算机的思维
我们下面拿一个例子
来说明 人和计算机
在做同样一件事情的时候
人站在计算机的角度上
需要考虑一些什么问题
我们拿三个套娃的一个排序
说明人为计算机
做了一个什么样的安排
大家看这有三个套娃
我现在是要给他按大小排序
大的在这边 小的在这边
大家看 人做这件事很简单
交换可以了 序排好了
可计算机做这件事就不这样
计算机是拿数据说话
它会比较这两个
那个谁大啊 一定会在问一次
问一次还不能定下来
你两个那个大啊
比如说它大 好了
它大
他到底是放在哪个位置呢
是放在这个位置
还是这个位置
还是这个位置
那要取决于什么呢
他两个相比完了以后
还要与它相比
所以在这一点上
计算机就是不做到什么呢
眼观六路耳听八方
也不能做到 察言观色
所以人平常做事情的决策
是这些东西都能辅助自己做决策
而计算机不能
这就是
算法不能有二义性
必须确定的表达
我们把她娃这件事
不说了 咱说任意的三个数
如果要排序的话计算机怎么做呢
我们再把刚才说的套娃这件事情
把它抽象成三个任意数的排序
我们这三个数就分别用A B C来表达
刚才的一个判断
或者说刚才的一个算法
就可以是这样描述
我们现在用了三个如果
然后得到了一个什么样的结论呢
得到了三种排列
但是大家看到没有我们仅仅是考虑了
那A要不大于B呢
比如说
我们把三个任意数排序的问题的算法
要想描述出来
或者说想用以前的描述方法描述还比较困难
我们试着做一下
我们看中间有两个环节
执行都比较困难
判断并排序
这个没有明确表达
计算机并不知道你要做什么
第二个
输出排好序的三个有序数
可是三个有序数有六种组合
到底要输出哪一种组合呢
计算机也没有得到一个确切的明确的指示
所以这样表达算法还是有一点困难的
如果把刚才的算法在细化一步的话
实际上我们判断和输出是连在一起的
我们就把二和三连在一起
就是说判断并排序这件事情
我们分成四步
这是A大于B这条线
如果A不大于B呢 还有
大家现在听下来是不是比较困难
我们现在在这个包括这里的表达式说
A大于B并且C大于A这种
并且的这种运算这里并且的在前边也用了好几次
可能仅仅是因为我们的表达方式的问题
算法的描述问题
是程序设计里面的非常重要的一个方面
我们下一个问题来讨论
算法的表示方法
-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