南华大学,C.C++计算机,数组
发布时间:2024-10-23
发布时间:2024-10-23
[ ] :数组运算符 构造数据类型之一 单目运算符 数组:具有相同数据类型、有序数据的集合,用数组名标识 优先级(1) 元素:属同一数据类型,用数组名和下标确定 左结合 §7.1 一维数组 不能用( )
第七章 数组
一维数组的定义 定义方式: 数据类型 数组名[常量表达式]; 例 int a[6]; 含6个元素 分别为a[0],a[1],a[2], a[3],a[4],a[5]
合法标识符
0 1 数组名表示内存首地 2
a
址,是地址常量
3 4 5
a[0] a[1] a[2] a[3] a[4] a[5]
表示元素个数 下标从0开始
编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型)
例 int i=15; 例 int data[5]; char c[10]; int data[i]; ( 不能用变量定义数组维数) data[5]=10; score[30],f,avg[20]; //C语言对数组不作越界检查,使用时要 注意 float 例 将数字0~4放入一个整型数组并输出 一维数组的引用
例 int data[5];
#define N 10 #include”stdio.h” 数组必须先定义,后使用 long main() num[N]; 只能逐个引用数组元素,不能一次引用整个数组 { 数组元素表示形式: 数组名[下标] intshort w[2*N]; i,x[5]; for其中:下标可以是常量或整型表达式 (i=0;i<5;i++) x[i]=i; printf(“%d”,x); ( ) for (i=0;i<5;i++) printf(“%d\n”,x[i]); }
一维数组的初始化 初始化方式
int a[5]={1,2,3,4,5}; 在定义数组时,为数组元素赋初值 等价于:a[0]=1; (在编译阶段使之得到初值) a[1]=2; int a[]={1,2,3,4,5,6}; a[2]=3; a[3]=4; a[4]=5;
static int a[5]; 如 int a[3]={6,2,3,5,1}; ( ) 等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; 只给部分数组元素赋初值 ,其他元素系统会自动赋以0值 当全部数组元素赋初值时,可不指定数组长度
说明: int a[5]={6,2,3}; 编译系统根据初值个数确定数组维数 如 数组不初始化,其元素值为随机数 等价于 :int a[6]={1,2,3,4,5,6}; a[3]=0; a[4]=0 等价于: a[0]=6; a[1]=2;a[2]=3; 对static数组元素不赋初值,系统会自动赋以0值
程序举例 #include <stdio.h>
main() 例 一个10个整数的数组,将该数组中的各元素按逆序 存放后显示出来 { int a[10],i,temp; for(i=0;i<10;i++)//4 5 6 7 8 9 10 输入:1 2 3 循环输入10个数 scanf(“%d”,&a[i]); 输出:10 9 8 7 6 5 4 3 2 1 for(i=0;i<10/2;i++) //交换数据,a[0]与a[9], a[1]与a[8]……. { temp=a[i]; a[i]=a[9-i]; a[9-i]=temp; } for(i=0;i<10;i++)//循环输出10个数 printf(" %d",a[i]); }
例:从键盘上输入10个整数,用选择法将其按由 小到大的顺序排列并输出。基本思想: (1)从第0个位置到第9个位置中选择出最小的一个与第0个 位置的数交换。 (2)从第1个位置到第9个位置中选择出最小的一个与第1个 位置的数交换。 … (9)从第8个位置到第9个位置中选择出最小的一个与第8个 位置的数交换。
例:5 13 3
9 序过程如下:
32 22 8 1 23
21
排
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨
5 13 1 13 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3
3 5 13 5 5 5 5 5 5 5
9 32 9 32 9 32 13 32 8 32 8 9 8 9 8 9 8 9 8 9
22 8 1 23 21 22 8 3 23 21 22 8 5 23 21 22 9 8 23 21 22 13 9 23 21 32 22 13 23 21 13 32 22 23 21 13 21 32 23 22 13 21 22 32 23 13 21 22 23 32
#include <stdio.h> main() {int i,j,t,a[10]; for(i=0;i<10;i++)scanf(“%d”,&a[i]); for(i=0;i<9;i++) for(j=i+1;j<10;j++) 内循环:在 if(a[i]>a[j]) (i,10)内选 {t=a[i];a[i]=a[j];a[j]=t; 择最小数 } for(i=0;i<10;i++)printf(“%6d”,a[i]); }
外循环: 控制选择 的次数
分析: 从程序可知: 1、程序使用两重循环来实现排序。 2、其中,外循环控制排序趟数。若数组有N个元素, 则共进行N-1趟排序。第一趟,I=0;第二趟,I= 1,· · · 3、其中,内循环完成在[I,9]的区间内选择最小数。 比较次数随趟数增大而减少。 4、在每一趟选择中,当后面元素较小时,马上进行交 换。而这种交换是不必要的。事实上,只要记住较小 元素的位置,即下标,在内循结束后做一次交换即可, 这样可大大节省程序运行时间。 改进程序如下:
5 13
3
9
32
22
8
1
23 21 23 23 23 23 23 23 23 23 23 21 21 21 21 21 21 32 32 32
1 13 3 1 3 13 1 3 5 1 3 5 1 3 5 1 3 5 1 3 5 1 3 5 1 3 5
9 32 22 8 5 9 32 22 8 5 9 32 22 8 13 8 32 22 9 13 8 9 22 32 13 8 9 13 32 22 8 9 13 21 22 8 9 13 21 22 8 9 13 21 22
#include <stdio.h> main() {int i,j,k,a[10]; for(i=0;i<10;i++)scanf(“%d”,&a[i]); for(i=0;i<9;i++) {k=i; for(j=i+1;j<10;j++) 内循环 if(a[k]>a[j])k=j; if(k!=i){t=a[i];a[i]=a[k];a[k]=t;} } for(i=0;i<10;i++)printf(“%6d”,a[i]); }
外循环
§5.2 二维数组及多维数组 二维数组的定义 定义方式: 数据类型 例 int a[3][2]; 数组名[常量表达式][常量表达式]; 数组元素的存放顺序 float b[2][5]; 原因:内存是一维的 int c[2][3][4]; 二维数组:按行序优先 int a[3,4]; ( ) 元素个数=行数*列数 列数 行数
int a[3][2]
0 1 2
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
3 4 5
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
二维数组理解二维数组a是由2个元素组成 例 int a[2][4]; 0列 1列 2列 3列 2000 2002 2004 20006 0行 a[0] a[0][0] a[0][1] a[0][2] a[0][3] 1 3 5 7 1行 2008 2010 2012 2014 a[1] a[1][0] a[1][1] a[1][2] a[1][3]行名 2016 9 17 2018 11 19 2020 13 21 2022 15 23
0 1 2 3 4 5 6 7
a[0][0]a[0][1] a[0][2] a[0][3] a[1][0]
a[0]
a[1]
a[1][1]a[1][2] a[1][3]
每个元素a[i]由包含4个元素 的一维数组组成
二维数组的顺序存储结构(按行存放):
int a[2][3];a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 第 1 行
float b[3][2];第0 行 B[0][0] 第0行
b[0][1]b[1][0] b[1][1] b[2][0] b[2][1] 第1行 第2行
2、二维数组的初始化 ⒈分行给二维数组赋初值,如:
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10
,11,12}}; 1 2 3 4 5 6 7 8 9 10 11 12⒉可以按数组排列的顺序将所有数据写在一个花括号内,如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};⒊可以对部分元素赋初值,如:
int a[3][4]={{1},{0,6},{0,0,11}}; 1 0 0 0 0 6 0 0 0 0 11 0
⒋如果对全部元素都赋初值,则定义数组时 可以不指定第一维的长度,如: int a[ ][3]={1,2,3,4,5,6}; //a[2][3] 5.可以缺行对部分元素赋初值如: int a[3][4]={{1},{5,6}}; 1 0 0 0 5 6 0 0 0 0 0 0
例题1: #include <stdio.h> main() {int i,j,a[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=i+j;
01
12
23
for(i=0;i<2;i++) { for(j=0;j<3;j++) printf(“%6d”,a[i][j]); printf(“\n”); } }