2.5 怎样表示一个算法

本文讲述了如何通过自然语言、流程图(包括传统流程图、N-S流程图和选择结构)和伪代码来表示算法,以及如何将这些表示转换为计算机语言,如C语言,实现算法的功能。重点介绍了基本结构在算法设计中的作用,强调结构化表示对于代码的可读性和维护性提升。
摘要由CSDN通过智能技术生成

思维导图:

 

第2章 算法——程序的灵魂

2.5 如何表示一个算法

为了准确地传达算法的思想并确保其可以被正确执行,开发者需要使用适当的方法来表示算法。不同的表示方法适合于不同的场景和需求。常见的表示方法包括自然语言、流程图、结构化流程图和伪代码等。

2.5.1 使用自然语言表示算法

自然语言是日常交流中使用的语言,如汉语、英语等。在算法的初步设计阶段,自然语言可以使思路快速传达,容易理解,尤其是在描述概念或草案时。然而,自然语言在描述更复杂的逻辑结构时可能会引入歧义,因为它的表达不够精确,容易根据上下文产生多种解释。例如,"张先生对李先生说他的孩子考上了大学" 这句话就无法清楚地指明是谁的孩子考上了大学。因此,对于包含复杂分支和循环的算法,自然语言不是最佳选择。

2.5.2 使用流程图表示算法

流程图是通过图形符号来描述算法的一种方法,它通过标准化的图形符号(如美国国家标准化协会ANSI制定的符号)来表示算法的各个步骤和流程。流程图直观、形象,易于理解和跟踪算法的执行流程。

  • 起止框:标志算法的开始和结束。

    2024/6/19日补充发现

  • 输入输出框表示算法的输入和输出操作。(课后习题4(2)的答案中出现了发现自己忘记了,其实输入输出框就是平行四边形,暴露了我2.5节对流程图各个框的不熟悉)

  • 判断框(菱形):用于条件判断,根据条件的真假分别进行不同的操作。
  • 处理框:用于执行具体的处理操作。
  • 连接点:用于连接流程线,使得流程图清晰且避免线条交叉。
  • 注释框:提供对算法步骤的额外说明,帮助理解。

例如,一个简单的算法,如计算1×2×3×4×5的结果,可以使用流程图清晰地表示出各个计算步骤和最终输出。

选择合适的表示方法

选择算法表示方法时,需要考虑算法的复杂性、目标受众和实现的需求。自然语言适合初步讨论和简单算法的描述;流程图和伪代码适用于需要精确描述的场合,特别是在编程之前详细规划算法逻辑时。结构化流程图和伪代码则更适合那些已经有一定编程背景的人员,因为这些方法能够更直接地转换成程序代码。

通过这些不同的方法,算法设计者可以有效地沟通其设计思想,减少实现过程中的误解和错误,确保算法能够被准确地实现和使用。

第2章算法——程序的灵魂:流程图的应用与分析

在程序设计和算法分析中,流程图是一个极为重要的工具,它帮助我们以图形化的方式理解和表达复杂的逻辑过程。第2章通过多个例子展示了流程图的构建和其在算法表示中的应用,让我们逐一探讨这些内容。

例2.7:学生成绩筛选算法

本例中,流程图描述了如何从50个学生中筛选出成绩在80分以上的学生,并输出他们的学号和成绩。流程图中明确了循环遍历学生名单,并对每个学生的成绩进行条件判断的过程。然而,原始的流程图未包括输入学生数据的部分,如果加入这一步骤,流程图会更为完整,确保从数据输入到处理的每一个步骤都被清晰记录。

例2.8:闰年判定算法

通过流程图表示,我们可以清楚地看到如何判定2000至2500年间每一年是否为闰年。流程图优于文字描述的一大优点是其直观性和易理解性。本例中提到的逻辑错误—即如果年份不能被4整除后仍执行后续步骤—通过流程图可以更容易地被发现和理解。修正这一逻辑错误,并在流程图中正确表示出来,是程序设计中避免错误和提高效率的关键步骤。

