C++语言程序设计 第四章 数组
第 4章 数组
结构体 struct
共用体 union
C++




基本类型
构造类型
指针类型
空类型 void
整 型
实 型
字符类型
枚举类型
数组
本章主讲内容
C++语言程序设计 第四章 数组
数组定义,
★ 数组是 有序 数据的集合
★ 数组中的每一个元素都属于 同一个 数据类型
★ 用一个 统一 的数组名和下标来唯一地确定数组中的元素
★ 数组是一个在内存中顺序排列的由若干相同数据类型的元
素组成的数据集合。
★ 数组的每个元素都有唯一的下标,通过数组名和下标,可
以访问数组的元素,因此数组元素也称为下标变量。下标实
际上就是数组元素在数组中的位置值,不能超出数组下标的
取值范围。
本章主要内容
C++语言程序设计 第四章 数组
4.1 一维数组
4.2 二维数组
4.3 字符数组
C++语言程序设计 第四章 数组
4.1一维数组
C++语言程序设计 第四章 数组
对一维数组定义的说明,
(1) 数据类型是指数组的数据类型,也就是每一个数组元素的数据类,它可
以是任何合法的数据类型(例如, int,char,float和 double等),也可以
是构造类型。
(2) 数组名命名规则和变量名相同,遵循标识符命名规则。
(3) 常量表达式用于指定数组的元素个数 。 它规定了数组的大小, 只能为正
整数 。 数组的下标范围为:, 0”到, 常量表达式 -1”,即最小下标为 0,
最大下标为, 常量表达式 -1”。
(4) 常量表达式中可以包括常量和符号常量, 不能包含变量 。 也就是说,
c++不允许对数组的大小作动态定义, 即数组的大小不依赖于程序运行
过程中变量的值 。
(5) 一个声明语句可以同时声明多个类型相同的变量和数组, 各变量和数组
之间要用逗号分开 。
C++语言程序设计 第四章 数组
举例说明,
int a[ 10] ;
数据类型
数组名
元素个数
C++语言程序设计 第四章 数组
4.1.2 一维数组元素的引用
访问一维数组元素的形式如下,
数组名 [下标 ]
数组下标是由零开始的
例如,a[4]它的各个数组
元素为 a[0],a[1],a[2],a[3]
C++语言规定不能
一次引用整个数组
只能逐个引用数组
中的各个元素
在 c++语言中没有提供
直接处理数组的运算
符,对数组的处理是通
过对数组元素的处理
完成的
C++语言程序设计 第四章 数组
例如,int x,count[10];
则下面引用是合法的,
count[0]=100;
x+=count[5];
下面引用是不合法的,
count[10]=20; //越界
count=20; //数组不能整体赋值
【 例 4.1】 数组元素的引用。
#include<iostream.h>
void main()
{
int a[10];
int i;
for(i=0;i<10;i++)
a[i]=i*2+2;
for(i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
}
程序运行结果如下,
2 4 6 8 10 12 14 16 18 20
C++语言程序设计 第四章 数组
C++语言程序设计 第四章 数组
实例分析
【 例 4.3】 找出一个包含 10个元素的数组中最大
的元素。
分析:找出一个数组中最大元素这类问题可以利
用扫描法解决。即以数组的第一个元素为基准,
向后比较,如果遇到有比基准元素更大的元素,
则将基准元素替换为该元素,直到数组中所有的
元素均被扫描。这时得到的最新的基准元素就是
数组中最大的元素。
#include<iostream.h>
#include<iomanip.h>
void main()
{
int a[10],i,big;
cout<<"please input the numbers:\n";
for(i=0;i<10;i++)
cin>>a[i];
cout<<"the numbers are,";
for(i=0;i<10;i++)
cout<<setw(4)<<a[i];
cout<<endl;
big=a[0];
for(i=0;i<10;i++)
if(a[i]>big) big=a[i];
cout<<"the big number is, "<<big<<endl;
}
程序的运行结果,
please input the numbers,
the numbers are,
15 23 78 36 45 56 99 62 11 30
the big number is,99
C++语言程序设计 第四章 数组
用冒泡法对 n个数排序
冒泡法的思路是:将相邻两个数比较,将较小的数调到前头。
如图所示,
9
8
7
5
2
8
9
7
5
2
8
7
9
5
2
8
7
5
9
2
8
7
5
2
9
8
7
5
2
7
8
5
2
7
5
8
2
7
5
2
8
7
5
2
5
7
2
5
2
7
5
2
2
5
排 序,第一轮 第二轮 第三轮 第四轮
比较次数,4 3 2 1
C++语言程序设计 第四章 数组
4.2二维数组
4.2.1 二维数组的定义
二维数组定义的一般形式为,
数据类型 数组名 [常量表达式 1][常量表达式 2];
第一维通常称
“列”
第二维通常称
“行”
a[0][1]
a[1][1]

行 0 1 2 3
0
1
2
a[0][0] a[0][2] a[0][3]
a[1][0] a[1][3] a[1][2]
a[2][0] a[2][1] a[2][2] a[2][3]
C++语言程序设计 第四章 数组
数组在内存中的存储,
C++语言程序设计 第四章 数组
4.2.2 二维数组元素的引用
多维数组在引用时和一维数组一样,使用的是数组的各个元素,而不是数组名。
二维数组的元素的表示形式为,数组名 [下标 ][下标 ]
如 a[ 2][ 3]。下标可以是整型表达式,如 a[ 2-1][ 2*2-1]。 不要写成 a[ 2,
3],a[ 2-1,2*2-1]形式。
数组元素可以出现在表达式中,也可以被赋值,例如,
b[ 1][ 2] =a[ 2][ 3]
常出的错误,
int a[ 3][ 4] ;

a[ 3][ 4] =3;
定义 a为 3× 4的数组,它可用的行下标值最大为 2,列下标值最大为 3。用 a[ 3][ 4]
超过了数组的范围。
C++语言程序设计 第四章 数组








1.分行给二维数组赋初值。
如, int a[ 3][ 4] ={{1,2,3,4},{5,6,7,8},{9,10,11,
12}};
2.将所有数据写在一个花括弧内,按数组元素在内存中的排列顺
序对各元素赋初值。
如,int a[ 3][ 4] ={1,2,3,4,5,6,7,8,9,10,11,
12};效果与前相同。但以第 1种方法为好,一行对一行,界限清楚。
3.可以对部分元素赋初值。
如, int a[ 3][ 4] ={{1},{5},{9}};
int a[ 3] [ 4] ={{1},{0,6},{0,0,11}};
int a[ 3] [ 4] ={{1},{5,6}};
4,如果对全部元素都赋初值 (即提供全部初始数据 ),则定义数组时对
第一维的长度可以不指定, 但第二维的长度不能省略 。
如, int a[ 3] [ 4] ={1,2,3,4,5,6,7,8,9,10,11,12};
int a[ ] [ 4] ={{0,0,3},{},{0,10}};
C++语言程序设计 第四章 数组
二维数组程序举例
【 例 4.6】 从键盘上为数组 a[2][3]输入任意整数值,显示该数组,找出该数组
的最大元素及其下标。
#include<iostream.h>
main()
{
int a[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{
cout<<"a["<<i<<"]["<<j<<"]
= ";
cin>>a[i][j];;
}
for(i=0;i<2;i++)
//显示数组 a
for(j=0;j<3;j++)
cout<<a[i][j]<< " ";
int h,l,Max=a[0][0]; //找出该数组的
最大元素及其下标
for(i=0;i<2;i++)
for (j=0;j<3;j++)
if(Max<a[i][j]) { Max=a[i][j];h=i;l=j;}
cout<<"Max,
"<<"a["<<h<<"]["<<l<<"]="<<a[h][l]<<
endl;
}
C++语言程序设计 第四章 数组
4.3 字符数组
4.3.1定义
字符数组就是数组元素是字符型的数组,
简称为字符数组。定义的一般形式,
char 数组名 [常量表达式 ];
例如,char mystring[256];
字符数组的定义和声明同普通数组没有
什么区别,主要的不同之处在于字符数
组元素的初始化与使用方法。
C++语言程序设计 第四章 数组
4.3.2 字符数组的初始化
1.用字符赋初值
例如, 如下语句,
char a1={ 'I ','B ','M '}
说明,
(1) 如果花括弧中提供的初值个数
(即字符个数)大于数组长度,
则在编译时,系统会提示为语法
错误。如果初值个数小于数组长
度,则只将这些字符赋给数组中
前面那些元素,其余元素由系统
自动定为空字符(即‘ \0 ’)。
(2) 如果提供的初值个数与定义的数
组长度相同, 则在定义数组时可
以省略数组长度说明, 系统会自
动根据初值个数确定数组长度 。
2.用字符串赋初值
形式 1,char <数组名 >="字符
串 "
形式 2,char <数组名 >={"字符
串 " }
这两种形式产生的效果是相同
的, 它们会产生一个以字符串
常量中的每个字符为数组元素
且在末尾加个 " \0"的特殊数组 。
C++语言程序设计 第四章 数组
4.3.3字符数组的使用
1.对字符数组的赋值
(1) 在声明语句中对字符数组赋初值。
例如,char s1[]="program"; char s2[]={'B ','A ','S ','I ','C '};
(2) 在程序中对字符数组的下标变量赋值。
例如,
char s[4];
s[0]= ‘A ’;s[1]= ‘B ’;s[2]= ‘C ’;s[3]= ‘\0 ’;//直接利用赋值语句赋值
2.字符数组的输入输出
(1) 将整个字符数组作为字符串处理。
对于数值型数组, 只能逐个元素地进行输入和输出 。 而对于字符数组可以作
为字符串一次性地进行输入和输出 。
(2) 字符数组元素的输出
字符串可以整体输出,也可以将字符串的每一个值单独输出
C++语言程序设计 第四章 数组
4.3.5 字符串处理函数
1,求字符串长度的函数 strlen
格式, strlen( 字符数组 )
功能,测试字符串的长度, 即字符串中包含的字符个数, 不包括字符串结束
标志
‘ \0’在内 。 该函数的返回值为字符的个数 。
【 例 4.10】 输入任意字符串, 求出其长度 。
#include <iostream.h>
#include <string.h>
void main()
{
char s[50];
cout<< "Please input a string, ";
cin>>s;
cout<< "The length of string '"<<s<< " ' is"<<strlen(s);
C++语言程序设计 第四章 数组
2,字符串拷贝函数 strcpy
格式, strcpy (字符数组名 1,字符数组名 2)
功能,把字符数组 2中的字符串拷贝到字符数组 1中 。 串结束标志 ‘ \0’也一 同拷
贝 。 字符数组 2,也可以是一个字符串常量 。 这时相当于把一个字符串赋予一个字符
数组 。 如,
char s1[10],s2[]="Happy";
strcpy(s1,s2);
s1[2] s1[3] s1[4] s1[5] s1[6] s1[7] s1[8] s1[9] s1[1] s1[0]
p p y \0 \0 \0 \0 \0 a H
(1) 字符数组 1的长度必须定义的足够大, 以便能容纳被拷贝的字符串 2。 也就是说字符串 1的
长度不能小于字符串 2的长度 。
(2) 字符数组 1必须写成数组名形式 ( 如 s1), 字符数组 2可以是字符数组名, 也可以是字符
串常量 。 如,strcpy(s1,"Hello");作用与前面相同 。
(3) 数组之间不能相互赋值, 即不能使用赋值表达式语句将一个字符数组或一个字符串常量
赋给另一个字符数组 。
C++语言程序设计 第四章 数组
3,字符串连接函数 strcat
格式, strcat( 字符数组 1,字符数组 2)
功能,连接两个字符数组中的字符串, 把字符串 2接到字符串 1的后面, 结果放在字
符数组 1中 。

char s1[50]= "happy";
char s2[10]= "birthday";
strcat(s1,s2);
cout<<s1;
程序运行后的输出结果为
happybirthday
说明,
(1) 字符数组 1的长度必须定义得足够大, 以便能容纳
连接后的新字符串 。
(2) 在进行连接前,两个字符串的后面都有一个 '\0',
连接时将字符串 1后面的 '\0'取消,只在新串的最后保
留 '\0'。
C++语言程序设计 第四章 数组
4,字符串比较函数 strcmp
格式,strcmp( 字符串 1,字符串 2)
功能,比较字符串 1和字符串 2。
如,strcmp(s1,s2);
strcmp("Hello","here");
strcmp(s1,"here");
比较的规则为:将字符串 1与字符串 2按从左到右的顺序逐个字符地进行比较 ( 按 ASCII码值
大小 ), 直到出现不相同的字符或遇到 '\0'为止 。 若全部字符都相同, 则认为两个字符串相等;
若出现不同的字符时, 则以第一对不相同的字符的比较结果为准 。
如果字符串 1小于字符串 2,该函数返回一个负整数值;如果字符串 1等于字符串 2,该函数返
回 0;如果字符串 1大于字符串 2,该函数返回一个正整数值 。
例如
if(strcmp(weekday," SUNDAY")==0)
cout<<" Today we have a party," <<endl;
注意:对两个字符串的比较, 不能用关系运算符, 如以下形式,
if(s1==s2) cout<< " s1=s2";
而只能用
if(strcmp(s1,s2)= =0) cout<< " s1=s2"