修仙之数组
- 一.数组
- 1.概念
- 2.一维数组
- 2.1 一维数组的创建和初始化
- 2.2 一维数组的使用
- 2.3 sizeof计算数组元素个数
- 3.二维数组
- 3.1 二维数组的创建
- 3.2 二维数组的初始化
- 3.3 二维数组的使用
- 4.数组练习
- 练习1:多个字符从两端移动,向中间汇聚
- 练习2.二分查找
一.数组
1.概念
数组是一组相同类型元素的集合;
从这个概念中我们就可以发现2个有价值的信息:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
• 数组中存放的多个数据,类型是相同的。
2.一维数组
2.1 一维数组的创建和初始化
1.创建一维数组
int arr[i]={0};
double arr[i]={0};
每个数组都有自己的数据类型,如 int-,double-,等等。用[ ]来显示数组的个数,{ }来显示数组的内容。
2数组的初始化
完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};
2.2 一维数组的使用
1.数组下标
int arr[10]={1,2,3,4,5,6,7,8,9}
// 0 1 2 3 4 5 6 7 8
数组的下标是从0开始的,最后一个元素的下标是n-1;
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[7]);//8
printf("%d\n",arr[4]);//5
return 0;
}
2.数组的打印
只要我们产生数组所有元素的下标就可以了,那我们使用for循环产生0~9的下标,接下来使用下标访问就行了。
3 数组的输入
#include<stdio.h>
int main
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
2.3 sizeof计算数组元素个数
sizeof 中C语言是一个关键字,是可以计算类型或者变量大小的,其实 sizeof 也可以计算数组的大小。
#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
这里的结果是:10,表示数组有10个元素。
以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组怎么变化,计算出的大小也就随着变化了。
3.二维数组
3.1 二维数组的创建
int arr[3][5];
double data[2][8];
解释一下:上述代码中出现的信息
• 3表示数组有3行
• 5表示每一行有5个元素
• int 表示数组的每个元素是整型类型
• arr 是数组名,可以根据自己的需要指定名字
data数组意思基本一致。
3.2 二维数组的初始化
这我们主要讲按照行初始化
int arr[3][5]={{1,2},{3,4},{5,6}};
注意:初始化时省略行,但是不能省略列
int arr[][5]={0};
//是可以的。
int arr[3][]={0};
//不可以使用,不知道列数
3.3 二维数组的使用
1。二维数组的输入和输出
访问二维数组的单个元素我们知道了,那如何访问整个二维数组呢?
其实我们只要能够按照⼀定的规律产生所有的行和列的数字就行;以上⼀段代码中的arr数组为例,行的选择范围是0-2,列的取值范围是0~4,所以我们可以借助循环实现生成所有的下标。
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;//遍历行
//输入
for(i=0; i<3; i++) //产生行号
{
int j = 0;
for(j=0; j<5; j++) //产生列号
{
scanf("%d", &arr[i][j]); //输入数据
}
}
//输出
for(i=0; i<3; i++) //产生行号
{
int j = 0;
for(j=0; j<5; j++) //产生列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
4.数组练习
练习1:多个字符从两端移动,向中间汇聚
编写代码,演示多个字符从两端移动,向中间汇聚
通过先打印arr2的数组,再通过左右的替换,把arr2的内容替换掉。其中left左边的可以等以right右边,但不能大于,否则将无法计算。
练习2.二分查找
在一个升序的数组中查找指定的数字n,很容易想到的方法就是遍历数组,但是这种方法效率比较低。
比如我买了一双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4…这样猜吗?显然很慢;二般你都会猜中间数字,比如:150,然后看大了还是小了,这就是二分查找,也叫折半查找。
使用中间值的下标去判断你想要的数字下标,如果大了,就要左边小的;如果小了,就要右边大的,以此累推,最终可以我到想要的数的下标。