C++017(一维数组 数组遍历 越界)

学习目标

  1. 定义一维数组

  2. 访问数组元素

数据时代

我们每时每刻都在产生数据,比如抖音APP会根据你看过的视频,收集你的喜好,从而推荐更多你喜欢的视频。你在互联网上每一个操作都会变成数据记录下来。那么如何记录如此庞大的数据集合呢?

在C++程序中如果要记录庞大的数据,一个个定义变量的方法会显得太笨重。C++早就替我们想了办法来批量存储数据,那就是数组!

排队报身高

5位同学排好了队,老师报数,相应的同学就说出自己的身高

老师报数

老师可以从1到5报数,也可以从5到1报数,还可以跳着报数

用变量保存身高(一个学生一个变量)

int a=110,b=112,c=113,d=120,e=123;
int x;
cin>>x;
switch (x) {
    case 1:cout << a;break;
    case 2:cout << b;break;
    case 3:cout << c;break;
    case 4:cout << d;break;
    case 5:cout << e;break;

}

如果有40位同学?100位同学?500位…

用变量保存身高(一个学生一个变量)

int a=110,b=112, c=113,d=120,e=123,

int x;

cin>>x; // 老师报数
switch (x) {
    case 1:cout << a;break;
    case 2:cout << b;break;
    case 3:cout << c;break;

    ..

需要添加更多的变量

}

用数组保存所有学生的身高数值

int n[5]={110,112,113,120,123};//身高数组

int x;

cin>>x;// 老师报数

cout << n[x-1];//输出对应位置的学生的身高
int n[500]={110, 112, 113, 120, 123, ...... } ;

int x;

cin>>x;// 老师报数
cout << n[x-1];//输出对应位置的学生的身高

1.什么是数组

  1. · 数组是一组数据类型相同的数,每个数称为数组的元素
  2. · 数组好比是一辆火车,火车上有很多车厢,每节车厢对应一个数组元素
  3. · 数组有一维数组、多维数组之分
  4. · 数组名后跟一个方括号,则称之为一维数组

1.2声明一维数组

· 想使用,先声明
· 声明数组的三要素:数据类型、数组名和数组长度

数据类型 数组名[数组长度];

int n[5];
float m[12];
int、float是数据类型
n、m是数组名
[5]、[12]是数组长度

· 一个数组内所有数的数据类型相同,好比客运列车拉的都是客车车厢
· 不同的数组可以是不同的数据类型,好比有客运列车、货运列车、油罐列车 ….

数据类型 数组名[数组长度];

数组名的命名规则和变量的命名规则相同:
· 只能由字母(AZ,az)、数字(0~9)和下划线“_”组成
· 第一字符不能是数字
· 不能使用C++中的关键字
· 区分英文大小写

变量名、数组名和之后要学的函数名都是标识符。标识符的命名规则都一样

数据类型 数组名[数组长度];
  1. 在方括号[]内指定数组长度
  2. 数组长度可以用整型常量,或常量表达式指定
  3. 数组长度不能小于0

声明数组等于定制了一列列车,列车号、车厢类型、列车长度在定制的时候就定下来了

int a[];×

int a[-3];×

int a [3];√

int a [3*3];√

1.3初始化一维数組

声明的同时进行初始化

int a[3]={1,2,3};
数据类型 数组名[数组长度]={初始值列表};
  1. · 赋值运算符=后跟大括号{},{}内是数组的初始值列表
  2. ·{}内各个值之间用逗号,分开
  3. · 初始值的个数必须 <= 数组长度(可以少,不能多)
其他几种初始化一维数组的方式
部分初始化  int a[3]={1,2};→2个?未指定值的部分默认赋值为0
全部初始化为0
int a[3]={0,0,0};或int a[3]={0};简写只适用于全部初始化为o的情况可以简写为={0}
不指定长度初始化
int a[]={1,2,3};内数据的个数决定了数组的长度

初始值的个数必须 <= 数组长度(可以少,不能多)

int a[3]={1,2,3,4};

[Error] too many initializers for 'int [3]'
语法错误!

意思是等待上车的人比座位多。

只能在数组声明时为数组整体赋初值,分开会有编译错误

