220 likes | 314 Views
第九章 数组. 制作:王远敏. 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] 常量表达式必须是常量,不能是变量。.
E N D
第九章 数组 制作:王远敏
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] • 常量表达式必须是常量,不能是变量。
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
9·1一维数组的定义和引用 三、一维数组的初始化 • 数组的初始化是指在定义数组时给数组初值。 1.在定义数组时赋初值。 int a[10]={0,1,2,3,4,5,6,7,8,9};
9·1一维数组的定义和引用 一维数组程序举例 [例] 使用输入语句给数组赋值 main() { int i, a[10]; for (i=0;i<=9;i++) scanf(“%d”,&a[i]); }
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};
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]); } }
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·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;}
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]); }
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); }
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);
二、通过数组的首地址引用数组元素 int a[10],*p,k; p=a; a[0] 与*(a+0) *(p+0) 等价 a[k]与*(a+k)等价
三、通过指针引用一维数组元素 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++);
四、用带下标的指针变量引用一维数组元素 int *p,s[10],i; p=s; s[i] *(s+i) *(p+i) p[i] 这四种写法等价 p=s+2; p[0]代表s[2]
五、数组元素地址作为实参 数组元素地址作为实参 例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); }
9.2二维数组的定义和引用 定义:类型说明符 [常量表达式][常量表达式] • 例如:float a[3][4] • a[0][0] …… a[0][3] • a[1][0] …… a[1][3] • a[2][0] …… a[2][3]
其中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]
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;
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]
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.遍历数组中的每一个元素
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); }