1、C+程序设计基础,第5章 数组,5.1 一维数组5.2 二维数组5.3 字符数组,本章主要内容,什么是数组?,为处理问题方便,可以把具备相同数据类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C+语言中,数组属于构造类型数据。一个数组能够分解为多个数组元素,这些数组元素可以是基本的数据类型或是构造类型。因此,按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。,5.1 一维数组,只有一个下标的数组叫一维数组。 数组的定义:类型说明符 数组名常量表达式;,例如: int a10; 定义了一个整数型数组,数组名为a,数组的大小为10,
2、即有10个元素:a0, a1, a2, a3, ,a9.,注意事项,1、数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。 2、数组名是一标识符,数组名的命名必须符合标识符的命名规则。 3、在相同作用域内,数组名不能和程序中其它变量名相同。 4、数组名后方括号中常量表达式表示数组元素的个数,不同于数组的下标。 5、不能在方括号中用变量来表示元素的个数,但可以是符号常数或常量表达式。 6、允许在同一个类型说明中,说明多个数组和多个变量。,5.1.2 一维数组的引用,数组中的各个元素又称下标变量,下标变量的形式为:数组名下标。引用数组元素的方法之一就是采用下标
3、方法。【例5.1】求某宿舍中4位同学英语成绩的平均值。,#include void main() double e1,e2,e3,e4,aver;e1=88.0;e2=96.0;e3=76.5;e4=80.0;aver=e1+e2+e3+e4;aver/=4;cout“aver=“averendl; 在这个例题中,由于涉及要处理的样本很小,可以采用简单变量的方法解决,但如果处理的样本比较大,例如要计算全班同学的英语平均成绩时,宜采用数组解决。,【例5.2】求某班(30位同学)英语成绩的平均值。 #include void main() double e30,aver=0.0;for(int i
4、=0;iei;for(int i=0;i30;i+)aver+=ei;aver/=30;cout“aver=“averendl; ,5.1.3 一维数组的初始化,数组初始化是指在数组说明时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样可以减少运行时间,提高效率。数组元素初始化的方法:初始化表达式按元素顺序依次写在一对 花括号内。例如:int age5=18,21,22,19,20;在定义数组的时候,可以给部分或全部数组元素 赋初值。例如:,(1)可以对全部数组元素赋初值;此时,可以省略“数组长度”。 例如:short a5=1,3,5,7,9; 或者:short a = 1,3,5,7
5、,9; 的作 用是完全一样的。都表示:定义了短整型数组a,a中有5个元素, 它们的初值分别是:a0=1、a1=3、a2=5、a3=7、a4=9 (2)可以对数组的前面部分元素赋初值;此时,不可以省略“数 组长度”。 例如:double f10=3.5,9.7; 它表示:定义了双精度型数组f,f中有10个元素,其中数组元素 f0的初值为3.5,f1 的初值为9.7,f2、f3、f9的初值为 默认值0。,注意: 1.初始化数组的值的个数不能多于数组元素个数。 2.初始化数组的值的个数可以少于数组元素个数。 3.初始化数组的值也不能通过跳过逗号的方式省略。 4.有初始化的数组定义可以省略方括号中的数
6、组大小。 5.只能给元素逐个赋值,不能给数组整体赋值。,如:下面初始化形式: 1、 int age5=1,2,3,4,5,6;()/初始化值个数多于数组元素个数 2、int age5=1,2,3,4;()/省略方式不正确 3、int age5=12,10,15 () /可少于5个 4 int age =1,2,6,10,23,24()/可省略数组大小。 5. int a10=1。 ()/给10个元素全部赋1值,只能写为:int a10=1,1,1,1,1,1,1,1,1,1;,【例5.3】 求Fibonacci数列的前30项,然后输出它们。 注:Fibonacci数列定义为:F(0)=1,F(
7、1)=1,F(n)=F(n-1)+F(n-2)。#include void main() int f30=1,1; /初始化数组前2个元素for(int i=2;i30;i+)fi=fi-1+fi-2;for(i=0;i30;i+)coutfiendl;,【例5.4】求10个元素的数组中元素的最大值、最小值、平均值。#include void main() double a10=1,2,3,4,5,6,7,8,9,0;double max,min,aver;max=min=aver=a0;for(int i=1;imax)max=ai;else if(aimin)min=ai;aver=ave
8、r/10.0;cout“max= “maxendl;cout“min= “minendl;cout“aver=“averendl; ,5.1.4 数组边界检查问题,C+语言与其它高级语言不同,它不进行数组边界检查,这是一件非常危险的事情。因此要求程序员特别注意程序的正确性,在使用数组时,尤其注意数组下标越界问题。,5.2 二维数组,所谓二维数组,就是采用两个下标标识数组元素在数组中的位置.5.2.1二维数组的说明 : 类型说明符 数组名第1维的长度 第2维的长度; 二维数组通常可跟一张二维表格对应起来。其中“第1维的长度”表达了表格的行数,“第2维的长度”表达了表格的列数。可见,二维数组可以表
9、达一个矩阵。 例如:int a34; 它说明了一个3行4列的整型数组,数组名为a。该数组共有34个数组元素,即: a00, a01, a02, a03 a10, a11, a12, a13 a20, a21, a22, a23,5.2.2二维数组的存储,二维数组中的各个数组元素“按行存放”于一片连续的内存空间中。即依次存放完第1行的各个元素之后,再顺次存放第2行的各个元素,。 以int a34;为例,其数组元素的存放顺序是:a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23。,5.2.3 二维数组的引用,二维数组的元素也称为双下
10、标变量,其表示的形式为:数组名下标1下标2这里,“下标1”、“下标2”均为整型常量或整型表达式,它们都是从0开始计数,且增量为1。例如:a34表示a数组的第3行第4列的元素(注意:存在第0行和第0列元素)。,5.2.4二维数组的初始化,二维数组初始化也是在类型说明时给各数组元素赋以初值。对二维数组初始化可按行进行,也可按数组元素排列顺序进行。 例如对数组a43: 方法1:按行初始化: int a43= 80,75,92,61,65,71,59,63,70,85,87,90 ; 方法2:按数组元素排列顺序初始化 int a43= 80,75,92,61,65,71,59,63,70,85,87,
11、90 ; 这两种赋初值的结果是完全相同的。,对于二维数组初始化赋值还有以下说明: 1、可以只对部分元素赋初值,未赋初值的元素自动取0值。 例如:int a33=1,2,3;是对每一行的行首元素赋值,未赋值的元素取0值。初始化后各元素的值为:1、0、0、2、0、0、3、0、0。 例如:int a 33=0,1,0,0,2,3: 赋值后的元素值为:0、1、0、0、0、2、3、0、0。 2、如对全部数组元素赋初值,则第一维的长度可以不给出。 例如:int a33=1,2,3,4,5,6,7,8,9; 可以写为:int a3=1,2,3,4,5,6,7,8,9;,【例5.5】 已知矩阵A如下,编程输出
12、矩阵A中最大元素所在的行号和列号。程序如下: #include void main() double A34=1,2,3,4,9,2,6,5,-8,7,0,0;int max,x,y;,max=A00; x=0; y=0; for(int i=0;imax) max=Aij;x=i;y=j; cout“x=“xendl; cout“y=“yendl;,5.3 字符数组,5.3.1 与“字符”有关的概念回顾1、字符常量:用单引号括起来的一个字符。 2、字符变量:用char来说明的变量,字符变量中只能存放一 个字符。 3、字符串常量:用双引号括起来的一串字符。这里,“一串 字符”可以是任意个字符,
13、并规定:字符串的结尾必须用“0” 作为结束标志。 4、C+语言没有“字符串变量”的概念,必要时,采用字符数 组或者字符指针来解决相关问题,5.3.2 字符数组的概念与说明,用来存放字符型数据的数组叫字符数组,字符数组中的每个元素相当于一个字符变量。字符数组其实也只是一般的数组,但在处理字符串时必须注意:1、字符数组中的每一个元素只能存放一个字符,整个数组可以存放一个字符串;2、必须用一个数组元素来存放字符串结束标志“0”。可见,一个数组长度为n的字符数组,能存放的字符串长度的最大值是n-1。,字符数组的说明方法:char 数组名数组长度; 例如:char c10; 这个例句说明了一个长度为10
14、的字符数组,用它可以处理长度不超过9的字符串(必须预留一个数组元素存放字符串结束标志“0”)。,字符数组的初始化,对一维字符数组进行初始化的方法有三种: 1、用字符串常量对字符数组进行初始化,形式是: char 数组名数组长度= “字符串“; 例如:char c=“C+ program“; 初始化后,c0=C,c1=+,c2=+,c3= ,c4=p,c5=r,c6=o,c7=g,c8=r,c9=a,c10=m,c11=0。 c数组的长度自动定为12。 2、用字符串常量对字符数组进行初始化的另一种形式是: char 数组名数组长度= “字符串“; 例如:char c=“C+ program“;
15、3、用字符常量对字符数组进行初始化,形式是: char 数组名数组长度= 字符0, 字符1, 字符2, ,字符n-1; 例如:char c=C, +, +, ,p,r,o,g,r,a,m;,5.3.4字符串的输出,对于字符串的输出,可以采用下列方法完成。1、用cout输出,格式是: cout字符串或字符数组名; 例如:设有:char s20= “This is a string.”; 则语句couts; 的输出结果是:This is a string.。另外,采用以下直接输出的 方式:cout“This is a string.”,也可以得到相同结果。2、用cout流对象的put方法,格式是:
16、 cout.put(字符或字符变量); 采用这种方法,每次只能输出一个字符,要输出整个字符串,应 采用循环的方法。,【例5.6】 #include void main() char s20= “This is a string.“;int i=0;while(si!= 0) cout.put(si);i+; ,3、用cout流对象的write方法,格式是:cout.write(字符串或字符数组名,个数n);其作用是输出字符串中的前n个字符。 【例5.7】#include void main() char s20= “This is a string.“; cout.write(s,4);该程序
17、的输出结果为:This。,5.3.5字符串的输入,除了可以在程序中利用字符数组初始化的方法或赋值的方法将字符串存放到字符数组中外,还可以采用以下方法输入字符串。但要注意只能用字符数组接收输入的字符串 。1、利用cin直接输入,格式是:cin字符数组名;,【例5.8】#include void main() char s20;cins;couts;运行该程序时,假若键盘输入abcdefg并回车,则输出结果为 abcdefg。但当输入abcd efg并回车,则输出结果为abcd。可见, 用这种方法输入字符串时,cin只能接收空格符之前的部分,而对 空格后部分视而不见。,2、利用cin流对象的get
18、line方法,格式是: cin.getline(字符数组名,输入字符串的最大长度n); 【例5.9】#include void main() char s20;cin.getline(s,20);couts; 运行该程序时,假若键盘输入abcdefg并回车,则输出结果为 abcdefg。当输入ab cdefg并回车,输出结果为ab cdefg。可见,这 种方法输入字符串时,可以接收空格符及其以后部分。,3、利用cin流对象的get方法,格式是:格式1:cin.get(字符数组名,输入字符串的最大长度n);格式2:cin.get(); 【例5.10】#include void main() char s20;char c;cin.get(s,10);couts;c= cin.get();coutc;,