Logo

郎哥编程

程序与算法

2018-06-20 12164

课程导言

【从本课开始,就要学习编程知识了。编程,顾名思义就是编写程序。学习之前,要先弄明白什么是程序?解决问题的步骤就是程序吗?算法和程序的关系是什么?本课将一一给出答案。通过本课的学习,你将了解到程序及算法的概念及其关系

一、什么是计算机程序?

程序是指完成某些事物的一种既定方式和过程,可以将程序看成是一系列动作的执行过程的描述。在百度百科中,计算机程序被定义为“一组指示计算机执行动作或做出判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。

在生活中,可以见到许多计算机程序实例。下面,我们看一个生活片段:

清晨六点十分,伴随着准时而优美的起床铃声,我迈出宿舍,走进了第一餐厅。餐厅里人很多,没有办法,我只买了两个包子做为我的早餐罢了。随着我的餐卡在打卡机上轻轻掠过,六毛钱便不翼而飞了。当我走到超市的时候,突然感觉只吃包子是不是太单调了,于是在超市里拿了一包早餐奶,但付钱的时候却发现超市的收银机坏掉了,没奈何,我只得忍痛把刚拿到手的早餐奶又放了回去,真郁闷!

在上面的生活片段中,我们能找出几处计算机程序为我们生活服务的痕迹来呢?

●  餐厅打卡机

●  超市收银机

前面关于计算机程序的定义提到了“计算机程序是一组执行动作或做出判断的指令并且运行于某种目标体系结构上”。定义有点晦涩难懂,但是只要我们结合实际运行的程序并稍微略加分析,就能够做到了然于心。

首先考察(餐厅打卡机)

餐厅打卡机一般采用了射频识别技术,“射频识别(RFID)是一种无线通信技术,可以通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或者光学接触。”②

打卡机利用射频识别技术将餐卡信息读取到打卡机,由打卡机的处理程序对读取的信息做进一步处理。打卡机中的处理程序就是计算机程序,它需要执行下述动作和指令完成一次打卡操作:

1)  接受输入的餐费金额

2)  读取卡内金额

3)  判断卡内金额是否大于餐费金额

4)  如果卡内金额小于餐费金额,给出余额不足提示

5)  如果卡内金额大于餐费金额,将卡内金额减去餐费金额后,回写到卡内

文字描述其动作或流程不够清晰或理解的话,我们可以用流程图来描述打卡机程序的执行动作或流程:

 

 

blob.png

图 1  餐厅打卡机程序流程图

采用流程图描述打卡机程序的执行动作,是不是更直观和清晰一些。

再来考察(超市收银机)

超市收银机的工作原理类似餐厅打卡机,也是采用射频识别技术读取商品条码,获取商品价格、名称等信息,并由收银机内置的计算机程序对商品价格等信息进行汇总处理,给出所购商品金额等信息。其处理流程要比餐厅打卡机复杂一些,它需要执行下述动作和指令完成一次收费操作:

1) 读取商品条码

2) 获取商品价格、名称等信息并显示到收银机屏幕上

3) 计算所扫商品总金额

4) 等待操作员按键

5) 操作员按下“商品”按键,继续读取商品条码

6) 操作员按下“等金额”或“找零”按键,钱柜自动开启

其流程图描述如下:

 

blob.png

 

图 2  超市收银机程序流程图

从餐厅打卡机和超市收银机的内置的程序可以看出,人们使用计算机,就是要利用计算机程序处理各种不同的问题,为了让计算机能够按照我们的意愿去工作,人们在设计计算机时,为计算机提供了一套指令,其中的每一种指令对应着计算机能执行的一个基本动作,为让计算机完成某项任务而编写的指令序列就称为计算机程序。

二、什么是程序算法?

我们知道,程序是用来解决问题的,是由多个步骤或过程组成的,这些步骤和过程就是解决问题的算法。

同学们都下过象棋吧,图3给出的是江湖迷局一书的一个残局棋谱,棋谱给出了每一步棋的走法,按照棋谱规定的步骤行棋,就能破解这个残局,棋谱给出的行棋规则就是算法。

 

0028.png

                                             图3  棋谱残局

去超市购物时,人们经常会对需要购买的同类商品做价格的比较,例如商品A、商品B、商品C在同样质量的情况下,人们会倾向于比较价格,优先购买价格便宜的商品,这个比较过程是在大脑进行的,比较的过程就是排序算法,从三个数中找出最小的数。

0029.png

图4 超市购买货物时进行价格比较

图3的棋谱残局需要走11手,就能破解残局,图4的价格排序也仅需要对3个数进行排序,在大脑比对一下数的大小就完成了。它们都是算法,算法有没有明确的概念和特征呢?

要想弄清楚算法的概念和特征。先看看算法能给人们的生活带来哪些帮助?前面的棋谱残局和价格比对是生活中的算法,可以帮助人们解决生活中的一些问题,让我们变成象棋高手,或者买到最实惠的商品。

