数组的增删改查也是对于初学者来说对数组最好的理解应用了,熟练掌握它们的运用能帮助我们更好的处理数组的问题。并且能加深我们理解数组和循环的关系。
在理解这些之前,我们先要明白数组的结构和基本要素,我们先看一个例子:
int nums[5] = {2,3,5,7,11};
在这里,我们定义了一个int型的数组,这个数组叫nums,5代表这个数组中最多可以存放5个元素。大括号中是这个数组的元素,它们的数据类型要和定义数据类型相匹配。每个元素在数组中的位置可以通过元素下标来进行访问,元素下标命名规则就是数组元素中从左往右,从0开始的顺序数字。
看过解析后我们简单归纳一下数组结构和基本要素:
1.标识符(数组名称nums)
2.数组元素(大括号里存放的数据)
3.元素下标(数据在数组中的位置)
4.元素类型(int)
简单了解数组之后,我们通过一些例子来理解数组的增删改查
1. 数组的增加功能
例1:在一个数组a中插入一个用户输入的数字(假设这个数组是int型数组)
int main()
{
int count = 5; //定义数组长度变量,增加和删除会改变数组长度。
int num; //需要插入的数字和用来交换数字的临时变量
int a[] = {2,8,11,1,5}; //定义一个数组
printf("请输入您需要增加的数字:");
scanf("%d",&num);
//插入数字
a[count] = num; //把输入的数字赋给数组,再将数组总长度+1
count++;
//打印结果
printf("插入数字后的结果是:\n");
for(int i = 0; i < count; i++)
{
printf("%d\t",a[i]);
}
return 0;
}
打印结果是:
](https://imgsa.baidu.com/forum/w%3D580/sign=9c06b0cd59fbb2fb342b581a7f4b2043/89e75037acaf2edd6624f179811001e93b0193bd.jpg)
数组的增加就是把它的长度扩充一位,然后在那个多出来的位置上赋上我们要插入的数据。
2.数组的删除功能
首先我们要理解删除的本质,它不是真正删除数组中的某个数据,而是先找到这个值之后,把它后边的值依次赋给前一个值,最后再把数组长度扣掉一位来实现删除的目的。
如在数组{2,8,11,1,5}中我们想删除8,那么我们只需把8之后的值依次赋给前一个值,即{2,11,1,5,5},最后将总长度减1,得到{2,11,1,5}从而实现删除。
例2:在例1定义的数组中,实现删除它其中一个数字的功能
int main()
{
int count = 5; //定义一个变量来表示数组元素的个数
int a[] = {2,8,11,1,5};
int deleteNum; //定义一个用户想删除的值的变量
int deleteIndex = -1; //定义一个需要删除的战力值的下标,并给它赋一个不可能实现的初值。方便判断(理解这里)
//输入想要删除的数字
printf("请输入您想删除的战力值:");
scanf("%d",&deleteNum);
//开始查找需要删除的数字
for(int i = 0; i < count; i++) //循环次数和数组元素个数相同
{
if(deleteNum == a[i]) //输入的战力被找到
{
deleteIndex = i; //记录下找到的值的下标
break; //找到后直接跳出循环,提升效率
}
}
//根据判断它是否找到,执行后续操作
if(deleteIndex == -1) //没有找到的情况
{
printf("没有找到您想删除的战力值。\n");
}
else //找到的情况
{
for(int i = deleteIndex; i < count - 1; i++) //找到之后,数组的元素个数要比原来少一个,所以是i < count - 1
{
a[i] = a[i + 1]; //把要删除的后一个值依次赋给前一个值
}
//删除完毕后,数组的总长度要减1
count--;
}
//打印结果
printf("删除后的结果为:\n");
for(int i = 0; i < count; i++)
{
printf("%d\t",a[i]);
}
return 0;
}
打印结果是:
](https://imgsa.baidu.com/forum/w%3D580/sign=3ecc6664bb4543a9f51bfac42e168a7b/f6198b539822720e81265a6a77cb0a46f01faba2.jpg)
定义元素下标并给初值就是为了方便我们进行判断没有找到的情况。因为下标不可能是负数。
3.数组的修改功能
想要修改数组中的某个元素,我们需要先判断用户输入的数字是不是数组里的元素,如果是我们需要找到它所在的位置(下标),然后直接给它赋一个修改后的新值即可。
例3:在例1的数组中将11改成45并打印结果。
int main()
{
int a[5] = {2,8,11,1,5}; //定义数组
int findNum; //定义需要查找的数字的变量
int temp; //修改数字的临时变量
int findIndex = -1; //要查找的数字的元素下标并服初值
//开始输入
printf("请输入您要查找的数字:");
scanf("%d",&findNum);
//开始查找
for(int i = 0; i < 5; i++)
{
if(findNum == a[i])
{
findIndex = i; //如果找到直接赋值并跳出循环
break;
}
}
//判断是否找到的情况
if(findIndex == -1)
{
printf("没有查找到该数字!\n");
}
else
{
printf("请输入修改后的数字:"); //输入的数字直接赋值给他
scanf("%d",&temp);
a[findIndex] = temp;
}
//打印结果
printf("修改后的数组是:\n");
for(int i = 0; i < 5; i++)
{
printf("%d\t",a[i]);
}
return 0;
}
打印结果是:
](https://imgsa.baidu.com/forum/w%3D580/sign=a7e3f19d2a9759ee4a5060c382fa434e/f31a2aaccbef7609e42f0c0f22dda3cc7dd99e6e.jpg)
不难看出程序的执行过程,我们先找到需要删除的数组元素直接赋值,就达到了修改的目的。
4.数组元素的查询功能
从数组的增,删,改中我们不难发现,想实现这三个功能数组必须先查询。所以查询是实现增删改的基础。只要了解了数组的增删改,查询也就不难实现了。下面我们用一个简单的小例子来理解它。
例4.还是例1的数组,要求用户从键盘录入一个数,程序判断这个数是不是数组中的元素
int main()
{
int a[5] = {2,8,11,1,5}; //定义数组
int findNum,index; //查找的数字变量和下标
//开始查找
printf("请输入数字:");
scanf("%d",&findNum);
int i;
for(i = 0; i < 5; i++)
{
if(findNum == a[i]) //如果输入的数字恒等于数组中某个i的值,即输入的数字和数组中i的元素是相同的
{
index = i; //记录这个数字所在的下标
printf("您输入的数字在数组中!它所在的下标是%d。\n",index);
break; //数组的查询是挨个比较,所以找到需要用break跳出循环
}
}
if(i == 5) //元素下标恒等于5代表输入的数字已经和数组的元素全部比较过一遍都不匹配。
{
printf("没有您想找的数字!\n");
}
return 0;
}
如果输入的数字在数组中,打印结果为:
](https://imgsa.baidu.com/forum/w%3D580/sign=1972b0985f43fbf2c52ca62b807fca1e/f6cdc655564e92580e27137e9082d158cdbf4e7b.jpg)
如果输入的数字不在数组中,打印结果为:
](https://imgsa.baidu.com/forum/w%3D580/sign=89890bc40f4f78f0800b9afb49300a83/c2834efab2fb43161f46efea2ca4462308f7d331.jpg)
最后思考一个问题:为什么我们找到数字之后需要用break直接跳出循环呢?
- 因为我们输入的数字是和数组里的元素挨个进行比较的,如果不加break语句,输出结果里不管有没有找到都会打印出来,如下所示:
](https://imgsa.baidu.com/forum/w%3D580/sign=34695db98a18367aad897fd51e728b68/1416014d510fd9f95312c5f9292dd42a2934a40d.jpg)
找到数字之后它还会和其他的数字进行比较,并得出没有找到的结论。所以加break不仅可以节省资源和时间,还能避免程序犯一些逻辑方面的错误。
总结:
- 数组的增删改查是我们学习代码的基本,它将数组和循环灵活的结合在一起,只要搞清楚它们的原理,就能更好的帮助我们学习更复杂的代码。希望这篇笔记能帮助同学们更好的理解数组和循环的使用实现数组的增删改查。