
程序设计基础 第8章数组 1/14
程序设计基础 第 8 章 数 组 1/14

本章知识点 8.0数组的概念 8.1一维数组用“数组名+一维下标”来表示数据 8.2一维数组的应用 8.3二维数组用“数组名+二维下标”来表示数据 8.4数组与函数数组元素与数组名做函数参数 小结 恩 2/14
8.0 数组的概念 8.1 一维数组 用“数组名+一维下标”来表示数据 8.2 一维数组的应用 8.3 二维数组 用“数组名+二维下标”来表示数据 8.4 数组与函数 数组元素与数组名做函数参数 小结 本章知识点 2/14

8.4数组作为函数参数 1、数组元素作函数实参 2、数组名作函数参数 恩 章目录3/14
8.4 数组作为函数参数 1、数组元素作函数实参 2、数组名作函数参数 章目录 3/14

1、数组元素作函数实参 ■有两个数据系列分别为: ◆inta8]={26,1007,956,705,574,371,416,517}; ◆intb[8]={994,631,772,201,262,763,1000,781}; ■求第三个数据系列c,要求c中的数据是a和b中对应数的最大 公约数:c[8]={2,1,4,3,2,7,8,11; int gcd(int m,intn) int main(void) intr; {inta[8]={.},b[8]={.}; if(m<n){r=m;m=n;n=r; int c[8],i; while(r=m%n) for(i=0;i<8;i++) {m=n;n=r;} c叮=gcd(a[0,b[);l调用函数 return n; for(i=0;i<8;i++) printf(%dlt”,c[叮); printf("An"); 数组元素等同于简单变量,可以用简 return 0; 单变量的场合均可以使用数组元素! 4/14
1、数组元素作函数实参 ◼有两个数据系列分别为: ◆int a[8]={26, 1007, 956, 705, 574, 371, 416, 517}; ◆int b[8]={994, 631, 772, 201, 262, 763, 1000, 781}; ◼求第三个数据系列c,要求c中的数据是a和b中对应数的最大 公约数:c[8]={2, 1, 4, 3, 2, 7, 8, 11}; int gcd(int m, int n) { int r ; if(m<n) { r=m; m=n;n=r; } while (r=m%n ) { m=n; n=r; } return n; } int main(void) { int a[8]={.},b[8]={.}; int c[8], i; for(i=0;i<8;i++) c[i]=gcd(a[i],b[i]); //调用函数 for(i=0;i<8;i++) printf(“%d\t”, c[i]); printf(“\n”); return 0; } 数组元素等同于简单变量,可以用简 单变量的场合均可以使用数组元素! 4/14

2、数组名作函数参数 ■用数组名做函数参数,此时实参与形参都用数组名。 ■在C语言中,数组名代表的是数组的起始地址。 ■这时,函数传递的是数组在内存中的地址。 ■实参中的数组地址传到形参中,实参形参共用同一段内存。 ■函数定义,形如: int f(int arxay[],int n){.} ■函数调用,形如: 2000 a[0] int main() 2004 [1] a {inta[]f{1,2,3,4,5},b; 2008 a[2] b=f(a5); 2012 a[3] 2016 a[4] 恩 5/14
2、数组名作函数参数 ◼用数组名做函数参数,此时实参与形参都用数组名。 ◼在C语言中,数组名代表的是数组的起始地址。 ◼这时,函数传递的是数组在内存中的地址。 ◼实参中的数组地址传到形参中,实参形参共用同一段内存。 ◼函数定义,形如: int f(int array[],int n){.} ◼函数调用,形如: int main() { int a[]={1,2,3,4,5},b; . b=f(a,5); } 5/14

数组b和数组a占据同一段内存 #include a同样为数组首地址,也是2000H void fun(int a[2],int n) int i; 2000H for(i=0;i<n;i++) 4 16 a[叮=a[j*a[叮 b 2000H2004H b就是2000H int main() {intb[2]={2,4}; printf(%d小t%d小n'b[o],b[1]); fun(b,2)月 printf(%d小t%dn”,b[o],b[1]); return 0; example6_5_1 6/14
数组b和数组a占据同一段内存 #include void fun(int a[2], int n) { int i; for(i=0;i<n;i++) a[i]=a[i]*a[i]; } int main() { int b[2]={2, 4} ; printf(“%d\t%d\n”b[0],b[1]); fun(b, 2); printf(“%d\t%d\n”,b[0],b[1]); return 0; } example6_5_1 6/14

#include l形参array,是数组名 void sort(int array,int n); void sort(int arrayD,int n) int main() inti,k,t; int a[10],i; for(i=0;i<n-1;i++) printf("enter array:In") {k=i; for(i=0;i<10;+)scanf("%d",&a[i]); for(j=i+1;j<n;j++) sort(a,10);∥调用排序函数对数组a中元素排序 if(array[]<array[k]) printf("The sorted array:In"); k=j; for(i=0;i<10;i++)printf("%d",a[i]); if(k!=i) printf("In"); t=array[k]; return 0; array[k]=array[]; array[叮=t; ■实参中的数组a地址传到形参array 中,实参形参共用同一段内存。 enter array: 45290-3541256633 The sorted array: -302591233455466 回 7/14
#include void sort(int array[],int n); int main() { int a[10],i; printf("enter array:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a,10); //调用排序函数对数组a中元素排序 printf("The sorted array:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); return 0; } //形参array是数组名 void sort(int array[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(array[j]<array[k]) k=j; if(k!=i) { t=array[k]; array[k]=array[i]; array[i]=t; } } } ◼实参中的数组a地址传到形参array 中,实参形参共用同一段内存。 7/14

查找问题:顺序查找函数 【例8.9】顺序查找:将被查数据x与数组里的每一个元素 逐个比较。可通过定义一个函数的方式来描述查找的过程, 在主函数中调用该自定义函数。 #include #define N 10 int search(int an,int n,int x); int main() 1x在数组中返回下标,否则返回-1 inti,k,t,b[N]; int search(int an,int n,int x) for(i=0;i<=N-1;i++) { scanf(〔“%d”,&b;If输入数组 int i; while(scanf("%d,&t)!=EOF) for(i=0;i<n;i++) k=search(b,N,t;∥函数调用 if(a[i]==x)return i; if(k==-1) return-1; printf(“Not Found!\n”); els printf("%dIn",k); 1 return 0; 8/14
查找问题:顺序查找函数 【例8.9】顺序查找:将被查数据x与数组里的每一个元素 逐个比较。可通过定义一个函数的方式来描述查找的过程, 在主函数中调用该自定义函数。 #include #define N 10 int search(int a[], int n, int x); int main() { int i, k, t, b[N]; for(i = 0; i <= N - 1; i++) scanf(“%d”,&b[i]); //输入数组 while (scanf(”%d”,&t)!=EOF) { k = search(b,N,t); //函数调用 if( k == -1) printf(“Not Found!\n”); else printf("%d\n",k); } return 0; } //x在数组中返回下标i,否则返回-1 int search(int a[], int n, int x) { int i; for( i=0;i<n;i++) if(a[i]==x) return i; return -1; } 8/14

查找问题:二分查找函数 【例8.10】二分查找:在数组里存放有序序列(由小到大,各不相同), 在多组输入中每次输入一个整数x,查找x在数组里是否存在,如果存 在返回其在数组的下标,如果不存在返回值为-1。 分析:二分查找的查找过程中采用先以有序数列的中点位置为比较对 象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部 分,否则为右半部分。通过一次比较,将查找区间缩小一半,所以称 这种查找方法为二分查找或折半查找。 二分查找的数据序列必须是有序的序列。 算法 设待查值为x,有序序列数组名为a,第二个数组元素的下标为s,最后一 个数组元素的下标为t,用mid表示区间的中间元素的位置,初始时mid=(s+t)/2。 )如果a[mid]==x,表示找到,返回此时的mid值,查找结束。 2)如菓amid=x,.则存在两种可能: (1)a[mid>x,说明如果该元素 岸在,只可能在中间位置之前的半个区间[s, mid-1],此时s不变、三mid-1,到前半区间做继续查我。 (2)a[mid<x,说明如果该元素存在,负可能在中间位置之后的半个区间 [mid+1,1,此时t不变、s=mid+1,到后半区间做继续查找 重复以上1)、2)过程,直到找到满足条件的记录,即查我成功,或直到确认区 间不存在该元素为止,此时查我不成功,香找结束。 回 6 9/14
查找问题:二分查找函数 【例8.10】二分查找:在数组里存放有序序列(由小到大,各不相同), 在多组输入中每次输入一个整数x,查找x在数组里是否存在,如果存 在返回其在数组的下标,如果不存在返回值为-1。 分析:二分查找的查找过程中采用先以有序数列的中点位置为比较对 象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部 分,否则为右半部分。通过一次比较,将查找区间缩小一半,所以称 这种查找方法为二分查找或折半查找。 二分查找的数据序列必须是有序的序列。 算法: 假设待查值为x,有序序列数组名为a,第一个数组元素的下标为s,最后一 个数组元素的下标为t,用mid表示区间的中间元素的位置,初始时mid=(s+t)/2。 1)如果a[mid]==x,表示找到,返回此时的mid值,查找结束。 2)如果a[mid]!=x,则存在两种可能: (1)a[mid]>x,说明如果该元素存在,只可能在中间位置之前的半个区间[s, mid-1],此时s不变、t=mid-1,到前半区间做继续查找。 (2)a[mid]<x,说明如果该元素存在,只可能在中间位置之后的半个区间 [mid+1,t],此时t不变、s=mid+1,到后半区间做继续查找。 重复以上1)、2)过程,直到找到满足条件的记录,即查找成功,或直到确认区 间不存在该元素为止,此时查找不成功,查找结束。 9/14

查找问题 0 经一次查找找到的情况; 。 经多次查找找到的情况; ·找不到的情况 10/14
• 经一次查找找到的情况; • 经多次查找找到的情况; • 找不到的情况 查找问题 10/14