如果让计算机执行算法,会给人们带来什么帮助呢?在学习方面,把解方程的步骤输入到计算机,可以帮助人们解方程;在工作方面,把英汉词库及检索算法输入到计算机,可以帮助人们自动进行英汉词语翻译;在生活方面,把游戏规则和算法输入到计算机,可以让人们娱乐等等。计算机有了算法,才有了大脑和灵魂,没有算法的计算机,只能是一台机器。

为了让计算机能够完成前面所说的任务,就需要事先对各类问题进行分析,确定解决问题的具体方法和步骤。再编制好一组让计算机执行的指令,交给计算机,让计算机按人们指定的步骤有效地工作。这些具体的方法和步骤,其实就是一个问题的算法。例如,让计算机帮助我们解方程,就需要把解方程的步骤和方程参数输入到计算机,计算机根据输入的步骤和参数完成方程的求解。

严格来说,计算机程序是为让计算机完成某项任务而编写的指令序列,指令序列就是解决问题的算法。

0030.png

图5 算法的概念

 

前面理解了算法的概念,再来看看算法有哪些特征。

算法是由有限多个步骤组成的,它有下述两个基本特征:第一个特征是每个步骤都明确地规定要执行何种操作;第二个特征是每个步骤都可以被人或机器在有限的时间内完成。算法除了上述两个基本特征外,还要具有第三个基本特征:虽然有些步骤可能被反复执行多次,但是在执行有限多次之后,就一定能够得到问题的解答。

0031.png

 

图6 算法的特征

算法比较抽象,下面讲解一个实际的算法案例,让同学们对算法有个感性认识。对一组无序的数字进行排序,比较经典的排序算法就是冒泡排序。

冒泡排序是将一组数字多趟顺序比较,一次比较两个数字,如果他们的顺序错误就把他们交换过来,小数或(大数)逐渐往上冒,当再没有需要交换的数字时,说明该组数已经排序完成。

三、【例题:冒泡排序算法实例】

对下面的一组数字利用冒泡排序算法,按照从大到小进行排序。为叙述方便和清晰,在每个数字前加上标号,当比较或交换两个数字时,称为下标①和下标②交换位置,或者下标②与下标③比较大小。

① 23,②34,③5,④7,⑤56

算法具体步骤是从下标①开始,首先比较下标②,如果下标①数值小于下标②数值,则交换两数位置,如果下标①数值大于下标②数值,则不交换,继续比较下标②和下标③两数,依次类推分别比较下标③和下标④、下标④和下标⑤,比较完毕,最小的数下标③5在数列的最右侧,完成第一趟比对,然后依次进行第二趟、第三趟、第N趟比对,直到没有数字进行交换,排序完成。

●  第一趟比对

下标①23和下标②34比较大小,下标①23小于下标②34,两数交换位置,交换位置后的数字排列如下:

②34,①23,③5,④7,⑤56

继续比较下标①23和下标③5,因为①23大于③5,因此两数不作交换。

继续比较下标③5和④7,因为下标③5小于④7,因此两数交换位置,交换位置后的数字排列如下:

②34,①23,④7,③5,⑤56

继续比较下标③5和⑤56,因为下标③5小于⑤56,因此两数交换位置,交换位置后的数字排列如下:

②34,①23,④7,⑤56,③5

●  第二趟比对

下标②34和下标①23比较大小,下标②34大于下标①23,因此,两数位置不变。

继续比较下标①23和下标④7,因为①23大于④7,因此两数不作交换。

继续比较下标④7和下标⑤56,因为④7小于⑤56,因此两数交换位置,交换位置后的数字排列如下:

② 34,①23,⑤56, ④7, ③5

继续比较下标④7和下标③5,因为④7大于③5,因此两数不作交换。

●  第三趟比对

下标②34和下标①23比较大小,下标②34大于下标①23,因此,两数位置不变。

继续比较下标①23和下标⑤56,因为①23小于下标⑤56,因此两数交换位置,交换位置后的数字排列如下:

②34,⑤56,①23,④7,③5

继续比较下标①23和下标④7,因为①23大于下标④7,因此,两数位置不变。

继续比较下标④7和下标③5,因为④7大于下标③5,因此,两数位置不变。

第三趟比对完成后的排序:

②34,⑤56,①23,④7,③5

●  第四趟比对

下标②34和下标⑤56比较大小,下标②34小于下标⑤56,因此两数交换位置,交换位置后的数字排列如下:

⑤56, ②34,①23,④7,③5

第四趟首次比对,排序已经完成。

冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,下一次继续这个过程,直到所有数据元素都排好序。

算法是解决问题的步骤,在前面也谈到了程序是执行过程的描述,那么,算法和程序是什么关系呢?

先请同学们思考一个计算长方形面积的问题,并给出算法。

第一步,设置num1和num2两个变量,接收用户输入的长度和宽度,并存储到num1和num2两个变量;

第二步,判断num1和num2是否大于0,如果大于0,继续下一个步骤,否则提示用户长度和宽度输入错误,算法结束;

第三步,计算num1和num2的乘积,并将乘积结果存储到result变量;

