当前课程知识点:C语言程序设计(上) >  从问题到C语言程序设计 >  1.1 计算机的问题求解方法 >  1.1.3-1关于算法-算法的特征

返回《C语言程序设计(上)》慕课在线视频课程列表

1.1.3-1关于算法-算法的特征在线视频

1.1.3-1关于算法-算法的特征

下一节:1.1.3-2关于算法——算法的表示

返回《C语言程序设计(上)》慕课在线视频列表

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这种

并且的这种运算这里并且的在前边也用了好几次

可能仅仅是因为我们的表达方式的问题

算法的描述问题

是程序设计里面的非常重要的一个方面

我们下一个问题来讨论

算法的表示方法

C语言程序设计(上)课程列表:

从问题到C语言程序设计

-1.1 计算机的问题求解方法

--1.1.1--程序设计面向的问题

--1.1.2--关于计算

--1.1.3-1关于算法-算法的特征

--1.1.3-2关于算法——算法的表示

--1.1.3-3关于算法——算法的优化

--1.1.4-1-程序设计方法

--1.1.4-2-程序设计方法

--讨论题:数学模型

-1.1 计算机的问题求解方法--作业

-1.2 C语言与C程序

--1.2.1-1-C概述

--1.2.1-2-C概述

--1.2.2-C初步

--讨论题:运算符

-1.3 C语言处理系统与程序调试运行

--1.3.1C程序如何调试运行

--1.3.2常用C语言处理系统

--1.3.3DEVC++的使用-v1

--1.3.4C语言概貌小程序

--例程

-1.4 程序中的人机交互

--1.4 printf用法

--1.4.2 scanf的用法

--例程

--作业讨论区

数据计算实现与顺序结构程序设计(一)

-2.1 算术运算的C程序实现

--2.1.1 第二章

--2.1.2 C语言算术表达式概念

--2.1.3 算术运算的实现

--2.1.4 整数相除

--2.1.5 输入格式造成的计算错误

--2.1.6 求余运算

--2.1.7 自增自减运算

--2.1.8 复合运算

--fangcheng.c

--fangcheng-1.c

--fangcheng-2.c

--fangcheng-3.c

--fangcheng-4.c

--算术混合运算.c

--讨论题:自增自减符

--讨论题:程序输出结果

--讨论题:程序运行结果

-2.1 算术运算的C程序实现--作业

-2.2 关系运算的C程序实现

--2.2.1 关系比较问题

--2.2.2 C语言关系表达式

--2.2.3关系运算优先级

--2.2.4 用关系运算做判断条件

--2.2.5 程序实例

--2.2.6 字符比较

--bukao.c

--pingshifen-1.c

--panduanzhengshu.c

--pingshifen-2.c

--字符比较.c

--讨论题:比较大小

--讨论题:程序的运行

-2.2 关系运算的C程序实现--作业

-第二周作业--作业

数据计算实现与顺序结构程序设计(二)

-2.3 逻辑运算的C程序实现

--2.3.1 逻辑运算问题~1

--2.3.2 逻辑运算表达式

--2.3.3 如何判断闰年

--2.3.4 逻辑运算优先级

--2.3.5 条件运算符

--计算结合性

--2.3.7 一个简单实例

--闰年.c

--自动购票问题.c

--讨论题:逻辑表达式

-2.3 逻辑运算的C程序实现--作业

-2.4 位运算的C程序实现

--2.4.1 什么是位运算

--2.4.2 位运算有哪些

--2.4.3 位运算怎么用

--讨论题:位运算

-2.5 几种很个别的运算

--2.5 几个很个别的运算

--讨论题

--讨论题

-2.5 几种很个别的运算--作业

-2.6 混合运算及数据类型转换

--2.6 混合运算及数据类型转换

--讨论题:数据类型

-2.7 顺序结构程序实例

--2.7.1 第一个程序:三角形

--Video

--三角形面积.c

--讨论题:工业产值

--讨论题:程序无效结果

-2.7 顺序结构程序实例--作业

选择结构的程序设计

-3.1 程序中的路径选择实现

--3.1.1_1 第三章

--3.1.1_2 神奇的if_else

--打印学生成绩.c

--一元二次方程.c

-3.1 程序中的路径选择实现--作业

-3.2 路径中的再选择——嵌套判断

--3.2.1_1 if语句的嵌套

--3.2.1_2三个数排序1029

--例程

--3.2.2 用户登录检查

--三个数排序_未优化.c

--三个数排序_优化.c

--讨论题:程序改错

-3.2 路径中的再选择——嵌套判断--作业

-3.3 复杂判断问题的C程序设计

--3.3 多级选择

--银行存款.c

--讨论题:多级选择

-3.4 多分支问题的C程序设计

--3.4.1 switch语句表达式

--3.4.2 加减乘除计算

--3.4.3 几类说明

--加减乘除运算.c

--讨论题:关于switch

-3.4 多分支问题的C程序设计--作业

-3.5 GOTO的适当使用

--3.5 GOTO的适当使用

-3.6 选择结构的程序实例

