第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂

2025-12-29
| 30页
| 113人阅读
| 1人下载
精品

内容正文:

6.3节:数组作为函数参数 编程语言基础——C语言 同步精品课堂 高教版(第5版) 掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。 教学目标 一 03 学会多维数组名作为函数参数的声明和调用方法,能够解决矩阵转置、求矩阵最值等实际问题 能够区分不同数组参数形式的适用场景,灵活运用数组参数解决实际编程问题 04 掌握数组名作为函数参数的原理和用法,能够正确编写函数实现对一维数组的处理(如排序、求最值) 02 理解数组元素作为函数参数的基本概念和传递方式,能够通过实例(如找最大值、求平均值)掌握其应用方法 01 教学重难点 二 03 各类数组作参数的典型应用实例,如找最值、排序、求平均值、矩阵转置等 多维数组名作为函数参数时形参的声明方式及其与实参的对应关系 04 正确理解数组名作为函数参数时传递的是数组首地址这一概念 02 数组元素、数组名及多维数组名作为函数参数的传递原理和语法规则 01 导入新课 三 数组作为函数参数——让程序学会"批量处理" "假设你是班长,老师突然给你布置任务: 统计全班50人的平均成绩 找出最高分和最低分 按成绩从高到低排序 你打算怎么做?" 今天我们就来学习C语言的'批量处理'秘籍:①👉 数组元素作为参数(找最值) ②👉 数组名作为参数(排序、求平均) ③👉 多维数组作为参数(矩阵转置)" 方案A:写50个变量,手动计算... 😫 方案B:用数组存储,但每个功能都要重复写代码...🤔 方案C:学会数组作为函数参数,一次编写多次调用! 🎯 新知讲授 四 数组作为函数参数是C语言模块化编程的重要机制,主要包括数组元素和数组名两种传递方式。本节课将系统学习如何将一维数组、多维数组作为参数传递给函数,掌握数组元素的传值调用和数组名的传址调用的区别,通过查找最大值、求平均值、矩阵转置等典型例题,深入理解数组参数在函数中的实际应用。 概述 新知讲授 四 知识点1:数组元素作为函数参数 1、概述 (1)形式参数可以说变量或数组,是在参数可以是“常量、变量、表达式、数组元素、数组”。如下表所示: 形式参数 实在参数 变量 常量、变量、表达式、数组元素 数组 数组 (2)数组元素可以用作函数实参,但是不能用作形参。因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作函数实参时,把实参的值传给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递。 新知讲授 四 知识点1:数组元素作为函数参数 2、例6-5:找出数组中的最大值。 #include <stdio.h> int max(int x,int y) //求两数中较大值的函数 { return x>y?x:y; } main() { int a[10],i,m; printf("input 10 integers: "); for(i=0;i<10;i++) scanf("%d",&a[i]); //输入数组元素 m=a[0]; //假定第1个元素是最大值 for(i=1;i<10;i++) //循环求最大值 m=max(m,a[i]);//数组元素作为函数参数 printf("max is %d",m);} 新知讲授 四 知识点1:数组元素作为函数参数 3、例题:输入10个数,要求输出其中值最大的元素和该数是第几个数。 #include <stdio.h> int main() { int max(int x,int y); //函数声明 int a[10],m,n,i; printf("enter 10 integer numbers:"); for(i=0;i<10;i++) //输入10个数给a[0]~a[9] scanf("%d",&a[i]); printf(" "); for(i=1,m=a[0],n=0;i<10;i++) { if(max(m,a[i])>m) //若max函数返回的值大于m { m=max(m,a[i]); //max函数返回的值取代m原值 n=i; } //把此数组元素的序号记下来,放在n中 } printf("The largest number is %d it is the %dth number. ",m,n+1); } int max(int x,int y) //定义max函数 { return(x>y?x:y); } //返回x和y中的大者 新知讲授 四 知识点1:数组元素作为函数参数 3、例题:输入10个数,要求输出其中值最大的元素和该数是第几个数。 【程序代码分析】 从键盘输入10个数给a[0]~a[9]。变量m用来存放当前已比较过的各数中的最大者。开始时设m的值为a[0],然后依次将m与a[i]比,如果a[i]大于m,就以a[i]的值取代m的原值。下一次以m的新值与下一个a[i]比较。经过9轮循环的比较,m最后的值就是10个数的最大数。 请注意分析怎样得到最大数是10个数中第几个数。当每次出现以max(m,a[i])的值取代m的原值时,就把i的值保存在变量n中。n最后的值就是最大数的序号(注意序号从0开始),如果要输出“最大数是10个数中第几个数”,应为n+1。因为数组元素序号从0开始。 新知讲授 四 知识点2:数组名作为函数参数 1、例题6-6:编写一个函数显示数组的值。 #include <stdio.h> void display(int b[ ],int n) { int i; for(i=0;i<n;i++) printf("%4d",b[i]); } main() { int a[5]={10,20,30,40,50}; display(a,5);//数组名作为函数参数 } 新知讲授 四 知识点2:数组名作为函数参数 2、例题:有一个一维数组score,内放10个学生成绩,求平均成绩。 #include <stdio.h> main() { float average(float array[10]); //函数声明 float score[10],aver;int i; printf("input 10 scores: "); for(i=0;i<10;i++) scanf("%f",&score[i]); printf(" "); aver=average(score); //调用average函数 printf("average score is %5.2f ",aver); } float average(float array[10]) //定义average函数 { int i;float aver,sum=array[0]; for(i=1;i<10;i++) sum=sum+array[i]; //累加学生成绩 aver=sum/10; return(aver);} 新知讲授 四 知识点2:数组名作为函数参数 2、例题:有一个一维数组score,内放10个学生成绩,求平均成绩。 (1)用数组名作函数参数,应该在主调函数和被调用函数分别定义数组。 (2)实参数组与形参数组类型必须一致。 (3)在定义average函数时,声明形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C语言编译系统并不检查形参数组大小,只是将实参数组的首元素的地址传给形参数组名。 (4)形参数组可以不指定大小,在定义数组时在数组名后面跟一个空的方括号。 注意 用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量) 传递的是数组首元素的地址。 float average(float array[]) 新知讲授 四 知识点2:数组名作为函数参数 3、例题:有两个班级,分别有5和10名学生,调用average函数,分别求这两个班的学生的平均成绩。 #include <stdio.h> int main() { float average(float array[],int n); float score1[5]={98.5,97,91.5,60,55}; //定义长度为5的数组 float score2[10]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};//定义长度为10的数组 printf("The average of class A is %6.2f ",average(score1,5));//用数组名score1和5作实参 printf("The average of class B is %6.2f ",average(score2,10));//用数组名score2和10作实参 } float average(float array[],int n) //定义average函数,未指定形参数组长度 { int i; float aver,sum=array[0]; for(i=1;i<n;i++) sum=sum+array[i]; //累加n个学生成绩 aver=sum/n; return(aver); } 新知讲授 四 知识点2:数组名作为函数参数 3、例题:有两个班级,分别有5和10名学生,调用average函数,分别求这两个班的学生的平均成绩。 【注意】 用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组就共占同一段内存单元。 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 起始地址1000 2 4 6 8 10 12 14 16 18 20 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9] 新知讲授 四 知识点2:数组名作为函数参数 4、例题:用选择法对数组中10个整数按由小到大排序。 【分析】 所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]~a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。 a[0] a[1] a[2] a[3] a[4] 3 6 1 9 4 未排序时的情况 1 6 3 9 4 将5个数中最小的数1与a[0]对换 1 3 6 9 4 将余下的后面4个数中最小的数3与a[1]对换 1 3 4 9 6 将余下的3个数中最小的数4与a[2]对换 1 3 4 6 9 将余下的2个数中最小的数6与a[3]对换,至此完成排序 新知讲授 四 知识点2:数组名作为函数参数 4、例题:用选择法对数组中10个整数按由小到大排序。 #include <stdio.h> main() { void sort(int array[],int n); int a[10],i; printf("enter array: "); for(i=0;i<10;i++) scanf("%d",&a[i]); sort(a,10);//调用sort函数,a为数组名,大小为10 printf("The sorted array: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf(" "); } 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; t=array[k]; array[k]=array[i]; array[i]=t; } } 可以看到在执行函数调用语句“sort(a,10);”之前和之后,a数组中各元素的值是不同的。原来是无序的,执行“sort(a,10);”后,a数组已经排好序了,这是由于形参数组array已用选择法进行排序了,形参数组改变也使实参数组随之改变。 新知讲授 四 知识点3:多维数组名作为函数参数 1、概述 可以用多维数组名作为函数的实参和形参,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。 在定义二维数组时,必须指定列数(即一行中包含几个元素) ,由于形参数组与实参数组类型相同,所以它们是由具有相同长度的一维数组所组成的。不能只指定第1维(行数)而省略第2维(列数)。在第2维大小相同的前提下,形参数组的第1维可以与实参数组不同。例如,实参数组定义为int score[5][10];而形参数组定义为int array[ ][10];或int array[8][10];均可以。这时形参数组和实参数组都是由相同类型和大小的一维数组组成的。C语言编译系统不检查第一维的大小。 int array[3][10]; 或 int array[][10]; //二者等价 int array[][]; 或 int array[3][ ];//必须指定列数 新知讲授 四 知识点3:多维数组名作为函数参数 2、例6-7:将一个4×4的矩阵转置。 #include <stdio.h> void reverse(int b[ ][4],int n); void printfarr(int a[ ][4],int n); main() {int a[4][4]={{1,2,3,4},{5,6,7,8}, {9,10,11,12},{13,14,15,16}}; printf("输出转置前的矩阵: "); printfarr(a,4); reverse(a,4); printf(" 输出转置后的矩阵: "); printfarr(a,4); } void reverse(int b[ ][4],int n)//转置函数 { int i,j,temp; for(i=0;i<n;i++) for(j=0;j<=i;j++) { temp=b[i][j]; b[i][j]=b[j][i]; b[j][i]=temp; } } void printfarr(int a[ ][4],int n) { int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) printf("%4d",a[i][j]); printf(" "); }} 新知讲授 四 知识点3:多维数组名作为函数参数 3、例题:有一个3×4的矩阵,求所有元素中的最大值。 #include <stdio.h> main() { int max_value(int array[][4]); //函数声明 int a[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}}; //对数组元素赋初值 printf("Max value is %d ",max_value(a)); //max_value(a)为函数调用 } int max_value(int array[][4]) //函数定义 { int i,j,max; max=array[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if(array[i][j]>max) max=array[i][j];//把大者放在max中 return(max); } 在主函数调用max_value函数时,把实参二维数组a的第1行的起始地址传递给形参数组array,因此array数组第1行的起始地址与a数组的第1行的起始地址相同。由于两个数组的列数相同,因此array数组第2行的起始地址与a数组的第2行的起始地址相同。a[i][j]与array[i][j]同占一个存储单元,它们具有同一个值。实际上,array[i][j]就是a[i][j],在函数中对array[i][j]的操作就是对a[i][j]的操作。 师生互动 五 数组参数‘bug 猎手’挑战赛 片段 1(数组元素作函数参数) 片段 2(数组名作函数参数) // 功能:修改数组第1个元素值为100 #include <stdio.h> void change(int a[]) { a = 100; } int main() { int arr[5] = {1,2,3,4,5}; change(arr[0]); printf("%d", arr[0]); } // 功能:计算数组元素总和 #include <stdio.h> int sum(int arr[5]) { int s = 0; for(int i=0; i<5; i++) { s += arr[i]; } return s; } int main() { int num[3] = {10,20,30}; int res = sum(num); printf("总和:%d", res); } 随堂练习 六 1.关于数组元素作为函数参数的说法,正确的是( ) A. 数组元素作为实参时,形参必须是数组类型 B. 数组元素作为实参时,传递的是数组元素的地址 C. 数组元素作为实参时,传递的是数组元素的值 D. 数组元素作为实参时,形参必须是指针类型 答案:C 解析:数组元素作为实参时,传递的是数组元素的值,与普通变量作为实参一样,是单向的值传递。 随堂练习 六 2.以下函数调用中,错误的是( ) int fun(int x); int a[5] = {1,2,3,4,5}; A. fun(a[0]); B. fun(a[3]); C. fun(a[5]); D. fun(a[2]); 答案:C 解析:数组a的下标范围是0-4,a[5]越界访问。 随堂练习 六 3.关于数组名作为函数参数的说法,错误的是( ) A. 数组名作为实参时,传递的是数组首元素的地址 B. 数组名作为实参时,形参可以是指针变量 C. 数组名作为实参时,形参可以是数组类型 D. 数组名作为实参时,形参和实参占用不同的存储空间 答案:D 解析:数组名作为实参时,传递的是地址,形参和实参指向同一块内存空间。 随堂练习 六 4.以下程序的输出结果是( ) #include <stdio.h> void fun(int b[]) { b[0] = 10; } main() { int a[5] = {1,2,3,4,5}; fun(a); printf("%d", a[0]); } A. 1 B. 10 C.随机值 D.编译错误 答案:B 解析:数组名作为参数传递的是地址,函数中对数组元素的修改会影响实参数组。 随堂练习 六 5.以下程序的输出结果是( ) #include <stdio.h> void fun(int b[][3]) { printf("%d", b[1][1]); } main() { int a[2][3] = {{1,2,3},{4,5,6}}; fun(a);} A. 1 B. 2 C. 5 D.6 答案:C 解析:二维数组名作为参数,函数中访问b[1][1]即访问a[1][1],值为5。 随堂练习 六 6.以下函数定义中,错误的是( ) A. void fun(int a[]) B. void fun(int a[10]) C. void fun(int a[][]) D. void fun(int (*a)[3]) 答案:C 解析:二维数组作为形参时,必须指定第二维的大小。 随堂练习 六 7.以下程序的输出结果是( ) #include <stdio.h> void fun(int b[], int n) { int i; for(i=0; i<n; i++) { b[i] += 2;}} main() { int a[5] = {1,2,3,4,5}; fun(a, 3); printf("%d", a[3]);} A. 4 B. 5 C. 6 D.7 答案:A 解析:函数只修改了前3个元素,a[3]未被修改,仍为4。 随堂练习 六 8.以下程序的输出结果是( ) #include <stdio.h> void fun(int b[][2]) { b[0][0] = 5; } main() { int a[2][2] = {1,2,3,4}; fun(a); printf("%d", a[0][0]);} A. 1 B. 2 C. 3 D.5 答案:D 解析:二维数组名作为参数,函数中对数组元素的修改会影响实参数组。 课堂小结 七 谢谢 EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn EV录屏5.4.2软件录制 Lavf58.33.100 本视频由湖南一唯信息科技开发的EV录屏软件录制, www.ieway.cn $

资源预览图

第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
1
第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
2
第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
3
第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
4
第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
5
第6章 第3节:数组作为函数参数(课件)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
6
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。