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

  • 程序 = 算法 + 数据结构 (沃思,计算机科学家)

  • 一个程序应该包括两方面:

    1. 对数据的描述:在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。
    2. 对操作的描述: 即操作步骤,也就是算法(algorithm)。
  • 数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。

  • 程序设计人员需具备知识:

    1. 算法

    2. 数据结构

    3. 程序设计方法

    4. 语言工具

1.算法的概念

  • 广义来说,为解决一个问题而采取的方法和步骤,就称为“算法”。

  • 同一问题有不同的解题方法和步骤,方法有优劣之分。因此,不仅需要保证算法正确,还要考虑算法的质量。

  • 算法分为 数值运算算法 和 非数值运算算法

    1. 数值运算:目的是求数值解,如求方程根、函数定积分等。

    2. 非数值运算:包括面十分广泛,最常见的是用于事务管理领域,如图书馆检索、人事管理等。

  • 数值运算有现成的模型,可以应用数值分析方法。故常将这些算法汇编成册(写成程序形式),供用户调用。如 数学程序库 等。

2.简单算法举例

  • 例2.1 求 1x2x3x4x5

    • 设两个变量,一个代表被乘数,一个代表乘数。直接将每一步的乘积放在被乘数变量中

    • 设 p 为被乘数 , i 为乘数。

    1. 使 p =1;
    2. 使 i = 2;
    3. 使 p x i,乘积放在 p 中,可表示为 p x i ⇨ p;
    4. 使 i 的值加 1 ,即 i + 1 ⇨ i;
    5. 若 i 的值不大于5,返回重新执行 S3 以及 之后的 S4 和 S5,否则,算法结束。最后得到的 p 的值就是 5!的值。
  • 例2.2 将50个学生中成绩在80分以上的学号和成绩输出。

    • 用 n 表示学生号,n1代表第一个学生,ni代表第i个学生;
    • 用 g 代表学生成绩,g1代表第一个学生的成绩。
    1. i =1;
    2. 如果 g1>80,则输出 n1 和 g1 ;否则不输出。
    3. i = i + 1;
    4. 如果 i<=50,返回S2,继续执行;否则,结束算法。
  • 例2.3 判定 2000-2500年中的每一年是否为闰年,将结果输出。

    • 闰年的条件 :

      • 能被4整除,但不能被100整除的年份;

      • 能被100整除,又能被400整除。

    • 设 y 为被检测的年份

    1. y = 2000;
    2. 若 y 不能被 4 整除,则输出y“ 不是闰年”,然后转到S6;
    3. 若 y 能被 4 整除,不能被 100 整除,则输出y“ 是闰年”,然后转到S6;
    4. 若 y 能被 100 整除, 又能被 400 整除,则输出y“ 是闰年”,然后转到S6;
    5. 输出y“ 不是闰年”;
    6. y = y + 1 ;
    7. 当 y <= 2500时,转S2继续执行,否则算法停止 。
  • 例2.4 求 1-1/2+1/3-1/4+···+1/99-1/100

    1. sign = 1;
    2. sum = 1;
    3. deno = 2;
    4. sign =(-1) sign;*
    5. term = sign * (1/deno);
    6. sum = sum + term;
    7. deno = deno + 1;
    8. 若 deno <=100,返回S4;否则算法结束。
    • 用有含义的单词作变量名,使算法更易于理解。

    • sum 表示累加和

    • deno 是“分母”英文denom inator 的缩写

    • sign 代表数值的符号

    • term 代表某一项

  • 例2.5 对于一个大于或等于3的正整数,判断它是否为素数。

    • 素数:除了 1 和 自身 之外,不能被其他任何整数整除的数。

    • 判断一个数n(n>=3)是否为素数:将 n 作为被除数,将 2 到(n-1)各个整数先后作为除数,如果都不能被整除,则 n 为素数。

    1. 输入 n 的值;
    2. i = 2;
    3. n 被 i 除,得余数 r;
    4. 如果 r =0,表示 n 能被 i 整除,则输出 n“不是素数”;算法结束,否则执行S5;
    5. i + 1
    6. 如果 i <=n-1,返回S3;输出 n“是素数”,结束算法。
  • 实际上,被 2 到 √n之间的整数即可。

3.算法的特性

  1. 有穷性;一个算法应包含有限的操作步骤。
  2. 确定性;算法中的每一个步骤都应当是确定的。
  3. 有零个或多个输入;输入指执行算法时需要从外界取得必要的信息。
  4. 有一个或多个输出;算法的目的是求解,“解”就是输出。没有输出的算法是没有意义的。
  5. 有效性;算法的每一个步骤都应当能有效低执行,并得到确定的结果。

4.算法的表示

  • 常用的算法表示方法有:自然语言、传统流程图、结构化流程图、伪代码、PAD图(Problem Analysis Digram 问题分析图)等。

(1)用自然语言表示算法

