Download - 第九章 数组
第九章 数组
制作:王远敏
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
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};
[ 例 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 一维数组的定义和引用
• [ 例 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;}
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-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]);}
例 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’);
}
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]
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] 指的是第三行第四个元素。
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]
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
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);}