补充函数省公开课金奖全国赛课一等奖微课获奖课件_第1页
补充函数省公开课金奖全国赛课一等奖微课获奖课件_第2页
补充函数省公开课金奖全国赛课一等奖微课获奖课件_第3页
补充函数省公开课金奖全国赛课一等奖微课获奖课件_第4页
补充函数省公开课金奖全国赛课一等奖微课获奖课件_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

17.1函数概述函数是C语言程序基本组成单元。在C语言中,函数不一定要有参数,也不一定要计算数值。每个函数本质上是一个自带申明和语句小程序。能够利用函数把程序划分成小块,这么便于人们了解和维护程序。函数能够复用,即一个函数最初可能是某个程序一部分,但能够将其用于其它程序中。

1/1827.1函数概述函数是C语言程序基本组成单元。/*计算平均值*/#include"stdio.h"void

main(void){

float

x,y,z;

float

average(float

a,float

b);/*函数申明*/

printf("输入3个数值:");

scanf("%f%f%f",&x,&y,&z);

printf("%.2f和%.2f平均值为:%.2f\n",x,y,average(x,y));/*函数调用*/

printf("%.2f和%.2f平均值为:%.2f\n",y,z,average(y,z));/*函数调用*/

printf("%.2f和%.2f平均值为:%.2f\n",x,z,average(x,z));/*函数调用*/}函数申明函数调用main(),一个C语言程序必须包含一个main函数且只能包含一个main函数

float

average(float

a,float

b)/*函数定义*/{

float

c;

c=(a+b)/2;

return

c;}函数定义函数类型函数名参数列表函数头部函数体2/1837.1函数概述为何要有函数申明呢?假设上面程序没有函数申明这条语句,当碰到main函数中第一个average函数调用时,编译器没有任何关于average函数信息,编译器不知道average函数有多少形式参数,形式参数类型是什么,也不知道average函数返回值是什么类型。所以程序无法正常编译。

处理方法:一个方法是安排程序,使得每个函数定义都在此函数调用之前;另一个方法是函数申明,其形式为:函数类型函数名(形式参数);3/1847.1函数概述函数申明必须与函数定义一致。需要说明是,函数申明不需要说明形式参数名字,只要显示它们类型就能够了。如:floataverage(float,float);此时程序不需要进入函数定义,所以编译器只需要知道其形式参数类型即可。

4/1857.2数值交换【例7-5】编写函数交换两个变量数值

#include"stdio.h"void

swap(int

x,int

y);void

main(void){

int

a,b;

printf("请输入交换数值:");

scanf("%d%d",&a,&b);/*读入数值*/

printf("交换前a=%d,b=%d\n",a,b);

swap(a,b);/*调用函数*/

printf("交换后a=%d,b=%d\n",a,b);}void

swap(int

x,int

y)/*交换函数定义*/{

int

temp;temp=x;x=y;y=temp;}请输入交换数值:58交换前a=5,b=8交换后a=5,b=8Pressanykeytocontinue5/1867.2数值交换为何没有实现数值交换?

要搞清楚这个问题,需要了解C语言中实际参数和形式参数是怎样传递。形式参数出现在函数定义中,只有在函数被调用时才在内存中为其分配变量空间,而且在函数调用结束后,释放变量空间。也就是说,形式参数中变量并不是一直存在,它伴随函数调用开始而生产,函数调用结束而消失。实际参数是出现在函数调用中表示式,其作用是在函数调用时,计算出表示式值传递给形式参数,完成函数功效。

6/1877.2数值交换程序执行过程对应内存改变:85ab5885abxytemp85585abxytemp85ab(a)调用前(b)调用时(d)返回后(c)返回前7/1887.2数值交换从程序执行过程中能够看出,C语言进行函数调用时参数是值传递,也就是从实际参数到形式参数单向传递,形式参数任何改变不会影响实际参数内容。这也就是解释了程序为何得不到我们想要结果。

8/1897.3数组作为参数函数调用

数组作为一个惯用结构数据类型,也能够作为函数参数。当形式参数是一维数组时,能够说明数组长度或不说明数组长度。比如:intfun(inta[6]){}或intfun(inta[]){}9/18107.3数组作为参数函数调用

因为在C语言中,形式参数中数组并不像普通数组定义那样在内存中已分配一块连续空间,它只是与实际参数数组公用一块内存空间,所以形式参数中数组长度没有意义

如在main函数有以下语句:intb[6],c;c=fun(b);

b[5]bb[4]b[3]b[2]b[1]b[0]b[5]bb[4]b[3]b[2]b[1]b[0]a(a)调用前(b)调用时10/18117.3数组作为参数函数调用

从图中能够看出,函数调用后,形式参数数组a并没有像实际参数数组b一样再次申请一块连续空间,而是使得数组a与数组b首地址相同。这么,在函数中访问数组a中元素实际上等同于访问数组b中元素,从而实现数组参数传递。这种参数传递方式称为地址传递。

11/18127.3数组作为参数函数调用

那么在函数中怎样知道数组长度呢?

可惜是,C语言没有为函数提供任何简便方法来确定传递给它数组长度。不过,处理数组,长度是必须,所以通常要把数组长度也作为形式参数。比如:intfun(inta[],intn){…}

12/18137.3求数组中元素最大值

【例7-6】求数组中元素最大值。/*求数组中元素最大值*/#include"stdio.h"#defineN10float

max_array(float

a[],int

n);/*函数申明*/void

main(void){

float

array[N],max;

int

i;

printf("请输入%d个实数:\n",N);

for(i=0;i<N;i++)

scanf("%f",&array[i]);

max=max_array(array,N);/*函数调用*/

printf(“最大数组元素值是:%.2f\n",max);}13/18147.3求数组中元素最大值

【例7-6】求数组中元素最大值。float

max_array(float

a[],int

n)/*函数定义*/{

int

i;

float

max;

max=a[0];

for(i=1;i<n;i++)

if(a[i]>max)

max=a[i];

return

max;}请输入10个实数:1.22.33.44.55.66.77.88.99.02.1最大数组元素值是:9.00Pressanykeytocontinue14/18157.4函数嵌套调用

在C语言中,函数调用是没有限制,被调用函数中仍能够再次调用其它函数,这称为函数嵌套调用。比如:voidfb(){}voidfa(){ fb();}voidmain(void){ fa();}

15/18167.4函数嵌套调用

C语言允许函数嵌套调用,不过不允许函数嵌套定义,即在一个函数定义内部再定义另外一个函数比如:voidmain(void){ voidfa()/*错误函数定义*/ { ... }}在C语言中,全部函数都是平等,不能相互包含,只有main函数含有特殊性质,它是程序执行入口和出口。

16/18177.5函数递归调用

一个函数除了能够调用其它函数外,C语言还支持函数直接或间接调用自己,这种函数自己调用自己形式,称为函数递归调用,带有递归调用函数也称为递归函数。比如:intf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论