8.4 函数的调用
考点4 函数调用的一般形式和调用方式
1.函数调用的一般形式
函数调用的一般形式为:
函数名(实参表列);
函数的调用可以分为调用无参函数和调用有参函数两种。如果是调用无参函数,则不用“实参表列”,但括号不能省略。在调用有参函数时,若实参列表中有多个实参,各参数间用逗号隔开。实参与形参要求类型一致。
真考链接
考点4 在选择题中主要考查是否掌握了函数的正确调用方法。此知识点应当重点理解重点掌握,其考核概率为10%。
在操作题中常常通过编程题进行考查。要求编写满足特定要求(如能进行特定运算)的子程序,然后让主程序进行调用实现计算的功能,其考核概率为60%。
2.函数调用的方式
(1)函数语句。把函数调用作为一条语句,这时该函数只需要完成一定的操作而不必有返回值。
(2)函数表达式。当一个函数出现在一个表达式中,该表达式就被称为函数表达式。因为要参与表达式中的计算,所以要求该函数有一个确定的返回值提供给表达式。
(3)函数参数。函数调用作为一个函数的实参。
C语言中,调用函数和被调用函数之间的数据可通过3种方式进行传递。
(1)实参与形参之间进行数据传递。
(2)通过return语句把函数值返回到主调用函数中。
(3)通过全局变量。
真题精选
【例1】以下程序的输出结果是( )。
试题程序
#include <stdio.h>
main()
{ int i=2,p;
p=f(i,i+1);
printf("% d\n",p);
}
int f(int a,int b)
{ int c;
c=a;
if(a>b)
c=1;
else if(a==b)
c=0;
else
c= -1;
return(c);
}
A.-1 B.0 C.1 D.2
【答案】A
【解析】以上程序中定义了名为f()的整型函数,它有两个int类型的形参。在main()函数中调用了f()函数,可以很直观地看到,实参的值分别是2和3,2传给函数形参a,3传给函数形参b。函数返回的值赋给变量p,main()函数中输出的值就是函数中的返回值。在函数f()中,若a的值大于b,c被赋1;若a的值等于b,c被赋0;若a的值小于b,c被赋-1。按照实参传送过来的值,a的值小于b,因此c被赋-1,所以函数的返回值为-1。总结:本题中没有复杂的算法,但读者必须熟练地掌握if...else分支结构的执行流程,同时建立清晰的有关函数定义和函数调用的基本概念,就可得出正确的答案。
【例2】若已定义的函数有返回值,则以下关于该函数调用的叙述中,错误的是( )。
A.函数调用可以作为独立的语句存在 B.函数调用可以作为一个函数的实参
C.函数调用可以出现在表达式中 D.函数调用可以作为一个函数的形参
【答案】D
【解析】函数的形参只能是一般变量,函数调用不可以作为一个函数的形参,但可以作为实参,选项A、B和C的描述都是正确的。
【例3】以下程序用以求阶乘的累加和,请阅读程序并填空。
S=0!+1!+2!+…+n!
试题程序
#include <stdio.h>
long f(int n)
{ int i;
long s;
s=______;
for(i=1;i< =n;i++)
s=______;
return s;
}
m ain()
{ long s;
int k,n;
scanf("% d",&n);
s=______;
for(k=0;k< =n;k++)
s=s+______;
printf("% ld\n",s);
}
【答案】1 s*i 0 f(k)
【解析】本题要求进行累加计算,但每一个累加项是一个阶乘值,阶乘值由0!、1!、2!、3!依次变化到n!。函数f()用于求阶乘值n!(n为形参),由于阶乘的值很大,因此定义函数为long类型。求阶乘的值存于变量s中,因此s的初值应为1,第一个空处填1。连乘的算法可用表达式s=s*i(i从1变化到n中,循环控制变量k的值确定了n的值,调用一次f()函数可求出一个阶乘的值,所以在第四个空处应填f(k) (k从0变化到n)。总结:在进行累加及连乘时,存放乘积或累加和的变量必须赋初值;求阶乘(即连乘)时,存放乘积的变量其初值不能是0。
【例4】编写函数fun(),其功能是计算:
s=ln(1)+ln(2)+ln(3)+…+ln(m)
s的平方根作为函数值返回。
在C语言中,可调用log(n)函数求ln(n)。log函数的引用说明为:doublelog(doublex)。
例如,若m的值为20,则fun函数值为6.506583。
注意:部分源程序给出如下。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。
试题程序
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
double fun(int m)
{
}
void main()
{ printf("% f\n ",fun(20));
}
【答案】double fun(int m)
{ int i;
double s=0.0;
for(i=1;i< =m;i++)
s=s+log(i);/*计算s=ln(1)+ln(2)+ln(3)+…+ln(m)*/
return sqrt(s);/*对s求平方根并返回*/
}
【解析】本题考查:计算表达式的值运用for循环语句通过累加操作求和;平方根函数sqrt()的使用。
首先计算从1~m的对数的和,因此循环变量的范围是1~m,每次循环都进行一次累加求和。该题需要注意的是,log函数的形式参数应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。在返回时求出平方根。
考点5 函数的说明及其位置
真考链接
考点5属于简单识记内容,其在选择题中的考核概率为10%。
1. 函数的说明
C语言中,除了主函数外,对于用户定义的函数要遵循先定义后使用的规则。如果在程序中把函数的定义放在调用之后,应该在调用之前对函数进行说明(或函数原型说明)。函数说明的一般形式如下:
类型名 函数名(参数类型1,参数类型2,……,参数类型n);
例如:intadd(int,int);
或:
类型名 函数名(参数类型1 参数名1,参数类型2 参数名2,……,参数类型n 参数名n);
此处的参数名完全是虚设的,它们可以是任意的用户标识符,既不必与函数首部中的形参名一致,又可以与程序中的任意用户标识符同名,实际上参数名常常省略。函数说明语句中的类型名必须与函数返回值的类型一致。
函数说明可以是一条独立的语句。对函数进行说明,能使C语言的编译程序在编译时进行有效的类型检查。当调用函数时,若实参的类型与形参的类型不能赋值兼容而进行非法转换,C编译程序将会发现错误并报错;当实参的个数与形参的个数不同时,编译程序也会报错。
2. 函数说明的位置
一个函数在所有函数的外部,如在被调用之前说明,则在说明后的所有位置上都可以对该函数进行调用。如在main()函数内部进行说明,则只能在main()函数内部才能识别该函数。
小提示
函数调用可以实现源代码的美观,而且易读,但要确保函数能返回格式和数字都正确的值。
常见问题
在C语言中,调用函数和被调用函数之间的数据使用什么方式进行传递?
调用函数和被调用函数之间的数据传递有3种方式:实参与形参之间进行数据传递、通过return语句把函数值返回到主调用函数中和通过全局变量。通过全局变量进行传递的值总是在程序运行中最新的值。
真题精选
【例1】以下程序的输出结果是( )。
#include <stdio.h>
func(int a,int b)
{ int c;
c=a+b;
return c;
}
main()
{ int x=6,r;
r=func(x,x+ =2);
printf("% d\n",r);
}
A.14 B.15 C.16 D.17
【答案】C
【解析】对于func()函数,先求右边x+=2参数,它返回8(x=8),然后求左边参数,x为8。所以输出为16。
【例2】以下叙述中,正确的是( )。
A.C语言程序总是从第一个定义的函数开始执行
B.在C语言程序中,要调用的函数必须在main()函数中定义
C.C语言程序总是从main()函数开始执行
D.C语言程序中的main()函数必须放在程序的开始部分
【答案】C
【解析】一个实用的C程序总是由许多函数组成,main()函数可以放在程序的任何位置。C语言规定,不能在一个函数内部定义另一个函数。无论源程序包含了多少函数,C程序总是从main()函数开始执行。对于用户定义的函数,一般必须遵循先定义后使用的原则(除了int和char类型函数之外)。
【例3】若有以下程序:
#include <stdio.h>
void f(int n);
main()
{ void f(int n);
f(5);
}
void f(int n)
{ printf("% d\n",n);
}
则以下叙述中,不正确的是( )。
A.若在主函数中对函数f()进行说明,则只能在主函数中正确调用函数f()
B.若在主函数前对函数f()进行说明,则在主函数和其他函数中都可以正确调用f()
C.对于以上程序,编译时系统会报错,提示对f()函数重复说明
D.函数f()无返回值,所以可用void将其类型定义为无值型
【答案】C
【解析】C语言规定,在一个函数中调用另一个函数(即被调用函数)需要具备的条件有:①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数);②如果使用库函数,一般还应该在本文件开头用#include命令;③如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明。
共有条评论 网友评论