靳润昭C语言教程讲义 2001年2月17日 2程序的灵魂一算法 2.1 算法的概念 简单算法举例 3算法的特性 怎样表示一个算法 241用自然语言表示算法 242用流程图表示算法 243三种基本结构和改进的流程图 244用N-S流程图表示算法 24.5用伪代码表示算法 246用计算机语言表示算法 5结构化程序设计方法 2程序的灵魂一算法 一个程序应包括 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 对操作的描述。即操作步骤,也就是算法( algorithm) Nikiklaus wirth提出的公式 数据结构+算法=程序 教材认为: 程序=算法+数据结构+程序设计方法+语言工具和环境 这4个方面是一个程序涉及人员所应具备的知识。 本课程的目的是使同学知道怎样编写一个C程序,进行编写程序的初步训练,因 只介绍算法的初步知识 21算法的概念 做任何事情都有一定的步骤。为解决一个问题而采取的方法和步骤,就称为算法。 计算机算法:计算机能够执行的算法 计算机算法可分为两大类 数值运算算法:求解数值 非数值运算算法:事务管理领域 22简单算法举例 【例2.1】求1×2×3×4×5 最原始方法 步骤1:先求1×2,得到结果2 第1页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第1页 2 程序的灵魂—算法..................................................................................................... 1 2.1 算法的概念................................................................................................. 1 2.2 简单算法举例.............................................................................................. 1 2.3 算法的特性................................................................................................. 4 2.4 怎样表示一个算法....................................................................................... 4 2.4.1 用自然语言表示算法............................................................................ 4 2.4.2 用流程图表示算法................................................................................ 4 2.4.3 三种基本结构和改进的流程图.............................................................. 8 2.4.4 用 N-S 流程图表示算法........................................................................ 9 2.4.5 用伪代码表示算法.............................................................................. 10 2.4.6 用计算机语言表示算法........................................................................11 2.5 结构化程序设计方法..................................................................................11 2 程序的灵魂—算法 一个程序应包括: ⚫ 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。 ⚫ 对操作的描述。即操作步骤,也就是算法(algorithm)。 Nikiklaus Wirth 提出的公式: 数据结构+算法=程序 教材认为: 程序=算法+数据结构+程序设计方法+语言工具和环境 这 4 个方面是一个程序涉及人员所应具备的知识。 本课程的目的是使同学知道怎样编写一个 C 程序,进行编写程序的初步训练,因此, 只介绍算法的初步知识。 2.1 算法的概念 做任何事情都有一定的步骤。为解决一个问题而采取的方法和步骤,就称为算法。 ⚫ 计算机算法:计算机能够执行的算法。 ⚫ 计算机算法可分为两大类: ◼ 数值运算算法:求解数值; ◼ 非数值运算算法:事务管理领域。 2.2 简单算法举例 【例 2.1】求 1×2×3×4×5。 最原始方法: 步骤 1:先求 1×2,得到结果 2
靳润昭C语言教程讲义 2001年2月17日 步骤2:将步骤1得到的乘积2乘以3,得到结果6。 步骤3:将6再乘以4,得24 步骤4:将24再乘以5,得120 这样的算法虽然正确,但太繁 改进的算 S1:使t=1 S2:使ⅰ2 S3:使tx,乘积仍然放在在变量t中,可表示为txi→t S4:使i的值+1,即计1→ S5:如果i≤5,返回重新执行步骤S3以及其后的S4和S5;否则,算法结束。 如果计算100!只需将S5若i≤5改成i≤100即可。 如果该求1×3×5×7×9×11,算法也只需做很少的改动: Sl:1→t S3:txi→t S4:i+2→t S5若i≤11,返回S3,否则,结束 该算法不仅正确,而且是计算机较好的算法,因为计算机是高速运算的自动机器,实现循环 轻而易举 思考:若将S5写成:S5:若i<11,返回S3;否则,结東。 【例2.2】有50个学生,要求将他们之中成绩在80分以上者打印出来 如果,n表示学生学号,n表示第个学生学号;g表示学生成绩,g表示第个学生成绩 则算法可表示如下 S2:如果g≥80,则打印n和g,否则不打印 S3:i+1→1 S4:若i≤50,返回S2,否则,结束 【例23】判定2000—2500年中的每一年是否闰年,将结果输出 润年的条件: l)能被4整除,但不能被100整除的年份 2)能被100整除,又能被400整除的年份 设y为被检测的年份,则算法可表示如下: Sl:2000→y 第2页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第2页 步骤 2:将步骤 1 得到的乘积 2 乘以 3,得到结果 6。 步骤 3:将 6 再乘以 4,得 24。 步骤 4:将 24 再乘以 5,得 120。 这样的算法虽然正确,但太繁。 改进的算法: S1: 使 t=1 S2: 使 i=2 S3: 使 t×i, 乘积仍然放在在变量 t 中,可表示为 t×i→t S4: 使 i 的值+1,即 i+1→i S5: 如果 i≤5, 返回重新执行步骤 S3 以及其后的 S4 和 S5;否则,算法结束。 如果计算 100!只需将 S5:若 i≤5 改成 i≤100 即可。 如果该求 1×3×5×7×9×11,算法也只需做很少的改动: S1: 1→t S2: 3→i S3: t×i→t S4: i+2→t S5:若 i≤11, 返回 S3,否则,结束。 该算法不仅正确,而且是计算机较好的算法,因为计算机是高速运算的自动机器,实现循环 轻而易举。 思考:若将 S5 写成:S5:若 i<11, 返回 S3;否则,结束。 【例 2.2】有 50 个学生,要求将他们之中成绩在 80 分以上者打印出来。 如果,n 表示学生学号,ni 表示第个学生学号;g 表示学生成绩,gi 表示第个学生成绩; 则算法可表示如下: S1: 1→i S2: 如果 gi≥80,则打印 ni 和 gi,否则不打印 S3: i+1→i S4:若 i≤50, 返回 S2,否则,结束。 【例 2.3】判定 2000 — 2500 年中的每一年是否闰年,将结果输出。 润年的条件: 1) 能被 4 整除,但不能被 100 整除的年份; 2) 能被 100 整除,又能被 400 整除的年份; 设 y 为被检测的年份,则算法可表示如下: S1: 2000→y
靳润昭C语言教程讲义 2001年2月17日 S2:若y不能被4整除,则输出y“不是闰年”,然后转到S6 S3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转到S6 S4:若y能被100整除,又能被400整除,输出y“是闰年”否则输出y“不是闰年” 然后转到S6 S5:输出y“不是闰年” S6y+l→ S7:当y≤2500时,返回S2继续执行,否则,结束 1.y不能被4整处。 非闰年 能被400整除 2.y被4整除 闰年 闰年 4.其 【例24】求234 99100 算法可表示如下: SI: sigh=l S3: deno=2 S4: sigh=(-1)sigh S5: term=sighx (1/deno S6 term=sum+term S7: deno= deno +1 S8:若deno≤100,返回S4:否则,结束。 【例2.5】对一个大于或等于3的正整数,判断它是不是一个素数 算法可表示如下: S1:输入n的值 第3页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第3页 S2:若 y 不能被 4 整除,则输出 y“不是闰年”,然后转到 S6 S3:若 y 能被 4 整除,不能被 100 整除,则输出 y“是闰年”,然后转到 S6 S4:若 y 能被 100 整除,又能被 400 整除,输出 y“是闰年” 否则输出 y“不是闰年”, 然后转到 S6 S5:输出 y“不是闰年”。 S6:y+1→y S7:当 y≤2500 时, 返回 S2 继续执行,否则,结束。 【例 2.4】求 100 1 99 1 ... 4 1 3 1 2 1 1− + − + + − 。 算法可表示如下: S1: sigh=1 S2: sum=1 S3: deno=2 S4: sigh=(-1)×sigh S5: term= sigh×(1/deno ) S6: term=sum+term S7: deno= deno +1 S8:若 deno≤100,返回 S4;否则,结束。 【例 2.5】对一个大于或等于 3 的正整数,判断它是不是一个素数。 算法可表示如下: S1: 输入 n 的值
靳润昭C语言教程讲义 2001年2月17日 S3:n被i除,得余数r S4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束:否则执行S5 S5:i+1→i S6:如果i≤n-1,返回S3:否则打印n“是素数”;然后算法结 改进: S6如果i≤Vn,返回s3:否则打印n“是素数”然后算法结束 23算法的特性 ●有穷性:一个算法应包含有限的操作步骤而不能是无限的 确定性:算法中每一个步骤应当是确定的,而不能应当是含糊的、模棱两可的 有零个或多个输入 有一个或多个输出。 ●有效性:算法中每一个步骤应当能有效地执行,并得到确定的结果 对于程序设计人员,必须会设计算法,并根据算法写出程序。 24怎样表示一个算法 241用自然语言表示算法 除了很简单的问题,一般不用自然语言表示算法。 242用流程图表示算法 流程图表示算法,直观形象,易于理解 第4页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第4页 S2: i=2 S3: n 被 i 除,得余数 r S4:如果 r=0,表示 n 能被 i 整除,则打印 n“不是素数”,算法结束;否则执行 S5 S5: i+1→i S6:如果 i≤n-1,返回 S3;否则打印 n“是素数”;然后算法结束。 改进: S6:如果 i≤ n ,返回 S3;否则打印 n“是素数”;然后算法结束。 2.3 算法的特性 ⚫ 有穷性:一个算法应包含有限的操作步骤而不能是无限的。 ⚫ 确定性:算法中每一个步骤应当是确定的,而不能应当是含糊的、模棱两可的。 ⚫ 有零个或多个输入。 ⚫ 有一个或多个输出。 ⚫ 有效性:算法中每一个步骤应当能有效地执行,并得到确定的结果。 对于程序设计人员,必须会设计算法,并根据算法写出程序。 2.4 怎样表示一个算法 2.4.1 用自然语言表示算法 除了很简单的问题,一般不用自然语言表示算法。 2.4.2 用流程图表示算法 流程图表示算法,直观形象,易于理解
靳润昭C语言教程讲义 2001年2月17日 起止框 输入输出框 <>判脂框 处理框 流程线 接点 【例2.6】将例2.1求5!的算用流程图表示。 开始 开始 1→t tx×1→t i+1 N ≥>5 打印t 结束 结束 【例2.7】将例22的算用流程图表示。 第5页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第5页 【例 2.6】将例 2.1 求 5!的算用流程图表示。 【例 2.7】将例 2.2 的算用流程图表示
靳润昭C语言教程讲义 2001年2月17日 开始 1→i Y N 打印m猛 i+1→1 i>50 结束 【例28】将例23判定闰年的算用流程图表示。 第6页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第6页 【例 2.8】将例 2.3 判定闰年的算用流程图表示
靳润昭C语言教程讲义 2001年2月17日 开始 200y Y不能被 4整 N Y不能被 打印y 100整除 不是闰年” Y不能被 打印y 400整除 “是闰年” 打印y 打印y “不是闰年 “是闰年” y>250 【例29】将例24求23499100的算用流程图表示。 一个流程图包括 1.表示相应操作的框: 2.带箭头的流程线 3.框内外必要的文字说明。 第7页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第7页 【例 2.9】将例 2.4 求 100 1 99 1 ... 4 1 3 1 2 1 1− + − + + − 的算用流程图表示。 一个流程图包括: 1. 表示相应操作的框; 2. 带箭头的流程线; 3. 框内外必要的文字说明
靳润昭C语言教程讲义 2001年2月17日 243三种基本结构和改进的流程图 1.顺序结 A 2.选择结构 成立 A B 成立 不成立 A 3.循环结构 第8页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第8页 2.4.3 三种基本结构和改进的流程图 1. 顺序结构: 2. 选择结构: 3. 循环结构
靳润昭C语言教程讲义 2001年2月17日 不成立 x+1→x ≥5 三种基本结构的共同特点: 只有一个入口 只有一个出口 结构内的每一部分都有机会被执行到: 结构内不存在“死循环”。 244用NS流程图表示算法 1973年美国学者提出了一种新型流程图:N-S流程图 顺序结构: 第9页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第9页 三种基本结构的共同特点: ⚫ 只有一个入口; ⚫ 只有一个出口; ⚫ 结构内的每一部分都有机会被执行到; ⚫ 结构内不存在“死循环”。 2.4.4 用 N-S 流程图表示算法 1973 年美国学者提出了一种新型流程图:N-S 流程图。 顺序结构:
靳润昭C语言教程讲义 2001年2月17日 选择结构 成立 不成立 循环结构: 当P1成立 直到P1成立 1→1 g≥80 打印mg +1→1 直到讠50 24.5用伪代码表示算法 伪代码使用介于自然语言和计算机语言之间的文字和符号来描述算法。 第10页
靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第10页 选择结构: 循环结构: 2.4.5 用伪代码表示算法 伪代码使用介于自然语言和计算机语言之间的文字和符号来描述算法