22
第第第 第第 第第 第第第

第九章 数组

Embed Size (px)

DESCRIPTION

第九章 数组. 制作:王远敏. 9·1 一维数组的定义和引用. 一、一维数组的定义 定义方式为 : 类型说明符 数组名 [ 常量表达式 ] ; 例如: int a[10];. 1 20 4 60 9 3 98 0 11 50. a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]. 说明: 常量表达式用中括号括起 下标从 0 开始 ,int a[10] ; a[0],a[1], …… .a[9] 常量表达式必须是常量,不能是变量。. - PowerPoint PPT Presentation

Citation preview

Page 1: 第九章     数组

第九章 数组

制作:王远敏

Page 2: 第九章     数组

9·1 一维数组的定义和引用一、一维数组的定义• 定义方式为 : 类型说明符 数组名 [ 常量表达式 ] ;• 例如: int a[10];

说明:• 常量表达式用中括号括起 • 下标从 0 开始 ,int a[10] ;• a[0],a[1],…….a[9]• 常量表达式必须是常量,不能是变量。

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

1 20 4 60 9 3 98 0 11 50

Page 3: 第九章     数组

9·1 一维数组的定义和引用二、一维数组元素的引用

每次可引用一个数组元素,不能引用整个数组。一个数组元素就如同一个简单变量 .

a[0]=a[5]+a[7]-a[2*3] 常量和表达式做下标a[i]=a[i]+1; 变量做下标a[a[0]]=>a[1] 数组元素做下标[ 例 1]main(){ int i, a[10]; for (i=0;i< = 9;i++) a[i]=i; for (i=9; i> = 0;i- -) printf(“%d”,a[i]);}

9 8 7 6 5 4 3 2 1 0

Page 4: 第九章     数组

9·1 一维数组的定义和引用三、一维数组的初始化• 数组的初始化是指在定义数组时给数组初值。

1. 在定义数组时赋初值。int a[10]={0,1,2,3,4,5,6,7,8,9};

Page 5: 第九章     数组

9·1 一维数组的定义和引用一维数组程序举例[ 例 ] 使用输入语句给数组赋值main(){ int i, a[10];

for (i=0;i<=9;i++)

scanf(“%d”,&a[i]);

}

Page 6: 第九章     数组

9·1 一维数组的定义和引用2. 只给一部分元素赋值,其余自动填 0 。例: int a[10]={ 0,1,2,3};

int b[10]={ , , , , ,5,6,7,8,9};

3. 如果想使一个数组中全部元素值为 0 ,可以写成 int a[10]={0,0,0,0,0,0,0,0,0,0};

4 . 对全部数组元素赋初值时,可以不指定数组长度。例: int a[ ]={1,2,3};

Page 7: 第九章     数组

[ 例 2] 求 Fibnacci 数列 {1,1,2,3,5,8,13,21,...}

初值 f[0]=1,f[1]=1 循环体 :f[i]=f[i-2]+f[i-1]

循环控制 (for i=2,i<=20;i++)

完整程序

main( ){ int i,f[20]={1,1}; for (i=2,i<20;i++) f[i]=f[i-2]+f[i-1]; for (i=2,i<20;i++) if (i%5==0) printf("\n"); printf("%12d",f[i]); }}

9·1 一维数组的定义和引用

Page 8: 第九章     数组

• [ 例 3] 用起泡法对 10 个数排序第 1 次 , a[0] 和 a[1] 比较9 8 5 4 2 0 6 1 3 7

8 9 5 4 2 0 6 1 3 7

8 5 9 4 2 0 6 1 3 7

8 5 4 9 2 0 6 1 3 7

8 5 4 2 9 0 6 1 3 7

8 5 4 2 0 9 6 1 3 7

8 5 4 2 0 6 9 1 3 7

8 5 4 2 0 6 1 9 3 7

8 5 4 2 0 6 1 3 9 7

8 5 4 2 0 6 1 3 7 9

第 2 次 , a[1] 和 a[2] 比较

第 i 次 , a[i] 和 a[i+1] 比较

9 8

9 5

9 4

9 2

9 7

9·1 一维数组的定义和引用

for (j=0;j<10-1;j++) if (a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;}

Page 9: 第九章     数组

9·1 一维数组的定义和引用从第一个元素开始 , 两两比较 , 较大的一个放在后

面for (j=0;j<9;j++)

if (a[j]>a[j+1])

{temp=a[j],a[j]=a[j+1];a[j+1]=temp;}

第一次循环后 , 最大的在最后 .

8 5 4 2 0 6 1 3 7 9

第二次循环for (j=0;j<8;j++)

if (a[j]>a[j+1])

{temp=a[j],a[j]=a[j+1];a[j+1]=temp;}

Page 10: 第九章     数组

9·1 一维数组的定义和引用如果有 n 个元素 , 一共要比较 n-1 次 ( 外循环次数 )在第 j 次比较是时 , 需要从 0 比较到 n-jmain( ){ int i,j,t,a[11]; 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;} printf(“the sorted numbers:\n); for (i=1;i<11;i++) printf(“%d ”,a[i]);}

Page 11: 第九章     数组

例 9.9 用选择法对数组中的数进行排序(按由小到大顺序)。

