《第7章 数组》由会员分享,可在线阅读,更多相关《第7章 数组(38页珍藏版)》请在金锄头文库上搜索。
1、第7章 数组,2,本章内容提示:,数组概述 一维数组 二维数组 字符数组,C+语言程序设计,3,7.1数组概述,数组 数组是由若干相同数据类型的数据所组成的有序集合。 数组中每一个数据又称为数组元素,它们之间具有固定的先后顺序。 用一个统一的数组名和下标来唯一地确定数组中的元素。 凡是具有一个下标的数组称为一维数组,具有两个或两个以上下标的数组称为多维数组。,构造数据类型,4,7.2一维数组,一维数组的定义 一维数组定义的一般格式为: 类型说明标识符 数组名常量表达式; 如: int a5; 对定义作几点说明: 数组名的命名遵循C+语言标识符的命名规则; 数组名后边是用 括起来的常量表达式,而
2、不能用圆括号。 常量表达式表明该数组的长度,即数组中元素的个数。 b数组中共有5个元素。 常量表达式中可以包括常量和符号常量,不能包括变量,即不允许对数组的大小作动态定义。,int n; Cinn; int an; /错误,const int n=5; int an; /正确,构造数据类型,5,7.2一维数组,一维数组元素的引用 一维数组中各元素在内存中所占的存储单元按下标序号顺序存放。 C+语言规定:只能逐个引用数组中的元素,而不能一次引用整个数组,而数组元素的表示形式为: 数组名下标 例:把一个一维数组的各元素值清0,并输出各元素值。,#include void main() int i,
3、 b5; for(i=0;i=0;i-) coutbiendl; ,构造数据类型,6,7.2一维数组,一维数组的初始化 可以用赋值语句或输入语句使数组中的元素得到值。 也可以使数组在定义时进行初始化,即在编译阶段使之得到初值。 可以采用几种方法: 在定义数组时对数组元素赋以初值。 int a5=0,1,2,3,4; 将数组元素的初值放在一对大括号内,各值之间用逗号隔开。定义后的结果为:a0=0,a1=1,a2=2,a3=3,a4=4,构造数据类型,7,7.2一维数组,一维数组的初始化的方法: 可以只给一部分元素赋值。 int a5=0,1,2; 这说明a数组中5个元素只有3个元素赋初值。即:a
4、0=0, a1=1, a2=2,后两个元素的值为0。 如果想使一个数组中全部元素值为0,可以写成 int a5=0,0,0,0,0;或int a5=0; 在对全部元素赋初值时,可以不指定数组的长度。 int b5=0,1,2,3,4; 可写成: int b=0,1,2,3,4;,构造数据类型,8,例7.2 求Fibonacci数列的前20项。,问题: 1202年,意大利数学家斐波那契出版了他的算盘全书。他在书中提出了一个关于兔子繁殖的问题: 如果一对兔子每月能生一对小兔(一雄一雌),而每对小兔在出生后的第三个月里,又能开始生一对小兔,假定在不发生死亡的情况下,由一对出生的小兔开始,50个月后会
5、有多少对兔子? 分析: 发现有规律的数列1、1、2、3、5、 从第3项开始,每一项都是前两项之和,#include void main() int i,f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) coutendl; couttfi; coutendl; ,例题,9,例4.3,问题: 把有10个元素的数组用冒泡排序法按升序排列。 分析: 冒泡发排序方法: 使较小的值像空气泡一样逐渐“上浮”到数组的顶部,而较大的数值逐渐“下沉”到数组的底部。这种排序技术要排好几轮,每一轮都要比较相邻的数组元素。如果这两个数组元素
6、是按升序排列的,那就保持原样。如果按降序排列,就交换它们的值。,例题,10,例 用冒泡法对10个数排序,排序过程: (1)比较第一个数与第二个数,若为逆序a0a1,则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在 第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束,11,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,
7、49,49,30,49,27,38,27,38,30,38,12,#include void main() int a10=53,37,89,3,46,78,321,64,5,32; coutaj+1) int t; t=aj; aj=aj+1; aj+1=t; coutendl; cout“第“i+1“次排序后数据的结果:“endl; for(j=0;j=9;j+) coutaj“ “; coutendl;,13,7.3二维数组,二维数组的定义 二维数组定义的一般形式为: 类型说明符号 数组名常量表达式常量表达式 如: int a32; 这就定义了一个3*2(3行2列)的数组。 注意: 不能
8、写成 int a3,2;的形式。 二维数组元素的引用 二维数组元素的表示方式为: 数组名下标下标 注意: 下标不要超过各维的下标值范围。,构造数据类型,14,7.3二维数组,二维数组的定义 可以把二维数组看成元素是一维数组的一维数组。 int a32; 可以把它看作是一个一维数组,它有3个元素a0,a1,a2,这每个元素又是一个分别含2个元素的一维数组: a0 a00,a01 a a1 a10,a11 a2 a20,a21 C+语言中,二维数组中元素在计算机内存中的存放顺序是:按行存放,即先在内存中存放第一行的元素,再放第二行的元素, a00,a01,10,a11,a20,a21,构造数据类型
9、,15,7.3二维数组,二维数组的初始化 分行给二维数组赋初值。 int a32=1,2,5,6,9,10; 这种赋值方法比较直观,把第一对括号内的数值赋给第一行的元素,第二括号内的数值赋给第二行的元素,依此类推。 可以将所有数据写在一个花括号内,这时,计算机自动按数组元素在内存中的排列顺序对各元素赋初值。 int a32=1,2,3,4,5,6; 可以只对数组中部分元素初始化。 int a32=1,5,9; 此处的作用表示:a00元素被赋成1,a10元素被赋成5,a20元素被赋成9,而数组中的其他元素被初始化为0。,构造数据类型,16,7.3二维数组,二维数组的初始化 如果对二维数组的全部元
10、素初始化,则定义数组时第一维长度可以省略,但第二维长度不能省。 int a32=1,2,3,4,5,6; 可写成:int a 2=1,2,3,4,5,6; 也可以只对部分元素初始化而省略第一维的长度,但应分行进行初始化。 int a 2=0,3,10;,构造数据类型,17,例4.5,问题 初始化二维数组,并按行求元素之和,按列求元素之和及所有元素之和。 分析 利用二维数组存储数据。,#include #define M 4 void main() int xMM=1,2,3,4,5,6,7,8,9;int i,j; cout“输出运算前的数组数据内容:“endl; for(i=0;iM;i+)
11、 for(j=0;jM;j+)coutxijt; coutendl; for(i=0;iM-1;i+) for(j=0;jM-1;j+) xiM-1+=xij;xM-1j+=xij;xM-1M-1+=xij; cout“输出运算后的数组数据内容:“endl; for(i=0;iM;i+) for(j=0;jM;j+) coutxijt; coutendl;,例题,18,例4.6,问题 输入四个学生、五门功能的成绩,分别存在二维数组中的前5列上,计算每个学生的平均成绩后,存放在该数组最后一列的对应行上。 分析 利用二维数组保存数据 4X6的二维数组,最后保存平均值,例题,19,例4.6,实现 程
12、序代码,#include void main() float a46,isum; int i,j; coutaij; ,例题,20,例4.6,实现 程序代码(续上),for(i=0;i4;i+) isum=0; for(j=0;j5;j+) isum+=aij; ai5=isum/5; cout“输出四个学生五门课程的成绩和平均分:“endl; for(i=0;i4;i+) for(j=0;j6;j+) coutaijt; coutendl; coutendl; ,例题,21,7.4字符数组,字符数组的定义 用来存放字符型数据的数组为字符数组。 数组中的一个元素中只能存放一个字符,整个数组可以
13、存放一个字符串。 char c5; 字符数组的初始化 逐个为数组中的各元素赋初值 char c5=a,b,c,d,e; 用字符串直接给字符数组赋初值 char str12=“C+ program“; char str12= “C+ program“; char str=“C+ program“;,构造数据类型,22,字符串,字符串 字符串是以0作为结束标志的一个字符序列。 字符串“C.program”包括9个字符,但在内存中占10个字节,最后一个字节存放 0。 注意: 字符串只能用字符数组来保存,不能用一个简单的字符变量保存。 字符数组的特殊初始化方式 可以用一个字符串常量中的字符为字符数组进
14、行初始化。 char c10=“C.program”; 此种方式把一个字符串保存到字符数组c中了,包括0字符。,构造数据类型,23,典型字符串函数,提供了一系列字符串操作函数,这些函数都包含在头文件string.h中,要调用字符串处理函数时,要包含string.h文件。 其中经常会用到的字符函数包括: strcpy strcat strcmp strlen strstr,24,strcpy函数,strcpy()函数原型说明如下: char *strcpy(char *to,const char *from); 功能: 该函数将from字符串中的内容复制到to字符串中,其中s2的字符串是已知的。
15、 注意: 构成to的字符串必须足够大,以便保存包含在from中的字符串。否则,to字符串将会溢出,这很可能会导致系统崩溃。 例4.9 : 使用字符串拷贝函数将一个已知字符串赋值给一个字符数组。,#include #include void main() char s130=“first“; char s220=“second“; char s310=“third“; char s430; strcpy(s4,s1); strcat(s4,s2); strcat(s4,s3); cout“s4:“s4endl; coutstrcat(s1,strncat(s2,s3,3)endl; ,例题,25,strcat函数,strcat()函数的原型说明如下: char *strcat (char