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 <CR>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 <CR> 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:10200<CR>a=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 <CR> 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[]<=z)*1+=1;elseif(p[i]>='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]<=’z’) *l+=1; else if(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; }