C++017(一维数组 数组遍历 越界)
C++017(一维数组 数组遍历 越界)
学习目标
-
定义一维数组
-
访问数组元素
数据时代
我们每时每刻都在产生数据,比如抖音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声明一维数组
· 想使用,先声明
· 声明数组的三要素:数据类型、数组名和数组长度
数据类型 数组名[数组长度];
int n[5];
float m[12];
int、float是数据类型
n、m是数组名
[5]、[12]是数组长度
· 一个数组内所有数的数据类型相同,好比客运列车拉的都是客车车厢
· 不同的数组可以是不同的数据类型,好比有客运列车、货运列车、油罐列车 ….
数据类型 数组名[数组长度];
数组名的命名规则和变量的命名规则相同:
· 只能由字母(AZ,az)、数字(0~9)和下划线“_”组成
· 第一字符不能是数字
· 不能使用C++中的关键字
· 区分英文大小写
变量名、数组名和之后要学的函数名都是标识符。标识符的命名规则都一样
数据类型 数组名[数组长度];
- 在方括号[]内指定数组长度
- 数组长度可以用整型常量,或常量表达式指定
- 数组长度不能小于0
声明数组等于定制了一列列车,列车号、车厢类型、列车长度在定制的时候就定下来了
int a[];×
int a[-3];×
int a [3];√
int a [3*3];√
1.3初始化一维数組
声明的同时进行初始化
int a[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访问数组的元素
- · 程序不能直接使用整个数组进行计算处理,而要逐个元素进行操作
- · 用数组名和下标来唯一地访问数组中的元素,如a[0]表示访问第一个元素
- · 下标代表元素在数组中的序号
数组名[下标]
下标范围: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.访问越界
“越界”:当指定的下标过大时,访问到的内存,就不是这个数组“自己”的内
存。访问的将是其它变量的内存了,具体数值不确定
-
C++的编译器并不判断和指出你的代码“访问越界”了
-
越界使用数组的结果是不可预测的
-
一定要在程序编写时保证不做越界访问
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;
}
本次课程的知识点
- 定义一维数组
- 初始化一维数组
- 访问数组元素
- 访问越界的风险
- 遍历访问数组元素
更多推荐


所有评论(0)