​ 自然语言就是人们日常生活中使用的语言,可以是汉语、英语或其他语言。

(2)用流程图表示算法

  • 流程图:用一些图框来表示各种操作。用图形表示算法,直观形象,易于理解。

  • ANSI 规定了一些常用的流程图符号:

    • 菱形框的作用是 对一个给定的条件进行判断,根据给定的条件是否成立来决定如何执行其后的操作,它有一个入口,两个出口。

    • 连接点(小圆圈)用于将画在不同地方的流程线连接起来。

      1. 一个流程图过长或过大画不下时,需要分开画,在小圆圈中写上数字来标识连接点,数字相同的为用一个点。

      2. 用连接点,可以避免流程线的交叉或过长,使流程图清晰整洁。

    • 注释框不是流程图中的必要成分,不反映流程和操作,只是对流程图中某些框的操作作必要的补充说明,以帮助更好的理解流程图的作用。

  • 一个流程图应包含以下几部分:

    1. 表示相应操作的框

    2. 带箭头的流程线(箭头反映流程的执行先后次序)

    3. 框内外必要的文字说明

  • 流程图的优缺点:

    1. 优点:用流程图表示算法直观形象,比较清地显示出各个框之间的逻辑关系
    2. 缺点:流程图占用篇幅较多,尤其算法比较复杂时,画流程图既费时又不方便

(3) 3 种基本结构

  • 1966年,Bohra 和 Jacopini 提出三种基本结构,作为表示一个良好算法的基本单元。

    1. 顺序结构,按指定顺序执行,最简单的一种基本结构
    2. 选择结构,又称选取结构或分支结构,此结构中包含一个判断框,根据给定条件执行不同操作,只能执行一个操作。
    3. 循环结构,又称重复结构,即反复执行某一部分的操作,有两类循环结构。
      1. 当型循环:先判断,再执行。条件成立时执行,直到条件不成立。
      2. 直到型循环:先执行,再判断。条件不成立时执行,直到条件成立停止。
  • 3 种结构共同特点

    1. 只有一个入口
    2. 只有一个出口,注意区分判断框的出口和选择结构的出口
    3. 结构内的每一部分都有机会被执行
    4. 结构内不存在”死循环“

(4)用N-S流程图表述算法

  • 1973年内美国学者 I.Nassi 和 B.Shneiderman 提出一种新的流程图形式,完全去掉了带箭头的流程线。

  • N-S 结构化流程图 将全部算法写在一个矩形框内,框内还可以包含其他从属于它的框;即由一些基本的框组成一个大的框。

  • N-S流程图用以下的流程图符号:

    • 顺序结构:如图(a)
    • 选择结构:如图(b)
    • 循环结构:当型循环结构 如图(c),直到型循环结构 如图(d)
  • N-S 流程图优点:

    1. 比文字描述直观、形象,易于理解;比传统流程图紧凑易画。
    2. 废除流程线,整个算法结构是由各个基本结构按顺序组成的。
    3. N-S的上下顺序就是执行时的顺序。
  • 小结:

    • 一个结构化的算法是由一些基本结构顺序组成的;
    • 在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本结构范围之内,如循环流程中的跳转;
    • 一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变;
    • 如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。
  • N-S 如同一个多层的盒子,又称 盒图。

(5)用伪代码表示算法

  • 伪代码:介于自然语言和计算机语言只之间的文字和符号来描述算法。如同一篇文章,自上而下地写下来。

    • 伪代码不用图形符号,因此书写方便,格式紧凑,比较好懂,便于向计算机语言过渡。
  • 流程图直观易懂,但画起来比较费事。在设计一个算法时,可能要反复修改,而流程图的修改是比较麻烦的。为了设计算法时方便,常用 伪代码 工具。

(6)用计算机语言表示算法

  • 计算机语言必须严格遵循所用语言的 语法规则。
  • 例2.1
#include <stdio.h>
void  main()
{int p,i;p = 1;i = 2;while(i<=5){p = p * i;i = i + 1;}printf ("%d \n",p);
}
/*
运算结果:120
*/
  • 例2.4
#include <stdio.h>
void main()
{int sgin = 1;float deno = 2.0, sum = 1.0, term;while(deno<=100){sign = -sign;twrm = sign/deno;sum = sum + term;deno = deno +1;}printf("%f \n",sum);
}
/*
运算结果:0.688172
*/

5.结构化程序设计方法

基本方法:便于 编写、阅读、修改、维护

  1. 自顶向下
  2. 逐步细化
  3. 模块化设计
  4. 结构化编码
  • 子模块:C 程序中通常用函数实现,子模块一般不超过50行,便于组织与阅读。

    • 模块化设计的思想实际上是一种”分而治之“的思想。将一个大任务分成若干个小任务。
    • 结构化程序设计方法用来解决人脑思维能力的局限性和能被处理问题的复杂性之间大的矛盾。
  • 编码:将已设计好的算法用计算机语言表示出来,即根据已经细化的算法正确地写出计算机程序。

