网站建设的战略作用网页设计与网站建设教程
一维数组的定义和初始化
数组的定义:
数据类型 数组名[数组长度];
其中长度必须是大于 0 的整型常量(C99 支持变量,但是 VS 系列的编译器都不支持),比如 10,4+6 都可以。
int main()
{int arr[10]; //未初始化,其值为随机值int brr[10] = {1,2,3,4,5,6,7,8,9,10};//刚刚好int crr[] = {1,2,3,4,5,6,7,8,9,10}; //crr 长度为 10,常用int drr[10] = {1,2,3,4,5}; //只初始化一部分则剩余部分为 0//int err[5] = {12,3,4,5,6,7,8,9,10};//错误,数组长度不够,数据太多return 0;
}
数组如果只初始化一部分则剩余部分为 0
一维数组的使用
如果需要将红色格子的数据改为 100,则写成 brr[3] = 100;
下标可以是整型变量
int arr[10]; //数组定义时,[ ]中必须是常量,表示长度
arr[0] = 100;//数组使用时,[ ]中可以使用常量和变量,表示下标
小提示变量和函数定义时前面有数据类型,使用时没有数据类型,通过这个就能区分定义和使用。
例:通过下标循环遍历数组中的每个元素
//输出 brr 数组的内容
for(i=0;i<10;i++)
{printf("%d ",brr[i]);
}
printf("\n");
例:对 brr 数组进行反转,即第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换
int main()
{int brr[10] = {1,2,3,4,5,6,7,8,9,10};int tmp; //用于交换数据int len = sizeof(brr)/sizeof(brr[0]);//求数组长度的标准公式for(int i=0;i<len/2;i++) //只需要交换一半{tmp = brr[i];brr[i] = brr[len-i-1];brr[len-i-1] = tmp;}for(int i=0;i<len;i++){printf("%d ",brr[i]);}return 0;
}
一维数组数组名 arr 表示整个数组有如下情况
1.在定义数组的同一个函数中,求 sizeof(arr),表示整个数组的字节数;
2.在定义数组的同一个函数中,求&arr+1,表示加整个数组的字节大小;
其它情况,数组名都表示数组首元素的地址。
在定义数组的同一个函数中,可以使用 sizeof(arr)/sizeof(arr[0]),表示
数组长度。
例:折半查找。在从小到大的数组中查找关键字 key,找到返回其下标,失败返回-1。
形式如:int BinSearch(int arr[],int len,int key);
算法描述:每次取有序待查区域的中间值和 key 进行比较,如果相等则找到,如果 key 值比中间值大,则说明 key 在数列的右半段,则在右边继续比较,否则在左边继续查找
#include <stdio.h>
//在长度为 len 的升序数组 arr 中查找关键字 key
//如果找到返回下标,失败返回-1
int BinSearch(int arr[],int len,int key)
{int low = 0; //起始下标int high = len-1; //结束下标int mid; //中间下标while(low <= high){mid = (low+high)/2;if(key == arr[mid]) //查找成功return mid;else if(key > arr[mid]) //在 mid 右边查找low = mid+1;else //在 mid 左边查找high = mid - 1;}return -1; //查找失败
}int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};int index;for(int i=0;i<12;i++){index = BinSearch(arr,sizeof(arr)/sizeof(arr[0]),i);if(index < 0)printf("%d 不在数组中\n",i);elseprintf("%d 在数组的%d 号下标\n",i,index);}return 0;
}
折半查找由于其优越的时间复杂度 O(logn),在查找领域非常的优秀
其它类型的一维数组
#include<stdio.h>
int main()
{char arr[] = {'a','b','c','d','e'}; //长度为 5 个的字符数组short brr[] = {1,2,3,4,5}; //长度为 5 个的 short 数组int crr[] = {10,20,30,40,50}; //长度为 5 个的 int 数组float drr[4] = {12.5,23.5,45.0}; //长度为 4 个的 float 数组double err[] = {12.3,45.6,67.8}; //长度为 3 个的 double 数组int i;for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)//输出 arr 的内容{printf("%c ",arr[i]);}printf("\n");for(i=0;i<sizeof(brr)/sizeof(brr[0]);i++)//输出 brr 的内容{printf("%d ",brr[i]);}printf("\n");for(i=0;i<sizeof(crr)/sizeof(crr[0]);i++)//输出 crr 的内容{printf("%d ",crr[i]);}printf("\n");for(i=0;i<sizeof(drr)/sizeof(drr[0]);i++)//输出 drr 的内容{printf("%f ",drr[i]);}printf("\n");for(i=0;i<sizeof(err)/sizeof(err[0]);i++)//输出 err 的内容{printf("%f ",err[i]);}printf("\n");return 0;
}
二维数组的定义和初始化
二维数组也是通过下标访问其中的元素,且下标从 0 开始,例如将红色格子的值修改成 100,应该写成: crr[1][2] = 100;
下面的代码将输出整个 crr 的内容:
#include<stdio.h>
int main()
{int crr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};for(int i=0;i<3;i++) //输出每一行的元素{for(int j=0;j<4;j++) //输出每一行中的每一列元素{printf("%-3d",crr[i][j]);//-3d 表示每个数字输出占 3 格,左对齐}printf("\n");}return 0;
}
二维数组可被看作是一种特殊的一维数组:它的元素又是一个一维数组
二维数组的使用
例:有一个 3×4 的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
分析:遍历整个数组,用一个变量保存最大值,另外两个变量分别保存最大值对应的行,列下标。
#include<stdio.h>
int main()
{int arr[3][4] = {1,2,3,4,5,6,70,18,9,10,11,12};int max = arr[0][0]; //保存最大值int row = 0; //保存最大值的行下标int col = 0; //保存最大值的列下标for(int i=0;i<3;i++){for(int j=0;j<4;j++){if(max < arr[i][j]) //max 已经不是最大值,需要更新{max = arr[i][j];row = i;col = j;}}}printf("最大值是%d,位于数组的第%d 行,第%d 列\n",max,row+1,col+1);return 0;
}