#include<stdio.h>#define NUM 6void arrsort(int [ ],int);void arrout(int *,int);main( ){ int a[NUM]={5,7,4,2,8,6}; arrout(a,NUM); arrsort(a,NUM); arrout(a,NUM);}

void arrsort( int *a,int n)

{int i,j,p,t;

for(j=0;j<n-1;j++)

{ p=j;

for(i=j+1;i<n;i++)

if(a[p]>a[i]) p=i;

if(p!=j)

{ t=a[j]; a[j]=a[p];a[p]=t;}

}

}

void arrout(int a[],int n)

{ int i;

for(i=0;i<n;i++) printf(“%d”,a[i]);

putchar(‘\n’);

}

Page 12: 第九章     数组

9.2 一维数组和指针一、一维数组和数组元素的地址数组名:存放数组首地址的指针数据,其值为数组的第一个

元素的地址,不能被重新赋值。例: int a[10],*p,x,k; p=a; p=&a[0]; for(k=0;k<10;k++) scanf(“%d”,a+k); for(p=a;p-a<10;p++) scanf(“%d”,p);

Page 13: 第九章     数组

二、通过数组的首地址引用数组元素int a[10],*p,k;

p=a;

a[0] 与 *(a+0) *(p+0) 等价 a[k] 与 *(a+k) 等价

Page 14: 第九章     数组

三、通过指针引用一维数组元素int a[10],*p,k;

for(k=0;k<10;k++)

printf (“%4d”,a[k]);

for(p=a,k=0;k<10;k++)

printf(“%4d”,*(p+k));

for(p=a,k=0;k<10;k++)

printf(“%4d”,*p++);

Page 15: 第九章     数组

四、用带下标的指针变量引用一维数组元素int *p,s[10],i;

p=s;

s[i] *(s+i) *(p+i) p[i]

这四种写法等价p=s+2;

p[0] 代表 s[2]

Page 16: 第九章     数组

五、数组元素地址作为实参数组元素地址作为实参例 9.3 编写函数,对具有 10 个元素的 char 类型数组,从下

标为 4 的元素开始,全部设置星号“ *” ,保持前 4 个元素中的内容不变。

void setstar(char *a,int n){ int i; for(i=0;i<n;i++) *(a+i)=‘I’; }void arrout(char *a,int n) { int i; for(i=0;i<n;i++) printf(“%c”,a[i]); printf(“\n”);}

main( )

{ …

setstar(&c[4],M-B);

arrout(c,M);

}

Page 17: 第九章     数组

9 . 2 二维数组的定义和引用定义:类型说明符 [ 常量表达式 ][ 常量表

达式 ]

• 例如: float a[3][4]

• a[0][0] …… a[0][3]

• a[1][0] …… a[1][3]

• a[2][0] …… a[2][3]

Page 18: 第九章     数组

9 . 2 二维数组的定义和引用• 引用• 程序中引用的是数组中一个元素,必须用下标来指定。

如:数组名 [ 下标 ][ 下标 ]

• float a[4][4]

• a[0][0] a[0][1] a[0][2] a[0][3]

• a[1][0] a[1][1] a[1][2] a[1][3]

• a[2][0] a[2][1] a[2][2] a[2][3]

• a[3][0] a[3][1] a[3][2] a[3][3]

其中 a[2][3] 指的是第三行第四个元素。

Page 19: 第九章     数组

9 . 2 二维数组的定义和引用• 在程序中为数组赋值的方法• 1. 用 scanf 语句由用户输入• for (i=1;i<=3;i++)• for (j=1;j<=4;j++)• scanf(“%d”,&a[i][j]);• 2. 由循环变量自动构成• 1 2 3 4 • 5 6 7 8• 9 10 11 12• 13 14 15 16

for (i=0;i<4;i++) (for j=0;j<4;j++) a[i][j] = 4*i+j+1;

Page 20: 第九章     数组

9 . 2 二维数组的定义和引用• 二维数组程序举例• 将一个二维数组行和列元素互换 , 存到另一个数

组中 1 4• a= 1 2 3 b= 2 5• 4 5 6 3 6• 分析 : 对数组 a, 列先与行变化 , 对于数组 b, 行先

于列变化 .• for (i=0;i<2;i++)• for (j=0;j<3;j++)• b[j][i]=a[i][j]

for (i=0;i<3;i++) for (j=0;j<2;j++) b[i][j]=a[j][i]

Page 21: 第九章     数组

9 . 2 二维数组的定义和引用• [ 例 5] 求出 3*4 矩阵中的最大值及其所在

的行列号 .

• 1. 设一个变量存放最大值 max;

• 2 设两个变量存放最大值在数组中的行列 .

• 3. 遍历数组中的每一个元素 max=a[0]0] for i=0 to 2

for j=0 to 3a[i][j]>max

y nmax=a[i][j]row=icolum=j

输入 max, row,colum

Page 22: 第九章     数组

9 . 2 二维数组的定义和引用#include <stdio.h>void main(){ int i,j,row,column,max; max=a[0][0]; for (i=0;i<3;i++) for(j=0;j<4;j++) if a[i][j]>max { max=a[i][j]; row=i;column=j; } printf(“ 最大元素是 %d, 位于第 %d 行 , 第 %d 列 \n”, max,row,column);}