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