《C语言程序设计》第六章 数组与指针-数组篇
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for (j=0;j<=1;j++)
int b[3][2],i,j;
printf(“%5d”,b[i][j]);
printf(“array a:\n”);
printf(“\n”);
for (i=0;i<=1;i++)
}
{
}
for (j=0;j<=2;j++) { printf(“%5d”,a[i][j]); b[j][i]=a [i][j]; } printf(“\n”);
第六章 数组与指针
6 1 数组 6.2 指针的概念 6.3 指针与数组 6.4 字符串的指针 6.5 指针数组和指向指针的指针
2020/11/28
1
6.1 数组
6.1.1 数组的概念 6.1.2 数组的定义、初始化和引用 6.1.3 字符数组
2
2020/11/28
数组的概念
由若干个类型相同的相关数据按顺序存储在一 起形成的一组同类型有序数据的集合,就称为数组。
2020/11/28
6
3、一维数组的初始化
对数组元素的初始化可以用以下方法实现:
(l)在定义数组时对数组元素赋以初值。例如:
int a[10]={0,l,2,3,4,5,6,7,8,9};
将数组元素的初值依次放在一对花括弧内。经过上面的定义 和初始化之后, a[0] =0, a[1]=1, a[2]=2, a[3]=3, a[4]=4, a[5]=5, a[6]=6, a[7] =7, a[8] =8, a[9] =9。
2020/11/28
8
(4)在对全部数组元素赋初值时,可以不指定数组长度。数 组的长度就是初值的个数。例如:
int a[ ]= {0,l,2,3,4,5};
花括弧中有6个数,系统就会据此自动定义a数组的长度 为6。但若被定义的数组长度与提供初值的个数不相同,则 数组长度不能省略。
2020/11/28
一维数组的定义方式为 类型说明符 数组名[常量表达式];
例如:
int a[10]; 它表示数组名为a,此数组有10个元素。
2020/11/28
4
说明:
(l)数组名定名规则和变量名相同,遵循标识符定名 规则。
(2)数组名后是用方括弧括起来的常量表达式,不能 用圆括弧。
(3)常量表达式表示元素的个数,即数组长度。
}
2020/11/28
24
字符数组
用来存放字符数据的数组是字符数组,字符数组中的一个 元素存放一个字符,字符数组的定义和引用的方式与一般的数 组类似。
1、字符数组的定义
char 字符数组名[常量表达式];
例如 char c[10]; c[0]=‘I’ ; c[1]=‘ ’ ; c[2]=‘a’ ; c[3]=‘m’ ; c[4]=‘ ’ ; c[5]=‘h’ ; c[6]=‘a’ ; c[7]=‘p’ ; c[8]=‘p’ ; c[9]=‘y’ ;
for (i=0;i<=2;i++)
for (j=0;j<=3;j++) if (a[i][j]>max) {
输出结果为: max=10,row=2,colum=1
max=a[i][j];
row=i;
colum=j;
}
printf(“max=%d,row=%d,colum=%d\n”,max,row,colum);
9
4、例子
① 用数组求Fibonacci数组的前20个数
程序如下:
main()
{
int i;
int f[20]={1,1};
for (i=2;i<20;i++)
f[来自百度文库]=f[i-2]+f[i-1];
for (i=0;i<20;i++)
{ if (i%5==0) printf(“\n”);
printf(“%12d”,f[i]);
(2)可以将所有数据写在一个花括弧内,按数组排列的顺序 对各元素赋初值。如:
int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
注意: 用第2种方法如果数据多,写成一大片,容易遗漏, 也不易检查。
2020/11/28
18
(3)可以对部分元素赋初值。
int a[3][4] ={{1},{5},{9}};
}
}
2020/11/28
10
② 用冒泡法对10个整数进行排序(从小到大)
排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1],
则交换;然后比较第二个数与第三个数;依次类推, 直至第n-1个数和第n个数比较为止——第一趟冒泡 排序,结果最大的数被安置在 最后一个元素位置上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大 的数被安置在第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序 结束
0030
0000
4、例题
0 10 0 0
①将一个二维数组行和列元素互换后到另一个二维数组中。
a= 1 2 3 456
14 b= 2 5
36
2020/11/28
21
程序如下:
printf(“array b:\n”);
main()
for (i=0;i<=2;i++)
{
{
int a[2][3]={{1,2,3},{4,5,6}};
19
(4)如果对全部元素都赋初值(即提供全部初始数据),则定 义数组时对第一维的长度可以不指定,但第二维的长度不 能省。如: int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
与下面的定义等价: int a[ ][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
12
根据流程图写出程序(今设n=10),定义数组长度为11, 本例中对a[0]不用,只用 a[1]到a[10],以符合人们的习惯。
流程图如下:
输入n个数给a[1]到a[n] for j=1 to n-1
for i=1 to n-j
真
a[i]>a[i+1]
假
a[i] a[i+1]
输出a[1]到a[n]
printf(“the sorted numbers :\n”); for (i=1;i<11;i++)
printf(“%d”,a[i]); }
2020/11/28
14
二维数组的定义和引用
1、二维数组的定义
二维数组定义的一般形式为 类型说明符 数组名[常量表达式][常量表达式]
例如:float a[3][4],b[5][10];
}
运行结果:array a: 12 45
array b: 14 25 36
3 6
2020/11/28
22
②有一个3×4的矩阵,要求编程序求出其中值最大的那个元素 的值,以及其所在的行号和列号。 先用N-S流程图表示算法:
max=a[0][0] for i=0 to 2
for j=0 to 3
真
a[i][j]>max
定义C为字符数组,包含10个元素。在赋值以后数组的状态 如图所示: c[0] c[1] c[2] c[3] c[4] c[5] c[6] c[7] c[8] c[9]
I
am
happ y
2020/11/28
25
2、字符数组的初始化
与一般数组的初始化方法类似。
例如char c[ ]={‘I’,’ ’,’a’,’m’,’ ’,’a’,’ ’,’s’,’t’,’u’,’d’,’e’, ’n’,’t’}
假
max=a[i][j]
row=i
colum=j
输出:max和row,colum
2020/11/28
23
程序如下:
main()
{
int i,j,row=0,colum=0,max;
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
2020/11/28
7
(2)可以只给一部分元素赋值。例如:
int a[10]={0,l,2,3,4};
定义a数组有10个元素,但花括弧内只提供5个初值,这表 示只给前面5个元素赋初值,后5个元素值为0。
(3)如果想使一个数组中全部元素值为0,可以写成
int a[10]= {0,0,0,0,0,0,0,0,0,0};
11
2020/11/28
988 888 895 555 559 444 444 922 222 290 000 009
第 第 第 第第 结 一 二 三 四五 次 次 次 次次 果
2020/11/28
85 555 58 444 44 822 22 280 00 008
第第 第 第结 一二三 四 次次 次 次果
…
a[3][4]=3;
定义a为3×4的数组,它可用的行下标值最大为2,列坐标值最
大为3。用a[3][4]超过了数组的范围。
2020/11/28
17
3、二维数组的初始化 可以用下面的方法对二维数组初始化:
(1)分行给二维数组赋初值。如 int a[3][4] ={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(4)常量表达式中可以包括常量和符号常量,不能包 含变量。
2020/11/28
5
2、一维数组元素的引用
数组必须先定义,然后使用。C语言规定只能逐 个引用数组元素而不能一次引用整个数组。
数组元素的表示形式为
数组名[下标]
下标可以是整型常量或整型表达式。
例如:a[0]=a[5]+ a[7]- a[2*3]
a
a[1] ---------------------- a 10
a 11
a 12
a 13
a[2] ---------------------- a 20 a 21 a 22 a 23
上面定义的二维数组可以理解为定义了3个一维数组,即 相当于 a[0][4],a[1][4],a[2][4]
二维数组中元素排列的顺序是:按行存放。
它的作用是只对各行第1列的元素赋初值,其余元素值自动
为0。赋初值后数组各元素为
10 0 0
50 0 0
90 0 0
也可以对各行中的某一元素赋初值:
int a[3][4] ={{1},{0,6},{0,0,11}};
初始化后的数组元素如下:
10 0 0 06 0 0 0 0 11 0
2020/11/28
2020/11/28
16
2、二维数组的引用
(1)二维数组的元素的表示形式为 数组名[下标][下标]
如a[2][3]。下标可以是整型表达式,如a[2-1][2*2-1]。不要 写成a[2,3],a[2-1,2*2-1]的形式。
(2)数组元素可以出现在表达式中,也可以被赋值。
(3)在使用数组元素时,应该注意下标值应在已定义的数组大 小的范围内。常出现的错误是 int a[3][4];
数组c的长度自动定义为14。
3、字符数组的引用
① 输出一个字符串
main()
{ char c[10]={‘I’, ‘ ’, ‘a’,’m’,’ ’,‘a’,‘ ’,’b’,’o’,’y’};
int i; for (i=0;i<10;i++)
运行结果:
printf(“%c”,c[i]);
I am a boy
2020/11/28
13
程序如下:
main() { int a[11];
int i,j,t; printf(“input 10 numbers :\n”) for (i=1;i<11;i++)
scanf(“%d”,&a[i]); printf(“\n”); for (j=1;j<=9;j++)
for (i=1;i<=10-j;i++) if (a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}
系统会根据数据总个数分配存储空间,一共12个数据,每 行4列,当然可确定为3行。
2020/11/28
20
(5)在定义时也可以只对部分元素赋初值而省略第一维的长度, 但应分行赋初值。如: int a[ ][4] ={{0,0,3},{ },{0,10}};
这样的写法,能通知编译系统,数组共有3行。
数组各元素为
C语言对二维数组采用这样的定义方式,使我们可以把 二维数组看作是一种特殊的一维数组,它的元素又是一个一 维数组。
2020/11/28
15
例如,可以把a看作是一个一维数组,它有3个元素: a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。
a[0] ---------------------- a 00 a 01 a 02 a 03
printf(“\n”);
}
2020/11/28
26
② 输出一个钻石图形
如果用一个统一的名称标识这组数据,那么 这个名字就称为数组名,构成数组的每一个数据 项称为数组的元素,用一个统一的数组名和下标 来唯一的确定数组中的元素。
同一数组中的元素必须具有相同的数据类型, 而且这组数据在内存中将占据一段连续的存储单元。
2020/11/28
3
一维数组的定义和引用
1、一维数组的定义