[注] 使用数组的目的,是为了方便地批量定义变量
[前言] c语言中提供了数组,可以实现批量地定义相同类型的变量,在我们需要多个相同类型的变量时,可以选择使用数组
数组分为两类:一维数组,二维数组
一、一维数组
1.一维数组的定义
类型符 数组名[元素个数];
类型符,可以是int,char,double等等这些基本数据类型,类型符决定了数组中多个变量的类型
数组名,数组名必须符合标识符的命名规则
元素个数,表示数组一次性定义的变量的个数(数组中包含的元素个数)
例如:int array[4];
2.一维数组---元素表示
int array[4];
[注] 数组中元素的下标是从0开始的
array[0]
3.一维数组的特点
数组中每个元素的类型都相同
数组中每个元素是由数组名和下标唯一确定的
数组元素下标从0开始,最大到元素个数减1
数组元素之间是紧密相连的
盖住数组名,剩下的部分就是数组的类型
数组所占总内存空间,是由数组的类型决定的
4.一维数组---初始化
数组的初始化的目的,是为了让数组中每个元素都有一个确定的值
//完全初始化
int array[4]={1,2,3,4};
//部分初始化
int array[4]={1,2};//编译器会优先取初始化列表中的值给数组前面的元素赋值,那些未显示初始化的元素默认初始化为0
//数组清空
int array[400]={};
5.一维数组---赋值
//一维数组---赋值
int array[4]={1,2,3,4};
//数组不能整体赋值,只能单个元素单独赋值
array2[0]=10;
array2[1]=array[1];
//通过循环,依次读取数据给数组的每个元素赋值
for (int i=0; i<4; i++)
{
scanf("%d",&array[i]);
}
6.数组下标问题
数组元素的下标是从0开始的
1.数组下标
数组定义时,数组的下标表示的是数组中元素的个数
2.数组元素的下标
使用数组元素时,下标表示的是元素在数组中的位置
3.数组下标越界问题
数组下标使用的合法范围为:0~元素个数-1
数组下标越界可能会导致程序终止
[注] 在程序运行过程中如果发生以下报错信息,一般都是数组使用越界导致的---Thread 1:signal SIGABRT
7.数组排序
int array[10]={7,2,6,3,4,9,5,1,8,10};
冒泡法
思想:
数组中待排序数,从左往右,依次取两两相邻的元素进行比较,前一个元素大于后一个元素,就交换这两个元素
第一趟比较完毕时,所有参与排序元素中最大值放在所有元素的结尾
重复以上步骤,直到所有元素排序完毕
//外层循环,控制比较的趟数
for (int i=1; i<10; i++)
{
//内层循环,控制具体某一趟的比较次数
for (int j=0; j<10-i; j++)
{
if (array[j]<array[j+1])
{
//交换相邻的两个元素
//交换的主角是array[j]和array[j+1]
int temp;
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
//打印数组中的每个元素
for(int i=0;i<10;i++)
{
printf("%d ",array[i]);
}
选择法
思想:
- 取数组中未排序元素中最左边的元素,依次和右边其他元素进行比较,如果前一个比后一个大,交换两个元素
- 第一趟比较完毕时,所有参与排序元素中最小元素,放在所有参与排序元素的最左边
- 重复以上步骤,直到所有元素排序完毕
//外层循环,控制比较的趟数
for (int i=0; i<9; i++)
{
//内层循环,控制具体某一趟的比较次数
for (int j=i+1; j<10; j++)
{
if (array[i]>array[j])
{
//交换相邻的两个元素
//交换的主角是array[i]和array[j]
int temp;
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
//打印数组中的每个元素
for(int i=0;i<10;i++)
{
printf("%d ",array[i]);
}
二、二维数组
1.二维数组的定义
类型符 数组名[元素个数][元素的元素个数];
例子:
int arr[4][4];//这是一个二维数组,这个二维数组具有4个元素,每个元素的类型是int[4]
2.二维数组---元素表示
int arr[4][4];
元素:arr[0],arr[1],arr[2],arr[3]
第一个元素arr[0]
第二个元素arr[1]
第三个元素arr[2]
第四个元素arr[3]
3.二维数组---初始化
//完全初始化
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int array2[3][3] = {{1,2},{4,5,6},{}};
int array3[3][3] = {{},{},{}};
//部分初始化
int array4[3][3] = {{1,2}};
4.其他
二维数组赋值
数组不能整体赋值,只能单个元素单独赋值.
array4[0] = array3[0];
二维数组在使用过程中,数组元素下标不能越界访问.
三、练习
1.将一个5元素数组中元素,相邻的两两相加,找出最大的组合;打印出是哪两个元素
int a[5],sum=0,b=0,x=0,y=0;
for (int i=0; i<5; i++)
{
scanf("%d",&a[i]);
}
for (int i=0; i<4; i++)
{
sum=a[i]+a[i+1];
if (sum>b)
{
b=sum;
x=a[i];
y=a[i+1];
}
}
printf("%d %d\n",x,y);
2.输入10个数,相邻的两个绝不相同。输出每个递增递减序列,并输出有多少个这种序列
1 2 3 2 4 5 6 7 6 3
1 2 3
3 2
2 4 5 6 7
7 6 3
总共:4
#include <stdio.h>
int main(int argc, const char * argv[])
{
int a[10],n=1;
for (int i=0; i<10; i++)
{
scanf("%d",&a[i]);
}
for (int i=1; i<9; i++)
{
if ((a[i-1]-a[i]<0&&a[i]-a[i+1]<0)||(a[i-1]-a[i]>0&&a[i]-a[i+1]>0))
{
printf("%d %d ",a[i-1],a[i]);
}
else
{
printf("%d %d\n",a[i-1],a[i]);
n++;
}
}
printf("\n总共:%d\n",n);
return 0;
}