1 / 22

第九章 数组

第九章 数组. 制作:王远敏. 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] 常量表达式必须是常量,不能是变量。.

Download Presentation

第九章 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第九章 数组 制作:王远敏

  2. 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] • 常量表达式必须是常量,不能是变量。

  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

  4. 9·1一维数组的定义和引用 三、一维数组的初始化 • 数组的初始化是指在定义数组时给数组初值。 1.在定义数组时赋初值。 int a[10]={0,1,2,3,4,5,6,7,8,9};

  5. 9·1一维数组的定义和引用 一维数组程序举例 [例] 使用输入语句给数组赋值 main() { int i, a[10]; for (i=0;i<=9;i++) scanf(“%d”,&a[i]); }

  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};

  7. 9·1一维数组的定义和引用 [例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]); } }

  8. 9·1一维数组的定义和引用 第1次, a[0]和a[1]比较 9 8 5 4 2 0 6 1 3 7 9 8 • [例3]用起泡法对10个数排序 9 5 8 9 5 4 2 0 6 1 3 7 第2次, a[1]和a[2]比较 9 4 8 5 9 4 2 0 6 1 3 7 9 2 8 5 4 9 2 0 6 1 3 7 第i次, a[i]和a[i+1]比较 8 5 4 2 9 0 6 1 3 7 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;} 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 9 7 8 5 4 2 0 6 1 3 7 9

  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;}

  10. 9·1一维数组的定义和引用 如果有n个元素,一共要比较n-1次(外循环次数) 在第j次比较是时,需要从0比较到n-j main( ) { 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]); }

  11. 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’); } 例9.9 用选择法对数组中的数进行排序(按由小到大顺序)。 #include<stdio.h> #define NUM 6 void 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); }

  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);

  13. 二、通过数组的首地址引用数组元素 int a[10],*p,k; p=a; a[0] 与*(a+0) *(p+0) 等价 a[k]与*(a+k)等价

  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++);

  15. 四、用带下标的指针变量引用一维数组元素 int *p,s[10],i; p=s; s[i] *(s+i) *(p+i) p[i] 这四种写法等价 p=s+2; p[0]代表s[2]

  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); }

  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]

  18. 其中a[2][3]指的是第三行第四个元素。 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]

  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;

  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]

  21. max=a[0]0] for i=0 to 2 for j=0 to 3 a[i][j]>max y n max=a[i][j] colum=j row=i 输入max, row,colum 9.2二维数组的定义和引用 • [例5]求出3*4矩阵中的最大值及其所在的行列号. • 1.设一个变量存放最大值max; • 2 设两个变量存放最大值在数组中的行列. • 3.遍历数组中的每一个元素

  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); }

More Related