C程序设计-谭浩强 第三版-学习笔记 第2章 程序的灵魂 算法相关推荐

  1. C程序设计-谭浩强 第三版-学习笔记第1章 C语言概述

    第一章 C语言概述 1.C语言历史背景 C语言是在B语言的基础上发展起来的,兼具一般高级语言和低级语言的优点,可用来编写系统软件或应用软件. 1972-1973年,贝尔实验室在B语言基础上设计出C语言 ...

  2. C程序设计谭浩强第五版课后答案 第三章习题答案

    C语言程序设计谭浩强第五版课后答案第三章 1.假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比.计算公式为p=(1+r)np = (1+r)^np=(1+r ...

  3. C程序设计(谭浩强第五版)总结

    C程序设计(谭浩强第五版)总结 本篇文章主要是总结谭浩强第五版C语言书上的重点和易漏点的知识点,其目的主要是给高校期末考试的同学们点参考.本文所参考的书籍是谭浩强的<C程序设计(第五版)> ...

  4. C语言程序设计谭浩强第五版复习梳理2

    第2章 算法--程序的灵魂 前言:前两章都是c语言基础知识,软考还有考研笔试可能会考,下一章开始学的才是真正的编程. 2.1程序=算法+数据结构 算法+数据结构=程序 数据结构: 对数据的描述.在程序 ...

  5. c语言考研题库谭浩强,C程序设计谭浩强第4版考研教材下载及真题视频讲解

    程序设计和C语言 1.1 复习笔记 一.计算机程序 1程序就是一组计算机能识别和执行的指令 2计算机的一切操作都是由程序控制的 二.计算机语言 1定义 人和计算机交流信息,要解决语言问题.需要创造一种 ...

  6. 类和对象的特性(C++谭浩强第三版笔记)

    0.0 从程序结构上看:   基于过程的程序中:围绕功能进行的,函数是构成程序的基本部分,程序面对的是一个个函数.   面向对象的程序中:除主函数外,其他函数基本上都出现在"类"中 ...

  7. C语言谭浩强第三版第九章例题及课后题:预处理命令

    目录 9.1定义一个带参数的宏,使两个参数的值互换 9.2输入两个整数,求它们相除的余数 9.3求三角形面积 9.4(5)判断闰年 9.5分析下面的宏所定义的输出格式 9.6设计输出实数的格式 9.7 ...

  8. C语言谭浩强第三版第十二章例题及课后题:位运算

    eg12.1取一个整数a从右端开始的4~7位 0000...000000        0 1111...111111       ~0  1111...110000       ~0<< ...

  9. C程序设计 谭浩强 第三章

    变量类型 常量 注:一般变量初始化不是在编译阶段完成的(只有静态存储变量和外部变量的初始化时在编译阶段完成的),而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句. 整型常量 实型常量:十 ...

最新文章

  1. 大数据实验报告总结体会_大数据挖掘流程及方法总结
  2. matlab 变参数 方程组,解带参数方程组 运行结果竟然自己带了新参数z
  3. 惠普打印机怎么无线连接电脑_惠普打印机打印中突然停止怎么办?
  4. matlab实现图像的高斯滤波
  5. ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固
  6. netty系列之:对聊天进行加密
  7. xcode+文字支持html元素,iOS使用UITextview实现富文本编辑
  8. [bzoj1700]: [Usaco2007 Jan]Problem Solving 解题
  9. 翻译: 3.3. 线性回归的简明实现 pytorch
  10. Spring Boot 设置允许跨域的两种配置方式
  11. 清华陈丹琦:如何让「大模型」变小
  12. delphi跨平台linux的版本,Delphi 2011 发布了 跨 MAC,LINUX,WINDOWS 平台
  13. iOS 最新AppStore申请加急审核 以及 apple联系方式大全
  14. 学Maven,看这一篇就够了!(视频|资料,建议收藏!)
  15. 关于手机无法弹出谷歌通知栏验证的问题
  16. 手把手教你虚拟机安装(VMware)、Linux操作系统安装
  17. 中国电影的网络付费点播发行:现状与展望
  18. 推荐一个开源的任务管理工具DooTask(支持私有部署)
  19. Ruby‘s Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效
  20. 浏览器数据库 IndexedDB 介绍

热门文章

  1. awvs13无法登陆,白屏
  2. 达人评测 神舟炫龙M7-E8S3怎么样
  3. Centos7.6部署docker容器虚拟化平台(Container 容器端口映射)
  4. python查看虚拟环境列表_Python虚拟环境简明教程
  5. css字体适配rem 根据屏幕大小变换字体大小
  6. 前端面试题整理(3)
  7. 阿里云redis公网连接
  8. trie树java_Trie树使用实例
  9. Best engine and tools for a TA and GAMDEVs
  10. c语言输出换行字符,float_printf格式换行_c语言printf里如何换行