例2.9 & 例2.10:更多算法的流程图表示

进一步的例子,如算法例2.4和例2.5的流程图,涉及到更复杂的数学和逻辑运算,比如求解特定数学问题和判断素数。这些流程图展示了算法中每一步的执行条件和操作,帮助理解算法的每个决策点和操作的逻辑联系。

流程图的重要性

流程图不仅仅是画图的技术,它是程序设计和算法开发的语言。通过明确地表示操作和决策的顺序,流程图帮助开发者避免逻辑错误,确保程序的正确性和效率。在计算机书刊和教育中,尽管现代有更多新的表示方法,如N-S结构化流程图,但传统流程图依然是学习基础逻辑和程序设计的有效工具。

总结来说,第2章通过详细的流程图和案例分析,不仅展示了流程图在表达复杂算法中的有效性,也强调了其在教育和实际应用中的不可或缺的角色。每位程序员都应该掌握如何读懂和绘制流程图,这是成为一名合格程序设计师的基本技能之一。

第2章算法——程序的灵魂:三种基本结构和改进的流程图

算法设计的核心在于其清晰性和维护性。传统流程图虽然在历史上起到了重要作用,但它们的复杂性和难以追踪的特性常常导致“碗面条”式的混乱状态,阻碍了算法的理解和维护。为了克服这些弊端,引入了三种基本结构的概念,旨在使算法设计变得更为有序和可靠。

1. 传统流程图的弊端

传统流程图允许流程线随意转向,导致流程图易于变得复杂和难以理解。这种无规律的转向类似于杂乱无章的书页排列,使得追踪算法流程成为一项挑战。如同一本书的章节应该有序排列以便阅读,算法的各个部分也应该有逻辑和顺序地组织起来。

2. 三种基本结构

为了解决传统流程图的问题,1966年Bohra和Jacopini提出了以下三种基本结构,它们成为了设计良好算法的基石:

  • 顺序结构:这是最简单的结构,涉及按特定顺序执行操作的框。操作完成后,系统自然地移至下一个操作。
  • 选择结构:这种结构包含一个判断框,根据条件的真假来决定执行路径。这是处理算法中决策点的标准方法。
  • 循环结构:分为当型(while型)和直到型(until型)循环,这些结构允许在满足特定条件时重复执行某些操作。

这三种基本结构确保了算法的条理性,每个结构都有一个明确的入口和出口,并保证内部每一部分都能被执行到,避免了死循环的发生。

3. 改进的流程图

改进后的流程图使用这三种基本结构来构建更为结构化的算法。这种方法不仅增强了算法的可读性和可维护性,还提高了其可靠性。例如,多分支选择结构(如图2.22和图2.23所示)是由基本的选择结构派生出的,它根据不同的条件执行不同的操作。

总结

三种基本结构的引入标志着从传统流程图向结构化设计的重要转变。这种结构化的方法使算法设计更加系统化和规范化,极大地改善了程序的质量和效率。每个程序员都应该熟练掌握这些结构,并能够将它们应用于复杂问题的解决中,从而构建出高效、可维护的程序和算法。

第2章算法——程序的灵魂:用N-S流程图表示算法

在算法设计的领域,清晰地表达逻辑结构对于确保代码的可读性和可维护性至关重要。传统流程图虽然在历史上有其用途,但由于其复杂性和缺乏清晰的结构导向,常常难以追踪和理解。为了解决这些问题,1973年,I. Nassi和B. Shneiderman提出了一种新的流程图形式,即N-S结构化流程图,它通过消除传统流程图中的流程线,提供了一种更为清晰和结构化的方式来表示算法。

N-S流程图的特点

N-S流程图,又称为盒图,使用嵌套的矩形框来表示算法中的逻辑结构。每个框内可以包含其他从属的框,形成一个层次化的表示方法,其中不再使用带箭头的流程线。这种结构化的表示方式使得算法的读取和理解变得更加直观和简洁。

基本结构的运用

