《C语言程序设计与实践(第2版)》——2.8 算法

2.8 算法

2.8.1 算法概念
人们使用计算机,就是要利用计算机来处理各种不同的问题,而要做到这一点,人们就必须事先对各类问题进行分析,确定解决问题的具体方法和步骤,再根据这些步骤,编制一组让计算机执行的指令(即程序),让计算机按人们指定的规则有效地工作。这些具体的方法和步骤,其实就是解决一个问题的算法。根据算法,依据某种规则编写计算机执行的命令序列,就是编制程序,而书写时所应遵守的规则即为某种语言的语法。由此可见,程序设计的关键之一是解题的方法与步骤,即算法。学习高级语言的重点和难点之一就是掌握分析问题、解决问题的方法,锻炼分析、分解问题并最终归纳整理出算法的能力。与此相对应的,具体语言(如C语言)的语法是工具,是算法的一个具体实现。所以在高级语言的学习中,一方面应熟练掌握该语言的语法——因为它是算法实现的基础;另一方面必须认识到算法的重要性,加强思维训练,寻找问题的最优解决方法,以编写出高质量的程序。
下面通过例2-8来介绍如何设计一个算法。
例2-8 设有一物体从高空坠下,每次落地后都反弹至距离原高度2/3差1m的地方,现在测得第9次反弹后的高度为2m,请编写程序,求出该物体从多高的地方开始下坠。
问题分析:
此题粗看起来有些无从着手,但仔细分析物体的运动规律后,能找到一些蛛丝马迹。假设物体坠落时的高度为,设第1~9次反弹的高度依次为h1, … ,h9,现在只有h9=2是已知的,但我们从物体的反弹规律能找出各反弹高度之间的关系:

算法设计:
上面从h9到h0的计算过程,其实是一个递推过程,这种递推方法在计算机解题中经常用到。另外,这些递推运算的形式完全一样,只是hi的下标不同而已,因此可以通过循环来处理。为了方便算法描述,我们统一用h0表示上一次的反弹高度,h1表示本次的反弹高度,算法可以详细描述如下:

其中第2~5步为循环,递推计算各次反弹的高度。
上面的示例演示了一个算法的设计过程,即从具体到抽象的过程,具体方法是:
1)弄清解决问题的基本步骤。
2)对这些步骤进行归纳整理,抽象出数学模型。
3)对其中的重复步骤,通过使用相同变量等方式求得形式的统一,然后简练地用循环解决。
算法的描述方法有自然语言描述、伪代码、传统流程图、N-S图及PAD图等,自然语言描述简单、明了,但是由于程序员之间母语的差别,妨碍了他们的正常交流,因此出现了后面四种算法描述形式,下面主要介绍流程图描述方法。如果读者对其他描述方法感兴趣,可以参考其他资料。
2.8.2 流程图与算法描述
可以用不同的方法来描述一个算法。常用的方法有自然语言、传统流程图、结构化流程图(N-S图)和伪代码等。
其中使用最广泛的是传统流程图。传统流程图又称为程序框图,是一种传统的算法表示法,它利用几何图形的框来代表各种不同性质的操作,用流程线来指示算法的执行方向。由于它直观形象,部分消除了不同国籍程序员之间的交流障碍,所以应用广泛。
下面首先介绍常见的流程图符号及流程图的示例。图2-2给出了一些常见的流程图标准符号。

图2-2 常见流程图符号
起止框。表示算法的开始和结束。一般内部只写“开始”或“结束”。
输入输出框。表示算法请求输入输出需要的数据或算法将某些结果输出。一般内部常常填写“输入……”,“打印 /显示……”。
判断框(菱形框)。主要是对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作。它有一个入口,两个出口。给定条件成立时在出口处标明“是”或“Y”,不成立时标明“否”或“N”。
处理框。表示算法的某个处理步骤,一般内部常常填写赋值操作。
流程线。用于指示程序的执行方向。
连接点。用于将画在不同地方的流程线连接起来。同一个编号的点是相互连接在一起的,实际上同一编号的点是同一个点,只是画不下才分开画。使用连接点可以避免流程线交叉或过长,使流程图更加清晰。
注释框。注释框不是流程图中必要的部分,不反映流程和操作,只是为了对流程图中某些框的操作做必要的补充说明,以帮助阅读流程图的人更好地理解流程图的作用。
在上述基本流程图符号的基础上,我们可以用一个完整的流程图来描述例2-8的算法。其流程图如图2-3所示。

图2-3 例2-8的算法流程图
习题
2.1 请对感兴趣的例子程序进行修改,观察修改后的程序运行结果。
2.2 请以一两个生活中的现象为例子,用算法描述图的方法,描述解决问题的步骤。
2.3 搜集网络上知名的C语言编程网站,关注入门级的C语言问题,并尝试解决。
2.4 用传统流程图表示求解以下问题的算法。
①依次输入10个数,要求输出其中最小的数。
②有3个数a、b、c,要求按照从小到大顺序输出。
③求1++++…++。
④判断一个数n能否同时被3和5整除。
⑤输出100~200之间的所有素数。
⑥求两个数m和n的最大公约数。
2.5 输入一个年份year,判定它是否是闰年,并输出它是否是闰年的信息。请用传统流程图表示其算法。符合下面两个条件之一的年份是闰年:
①能被4整除但不能被100整除。
②能被100整除且能被400整除。

时间: 2024-09-20 21:59:50

《C语言程序设计与实践(第2版)》——2.8 算法的相关文章

《C语言程序设计与实践(第2版)》——导读

