
No.9-2《C语言程序设计》教案备注第九讲函数(二)1.了解函数间的通信方式;目的2.了解把数组、字符串传递给函数的方法;3.了解递归函数和递归程序设计方法;要求3小时学时划分组织形式讲授+自学+独立作业+上机量1.函数间的通信方式;点2.向函数传递数组和字符串:难3.递归函数及程序设计;点[引言】上一次课,我们重点讨论了,C语言函数的定义,引用方法及变量的存储类型。通过学习,我们知道,C语言函数是具有独立功能的程序段,是C语言程序的基本构成单位。实质上,C语言程序就是为解决某一问题而把有关函数组织在一起的有机整体,函数之间不能嵌套,只是调用和被调用的关系。那么,在进行程序设计时,究竟如何把相关函数有机地组织在一起,才能实现在程序执行时,各函数间能传递信息和数据,通俗一点讲,就是在函数调用时,如何是调用函数把参数传递给被调用函数,而是被调用函数把处理的结果返回给调用函数,从而获得我们所需要的结果呢?这就是我们今天要讨论的主要问题,即书中的第四节函数间的通信方式。6.4函数间的通信方式通信方式的种类:参数传递方式(传值方式和传址方式)函数返回值全局变量文件一、传值方式(数据复制方式)(一)含义把实参值本身复制给被调用函数的形参,是形参获得初始值
《C 语言程序设计》教案 No.9-2 第九讲 函数(二) 备 注 目 的 要 求 1.了解函数间的通信方式; 2.了解把数组、字符串传递给函数的方法; 3.了解递归函数和递归程序设计方法; 学时划分 3 小时 组织形式 讲授+自学+独立作业+上机 重 点 难 点 1. 函数间的通信方式; 2. 向函数传递数组和字符串; 3. 递归函数及程序设计; [引言]上一次课,我们重点讨论了,C 语言函数的定义、引用方法及 变量的存储类型。通过学习,我们知道,C 语言函数是具有独立功能 的程序段,是 C 语言程序的基本构成单位。实质上,C 语言程序就是 为解决某一问题而把有关函数组织在一起的有机整体,函数之间不能 嵌套,只是调用和被调用的关系。那么,在进行程序设计时,究竟如 何把相关函数有机地组织在一起,才能实现在程序执行时,各函数间 能传递信息和数据,通俗一点讲,就是在函数调用时,如何是调用函 数把参数传递给被调用函数,而是被调用函数把处理的结果返回给调 用函数,从而获得我们所需要的结果呢?这就是我们今天要讨论的主 要问题,即书中的第四节函数间的通信方式。 6.4 函数间的通信方式 通信方式的种类: 参数传递方式(传值方式和传址方式) 函数返回值 全局变量 文件 一、传值方式(数据复制方式) (一) 含义 把实参值本身复制给被调用函数的形参,是形参获得初始值

第九讲函数No.9-3(二)说明1.在传值方式的函数调用中,形参是变量,实参可以是变量、常量、函数调用和表达式;2.传值方式的调用,是在运行栈动态为形参分配存储空间,并把调用函数提供的实参值复制到形参占用的存储中:3.传值方式没有副作用,即不管被调用函数对传递给它的参数做任何处理,都不会影响到原来的实际参数:swap(x,y)int x,y,1函数调用inttempctemp=x,x=y,(c)zby=temp(b)y+-1(a)+a-mainO.实参值1运行栈int a,b,printf(In Enter a and b:");说明程序的执行结果为:scanf("%d %d",&a,&b);教材中Enter a and b:10 200 P178printf("In a=%d b=%d",a,b);a=10b=20010,200错printf("n---do swap-"),---do swap---“,”应为swap(a,b);a=10b=200空格printf("In a=%d b=%d",a,b)7二、地址复制方式(传地址方式)(一) 含义地址复制方式是把地址常量传递给被调用函数的形参,而不是把数据传递给它。(二)说明1.实参为地址常量(如数组名),形参为指针变量或数组名;2.传址方式,在调用函数时,首先在运行栈中为形参分配存储空间,并把实参的地址复制到形参占用存储,被调用函数引用地址,对实参进行间接访问;3.地址复制方式有副作用;(三)地址复制方式举例
第九讲 函 数 No.9-3 (二)说明 1. 在传值方式的函数调用中,形参是变量,实参可以是变量、常量、 函数调用和表达式; 2. 传值方式的调用,是在运行栈动态为形参分配存储空间,并把调 用函数提供的实参值复制到形参占用的存储中; 3. 传值方式没有副作用,即不管被调用函数对传递给它的参数做任 何处理,都不会影响到原来的实际参数; swap(x,y) int x,y; { int temp; temp=x; x=y; y=temp; } main() { int a,b; printf(“\n Enter a and b:”); scanf(“%d %d”,&a,&b); printf(“\n a=%d b=%d”,a,b); printf(“\n-do swap-”); swap(a,b); printf(“\n a=%d b=%d”,a,b); } 二、地址复制方式(传地址方式) (一)含义 地址复制方式是把地址常量传递给被调用函数的形参,而不是把 数据传递给它。 (二)说明 1.实参为地址常量(如数组名),形参为指针变量或数组名; 2.传址方式,在调用函数时,首先在运行栈中为形参分配存储空间, 并把实参的地址复制到形参占用存储,被调用函数引用地址,对 实参进行间接访问; 3.地址复制方式有副作用; (三)地址复制方式举例 说明 教材中 P178 10,200 错 “,”应为 空格 程序的执行结果为: Enter a and b: 10 200 a=10 b=200 -do swap- a=10 b=200 (c) z (b) y (a) x . 运行栈 c b a 实参值 函数调用

No.9-4《C语言程序设计》教案swap(x,y)1int*x,*y,int temp;temp=*x;说明:b*x=*y,1.教材&bP179程序*y=temp;1&a中丢a":-do swap-mainO实参值1运行栈2.图6.9中int a,b,多cprintf("In Enter a and b:");scanf(%d %d",&a,&b);程序的执行结果为printf("ln a=%d b=%d,a,b),Enteraandb:10200a=10b=200printf(n--do swap---");,---do swap---swap(&a,&b);a=200b=10printf("In a=%d b=%d",a,b);/*关于传值和传址的区别举例*/调用函数(某水果生产基地)被调用函数(某地区市民)实现功能:调查新水果是否受欢迎传值方式:提供水果传址方式:提供产地三、利用参数返回结果(一)实质根据地址复制方式,被调用函数可以改变调用函数中的数据(二)举例/*求输入字符串中大写和小写字母个数*/main1charstr[80];int upnum, lownum;printf(In Enter a string:");scanf(%s",str);upnum=0,lownum=0;
《C 语言程序设计》教案 No.9-4 swap(x,y) int *x , *y; { int temp; temp=*x; *x=*y; *y=temp; } main() { int a,b; printf(“\n Enter a and b:”); scanf(“%d %d”,&a,&b); printf(“\n a=%d b=%d”,a,b); printf(“\n-do swap-”); swap(&a,&b); printf(“\n a=%d b=%d”,a,b); } /*关于传值和传址的区别举例*/ 调用函数(某水果生产基地) 被调用函数(某地区市民) 实现功能:调查新水果是否受欢迎 传值方式:提供水果 传址方式:提供产地 三、利用参数返回结果 (一)实质 根据地址复制方式,被调用函数可以改变调用函数中的数据 (二) 举例 /*求输入字符串中大写和小写字母个数*/ main() { char str[80]; int upnum, lownum; printf(“\n Enter a string:”); scanf(“%s”,str); upnum=0; lownum=0; 说明: 1. 教 材 P179 程序 中丢 -do swap- 2.图 6.9中 多 c b &b &a a . 实参值 运行栈 程序的执行结果为: Enter a and b: 10 200 a=10 b=200 -do swap- a=200 b=10

第九讲函数No.9-5size(str,&upnum,&lownum);printf("In upcase=%d lowcase=%d",upnum,lownum)7size(p,u,l)int*u,*1,char p[];int i=0,while(p[]="0")if(p[i]>='a'&&p[]='A'&&p[i]<='Z")*u+=l;i++;1四、利用函数返回值传递数据(一)实现方法return【(表达式)]:(二)几点说明1.语句中的表达式可以是:常量、变量、函数引用、数组元素、地址常量或其他表达式;2.没有返回值时:(1)省略return语句;(2)省略return语句后的表达式:3.return语句的功能:(1)返回函数值;(2)终止函数执行,使控制返回调用函数(3)若省略return语句,执行到最后一个)结束,返回;(4)一个函数可以有多个return语句,但不提倡;(三)举例/*求x的n次方函数+/float power(x,n)float x
第九讲 函 数 No.9-5 size(str,&upnum,&lownum); printf(“\n upcase=%d lowcase=%d”,upnum,lownum); } size(p,u,l) int *u ,*l; char p[]; { int i=0; while(p[i]!=’\0’) { if(p[i]>=’a’&&p[i]=’A’&&p[i]<=’Z’) *u+=1; i++; } } 四、利用函数返回值传递数据 (一)实现方法 return [(表达式)]; (二)几点说明 1.语句中的表达式可以是:常量、变量、函数引用、数组元素、地 址常量或其他表达式; 2.没有返回值时: (1)省略 return 语句; (2)省略 return 语句后的表达式; 3.return 语句的功能: (1)返回函数值; (2)终止函数执行,使控制返回调用函数; (3)若省略 return 语句,执行到最后一个}结束,返回; (4)一个函数可以有多个 return 语句,但不提倡; (三)举例 /*求 x 的 n 次方函数*/ float power(x,n) float x;

No.9-6《C语言程序设计》教案int n,1float temp;for (temp=1;n>0;n--)temp*=x;return(temp);/实现数的判断:若为0返回0;若为正返回1;若为负返回-1*sign(x)float x;,1if(x>0)return(1);else if(x==0)return(0);elsereturn(-1);五、利用全局变量传递数据(一) 实质利用全局变量对对所有函数都可见(二) 说明1.程序的运行效率高;2.降低了函数的独立性,容易出错,不利于调试和维护;3.使用要有节制;(三)举例float result;main()1float x,y,printf("nEnterxandy:");scanf("%f %f",&x,&y);plus(x,y);printf(cIn x+y=%f",result):plus(x,y)float x,y,1result=x+y;1
《C 语言程序设计》教案 No.9-6 int n; { float temp; for (temp=1;n>0;n-) temp*=x; return(temp); } /*实现数的判断:若为 0 返回 0;若为正返回 1;若为负返回-1*/ sign(x) float x; { if (x>0) return(1); else if(x==0) return(0); else return(-1); } 五、利用全局变量传递数据 (一)实质 利用全局变量对对所有函数都可见 (二)说明 1.程序的运行效率高; 2.降低了函数的独立性,容易出错,不利于调试和维护; 3.使用要有节制; (三)举例 float result; main() { float x,y; printf(“\n Enter x and y:”); scanf(“%f %f”,&x,&y); plus(x,y); printf(“\n x+y=%f”,result); } plus(x,y) float x,y; { result=x+y; }

第九讲函数No.9-76.5数组与函数二、将数组元素传递给被调用函数的方法1.将数组首地址作为实参,被调用函数定义中用指针作形参接收:2.将数组首地址作为实参,被调用函数定义中用数组名做形参:二、举例1.求数组的平均值,函数形参用指针形式float mean(x,n)调用函数float*x,20int n,(a[0] 20ninti,axa[1]floataver,..for (i=0,aver=0;imaxv)maxv=data[i];return(maxv);maino
第九讲 函 数 No.9-7 6.5 数组与函数 一、将数组元素传递给被调用函数的方法 1.将数组首地址作为实参,被调用函数定义中用指针作形参接收; 2.将数组首地址作为实参,被调用函数定义中用数组名做形参; 二、举例 1.求数组的平均值,函数形参用指针形式 float mean(x,n) float *x; int n; { int i; float aver; for (i=0,aver=0;imaxv) maxv=data[i]; return(maxv); } main() 调用函数 20 a[0] a[1] . a[19] 20 n a x . 运行栈

No.9-8《C语言程序设计》教案1float x[50],maxmum;int i,for (i=0;i<50;i++)x[]=2*i-1;maxmum=max(x,50):printf(nmaxmum=%f,maxmum)6.6字符串和函数一、将字符串传递给函数的方法1.将字符串首地址作为实参,被调用函数定义中用指针作形参接收;2.将字符数组首地址作为实参,被调用函数定义中用数组名做形参:二、举例/*求字符串长度,形参用指针形式*strlen(s)char*s;1int n,for (n=0;*s!="10′;s++)n++;return(n):1mainO1char str[80];int len,printf("ln Enter a string:");scanf("%s",str);len=strlen(str);printf(ln First string length is %d",len);len=strlen("string length");printf(InSecond stringlength is%d",len)6.9递归函数与递归程序设计一、递归函数的概念在函数的定义中,若出现直接或间接调用自己的函数
《C 语言程序设计》教案 No.9-8 { float x[50],maxmum; int i; for (i=0;i<50;i++) x[i]=2*i-1; maxmum=max(x,50); printf(“\n maxmum=%f”,maxmum); } 6.6 字符串和函数 一、将字符串传递给函数的方法 1.将字符串首地址作为实参,被调用函数定义中用指针作形参接收; 2.将字符数组首地址作为实参,被调用函数定义中用数组名做形参; 二、举例 /*求字符串长度,形参用指针形式*/ strlen(s) char *s; { int n; for (n=0;*s!=’\0’;s++) n++; return(n); } main() { char str[80]; int len; printf(“\n Enter a string:”); scanf(“%s”,str); len=strlen(str); printf(“\n First string length is %d”,len); len=strlen(“string length”); printf(“\n Second string length is %d”,len); } 6.9 递归函数与递归程序设计 一、递归函数的概念 在函数的定义中,若出现直接或间接调用自己的函数

第九讲函数No.9-9间接调用自己:直接调用自己:int a(x)int f(x)int x,int x,1int d,c,bO,int y,Z,--d=b(c);z-f(y);3.:int b(y)int y,3inte,..e=a(i);.二、递归函数典型实例/*求n!*/1!=1n!=n (n-1)!n>1/*用递归函数求n!*/rfact(n)int n,1if (n<=1)return(1);else/*直接调用函数rfactO*return(n*rfact(n-1):mainO1intn,p,printf(InEnter n:");scanf(%d",&n);p=rfact(n);printf("In%d!=%d",n,p);【自学部分】指针函数和指向函数的指针
第九讲 函 数 No.9-9 二、递归函数典型实例 /*求 n!*/ 1!=1 n!=n(n-1)! n>1 /*用递归函数求 n!*/ rfact(n) int n; { if (n<=1) return(1); else return(n*rfact(n-1)); /*直接调用函数 rfact()*/ } main() { int n,p; printf(“\nEnter n:”); scanf(“%d”,&n); p=rfact(n); printf(“\n%d!=%d”,n,p); } [自学部分]指针函数和指向函数的指针 间接调用自己: 直接调用自己: int a(x) int f(x) int x; int x; { { int d,c,b(); int y, z; . . d=b(c); z=f(y); . . } } int b(y) int y; { int e,i; . e=a(i); . }

No.9-10《C语言程序设计》教案小结一、函数之间的通信方式1.参数传递方式(1)传值方式(2)地址复制方式2.参数返回值3.函数返回值4.全局变量二、数组与函数三、字符串与函数四、递归函数及程序设计独立作业题1.函数间的通信方式有哪几种?2.参数传递方式中的传值和传址方式有何区别?3.利用参数返回值实质是利用了函数什么特征?4.使用函数返回值通过什么实现?5.return语句中的表达式可以是什么?6.一个函数定义中是否可以含多个return语句?7.使用全局变量传递数据时,有何优缺点?8.如何把数组元素传递给函数?9.如何把字符串传递给函数?10.递归函数的含义是什么?11.教材P205一一思考与练习2.4.7
《C 语言程序设计》教案 No.9-10 小 结 一、函数之间的通信方式 1.参数传递方式 (1)传值方式 (2)地址复制方式 2.参数返回值 3.函数返回值 4.全局变量 二、数组与函数 三、字符串与函数 四、递归函数及程序设计 独立作业题 1.函数间的通信方式有哪几种? 2.参数传递方式中的传值和传址方式有何区别? 3.利用参数返回值实质是利用了函数什么特征? 4.使用函数返回值通过什么实现? 5.return 语句中的表达式可以是什么? 6.一个函数定义中是否可以含多个 return 语句? 7.使用全局变量传递数据时,有何优缺点? 8.如何把数组元素传递给函数? 9.如何把字符串传递给函数? 10.递归函数的含义是什么? 11.教材 P205——思考与练习 2.4.7.

第九讲函数No.9-11上机实作(六)一、变量存储类型及作用域练习1.先读下列程序,然后在机上运行,同所得结果对照mainO1int i,a=2;for (i=0;i<3;i++)printf(%4d"f(a);f(a)int a,1int b=0;static int c=2;执行结果为:b++;c++;789return(a+b+c);72.若把上题中的intb=0改为staticintb=0,结果会发生什么变化?3.通过以上实作结果,说明了什么问题?执行结果为:7911二、函数间的通信方式实作1.运行教材一一思考与练习题3.,分析所得结果;执行结果为:100,1000,15,100,102.把上题中的func(&s)改为func(s),把*p改为p,程序的执行结果会发生什么变化?执行结果为:100,1000,15,100,10003.通过以上实作结果,说明了什么问题?三、编程调试及运行教材P205一一思考与练习题2.4.7
第九讲 函 数 No.9-11 上 机 实 作(六) 一、变量存储类型及作用域练习 1.先读下列程序,然后在机上运行,同所得结果对照 main() { int i,a=2; for (i=0;i<3;i++) printf(“%4d”,f(a)); } f(a) int a; { int b=0; static int c=2; b++;c++; return(a+b+c); } 2.若把上题中的 int b=0 改为 static int b=0,结果会发生什么变化? 3.通过以上实作结果,说明了什么问题? 二、函数间的通信方式实作 1.运行教材——思考与练习题 3.,分析所得结果; 2.把上题中的 func(&s)改为 func(s),把*p 改为 p,程序的执行结果 会发生什么变化? 3.通过以上实作结果,说明了什么问题? 三、编程调试及运行 教材 P205——思考与练习题 2.4.7. 执行结果为: 7 8 9 执行结果为: 7 9 11 执行结果为: 100,1000,15,100,10 执行结果为: 100,1000,15,100,1000