int a[3]={1,2,3};
int a[3];
a={1,2,3};
[Error] assigning to an array from an initializer list
在声明之外,单独进行整体赋值。语法错误!
int ar[10]=1;语法错误。初始值需要用注释

int ar [10]={1};只有ar[0]为1,其他元素为0

int ar[10]={1,1,1,1,1,1,1,1,1,1};

int ar[]={1,1,1,1,1,1,1,1,1,1};

1.4访问数组的元素

  1. · 程序不能直接使用整个数组进行计算处理,而要逐个元素进行操作
  2. · 用数组名和下标来唯一地访问数组中的元素,如a[0]表示访问第一个元素
  3. · 下标代表元素在数组中的序号

数组名[下标]

下标范围:0到“数组长度-1’

任何一个数组第一个元素的下标都为0
任何一个数组最后一个元素的下标都为数组长度-1

一旦声明了数组,C++就会为该数组分配一串连续的存储单元数组a的存储格式如右图所示

声明整型数组a,长度3

int a[3];

数组a的存储方式

a[0]a[1]a [2]

· 整型数组a有三个元素,分别是a[0]、a[1]、a[2]
· 上述数组中没有a[3]元素,因为数组从下标0开始到下标(数组长度-1)结束

数组元素可以当做变量使用:进行赋值,参与运算…

int a [3]={0};

a [0]=1;

a [1]=2;

a [2]=3;

cout << a[0]+a[1]+a[2];
执行的语句 数组a的值
int a[3]={0}; a [0] a [1] a [2]
0 0 0
a [0] a [0] a[1] a [2]
1 0 0
a [1] a [0] a[1] a [2]
1 2 0
a [2] a [0] a[1] a [2]
1 2 3

cout<<a[0]+a[1]+a[2];输出6

2.访问越界

“越界”:当指定的下标过大时,访问到的内存,就不是这个数组“自己”的内
存。访问的将是其它变量的内存了,具体数值不确定

  1. C++的编译器并不判断和指出你的代码“访问越界”了

  2. 越界使用数组的结果是不可预测的

  3. 一定要在程序编写时保证不做越界访问

2.1用循环语句遍历数组(的所有元素)

· 把所有元素都查看一遍的做法通常被称为遍历

· 可以从头到尾正向遍历,也可以做反向遍历

正向遍历方式一

int a[5]={1,2,3,4,5};