--3.6 程序展示

--计算第几天.c

--存款利息__switch实现.c

--讨论题:输出奇数

--讨论题:计算税金

-3.6 选择结构的程序实例--作业

-第四周作业--作业

循环结构的程序设计(一)

-4.1 需要重复执行的程序

--4.1.1----第四章~1

--4.1.2---while实现先判断后循环~1

--4.1.3----while循环的应用-录入速度~1

--求和.c

--打印学生成绩.c

--统计录入速度.c

--求平均数.c

-4.1 需要重复执行的程序--作业

-4.2 至少要执行一次的循环

--4.2.1至少要执行一次的循环

--4.2.2-do-while循环应用

--成绩录入_do while实现.c

--n的阶乘.c

--字符分类统计.c

--讨论题:关于while

-4.2 至少要执行一次的循环--作业

-4.3 已知循环次数用for语句

--4.3.1--用for语句控制循环次数

--4.3.2--循环的应用-求和

--求和问题.c

--斐波那契数列问题.c

--数列求和.c

--讨论题:循环语句的不同

--讨论题:循环语句

-4.3 已知循环次数用for语句--作业

-4.4 循环控制——简单循环应用

--4.4.1-循环的应用-找数-水仙花数

--4.4.2--循环的应用-求素数

--水仙花数.c

--讨论题:死循环

--讨论题:continue和break

--讨论题:猜数字

-循环结构的程序设计(一)--4.4 循环控制——简单循环应用

循环结构的程序设计(二)

-4.5 循环的嵌套

--4.5.1 循环的嵌套——九九乘法表

--4.5.2 循环的嵌套——打印三角形

--打印九九乘法表.c

--打印实心三角图案.c

--打印空心三角图案.c

--讨论题:程序运行

-4.5 循环的嵌套--作业

-4.6 break与continue

--4.6 循环中断与继续循环——break再讨论

--最大素数.c

--求正数个数及平均数.c

-4.6 break与continue--作业

-4.7 循环的综合应用

--4.7.1 数的排列组合问题

--4.7.2 循环综合应用——穷举算法

--4.7.3 循环综合应用——满足条件的数

--4.7.4 循环综合应用——求最后三位数

--4.7.5 循环综合应用——打印空心图案

--数的排列组合.c

--数的排列组合优化.c

--鸡兔同笼.c

--找满足条件的数.c

--输出14的13次方的最后三位数.c

--打印空心字符.c

--讨论题:打印图形

--讨论题:打印空心图形

--讨论题:计算闰年

-第六周作业

--虚拟实验:循环程序设计实验

-第六周作业--作业

数组(一)

-5.1 同类有序数据处理问题

--5.1.0 数组开篇

--5.1.1 同类有序数据存储问题

--讨论题:下标变量与下标

-5.2 一维数组的定义和引用

--5.2.1_1 数组的定义~1

--5.2.1_2 数组的初始化

--5.2.2 一维数组的输入输出

--5.2.3 一维数组的应用1--成绩排序(选择法)~2

--5.2.4 一维数组的应用2--Fibonacci数列

--数组定义.c

--数组初始化.c

--输出大于平均值的数.c

--反向输出.c

--选择法_成绩排序.c

--求斐波那契数列前n项.c

--讨论题:对称数

--讨论题:关于'\0'

-5.2 一维数组的定义和引用--作业

-5.3 一维字符串数组

--5.3 一维字符串数组11.24~1

--用函数测试字符串长度.c

--讨论题:编程

-5.4 字符串处理函数

--5.4 字符数组的输入与输出

--字符串反向.c

--字符串函数

--讨论题:程序如何运行

--讨论题:黑色星期五

数组(二)

-5.5 二维数组的定义与使用

--5.5 二维数组定义

--二维数组的定义与初始化.c

-5.6 二维数组的输入输出

--5.6 二维数组的输入与输出

--二位数组输出_矩阵输出.c

--讨论题:随机数据存储

-5.6 二维数组的输入输出--作业

-5.7 二维数组的应用‍

--5.7.1二维数组的应用-转置矩阵

--5.7.2 用一维数组方式引用二维数组元素

--转置矩阵.c

--找二维数组最大数.c

--讨论题:修改程序

--讨论题:关于随机数函数 rand()

-5.8 二维字符数组

--5.8 单词排序

--单词排序.c

--讨论题:回文字符串

-5.8 二维字符数组--作业

-5.9 数组综合应用

--5.9.1 应用1——学生成绩统计

--统计成绩.c

--5.9.2 应用2——删除重复字符

--删除串中的重复字符串

--5.9.3 应用3——统计字符

--5.9_4数组的应用4--矩阵相乘

--统计字符次数.c

--讨论题:洗牌

-本期课程结束语

--end

-第八周编程作业

--虚拟实验:冒泡排序算法程序设计实验

期末复习

-《C语言程序设计(上)》期末复习参考

--html

期末复习答案

-《C语言程序设计(上)》期末复习参考答案

--html

1.1.3-1关于算法-算法的特征笔记与讨论

也许你还感兴趣的课程:

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