## 1内容介绍:
算法
一个程序应包括:
l 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(data structure)。
l 对操作的描述。即操作步骤,也就是算法(algorithm)。Nikiklaus Wirth提出的公式:
数据结构+算法\=程序
程序\=算法+数据结构+程序设计方法+语言工具和环境
这4个方面是一个程序涉及人员所应具备的知识。
本课程的目的是使同学知道怎样编写一个C程序,进行编写程序的初步训练,因此,只介绍算法的初步知识。
## 2.1 算法的概念
做任何事情都有一定的步骤。为解决一个问题而采取的方法和步骤,就称为算法。
l 计算机算法:计算机能够执行的算法。
l 计算机算法可分为两大类:
n 数值运算算法:求解数值;
n 非数值运算算法:事务管理领域。
## 2.2简单算法举例
【例2.1】求1×2×3×4×5。
最原始方法:
步骤1:先求1×2,得到结果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表示第i个学生学号;g表示学生成绩,gi表示第i个学生成绩;
则算法可表示如下:
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
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继续执行,否则,结束。
![](https://img.kancloud.cn/45/0f/450f8ac6cf480378635ec34611b054fd_246x305.png)
## 2.3 算法的特性
1 有穷性:一个算法应包含有限的操作步骤而不能是无限的。
2 确定性:算法中每一个步骤应当是确定的,而不能应当是含糊的、模棱两可的。
3 有零个或多个输入。
4 有一个或多个输出。
5 有效性:算法中每一个步骤应当能有效地执行,并得到确定的结果。
对于程序设计人员,必须会设计算法,并根据算法写出程序。
## 2.4 怎样表示一个算法
### 2.4.1 用自然语言表示算法
除了很简单的问题,一般不用自然语言表示算法。
### 2.4.2 用流程图表示算法
流程图表示算法,直观形象,易于理解。
![](https://img.kancloud.cn/da/97/da9768974623e1875ccf215f8ffaa4ea_226x310.png)
【例2.6】将例2.1求5!的算用流程图表示。
![](https://img.kancloud.cn/9f/cf/9fcf285c33ebb1ce3f45b8109597e0c8_436x461.png)
【例2.7】将例2.2的算用流程图表示。
![](https://img.kancloud.cn/1c/6c/1c6c48d30b3a67275c90c3fa33eb0349_418x470.png)
【例2.8】将例2.3判定闰年的算用流程图表示。
![](https://img.kancloud.cn/da/49/da49563cc4136588c836581c88d9c574_522x708.png)
### 2.4.3 三种基本结构和改进的流程图
1. 顺序结构: 从算法开始至算法结束,每个步骤依次顺序执行。
![](https://img.kancloud.cn/85/8b/858b932b786852a9386a3ba7e51eed82_208x216.png)
2. 选择结构:在算法的执行过程中,需要根据条件的不同而执行不同的执行路径。
![](https://img.kancloud.cn/78/10/78102f8d56eb3cb676e938a508a8d089_306x252.png)
![](https://img.kancloud.cn/3c/fc/3cfc7ec45ffba93e03d3b0fed858a983_306x229.png)
3. 循环结构:在算法的执行过程中,根据条件需要重复执行某些步骤。
下面是 “当型”循环 和 “直到型”循环示意图:
![](https://img.kancloud.cn/c9/ea/c9ead79e555dd2ab8c1004dba306f90f_395x282.png)
![](https://img.kancloud.cn/5d/f0/5df0a3a22f48b1a79fc96bea40ae31e0_181x335.png)
三种基本结构的共同特点:
1 只有一个入口;
2 只有一个出口;
3 结构内的每一部分都有机会被执行到;(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)
4 结构内不存在“死循环”(无终止的循环)。
### 2.4.4 用N-S流程图表示算法
1973年美国学者提出了一种新型流程图:N-S流程图。
顺序结构:
![](https://img.kancloud.cn/62/c5/62c547eaad474227762ede6b18a5d347_98x84.png)
选择结构:
![](https://img.kancloud.cn/ed/e3/ede3bdbef00720367c53f1489f9a320b_195x127.png)
循环结构:
![](https://img.kancloud.cn/61/25/6125282d9a08ea9b3ae1712defcec2c7_206x269.png)
![](https://img.kancloud.cn/c6/99/c699f1ae84c31752a31cf99cc20fddf6_221x228.png)
### 2.4.5 用伪代码表示算法
伪代码使用介于自然语言和计算机语言之间的文字和符号来描述算法。
### 2.4.6 用计算机语言表示算法
1 我们的任务是用计算机解题,就是用计算机实现算法;
2 用计算机语言表示算法必须严格遵循所用语言的语法规则。
【例2.20】求1×2×3×4×5用C语言表示。
```
#include <stdio.h>
#include <stdlib.h>
main(){
int i,t;
t=1;
i=2;
while(i<=5) {
t=t\*i;
i=i+1;
}
//输出结果信息
printf("%d",t);
}
```
## 2.5 结构化程序设计方法
1 自顶向下;
2 逐步细化;
3 模块化设计;
4 结构化编码;
- 空白目录
- 第一章 c语言简介
- 1 通俗地理解什么是编程语言
- 2 C语言究竟是一门怎样的语言
- 第二章 算法简介&基本语法
- 1 算法简介
- 2 C 程序结构
- 3 C 基本语法
- 第三章 数据类型
- 1 数据类型
- 2 变量
- 3 常量
- 第四章 运算符
- 1 算术运算符
- 2 关系运算符
- 3 逻辑运算符
- 4 位运算符
- 5 赋值运算符
- 6 杂项运算符(其他运算符)
- 7 c语言中的运算符优先级
- 第五章 控制流
- 1 判断语句
- 2 switch语句
- 3 循环语句
- 4 流程控制相关案例
- 第六章 指针
- 1 c语言指针概述
- 2 指针的算术运算
- 3 指针数组
- 4 指向指针的指针
- 5 传递指针给函数
- 6 从函数返回指针
- 第七章 函数
- 1 函数的语法
- 2 作用域规则
- 3 形参与实参
- 第八章 数组
- 1 C语言中的数组
- 2 多维数组
- 3 传递数组给函数
- 4 从函数返回数组
- 第九章 指针
- 1 分钟彻底理解C语言指针的概念
- 2 C语言指针变量的定义和使用
- 3 C语言指针变量的运算(加法、减法和比较运算)
- 4 C语言数组指针(指向数组的指针)
- 5 C语言字符串指针(指向字符串的指针)
- 第十章 结构体
- 第十一章 练习
- 第十二章 文件操作
- 第十三章 文件操作2