前言 C语言程序设计是一门理论与工程实践密切相关的专业基础课程,在计算机学科教学中具有十分重要的地位.大力加强该课程的建设,提高该课程的教学质量,有利于教学改革和教育创新,有利于创新人才的培养.通过本课程的学习,学生应培养良好的编程风格,掌握常见的算法思路,真正提高运用C语言编写程序解决实际问题的综合能力,为后续课程的实践环节打好基础. 目前国内关于C语言的教材较多,有些教材语法知识介绍细致,较适合作为非专业的等级考试类教学用书:有些教材起点较高,内容深奥,不适于初学者.为了帮助广大学生更好地掌

《C语言程序设计与实践(第2版)》——2.2 分支语句

2.2 分支语句 2.2.1 if语句 例2-2中程序的功能是统计C语言程序设计课程期末考试各分数段的人数.按照五级制统计可分成以下几档: 90-100 A 80-89 B 70-79 C 60-69 D 0-59 E 要求输出各分数段的具体人数. 例2-2 用if语句统计各分数段的人数. #include <stdio.h> / 统计各分数段人数/ int main() { int score, i; int grade[5]; for (i = 0; i < 5; i++) grad

《C语言程序设计与实践(第2版)》——1.2 计算机与程序设计

1.2 计算机与程序设计 计算机的功能非常强大,能做非常复杂.人脑难以胜任的许多工作.然而,从电子市场买回CPU.主板.内存.硬盘等硬件并组装好一台计算机后,你却发现这台计算机什么也做不了.究其原因,就是因为该计算机上还没有安装任何计算机程序,即软件.硬件是计算机拥有强大功能的前提条件,但是如果没有"大脑"(也就是计算机程序)去指挥它,它将什么也做不了,所以计算机程序的存在是计算机能够工作.能够按指定要求工作的必要条件.因此,计算机程序(Program,通常简称程序)可以简单理解为人们

《C语言程序设计与实践(第2版)》——2.6 数组

2.6 数组 在例2-2中,要求统计C语言程序设计课程各个分数段的人数并输出.本节则不是定义5个独立的变量来存放各个分数段的人数,而是使用"数组"来存放这5个不同的数据. 程序中的定义语句int grade[5]; 用于把grade定义为由5个整数组成的数组.在C语言中,当要定义一组类型相同的数据时,我们可以通过定义数组的方式来定义这些元素,通过数组名和下标来引用某一个元素,数组的下标总是从0开始,在例2-2中,这个数组的5个元素分别是grade[0].grade[1].-.grade

《C语言程序设计与实践(第2版)》——1.4 C语言的发展历史、现状与特点

1.4 C语言的发展历史.现状与特点 1.4.1 C语言的发展历史和现状 C语言的发展历史可以追溯到1961年的ALGOL 60,它是C语言的祖先.ALGOL 60是一种面向问题的高级语言,与计算机硬件的距离比较远,不适合用来编写系统软件.1963年,英国剑桥大学推出了CPL(Combined Programming Language).CPL对ALGOL 60进行了改造,在ALGOL 60基础上接近硬件一些,但是规模较大,难以实现.1967年,英国剑桥大学的Martin Richards对CP

《C语言程序设计与实践(第2版)》——第3章 基本数据类型和表达式 3.1基本语法单位

第3章 基本数据类型和表达式 本书第2章从总体上介绍了一个C程序的基本结构,使读者对C程序有了大概的了解.本章将详细介绍C语言程序中使用的基本语法单位.数据类型.运算符和表达式. 3.1 基本语法单位 任何一种语言都会根据自身的特点规定它自己特定的一套基本符号.例如,英语的基本符号是26个英文字母和一些标点符号. C语言作为一种程序设计语言,也有它自己的基本符号,这些基本符号就组成了程序.3.1.1 基本符号 程序中要对各种变量和各种函数起名,这些变量名.函数名都是由语言的基本符号组成的.C语言

《C语言程序设计与实践(第2版)》——第1章 C语言与程序设计概述 1.1初见C语言程序

第1章 C语言与程序设计概述 1.1 初见C语言程序 我国古代数学家张邱建在其编写的<算经>里提出了历史上著名的"百钱买百鸡"问题:今有鸡翁一,值钱五:鸡母一,值钱三:鸡雏三,值钱一.凡百钱买鸡百只,问鸡翁.母.雏各几何?对于这个问题,很多读者在小学或初中的竞赛中可能都见到过,而且通常都采用不定方程求解.现在我们用C语言解决该问题.通过例1-1所示的程序,初学者一方面可以对C语言有一个感性的认识,另一方面可以初步领略计算机高效和强大的解决问题的能力. 例1-1 用C语言程序

《C语言程序设计与实践(第2版)》——2.3 循环语句

2.3 循环语句 2.3.1 while循环语句 在例2-1中,针对每个x值求得对应y值均是以相同的方式计算,故可以用循环语句来重复产生各行输出,每行重复一次.这就是while循环语句的用途. while (x <= end) { ... } while循环语句的执行步骤如下:首先,测试圆括号中的条件.如果条件为真(x小于等于end),则执行循环体(花括号中的语句).其次,重新测试该条件,如果为真(条件仍然成立),则再次执行该循环体.当该条件测试为假(x大于end)时,循环结束,继续执行跟在该循

《C语言程序设计与实践(第2版)》——3.4 表达式和运算符

3.4 表达式和运算符 C语言的运算符范围很广,具有非常丰富的运算符和表达式运算,为编写程序提供了方便.表达式是由操作数和运算符组成,运算后产生一个确定的值,其中操作数可以是常量.变量.函数和表达式,每个操作数都具有一种数据类型,通过运算得到的结果也具有一种数据类型,结果的数据类型与操作数的数据类型可能相同,也可能不相同.运算符指出了表达式中的操作数如何运算.C语言中共有44种运算符,根据各运算符在表达式中的作用,表达式大致可以分成算术表达式.关系表达式.逻辑表达式.条件表达式.赋值表达式和逗号