第五单元 数组
引言: 为什么C++中提供“数组”这一类型?
通过前面的学习,可以编程完成这样一个任务:输入50名同学的身高,但是这样就要定义50个变量,分别储存每位同学的身高。显然,这样的程序代码冗长烦琐,编程效率也很差。其实,在这个任务中,这50个变量的作用和类型都是相同的。那么,可不可以把它们集中在一起定义,存储和操作呢?为此,C++提供了“数组”这一类型。
数组的介绍:
1.数组就是一组相同类型的变量,它们往往为了表示同一对象的统一属性,如一个班级所有同学的身高,全球所有国家的人口数等。
2.数组可以是一维的,也可以是二维或多维的。
3.在C++中,使用一维数组时,一般是从0开始编号,h[i]就是表示第i+1个同学的身高,i称为“下标变量”。
一维数组的定义
重点内容:
1.定义一维数组的格式如下:
类型标识符 数组名[常量表达式];
其中,类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义。数组名必须是合法的标识符。常量表达式的值即为数组元素的个数。例如,“int h[50];”就表示定义一个一维数组h,共50个元素,它们的编号从0开始到49,每个元素都是int类型。
下面的几个定义也是允许的:
int d[50],g[100];
int a[5*10];
#define N50
int b[N];
假设要存储1000个人的期中成绩和性别 可以定义两个数组:
int score[1000];//或者float score[1000];
bool xb[1000];//或者 char xb[1000];
2.一维数组的元素引用
数组定义好后,就可以“引用”数组中的任意一个元素。引用格式为“数组名[下标]”,如h[5],h[i*2+1]等。其中,下标只能为整型常量或整型表达式,值必须在数组定义的下标范围内,否则会出现“下标越界错误”。
需要注意的是,不能一次引用整个数组,只能逐个引用数组的单个元素。例如,对于一个数组a来说,语句“cout<<a;”是不合法的。
3.一维数组的存储结构
数组在计算机内存单元中是连续存储的。程序一旦执行到数组的定义语句,就会开辟出若干字节的内存单元。例如,对于已定义的数组“int h[50];”,假设系统给它分配的内存单元地址从1000开始,则“1000”就称为该数组在内存中的“首地址”。由于每个元素都是int类型,占用4个字节,所以h数组在内存中共占用200个字节的空间。也就是说,整个数组所占的内存大小等于数组元素类型的大小乘以数组元素的个数。C++还提供了一个sizeof函数,可以直接求出一个数组所占的内存空间。同时,根据数组在内存单元中的首地址和数组类型,可以计算出该数组中任意第i个元素的首地址。例如,h[49]在内存中的起始地址为1196。
一维数组的输入与输出
本课介绍: 一维数组的输入,输出等操作都是采用循环语句结合下标变化逐个元素进行的。
重点内容:
1.输出数组格式:
int h[100];
for(i=0;i<100;i++) cout<<h[i];
2.输入数组格式:
(1)键盘读入:
int h[100];
for(i=0;i<100;i++) cin>>h[i];
(2)直接赋值:
int h[100],a[20];
for(i=0;i<100;i++) h[i]=0;
foe(i=0;i<20;i++) a[i]=i*2+1;
C++中还提供了两个函数给数组“整体”赋值。
(1)memset函数
memset函数是给数组“按字节”进行赋值,一般用在char型数组中,如果是int类型的数组,一般赋值为0和-1。使用前需要包含头文件:#include<cstring>.
例如,“memset(h,0,sizeof(h));”就是将h数组所有元素均赋值为0。
(2)fill函数
fill函数是给数组“按元素”进行赋值,可以是整个数组,也可是部分连续元素,可以赋任何值。使用前需包含头文件:#include<algorithm>。例,"fill(a,a+10,5);"是将a数组的前10个元素赋值为5。
另外,C++还支持在定义数组的同时,给所有或者部分元素赋值。例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
int a[10]={0,1,2,3,4};//部分赋初值,后面的元素自动初始化为0
int a[]={1,2,3,4,5};//不定义数组长度,直接根据赋值个数定
典型例题:
1.memset和fill函数的作用
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int a[10],b[10],c [10],d[10],i;
meset(a,0,sizeof(a));//将a数组所有元素均赋值为0
for(i=0;i<9;i++) cout<<a<<" ";
cout<<a[9]<<endl;
memset(b,1,sizeof(b));
//将b数组所有元素均赋值为二进制数2^0+2^8+2^16+2^24=1684009
for(i=0;i<9;i++) cout<<b[i]<<" ";
cout<<b[9]<<endl;
memset(c,0,5);
//将c数组前5个字符都赋值为0,所以只能确定c[0]==0,其他元素值不确定
for(i=0;i<9;i++) cout<<c[i]<<" ";
cout<<c[9]<<endl;
fill(d,d+5,8);//将d数组前5个元素都赋值为8,其他元素值不确定
for(i=0;i<9;i+