第四步,显示result变量的值到屏幕。

算法非常简单,四个步骤,如何让计算机执行这个算法呢?

实现算法的伪代码:

Begin(算法开始)
     声明  num1、num2;
     输入  num1、num2;
     IF num1 <=0 || num2 <=0
     {
        Print(“输入的长度和宽度不能小于0”);
       退出程序
     }
     result = num1 * num2;
     Print  result;
End (算法结束)

要让计算机执行算法,就必须要把算法用编程语言编写出来,如Java语言,如实现计算长方形面积算法的伪代码,伪代码是一种算法描述语言,可以很容易地转换为编程语言,如Java、C语言等。可见,程序是算法的实现,算法通过某一种编程语言实现后,就是程序。

四、课程小结

1、人们使用计算机,就是要利用计算机解决现实世界的问题。为了让计算机能够按照人们的意愿去工作,需要为计算机提供一组指令,人们把解决问题的步骤用指令来描述,并把指令输入到计算机中,计算机就会按照指令来工作,这些描述工作步骤的指令就是程序。

2、算法是解决问题的思路和步骤,这些步骤是有限的,每个步骤都可以在有限时间内由人或计算机完成,并能输出执行后的结果,所有步骤执行完毕后,一定能够得到算法的最终解答。

3、算法与程序的关系是相互依附的关系,算法要在计算机上执行,必须将算法的步骤用编程语言的语法描述出来,编译通过后,方可在计算机上执行。用编程语言语法描述算法的过程就是编写程序,编写的程序编译通过后,就是可以在计算机上执行的程序了。

五、思考与练习

1、请列举一些你在生活中经常使用的计算机程序。

2、计算机程序和算法有什么区别?

3、对下面的一组数字用冒泡排序算法进行排序,请用文字详细描述排序过程。

36,29,101,12,33

4、现实问题模拟:《停车场的看门人》   

某大型停车场对于进入该场地的车辆有如下的规定: 

(1)进入该停车场的车辆必须为客运车辆,货运车辆谢绝入内。

(2)如果该车的乘员数量小于等于4人,则收费五元。

(3)如果该车的乘员数量大于4人,则收费八元。

作业要求:请根据该停车场的规定,用文字给出判断进入该场的车辆是否符合规定,应该收费多少的算法。

5、请用文字给出一个计算长方形面积问题的算法。

要求:接受用户输入的长度和宽度,输入的长度和宽度不能为零,如果为零,提示用户重新输入,最后将计算结果显示到显示器上。

 

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
2021-09-12 21:47

很实用

方丈大人 2021-08-30 15:31

表示不是很懂,因为学习不好

郎宏林 2021-09-01 11:20

<p>主要还是兴趣问题,有兴趣什么都不难学</p>

千夜清原 2020-10-24 22:33

老师,学习编程是不是物理要很好啊?我物理不好啊

天启75X 2020-06-27 11:11

老师,我快初二了,对编程很感兴趣,怎么学?

郎宏林 2020-06-27 13:37

<p>你好,可以先学习《Python遇上数学入门篇》课程,该课程简单易懂,适合与初中生入门编程。编程入门后,可以再深入学习其它课程。</p>

南星 2020-05-09 14:44

老师我小学的,快要升初了。我对编程很感兴趣,想打点基础,合适吗?

郎宏林 2020-05-09 14:54

<p>可以啊,你可以加入《编程与思维培养》直播课。</p><p>具体操作:在APP中进入《编程与思维培养》直播课详情页,将详情页的二维码截图保存到相册,然后再手机上安装钉钉,用钉钉扫描二维码就可以加入班级。今晚讲第一节课。</p><p>或者加我微信:l18263658936</p>

雨中人 2020-04-27 17:48

本科不是学计算机的,比较对编程感兴趣,之前也没有接触过,可以自学JAVA么?

郎宏林 2020-04-27 21:02

<p>自学java没有问题,只要感兴趣就好</p>

2282223745 2020-04-19 01:00

高一生学那种好点?自学java可以吗

郎宏林 2020-04-19 07:59

<p>高一学生,可以自学Java。建议你学习《Python遇上数学》,对你学好数学是有帮助的,也能很快掌握编程技术。</p>

光速白虎 2020-04-10 20:59

英语成绩不好对编程有没有影响

郎宏林 2020-04-10 21:34

<p>有一定影响,但不是很大。编程中涉及的英文单词和句子,你可以借助在线翻译理解。学习编程,反而有助于提高你的英语阅读能力。</p><p><br/></p><p><br/></p>

光速白虎 2020-04-10 12:19

编程多少岁开始学比较好?

郎宏林 2020-04-10 12:42

<p>《Python遇上数学入门篇》课程图文并茂、简单易懂,小学四年级以上文化水平的读者就能看懂和学会基本Python编程,编程案例以小学数学知识为主,包括数值计算、数学建模、设计小游戏、图形绘制等15个案例程序。所以Python编程可以从四年级开始学习。</p><p><br/></p>

光速白虎 2020-04-10 12:17

学编程英语是不是要很好