C语言 一维数组的定义和引用 数组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=1; i<=6-j; i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} printf (“the sorted numbers:\ n”); for(i=1;i<7;i++) printf(“%d _ _”,a[i]);
}
.
x a[0] 9 a[1] 8 a[2] 5 a[3] 4 a[4] 2 a[5] 0 a[6]
123 a=
456
14 b= 2 5
36
.
20
T7-4.c两数组行列互换
main( )
{ int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; printf(“array a:\n”);
for(i=0;i<=1;i++)
{for(j=0;j<=2;j++) {printf(“%4d”, a[i][j]); b[j][i]=a[i][j];} printf(\ n”);
a[1]=100; printf (“a[1]=%d\n”,a[1]); }
编译指出:constant expression
required in function main (主函数
中要求常量表达式)
.
4
7.1.2 一维数组元素的引用
引用规则:1.先定义,后使用。 2.引用形式:数组名[下标] 下标可以是整、字符 型的常量、变量或表达式。 3.引用方法:针对元素而不是整个数组。
区。
.
7
7.1.4 一维数组程序举例
例T7-2.c 求Fibonacci 数列问题
i
关于菲波那契算法:头两个数各为1, 2
以后的每个数皆为前两个数之和。
3 4
main( )
5
{
6
int i;
7
int f[20]={1,1};
for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1];
。
.
6
例T7-1-1.c 定义时对数组元素初始化
main( )
{ int i; int a[5]={2,4,6,8,10}; for(i=0;i<=4;i++) printf(“%d\n”,a[i]);
运行结果: 2 4 6 8
}
10
注意:static 存储类别,这和新ANSI新标准
一致,
若采用static,数组元素的值被存储在静态
0 b[0][0] a[0][0]=1
1 b[1][0] a[0][1]=2
2 b[2][0] a[0][2]=3
0 b[0][1] a[1][0]=4
1 b[1][1] a[1][1]=5
2 b[2][1] a[1][2]=6
21
例T7-5.c 有3 × 4矩阵,求出其中最大元素所在的行号和列号
4.全部元素赋值时,第一维下标可省略 如: int a[ ][3]={1,2,3,4,5,6};
又如:int a[ ][4]={{0,0,3},{0},{0,10}};
12 3 a=
45 6
00 30 a= 0 0 0 0
0 10 0 0
.
19
7.2.4 二维数组程序举例 例T7-4 将一个二维数组的行和列元素互换, 存到另一个二维数组中 。
第一轮大数沉底 第二轮
5444 4522 2250 0005
第三轮
42
24
2
00
0
4
2
第四轮 第五轮
此处:n=6 外层循环j(1~n-1)次
内层循环i (1~n-j)次
.
9
.
10
main( ) {int a[7]; int i, j , t; printf (“input 6 numbers:\ n”); for(i=1;i<7;i++) scanf(“%d”, &a[i ]; printf (“\ n”); for(j=1; j<=5; j++)
}
printf(“array b:\ n”);
for(i=0;i<=2; i++)
i 0
{for(j=0;j<=1;j++)
printf(“%4d”,b[i][j]); printf(“\ n”); 1 }
}
.
运行结果:
array a:
12
3
45
6
array b:
1
4
2
5
3
6
j
b[j][i] a[i][j]
xyz[‘#’] (‘#’=35) #define N 5 main() {int a[N];printf(“%d\n”,a[1]=100);} 而:int a(10) , b[x], %[5], 8[3], x-y[50], 5x[100]
是否正确? 又如: int i=5; int a[5+i] 是否正确性?
for(i=0;i<2;i++)
for(j=0;j<3;j++) {scanf("%f",&k);
a[i][j]=k; }
for(j=0;j<3;j++) scanf(“%f%f”,&a[0][j],&a[1][j])
for(i=0;i<2;i++)
for(j=0;j<3;j++)
Biblioteka Baidu
{printf("&a[%d][%d]=%x ",i,j,&a[i][j]);
如: int a[2][3]={{1,2,3},{4,5,6}}; 2.按数组元素排列的顺序赋初值
如:int a[2][3]={1,2,3,4,5,6}; 3.对部分元素赋初值,按行赋值 较直观
如:int a[2][3]={{2,5},{3}};
.
1 a=
4
1 a=
4
2 a=
3
23 56
23 56
50 0 018
1 2 34 a= 9 8 7 5
-10 10 -5 2
}
运行结果: max=10,row=2,colum=1
问题:在比较前
为什么要把a[0][0]赋给max?
如:a[0]=a[‘b’ - ‘a’] + a[‘ b’ -96] +a[3] - a[2*2]
例T7-1. C 对数组a 顺序赋值,逆序输出
main( )
{int a[5],i; for(i=0; i<=4; i++)
0 a[0] 1 a[1]
a[i]=i;
2 a[2]
for(i=4;i>=0;i- -)
printf("a[%d][%d]=%f\n",i,j,a[i][j]);}
}
.
15
3.多维数组的定义和在内存中的存放顺 序:
如 int a[2][3][4]; 共24个元素,在内存中排列的顺序是 :第三维变化最快,然后是第二维,第
一维最慢。
.
16
7.2.2 二维数组的引用
形式:数组名[下标][下标]
main( )
{int i, j, r=0,c=0, max;
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++) if(a[i][j]>max) {max=a[i][j]; r=i;c=j} printf(“max=%d,row=%d, colum=%d\n”,max,r,c);
运行:input 6 numbers: 输入:9 8 5 4 2 0 输出:0 2 4 5 8 9
11
.
12
7.2 二维数组的定义和引用 7.2.1 二维数组的定义 1.一般形式:类型说明符 数组名[常量表达式][常量 表达式]
如:float a[3][4] 定义数组a具有三行四列 在C中,可将二维数组看着是特殊形式的一维数组。
printf (“a[5]=%d\t”,a[5]);
printf (“a[6]=%d\ n”,a[6]);
}
运行结果:
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
a[5]=-30
a[6]=285
.
3
4.数组大小的定义只能是常量,而不能是变 量或动态地定义。 例7-0-2. C main( ) { int n=5,a[n];
&a[1][2]=ffd8 a[1][2]=11
for(j=0;j<3;j++)
{printf(“&a[%d][%d]=%x ”, i, j,
地址 值
&a[i][j]);
ffce 1
printf (“a[%d][%d]=%d\ n”,i,j,a[i][j]);
ffd0 ffd2
3 5
}
ffd4 7
数组元素
for(i=0;i<20;i++)
{ if(i%5==0) printf (“\ n” );
printf (“%12d”,f[i]; 运行结果:
}
1
1
2
}
8
13
21
89 144 233
9.87 1597 2584
f[i]=f[i-2]+f[i-1] f[2]=f[1]+f[0]=2 f[3]=f[2]+f[1]=3 f[4]=f[3]+f[2]=5 f[5]=f[4]+f[3]=8 f[6]=f[5]+f[4]=13 f[7]=f[6]+f[5]=21
如: int a[5]={1, 3, 5}; 3. 初始化时给全部元素赋0值
如:int a[5]={0,0,0,0,0}; 或 int a[5]={0};
4. 对全部元素赋初值时可以不指出长度 如:int a[5]={2,4,6,8,10};
或 int a[ ]={2,4,6,8,10}; 效果一样
a[0][0] a[0][1] a[0][2] a[1][0]
}
ffd6 9 a[1][1]
ffd8 11 a[1][2]
.
14
注:从键盘给实型数组元素赋值时,应通过一中间变量进行, 或采用其它办法实施。 T7-3-2.c 实型数组从键盘赋值情况
main()
{int i,j;
float a[2][3],k;
其中:下标是整型或字符型的常量,变量或表
达式。(定义时不能使用变量)
如: a[1][2]
a[i][j]
1.数组元素可出现在表达式中,如:
a[1][2]=a[2][2]/2
2.使用数组元素时,应注意不要超出其定义的
范围;
如: int a[2][3];
a[2][3]=5;
.
17
7.2.3 二维数组的初始化 1.按行给二维数组赋初值
第7章
数
组
数组:是构造类型,元素由基类型(整、实
、字符)组成。
它是有序的、同类型数据的集合。
7.1 一维数组的定义和引用
7.1.1 一维数组的定义
形式:类型说明符 数组名[常量表达式]
如:int a[5];
float b[10];
说明:
1.命名规则:数组名是由合法的标识符组成。
.
1
2.数组名后是用 [ ] 括起来的是常量表达式 包括:整、字符、符号常量表达式。 如: int a[2+3], b[5], c[‘a’] , _d[8],
如上述定义可看着是具有三个元素的一维数组, 而每个元素又可看作是包含四个元素的一维数组。
因此,上述定义相当于:
float a[0][4], a[1][4], a[2][4] 注 :实际应用时若如此定义则被认为是重定义。 2.二维数组各个元素在内存中的存放顺序是:
按先行后列的顺序依次存放
.
13
例T7-3-1.c
3 a[3]
printf( “a[%d]=%d\n”, i, a[i ]); 4 a[4]
} .
运行结果: a[4]=4 a[3]=3 a[2]=2 a[1]=1 a[0]=0
5
7.1.3 一维数组的初始化
实现的方法有: 1.定义时对数组元素初始化
如: int a[5]={1, 2, 3, 4, 5}; 2. 只给部分元素赋值
3.数组的长度
int a[5] a[0], a[1], a[2], a[3], a[4] 5个元素 ,下标从0 ~ 4
注意:
在Turbo C 中超过定义的数组下标元素是可以引用的,系
统不作检查。
.
2
例T7-0-1.c
main( )
{int i, a[5];
for(i=0;i<=4;i++)
printf (“a[%d]=%d\ n”,i,a[i]=i+1);
main( ) {
int i, j, a[2][3]; for(i=0; i<2; i++) for(j=0; j<3; j++) scanf(“%d”, &a[i][j]); for(i=0; i<2;i++)
输入:1 3 5 7 9 11 输出:&a[0][0]=ffce a[0][0]=1
&a[0][1]=ffd0 a[0][1]=3 &a[0][2]=ffd2 a[0][2]=5 &a[1][0]=ffd4 a[1][0]=7 &a[1][1]=ffc6 a[1][1]=9
┆
3 34 377 4181
5 55 610 68765
例T7-3.c 用起泡法对6个数排序(由小到大) 思路:将相邻两数两两比较,若小则调到前头,不小也要比较
988888 895555 559444 444922 222290
000009
85555 58444 44822 22280 00008
}
.
x a[0] 9 a[1] 8 a[2] 5 a[3] 4 a[4] 2 a[5] 0 a[6]
123 a=
456
14 b= 2 5
36
.
20
T7-4.c两数组行列互换
main( )
{ int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; printf(“array a:\n”);
for(i=0;i<=1;i++)
{for(j=0;j<=2;j++) {printf(“%4d”, a[i][j]); b[j][i]=a[i][j];} printf(\ n”);
a[1]=100; printf (“a[1]=%d\n”,a[1]); }
编译指出:constant expression
required in function main (主函数
中要求常量表达式)
.
4
7.1.2 一维数组元素的引用
引用规则:1.先定义,后使用。 2.引用形式:数组名[下标] 下标可以是整、字符 型的常量、变量或表达式。 3.引用方法:针对元素而不是整个数组。
区。
.
7
7.1.4 一维数组程序举例
例T7-2.c 求Fibonacci 数列问题
i
关于菲波那契算法:头两个数各为1, 2
以后的每个数皆为前两个数之和。
3 4
main( )
5
{
6
int i;
7
int f[20]={1,1};
for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1];
。
.
6
例T7-1-1.c 定义时对数组元素初始化
main( )
{ int i; int a[5]={2,4,6,8,10}; for(i=0;i<=4;i++) printf(“%d\n”,a[i]);
运行结果: 2 4 6 8
}
10
注意:static 存储类别,这和新ANSI新标准
一致,
若采用static,数组元素的值被存储在静态
0 b[0][0] a[0][0]=1
1 b[1][0] a[0][1]=2
2 b[2][0] a[0][2]=3
0 b[0][1] a[1][0]=4
1 b[1][1] a[1][1]=5
2 b[2][1] a[1][2]=6
21
例T7-5.c 有3 × 4矩阵,求出其中最大元素所在的行号和列号
4.全部元素赋值时,第一维下标可省略 如: int a[ ][3]={1,2,3,4,5,6};
又如:int a[ ][4]={{0,0,3},{0},{0,10}};
12 3 a=
45 6
00 30 a= 0 0 0 0
0 10 0 0
.
19
7.2.4 二维数组程序举例 例T7-4 将一个二维数组的行和列元素互换, 存到另一个二维数组中 。
第一轮大数沉底 第二轮
5444 4522 2250 0005
第三轮
42
24
2
00
0
4
2
第四轮 第五轮
此处:n=6 外层循环j(1~n-1)次
内层循环i (1~n-j)次
.
9
.
10
main( ) {int a[7]; int i, j , t; printf (“input 6 numbers:\ n”); for(i=1;i<7;i++) scanf(“%d”, &a[i ]; printf (“\ n”); for(j=1; j<=5; j++)
}
printf(“array b:\ n”);
for(i=0;i<=2; i++)
i 0
{for(j=0;j<=1;j++)
printf(“%4d”,b[i][j]); printf(“\ n”); 1 }
}
.
运行结果:
array a:
12
3
45
6
array b:
1
4
2
5
3
6
j
b[j][i] a[i][j]
xyz[‘#’] (‘#’=35) #define N 5 main() {int a[N];printf(“%d\n”,a[1]=100);} 而:int a(10) , b[x], %[5], 8[3], x-y[50], 5x[100]
是否正确? 又如: int i=5; int a[5+i] 是否正确性?
for(i=0;i<2;i++)
for(j=0;j<3;j++) {scanf("%f",&k);
a[i][j]=k; }
for(j=0;j<3;j++) scanf(“%f%f”,&a[0][j],&a[1][j])
for(i=0;i<2;i++)
for(j=0;j<3;j++)
Biblioteka Baidu
{printf("&a[%d][%d]=%x ",i,j,&a[i][j]);
如: int a[2][3]={{1,2,3},{4,5,6}}; 2.按数组元素排列的顺序赋初值
如:int a[2][3]={1,2,3,4,5,6}; 3.对部分元素赋初值,按行赋值 较直观
如:int a[2][3]={{2,5},{3}};
.
1 a=
4
1 a=
4
2 a=
3
23 56
23 56
50 0 018
1 2 34 a= 9 8 7 5
-10 10 -5 2
}
运行结果: max=10,row=2,colum=1
问题:在比较前
为什么要把a[0][0]赋给max?
如:a[0]=a[‘b’ - ‘a’] + a[‘ b’ -96] +a[3] - a[2*2]
例T7-1. C 对数组a 顺序赋值,逆序输出
main( )
{int a[5],i; for(i=0; i<=4; i++)
0 a[0] 1 a[1]
a[i]=i;
2 a[2]
for(i=4;i>=0;i- -)
printf("a[%d][%d]=%f\n",i,j,a[i][j]);}
}
.
15
3.多维数组的定义和在内存中的存放顺 序:
如 int a[2][3][4]; 共24个元素,在内存中排列的顺序是 :第三维变化最快,然后是第二维,第
一维最慢。
.
16
7.2.2 二维数组的引用
形式:数组名[下标][下标]
main( )
{int i, j, r=0,c=0, max;
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++) if(a[i][j]>max) {max=a[i][j]; r=i;c=j} printf(“max=%d,row=%d, colum=%d\n”,max,r,c);
运行:input 6 numbers: 输入:9 8 5 4 2 0 输出:0 2 4 5 8 9
11
.
12
7.2 二维数组的定义和引用 7.2.1 二维数组的定义 1.一般形式:类型说明符 数组名[常量表达式][常量 表达式]
如:float a[3][4] 定义数组a具有三行四列 在C中,可将二维数组看着是特殊形式的一维数组。
printf (“a[5]=%d\t”,a[5]);
printf (“a[6]=%d\ n”,a[6]);
}
运行结果:
a[0]=1
a[1]=2
a[2]=3
a[3]=4
a[4]=5
a[5]=-30
a[6]=285
.
3
4.数组大小的定义只能是常量,而不能是变 量或动态地定义。 例7-0-2. C main( ) { int n=5,a[n];
&a[1][2]=ffd8 a[1][2]=11
for(j=0;j<3;j++)
{printf(“&a[%d][%d]=%x ”, i, j,
地址 值
&a[i][j]);
ffce 1
printf (“a[%d][%d]=%d\ n”,i,j,a[i][j]);
ffd0 ffd2
3 5
}
ffd4 7
数组元素
for(i=0;i<20;i++)
{ if(i%5==0) printf (“\ n” );
printf (“%12d”,f[i]; 运行结果:
}
1
1
2
}
8
13
21
89 144 233
9.87 1597 2584
f[i]=f[i-2]+f[i-1] f[2]=f[1]+f[0]=2 f[3]=f[2]+f[1]=3 f[4]=f[3]+f[2]=5 f[5]=f[4]+f[3]=8 f[6]=f[5]+f[4]=13 f[7]=f[6]+f[5]=21
如: int a[5]={1, 3, 5}; 3. 初始化时给全部元素赋0值
如:int a[5]={0,0,0,0,0}; 或 int a[5]={0};
4. 对全部元素赋初值时可以不指出长度 如:int a[5]={2,4,6,8,10};
或 int a[ ]={2,4,6,8,10}; 效果一样
a[0][0] a[0][1] a[0][2] a[1][0]
}
ffd6 9 a[1][1]
ffd8 11 a[1][2]
.
14
注:从键盘给实型数组元素赋值时,应通过一中间变量进行, 或采用其它办法实施。 T7-3-2.c 实型数组从键盘赋值情况
main()
{int i,j;
float a[2][3],k;
其中:下标是整型或字符型的常量,变量或表
达式。(定义时不能使用变量)
如: a[1][2]
a[i][j]
1.数组元素可出现在表达式中,如:
a[1][2]=a[2][2]/2
2.使用数组元素时,应注意不要超出其定义的
范围;
如: int a[2][3];
a[2][3]=5;
.
17
7.2.3 二维数组的初始化 1.按行给二维数组赋初值
第7章
数
组
数组:是构造类型,元素由基类型(整、实
、字符)组成。
它是有序的、同类型数据的集合。
7.1 一维数组的定义和引用
7.1.1 一维数组的定义
形式:类型说明符 数组名[常量表达式]
如:int a[5];
float b[10];
说明:
1.命名规则:数组名是由合法的标识符组成。
.
1
2.数组名后是用 [ ] 括起来的是常量表达式 包括:整、字符、符号常量表达式。 如: int a[2+3], b[5], c[‘a’] , _d[8],
如上述定义可看着是具有三个元素的一维数组, 而每个元素又可看作是包含四个元素的一维数组。
因此,上述定义相当于:
float a[0][4], a[1][4], a[2][4] 注 :实际应用时若如此定义则被认为是重定义。 2.二维数组各个元素在内存中的存放顺序是:
按先行后列的顺序依次存放
.
13
例T7-3-1.c
3 a[3]
printf( “a[%d]=%d\n”, i, a[i ]); 4 a[4]
} .
运行结果: a[4]=4 a[3]=3 a[2]=2 a[1]=1 a[0]=0
5
7.1.3 一维数组的初始化
实现的方法有: 1.定义时对数组元素初始化
如: int a[5]={1, 2, 3, 4, 5}; 2. 只给部分元素赋值
3.数组的长度
int a[5] a[0], a[1], a[2], a[3], a[4] 5个元素 ,下标从0 ~ 4
注意:
在Turbo C 中超过定义的数组下标元素是可以引用的,系
统不作检查。
.
2
例T7-0-1.c
main( )
{int i, a[5];
for(i=0;i<=4;i++)
printf (“a[%d]=%d\ n”,i,a[i]=i+1);
main( ) {
int i, j, a[2][3]; for(i=0; i<2; i++) for(j=0; j<3; j++) scanf(“%d”, &a[i][j]); for(i=0; i<2;i++)
输入:1 3 5 7 9 11 输出:&a[0][0]=ffce a[0][0]=1
&a[0][1]=ffd0 a[0][1]=3 &a[0][2]=ffd2 a[0][2]=5 &a[1][0]=ffd4 a[1][0]=7 &a[1][1]=ffc6 a[1][1]=9
┆
3 34 377 4181
5 55 610 68765
例T7-3.c 用起泡法对6个数排序(由小到大) 思路:将相邻两数两两比较,若小则调到前头,不小也要比较
988888 895555 559444 444922 222290
000009
85555 58444 44822 22280 00008