-
算法---程序的灵魂
一个程序主要包括以下两方面的信息:
(1) 对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式
这就是数据结构(data structure)
(2) 对操作的描述。即要求计算机进行操作的步骤
也就是算法(algorithm)
算法 + 数据结构 = 程序
广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”
对同一个问题,可以有不同的解题方法和步骤
为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法
-
计算机算法可分为两大类别:
数值运算算法
非数值运算算法
数值运算的目的是求数值解
非数值运算包括的面十分广泛,最常见的是用于事务管理领域
-
简单的算法举例
例2.1 求1+2+3+4+5
可以用最原始的方法进行:
步骤1:先求1+2,得到结果3。
步骤2:将步骤1得到的和3再加上3,得到结果6
步骤3:将6再加上4,得10。
步骤4:最后将10再加上5,得上15。这就是最后的结果。
如果从1+2+…+100呢?
改进的算法:
步骤1:定义变量sum并赋值为0。
步骤2:定义一个循环变量i并赋值为1
步骤3:判断循环变量是否小于等于5,如果条件成立,将sum与i相加并将结果赋给sum,否则运算结束,跳到步骤5 。
步骤4:循环变量自增1,跳到步骤3 。
步骤5:得到sum的总和值
-
再次改进的算法:
-
算法的特性
一个有效算法应该具有以下特点:
(1) 有穷性。一个算法应包含有限的操作步骤,而不能是无限的。
(2) 确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。
(3) 有零个或多个输入。所谓输入是指在执行算法时需要从外界取得必要的信息。
(4) 有一个或多个输出。算法的目的是为了求解,“解” 就是输出。没有输出的算法是没有意义的。
(5) 有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。例如:a/b,如果
b=0就不能有效地执行
-
流程图表示表示法
-
例如将求1×2×3×4×5的阶乘用流程图表示
一个流程图包括以下几部分:
(1) 表示相应操作的框
(2) 带箭头的流程线
(3) 框内外必要的文字说明
流程线不要忘记画箭头,否则难以判定各框的执行次序
-
三种基本结构和改进的流程图
(1) 顺序结构
(2) 选择结构
(3) 循环结构
① 当型循环结构
② 直到型循环结构
以上三种基本结构,有以下共同特点:
(1) 只有一个入口
(2) 只有一个出口
一个判断框有两个出口
一个选择结构只有一个出口
(3) 结构内的每一部分都有机会被执行到。也就是说,对每一个框来说,都应当有一条从入口到出口的路径通过它
(4) 结构内不存在“死循环”
-
由三种基本结构派生出来的结构:
-
用N-S流程图表示算法
N-S流程图用以下的流程图符号
例如将求5!算法用N-S图表示。
-
用伪代码表示算法
伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法
用伪代码写算法并无固定的、严格的语法规则,可以用英文,也可以中英文混用
例如求5!用伪代码表示算法
用计算机语言表示算法
例如求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;
}
-
结构化程序设计方法
采取以下方法保证得到结构化的程序:
(1) 自顶向下;
(2) 逐步细化;
(3) 模块化设计;
(4) 结构化编码。
-
常量和变量
2. 变量:在程序运行期间,变量的值是可以改变的
-
数据类型
- 所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式
- 不同的类型分配不同的长度和存储形式
-
整型数据
1. 整型数据的分类
基本整型(int型):占2个或4个字节(VC6.0)
短整型(short int):VC++6.0中占2个字节
长整型(long int):VC++6.0中占4个字节
双长整型(long long int):C99新增的
2. 整型变量的符号属性
整型变量的值的范围包括负数到正数
可以将变量定义为“无符号”类型
扩充的整型类型:
Ø有符号整型 [signed] int
Ø无符号基本整型 unsigned int
Ø有符号短整型 [signed] short [int]
Ø无符号短整型 unsigned short [int]
Ø有符号长整型 [signed] long [int]
Ø无符号长整型 unsigned long [int]
Ø有符号双长整型 [signed] long long [int]
Ø无符号双长整型 unsigned long long [int]
Ø用long定义长整型变量,如:long a;
Ø分配4个字节存储空间,VC6中和int一样
Ø用unsigned long定义无符号长整型变量,如: unsigned long a; 变量分配4个字节存储空间, VC6中和int一样
Øunsigned long long和long long是 C99后新增的特性,有些编译器不支持这种特性。
-
字符型数据
Ø字符是按其代码(整数)形式存储的
1.字符与字符代码
大多数系统采用ASCII字符集
字母:A ~Z,a ~z
数字:0~9
专门符号:29个:! ” # & ‘ ( ) *等
空格符:空格、水平制表符、换行等
不能显示的字符:空(null)字符(以‘\0’表示)、警告(以‘\a’表示)、退格(以‘\b’表示)、回车(以‘\r’表示)等
-
浮点型数据
Ø字符常量:由单撇号括起来的单个字符或转义字符
Ø整型常量:不带小数点的数值
系统根据数值的大小确定int型还是long型等
Ø浮点型常量:凡以小数形式或指数形式出现的实数
C编译系统把浮点型常量都按双精度处理分配8个字节
-
数据存储溢出问题
-
有符号变量与无符号变量比较问题
出错的原因是,编译器在进行运算时会对不同的数据类型进行隐式转换,有符号型会隐式转成无符号型,造成负数大于
正数不正确的结果,如何避免这个问题呢,有2个方式避免
1. 参与比较的变量在定义时要保持扩展类型一致
2.比较时用强制转换保正类型一致
-
C语言隐式转换规则如下: