C语言程序设计课件第7章 7.2函数的调用_第1页
C语言程序设计课件第7章 7.2函数的调用_第2页
C语言程序设计课件第7章 7.2函数的调用_第3页
C语言程序设计课件第7章 7.2函数的调用_第4页
C语言程序设计课件第7章 7.2函数的调用_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计

录目录CONTENTS

函数概述7.1

函数定义7.2

函数的调用7.3函数调用的一般形式为:函数名(实际参数表列)需要说明以下几点:如果调用无参函数,则“实际参数表列”可以没有,但括号不能省略。实际参数(简称“实参”)表中实参的类型及个数必须与形参相同,并且顺序一致。当有多个实参时,参数之间用逗号隔开。实参可以是常量、有确定值的变量或表达式及函数调用。

7.3函数的调用7.3.1函数的调用形式123【例7-3】求两个实数的平均值。【问题分析】在这里我们定义一个有参函数用于计算两实数的平均值。在主函数中可以多次调用此函数用于计算不同数值的平均值。

7.3函数的调用7.3.1函数的调用形式【参考代码】#include<stdio.h>floataverage(floatx,floaty) /*定义函数用于计算两数的平均值,x和y为形参*/{floatav; /*定义变量av用于存放平均值*/

av=(x+y)/2.0; /*求平均值*/

returnav; /*返回av的值*/}intmain(){

floata=1.8,b=2.6,c;

c=average(a,b); /*实参为确定值的变量*/

printf("Theavergaeof%5.2fand%5.2fis%5.2f\n",a,b,c);

c=average(a,a+b); /*实参为表达式*/

printf("Theavergaeof%5.2fand%5.2fis%5.2f\n",a,a+b,c);

c=average(2.0,4.0); /*实参为常量*/

printf("Theavergaeof2.0and4.0is%5.2f\n",c);

c=average(c,average(a,b)); /*实参为函数调用*/

printf("Theavergaeis%5.2f\n",c);}

7.3函数的调用7.3.1函数的调用形式【运行结果】程序运行结果如图所示。

7.3函数的调用7.3.1函数的调用形式【程序说明】求两个实数的平均值函数average有两个形式参数x和y,这两个参数用来接收调用函数时传递来的变量或表达式的值。该程序主函数调用了四次average函数,第一次调用时,用形式参数x和y接收实参变量a和b的值;第二次调用时,用表达式a+b作为实参之一,将a和a+b的值传给形参x和y;第三次调用时,用常量作为实参,将2.0和4.0的值传给x和y;第四次调用时,用函数调用average(a,b)作为实参之一,将c和average(a,b)的值传给形参x和y。按被调用函数在主调函数中出现的位置和完成的功能进行划分,函数调用有下列三种调用方式。

7.3函数的调用7.3.1函数的调用形式把函数调用作为一个语句,如例7-2中的“window();”,这时不要求函数带回值,只要求函数完成一定的操作。1在表达式中调用函数,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例如:c=average(a,b); /*将调用函数的结果赋值给c*/d=8*average(a,b); /*将调用函数的结果乘以8后赋值给d*/2将函数调用作为另一个函数调用的实参。例如:c=average(c,average(a,b));此处把average(a,b)作为average函数的一个参数。3

7.3函数的调用7.3.1函数的调用形式在一个函数调用另一个函数时,如果使用用户自定义函数,并且该函数与主调函数在同一个文件中,此时一般被调用函数应放在主调函数之前定义。若被调用函数的定义在主调函数之后出现,就必须在主调函数中对被调函数加以声明。函数声明的一般形式为:类型说明符函数名(形参表);函数声明实际上就是函数定义时的函数头,后面加分号构成一条声明语句。函数声明与函数头的区别是,函数声明的形参表中可以只写类型名,而不写形参名。例如,下面两种写法都是正确的:floataverage(floatx,floaty);floataverage(float,float);【例7-4】输入两个实数,用一个函数求出两数中较小数。【问题分析】分别编写min函数和main函数,main函数在min函数之前,需要在main函数中对min函数进行声明。

7.3函数的调用7.3.2函数声明【参考代码】#include<stdio.h>intmain(){floatx,y,z;

floatmin(floata,floatb); /*函数声明*/

printf("Pleaseentertwonumbers:");

scanf("%f

%f",&x,&y);

z=min(x,y); /*函数调用*/

printf("minis%f\n",z); /*输出结果*/

return0;}floatmin(floata,floatb) /*函数定义*/{

floatc;

if(a>b) /*比较大小,将较小数赋值给c*/ c=b;

else c=a;

returnc; /*返回值为c*/}

7.3函数的调用7.3.2函数声明【运行结果】程序运行结果如图所示。

7.3函数的调用7.3.2函数声明【程序说明】程序第5行是对被调用的min函数的声明:floatmin(floata,floatb);从程序中可以看到,main函数的位置在min函数的前面,而程序编译时是从上到下逐行进行的。如果没有对min函数的声明,当编译到程序第8行(z=min(x,y);)时,编译系统将无法确定min是不是函数名,也无法判断实参(x和y)的类型和格式是否正确,因此,在调用函数前必须对被调函数加以声明。C语言规定以下几种情况,可以不在主调函数中对被调函数进行声明:如果被调函数写在主调函数的前面,可以不必进行声明。例7-2和例7-3均属于此种情况,在此不再赘述。1如果函数的返回值为整型或字符型,可以不必进行声明。2

7.3函数的调用7.3.2函数声明【例7-5】通过自定义函数,求任意两个整数的和。【参考代码】#include<stdio.h>intsum(int,int);

intmain(){inta,b;

printf("inputtwointegers:");

scanf("%d

%d",&a,&b);

printf("Thesumof%dand%dis%d\n",a,b,sum(a,b)); /*调用函数*/

return0;}intsum(inta,intb) /*函数定义*/{

return(a+b); /*返回a+b的值*/}

7.3函数的调用7.3.2函数声明【运行结果】程序运行结果如图所示。

7.3函数的调用7.3.2函数声明如果在所有函数定义之前,在源程序文件的开头,即在函数的外部已经对函数进行了声明,则在各个调用函数中不必再对所调用的函数进行声明。例如,例7-4程序中也可将第5行函数声明(floatmin(floata,floatb);)放到main函数之前。3

名师点睛在调用函数前,可以在主调函数内部对被调函数进行声明。如果使用这种声明方式,则本次函数声明只在主调函数内部有效,也就是说,如果其他函数中也需要调用该被调函数,在那些函数中对被调函数仍然需要进行声明。如果已经在文件的开头(或在函数前)对某函数进行了声明,则从声明处开始,在本文件中对声明函数的调用不需要再次进行声明。

7.3函数的调用7.3.2函数声明在调用有参函数时,主调函数和被调函数之间往往有数据传递关系。前面已经介绍过,在定义函数时函数名后面圆括号内的为“形式参数”(简称“形参”),用于接收主调函数传来的数据;在调用函数时,函数调用语句的函数名后面圆括号中的内容为“实际参数”(简称“实参”)。在调用函数过程中,系统会把实参的值传递给被调用函数的形参。该值在函数调用期间有效,可以参加该函数的运算。例如,例7-4程序中第12~20行是一个被调函数(注意第12行的末尾没有分号)。第12行定义了一个函数名为min,函数类型为float的函数。指定两个形参a和b,形参的类型为float。主调函数main的第8行(z=min(x,y);)是一个函数调用语句,表示调用min函数,此处函数名min后面圆括号内的x和y是实参。x和y是主调函数main函数中定义的变量,a和b是被调函数min中定义的形参变量,通过函数调用,使两个函数之间发生数据传递。实参x和y的值按顺序对应传递给被调函数中的形参a和b,x传给a,y传给b。在执行被调函数min后,其返回值c作为函数的返回值返回给主调函数,赋给变量z。

7.3函数的调用7.3.3函数的参数传递

名师点睛关于形参和实参的说明如下:(1)函数中指定的形参变量,在未出现函数调用时,并不占用内存单元。在发生函数调用时,被调函数的形参被临时分配内存单元,调用结束后,形参所占的内存单元被自动释放。(2)函数一旦被定义,就可多次调用,但必须保证形参和实参数据类型一致。如果实参和形参数据类型不一致,则按不同类型数值的赋值规则进行转换。例如,实参a为float型变量,其值为5.8,而形参x为int型,则在传递时先将实数5.8转换成整数5,然后送到形参x。(3)实参可以是常量、变量或表达式,但要求它们有确定的值。(4)在被定义的函数中,必须指定形参的数据类型。(5)C语言规定,实参对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回给实参。

7.3函数的调用7.3.3函数的参数传递【例7-6】阅读下面的程序,试分析运行结果。#include<stdio.h>intswap(inti,intj){intt;

t=i;i=j;j=t;

printf("Infunctioni=%d,j=%d\n",i,j);}intmain(){

inti=2,j=3;

swap(i,j);

printf("Outfunctioni=%d,j=%d\n",i,j);

return0;}

7.3函数的调用7.3.3函数的参数传递【运行结果】程序运行结果如图所示。【程序说明】该程序中的swap函数的作用是将形参i和j两数互换,因此,在函数内部输出i和j时,两数实现了交换。但是,C语言中规定:只能把实参数值传递给形参,而形参不能把数值传递给实参。因此,main函数中的i和j还是原来的值,没有实现交换。

7.3函数的调用7.3.3函数的参数传递一般情况下,主调函数调用完被调函数后,都希望能够得到一个确定的值,这就是函数的返回值。在C语言中,函数返回值是通过return语句来实现的。return语句的一般形式有三种:return(表达式);return表达式;return;下面对返回语句和函数返回值作一些说明。(1)return语句可使函数从被调函数中退出,返回到调用它的代码处,并向调用函数返回一个确定的值。如果需要从被调函数带回一个函数值(供主调函数使用),被调函数中必须包含return语句且return中带表达式,此时使用return语句的前两种形式均可。如果不需要从被调函数带回函数值,应该用不带表达式的return语句;也可以不要return语句,这时被调函数一直执行到函数体的末尾,然后返回主调函数。在这种情况下,会返回一个不确定的函数值,因此,一般不提倡使用这种方法返回。(2)一个函数中可以有多个return语句,执行到哪一个return语句,哪一个语句就起作用。(3)在定义函数时应当指定函数的类型,并且函数的类型一般应与return语句中表达式的类型一致。当二者不一致时,应以函数的类型为准,即函数的类型决定返回值的类型。对于数值型数据,可以自动进行类型转换。

7.3函数的调用7.3.4返回语句和函数返回值【例7-7】将例7-5中程序稍作改动,修改后的程序代码如下所示,分析其运行结果。#include<stdio.h>intmain(){ floatx,y,z; intmin(floata,floatb); /*函数声明*/ printf("Pleasee

温馨提示

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

评论

0/150

提交评论