数组的学习总结

本文总结了数组的基本概念,包括数组的定义、赋值、使用及其常见类型,如一维和二维数组。特别强调了数组下标的从0开始、初始化时未赋值的元素默认值以及动态数组的使用,还分享了数组在编程题目中的应用和注意事项,如避免越界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识梳理

首先,何为数组。

数组即为一组有着相同类型的变量的集合。在整个数组中的每个元素,都有着自己的下标。

通过数组下标,可以实现对数组元素的访问。
举例:

a[0],a[1],a[2]..........

第二,数组的定义。

数组的定义一般格式为

int(定义类型) a(数组名)[100](定义数组大小)

其中,定义数组的位置可以放在主函数外的开头部分,也可以放在主函数内。

..........
int a[100];
int main()
{
	........
}

or
int main()
{
	int a[100];
}

值得注意的是,当在主函数外定义且未赋值的时候,数组内的所有元素默认为“0”;但是当你在主函数内定义且未赋值,那么数组内所有的元素都会是随机数。

第三,数组的赋值。

你可以在一开始就给数组复赋值。

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

如果你所赋值的元素的个数不够定义数组的个数的话,那么剩下的元素的值将被赋值为“0”;

或者在定义好了之后,再给数组赋值。

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

其中,“i”是数组的下标,这里要注意下标是从“0”开始的,另外一个要注意的是,不要越界,即赋值的元素的量不要超过数组的大小,否则很容易报错。

第四,数组的使用。

数组的使用很简单,在给数组赋值后,只要有具体的下标,便可以确定数组元素。之后便可以像使用普通的“int a”中的“a”一样就可以。

举例

for(int i=0;i<10;i++){
	a[i]=i;
}
//我们给数组的十个元素依次附上0-9的值

for(int i=0;i<9;i++){
	cout<<a[i]+a[i+1];
}
//依次打印每个相邻数组元素的和。

第五,其他数组。

(1)二维数组

这种“a[100]”类型的数组又称为一维数组,既然有一维数组,那么就可以有二维,三维…在这里,我们只讨论二维。

首先,二维数组和一维数组并没有太大差别,定义的方法也是相似。

int  a[100][100];

至于其他的,比如赋值和使用方法也是相似的。

//用双重循环赋值
for(int i=0;i<n;i++){
	for(int t=0;t<m;t++){
		cin>>a[i][t];
	}
}

那么他们不同在哪里呢。
如果说一位数组就像是一行元素,

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

那么二维数组就可以抽象成一个表格,在一些问题上比一维数组更加好用。

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

(2)浅谈动态数组
定义数组时,数组的大小必须是一个常量,为了避免越界,一般来说会定义一个很大的数组。
其实,除了这种解决办法之外,还有另外一种解决方案,那就是“vector”动态数组。
首先,是动态数组的定义。

include<vector>//头文件
vector<int> a ;                                //声明一个int型向量a
vector<int> a(10) ;                            //声明一个初始大小为10
vector<int> a(10, 1) ;                         //声明一个初始大小为10且初始值都为1的动态数组


或者

 int n[] = {1, 2, 3, 4, 5} ;
 vector<int> a(n, n+5) ;              //将数组n的前5个元素作为动态数组a的初值
 vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为动态数组a的初值

接着,是输入输出

a.push_back(n)//向里面插入元素
//或者在已经定义的大小的范围内
vector<int> a(10, 0) ; 
cin >>a[2] ;
cin >>a[5] ;
//输出和普通数组的输出一样
for(i=0; i<a.size()/*这是计算动态数组大小的函数*/; i++)
	cout<<a[i]<<" " ;

题目举例

(1)模拟

描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

在这个题目中,可以使用数组模拟那里有无树木,最后再进行计算。

   int main()
{
    int x,y,n,m,q=0;
    scanf("%d %d",&x,&y);
    int a[x+1]={0};
    for(int i=1;i<=y;i++){
        scanf("%d %d",&n,&m);
        for(int p=n;p<=m;p++){
            a[p]=1;
        }
    }
    for(int i=0;i<=x;i++){
        if(a[i]==0)q++;
    }
    cout<<q;
    return 0;
}

(2)保存数据

描述
将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8。
输入
输入为两行:第一行数组中元素的个数n(1<n<100),第二行是n个整数,每两个整数之间用空格分隔。
输出
输出为一行:输出逆序后数组的整数,每两个整数之间用空格分隔。

在这一题目中,可以用数组保存数据,最后再反向输出数组。

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	int a[n]{0};
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(int i=n-1;i>=0;i--){
		if(i==0)cout<<a[i];
		else cout<<a[i]<<" ";
	}
	return 0;	
}

感悟

1.数组作为一个非常方便并且极为基础的东西,是必须要熟练掌握的,在许多题目中,数组都得到了应用,无论是用来模拟还是保存数据,数组都是必不可少的。
2.在使用数组的时候,一定要注意,不要越界!不要越界!不要越界!,定义的时候要尽量定义大数组,避免因为越界出错。
3.数组的下标是从“0”开始,不是从“1”开始,在计数控制和赋值时一定要注意这件事。
4.定义数组只能用常量!虽然coldblocks中用变量定义也能通过,但是这只是特殊情况,平时一定要养成用常量的习惯!
5.要学会用c/c++中自带的函数来操作数组,比如排序就可以用“sort排序”,可以大大节省时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值