N-S流程图基于三种基本结构,这些结构包括:

  1. 顺序结构:顺序结构用于表示按特定顺序执行的操作,操作按照从上到下的顺序进行。

  2. 选择结构:选择结构用于处理基于条件判断的操作路径。这种结构在一个单一框架内部决定执行路径,依据条件的真假来执行相应的操作。

  3. 循环结构:包括“当型”(while型)和“直到型”(until型)循环,用于表示重复执行操作直到某个条件满足为止。

N-S流程图的实例应用
  • 例2.11:使用N-S图表示求5的阶乘的算法,展示了如何通过循环结构简化复杂的迭代过程。
  • 例2.12:表示输出50名学生中成绩高于80分者的学号和成绩的算法,展示了如何用顺序和选择结构来过滤和输出数据。
  • 例2.13:用于判断闰年的算法,通过选择结构清楚地展示了条件判断的逻辑。
  • 例2.14例2.15:进一步展示了如何使用N-S图来处理数学计算和素数判断,这些例子强调了结构化设计的优势,尤其是在处理逻辑复杂性时的清晰性和效率。
结构化算法的优势

N-S流程图的优势在于它的结构化设计,这种设计不允许无规律的跳转,而是要求从上到下的顺序执行。这种方法不仅增加了算法的可读性,也提高了维护的便利性。通过使用这种流程图,算法设计师可以更容易地理解和实现复杂的逻辑,同时保证算法的稳健性和可靠性。

总之,N-S流程图作为一种现代算法表示工具,它通过简化结构和增强可读性,为程序设计和算法开发提供了重要的支持。这种图形化的方法确保了算法逻辑的清晰表达和有效执行,是每位程序员都应掌握的重要技能之一。

第2章算法——程序的灵魂:用计算机语言表示算法

设计算法的最终目的是实现这些算法,让它们在现实世界中工作。在计算机科学领域,实现算法通常意味着将算法转换为计算机能够理解和执行的形式——即编写程序。这种转换涉及从伪代码或流程图等形式的算法描述,转换为具体的编程语言代码。

实现算法的重要性

如同作曲家创作乐谱需要乐队来演奏,算法设计后也需通过编程实现来达到其功能。这不仅涉及算法的逻辑设计,还包括考虑实现环境的限制、数据结构的选择以及最终代码的性能优化等方面。

计算机语言与算法实现

计算机无法直接理解人类的自然语言或简单的逻辑图示,它只能执行用特定编程语言写成的程序。因此,编程语言是算法实现的必要工具。它们提供了一种规范的方法来描述算法中的操作,控制流程,以及管理数据。

C语言实现算法的示例
例2.18: 求5的阶乘(C语言实现)
#include <stdio.h>

int main() {
    int i, t;
    t = 1;
    i = 2;
    while (i <= 5) {
        t = t * i;
        i = i + 1;
    }
    printf("%d\n", t);
    return 0;
}

这段C语言代码实现了求5的阶乘的算法,使用了while循环结构,体现了从伪代码到具体编程语言的转换。

例2.19: 计算交错级数的和(C语言实现)
#include <stdio.h>

int main() {
    int sign = 1;
    double deno = 2.0, sum = 1.0, term;
    while (deno <= 100) {
        sign = -sign;
        term = sign / deno;
        sum = sum + term;
        deno = deno + 1;
    }
    printf("%f\n", sum);
    return 0;
}

这段代码计算了一个交错级数的和。通过循环结构和变量操作,展示了如何使用C语言实现更复杂的数学计算。

结论与应用

编程语言提供了一种精确的方式来实现算法。编写程序代码是算法实现的关键步骤,这不仅仅是一个技术操作,而是将抽象的算法思想转化为具体可运行的程序的过程。编程不仅仅是写出代码,更关键的是理解和实现算法的核心逻辑。

学习和应用编程语言进行算法实现是计算机科学教育的核心部分。对于学习者来说,理解如何将算法逻辑转化为编程语言是非常重要的技能,有助于他们更好地掌握编程技术和深入理解计算机科学的本质。

 

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值