for(int i=0;i <= 4;i++) {

cout << a[i] << endl;
for循环从0到长度-1,下标:i
正向遍历方式二

int a [5]={1,2,3,4,5};

for(int i=1;i <= 5; i++) {

cout << a[i-1] << endl;
for循环从1到长度,下标:i-1

运行结果:

1

2
3

4

5

2.2反向遍历(举一反三)

反向遍历代码怎么写?

for循环从长度-1到0下标:i

int a[5]={1,2,3,4,5};
for(int i=4;i>=0;i --)
{
	 cout << a[i]<< endl;
}

for循环从长度到1下标:i-1

int i=5;i>=1;i --
FOR(int i=5;i>=1;i--)
{
	cout << a[i-1]<< endl;
}

运行结果:

5
4

3

2

1

输入数据给数组

输入20个数放入整数数组,怎么做?

int a [20]={0};

cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4];

cin>>a[5]>>a[6]>>a[7]>>a[8]>>a[9];

cin>>a[10]>>a[11]>>a[12]>>a[13]>>a [14];

cin>>a[15]>>a[16]>>a[17]>>a[18]>>a[19];

重复、代码太长、易出错

简化

int a [20]={0};
for(int i=0;i <= 19;i++) {
cin>>a[i];
用循环来做

下面代码的做了什么?

#include<iostream>
using namespace std;

int main () {
    int a [3]={0};1、声明数组并初始化为0
    for(int i=0;i <= 2;i++)2、循环接收输入,存入数组
    cin>>a[i];
    for(int i=0;i <= 2;i++)3、遍历数组、计算并输出
    cout << a[i]+i << endl;
    return 0;
}

功能:每个元素增加元素下标值,即第i个元素的值增加i

1、正序变逆序

【编程挑战】编写一个程序,输入n个数(不超过100),要求程序按输入时的逆序把这n个数打印出来。
【输入】两行。第一行为一个整数n(不超过100)。第二行,n个整
数,中间用空格隔开
【输出】一行n个数(顺序与输入时相反)中间用空格隔开
【输入样例】5

​ 22 3 45 5 19

【输出样例】19 5 45 3 22

解析及伪代码

1.定义什么样的数组?

不超过100个数 inta[100]={0}

2.数组的值从哪里来?常量还是需要输入?

从键盘输入 for循环,逐个输入

3.处理过程是怎样的?

无需处理

4.输出什么?

逆序输出

流程分析

1、申明数值并初始化

int a[100]=-{0}

2、for循环,逐个输入

int n;
cin>>n;
for(int i=0;i<=n-1;i++)
{
    cin>>[i];
}

3、for循环反向遍历输出

for(int i=n-1;i>=0;i--)
{
	cout<<a[i]<<" ";
}

完整代码案例

#include<iostream> 
using namespace std;
int main()
{
	int a[100]={0};
	int n;
	cin>>n;
	for(int i=0;i<=n-1;i++)
	{
		cin>>a[i];
	}
	for(int i=n-1;i>=0;i--)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

2、身高筛选

【编程挑战】篮球校队招新,初选出了10个同学,接下来进行身高筛选。只有身高>=平均身高的才能加入篮球校队。请编写一段程序,输入10个身高(单位厘米),输出所有>=平均身高的身高数值。
【输入】一行10个(100~200之间的)数,空格隔开
【输出】所有>=平均身高的身高数值,空格隔开
【输入样例】156 174 170 164 167 159 169 171 158 162
【输出样例】174 170 167 169 171

#include<iostream> 
using namespace std;
int main()
{
	float a[10]={0};
	float avg=0;
	for(int i=0;i<=9;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<=9;i++)
	{
		avg+=a[i];
	}
	avg/=10;
	for(int i=0;i<=9;i++)
	{
		if(a[i]>=avg)
			cout<<a[i]<<" ";
	}
	return 0;
}

班级分数

【编程挑战】编写一个程序,输入一个班n个学生的成绩(百分制),输出平均分、最高分和最低分。班级学生数不超过45人。
【输入】两行。第一行一个数n(n <= 45),第二行n个分数(空格隔开)
【输出】一行3个数,平均分、最高分和最低分,空格隔开
【输入样例】10

90 78 32 23 56 89 87 90 95 80

【输出样例】72 95 23

#include<iostream> 
using namespace std;
int main()
{
	int n,m;
	cin>>n;//输入人数
	int a[n]={0};
	//输入n个人的成绩 
	for(int i=0;i<=n-1;i++) 
	{
		cin>>a[i];
	}
	//将n个人的成绩进行计算
	//平均分 
	float avg; 
	for(int i=0;i<=n-1;i++)
	{
		avg+=a[i];	
	} 
	avg/=n;
	cout<<"平均分"<<avg<<" ";
	//最高分;
	int height=0;
	for(int i=0;i<=n-1;i++)
	{
		if(a[i]>height)
			height=a[i];
	 } 
	 cout<<"最高分"<<height<<" ";
	 //最低分
	int low=100;
	for(int i=0;i<=n-1;i++)
	{
		if(a[i]<low)
			low=a[i];
	 } 
	 cout<<"最低分"<<" "<<low;  
	return 0;
}

复杂但是逻辑清晰

整合:

#include<iostream> 
using namespace std;
int main()
{
	int n;
	cin>>n;//输入人数
	int a[n]={0};
	//输入n个人的成绩 
	for(int i=0;i<=n-1;i++) 
	{
		cin>>a[i];
	}
	//将n个人的成绩进行计算
	//平均分 
	float avg; 
	int height=0,low=100;
	for(int i=0;i<=n-1;i++)
	{
		avg+=a[i];
		if(a[i]>height)	height=a[i];
		if(a[i]<low)	low=a[i];
	} 
	avg/=n;
	cout<<"平均分"<<avg<<" "<<"最高分"<<height<<" "<<"最低分"<<" "<<low;  
	return 0;
}

本次课程的知识点

  1. 定义一维数组
  2. 初始化一维数组
  3. 访问数组元素
  4. 访问越界的风险
  5. 遍历访问数组元素
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