当前位置:文档之家› C语言-桂林理工大学7-第七章 函数及其应用

C语言-桂林理工大学7-第七章 函数及其应用

C语言-桂林理工大学7-第七章 函数及其应用
C语言-桂林理工大学7-第七章 函数及其应用

学时安排:5

授课题目:第七章函数及其应用

目标要求:

掌握函数的定义与调用,理解函数间的信息传递方式,掌握数组做为函数参数时数据传递方式,了解递归调用。掌握变量的存储类型及作用域。

授课类型:理论课授课场地:教室

教学方式:讲授、演示、提问、讨论教辅设备:投影仪

授课内容:

第七章函数及其应用

模块化程序设计介绍

7、1 函数的定义

7.1.1 C语言的函数:

C语言的函数是子程序的总称,包括函数和过程。(有返回值、无返回值,教材中称为:有返回值函数,无返回值函数)。

C语言函数可以分为库函数、用户自定义函数。库函数由系统提供,程序员只需要使用(调用),用户自定义函数需要程序员自己编制。

C语言的程序由函数组成,函数是C语言程序的基本单位。

前面章节介绍的所有程序都是由一个主函数main组成的。程序的所有操作都在主函数中完成。事实上,C语言程序可以包含一个main函数,也可以包含一个main函数和若干个其它函数。

C语言程序的结构如图所示。在每个程序中,主函数main是必须的,它是所有程序的执行起点,main函数只调用其它函数,不能为其它函数调用。如果不考虑函数的功能和逻辑,其它函数没有主从关系,可以相互调用。所有函数都可以调用库函数。程序的总体功能通过函数的调用来实现。

7.1.2 .函数定义的一般形式:

说明:一个函数(定义)由函数头(函数首部)和函数体两部分组成

1、函数头(首部):说明了函数类型、函数名称及参数。

(1)函数类型:函数返回值的数据类型,可以是基本数据类型也可以是构造类型。如果省略默认为int,如果不返回值,定义为void类型。

(2)函数名:给函数取的名字,以后用这个名字调用。函数名由用户命名,命名规则同标识符。

(3)函数名后面是参数表,无参函数没有参数传递,但“()”号不能省略,这是格式的规定。参数表说明参数的类型和形式参数的名称,各个形式参数用“,”分隔。

2、函数体:函数首部下用一对{}括起来的部分。如果函数体内有多个{},最外层是函数体的

范围。

函数体一般包括声明部分、执行部分两部分。

(1)声明部分:在这部分定义本函数所使用的变量和进行有关声明(如函数声明)。

(2)执行部分:程序段,由若干条语句组成命令序列(可以在其中调用其它函数)。

注意:函数不能单独运行,函数可以被主函数或其它函数调用,也可以调用其它函数,但是不能调用主函数。

例:输入三个整数,求三个整数中的最大值,打印。

(1)比较两个程序,使用函数好象程序更长了,但是请思考,如果程序中要调用100次求三个数最大值又会是什么情况呢?

(2)解释max函数的定义的几个部分。简要解释max函数的调用。

7、2函数的调用

7.2.1函数调用的一般方法

函数名([实参表列])[;]

说明:

(1)无参函数调用没有参数,但是“()”不能省略,有参函数若包含多个参数,各参数用“,”分隔,实参参数个数与形参参数个数相同,类型一致或赋值兼容。

(2)函数调用可以出现的位置

●以单独语句形式调用(注意后面要加一个分号,构成语句)。以语句形式调用的函数可

以有返回值,也可以没有返回值。

例如:

printf(“max=%d”,nmax);

swap(x,y);

puts(s);

●在表达式中调用(后面没有分号)。在表达式中的函数调用必须有返回值。

例如:

if(strcmp(s1,s2)>0)……//函数调用strcmp()在关系表达式中。

nmax=max(n1,n2,n3) ; //函数调用max()在赋值表达式中,“;”是赋值表达式作为语句时加的,不是max函数调用的。

fun1(fun2()); //函数调用fun2()在函数调用表达式fun1()中。函数调用fun2()的返回值作为fun1的参数。

7.2.2 函数调用时数据的传递(函数之间的通讯)

函数是相对独立的,但是不是孤立的,它们通过调用时1)参数传递和2)函数的返回值3)全局变量(后面介绍)来相互联系。

已经介绍了函数参数的传递和返回值。现在以数组应用为例介绍参数传递中的传址方式的使用。

例:求学生平均成绩。P110.(注意参数传递的是数组的地址)

思考:如果在函数ave中加入程序段:

for(i=0; i

b[i]=sqrt(b[i])*10;

那么实参数组a中的数据是否改变?

7.2.3 函数的声明

函数定义的位置可以1)在调用它的函数之前,也可以2)在调用它的函数之后,甚至位于3)其它的源程序模块中。

●函数定义位置在前,函数调用在后,不必声明,编译程序产生正确的调用格式。

●函数定义在调用它的函数之后或者函数在其它源程序模块中,且函数类型不是整型,

这时,为了使编译程序产生正确的调用格式,可以在函数使用前对函数进行声明。这

样不管函数在什么位置,编译程序都能产生正确的调用格式。

函数声明的格式:

函数类型函数名([参数类型][,…,[参数类型]]);

C语言的库函数就是位于其它模块的函数,为了正确调用,C编译系统提供了相应的.h文件。.h文件内许多都是函数声明,当源程序要使用库函数时,就应当包含相应的头文件。

7、3函数的信息传递方式

7.3.1形式参数与实际参数

1、形式参数(形参):函数定义时设定的参数。

2、实际参数(实参):调用函数时所使用的实际的参数。

例中,主函数中调用max函数的语句是:nmax=max(n1,n2,n3);其中n1,n2,n3就是实参,它们的类型都是整型。

3、参数的传递

在调用函数时,主调函数和被调函数之间有数据的传递-实参传递给形参。具体的传递方式有两种:

(1)值传递方式(传值):将实参单向传递给形参的一种方式。

(2)地址传递方式(传值):将实参地址单向传递给形参的一种方式。

注意:

(1)单向传递:不管“传值”、还是“传址”,C语言都是单向传递数据的,一定是实参传递给形参,反过来不行。也就是说C语言中函数参数传递的两种方式本质相同-“单向传递”。

(2)“传值”、“传址”只是传递的数据类型不同(传值-一般的数值,传址-地址)。传址实际是传值方式的一个特例,本质还是传值,只是此时传递的是一个地址数据值。

(3)系统分配给实参、形参的内存单元是不同的,也就是说即使在函数中修改了形参的值,也不会影响实参的值。

●对于传值,即使函数中修改了形参的值,也不会影响实参的值。

●对于传址,即使函数中修改了形参的值,也不会影响实参的值。但是,注意:不会影响实

参的值,不等于不影响实参指向的数据。

传址与传值一样不能通过参数返回数据,但因为传递的是地址,那么就可能通过实参参数所指向的空间间接返回数值。

(4)两种参数传递方式中,实参可以是变量、常量、表达式;形参一般是变量,要求两者类型相同或赋值兼容。

7.3.2函数的返回值

C语言可以从函数(被调用函数)返回值给调用函数(这与数学函数相当类似)。在函数内是通过return语句返回值的。使用return语句能够返回一个值或不返回值(此时函数类型是void)。`

Return语句的格式:

Return [表达式];或return (表达式); 说明:

(1) 函数的类型就是返回值的类型,return 语句中表达式的类型应该与函数类型一

致。如果不一致,以函数类型为准(赋值转化)。

(2) 函数类型省略,默认为int 。

(3) 如果函数没有返回值,函数类型应当说明为void (无类型)。

7、4 函数与数组

数组作为参数时的情况:

– 数组元素作实参,与单个变量一样

– 数组名作函数参数,形、实参数都应是数组名或指针 – 实参数组与形参数组的大小可以不同,但实参>形参;

7.4.1 数组元素作实参

7.4.2 一维数组名作实参

#include "stdio.h" #include "math.h" main()

{ float a[10],b=0;

int i;

for (i=1;i<=10;i++) { scanf("%f",&a[i]); if (a[i]>0)

b=b+sqrt(a[i]); }

printf("b=%f\n",b); }

【例】求100名职工的平均薪水 #include "stdio.h" float average(arr) float arr[100]; { int i;

float aver,sum=arr[0]; for (i=1;i<100;i++) sum=sum+arr[i]; aver=sum/100; return(aver); }

main()

{float sal[100],aver; int i;

for(i=0;i<100;i++) scanf("%f",&sal[i]); aver=average(sal); printf("%6.3f",aver);}

7、5递归函数递归调用

函数允许嵌套调用和递归调用。递归调用是嵌套调用的特例。

7.5.1 函数的嵌套调用

函数嵌套调用:函数调用中又存在调用。如函数1调用函数2,函数又调用函数3。函数之间没有从属关系,一个函数可以被其它函数调用,同时该函数也可以调用其它函数。

例验证歌德巴赫猜想。按照歌德巴赫猜想,任何一个偶数均可以表示为两个质数之和。如

16=13+3 38=7+31……

程序一

#include

main()

{

int primeok(unsigned int n);

int proveok(unsigned int n);

unsigned n,m1,m2;

for (n=6; n<=20; n+=2)

{

m1=proveok(n);

m2=n-m1;

printf("%u=%u+%u\n",n,m1,m2);

}

}

int proveok(unsigned int n)

{ unsigned int i;

int n1,n2;

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

{ n1=i*primeok(i);

n2=(n-i)*primeok(n-i);

if (n==n1+n2) break;

}

return(i);

}

int primeok(unsigned int n)

{ int i,m;

m=sqrt(n);

for (i=2; i<=m; i++)

if (n%i==0) break;

if (i>=m+1)

return(1);

else

return(0);

}

程序二

#include

main()

{

int primeok(unsigned int n);

int proveok(unsigned int n);

unsigned n,m1,m2;

for (n=6; n<=20; n+=2)

{

m1=proveok(n);

m2=n-m1;

printf("%u=%u+%u\n",n,m1,m2);

}

}

int proveok(unsigned int n)

{ unsigned int i;

int n1,n2;

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

{ n1=i;

n2=n-i;

if ((n==n1+n2)&&(primeok(n1)==1)&&(primeok(n2)==1)) break;

}

return(i);

}

int primeok(unsigned int n)

{ int i,m;

m=sqrt(n);

for (i=2; i<=m; i++)

if (n%i==0) break;

if (i>=m+1)

return(1);

else

return(0);

}

7.5.2函数的递归调用

1、函数的递归调用:是指函数直接调用或间接调用自己,或调用一个函数的过程中出现直接或间接调用该函数自身。前者称为直接递归调用,后者称为间接递归调用。

例如:->f1()->f1()直接递归调用;->f1()->f2()->f1()间接递归调用。

2、使用递归调用解决问题的方法:(有限递归)

(1)原有的问题能够分解为一个新问题,而新问题又用到了原有的解法,这就出现了递归。(2)按照这个原则分解下去,每次出现的新问题是原有问题的简化的子问题

(3)最终分解出来的新问题是一个已知解的问题。

3、递归调用过程(两个阶段)

(1)递推阶段:将原问题不断地分解为新的子问题,逐渐从未知的向已知的方向推测,最终达到已知的条件,即递归结束条件,这时递推阶段结束。

(2)回归阶段:从已知条件出发,按照“递推”的逆过程,逐一求值回归,最终到达“递推”的开始处,结束回归阶段,完成递归调用。

例:用递归法求n!(P.114)

解:

n!=n*(n-1)*(n-2)*……*1=n(n-1)!。

递归公式:

1 0,1

n!=

n*(n-1)! 其它

main()

{

float fac(int n);

int i;

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

printf("%d!=%25.0f\n",i,fac(i));

}

float fac(int n)

{

float f;

if (n<0) printf("n<0,dataerror!");

else if (n==0||n==1) f=1;

else f=fac(n-1)*n;

return(f);

}

7.6变量的存储类型及作用域

变量从空间上分为局部变量、全局变量。

从变量存在的时间的长短(即变量生存期)来划分,变量还可以分为:动态存储变量、静态存储变量。变量的存储方式决定了变量的生存期。

C语言变量的存储方式可以分为:动态存储方式、静态存储方式。

动态存储方式:在程序运行期间根据需要为相关的变量动态分配存储空间的方式。C 语言中,变量的动态存储方式主要有自动型存储方式和寄存器型存储方式。 1

、 自动型存储方式(auto )

auto 型存储方式是C 语言默认的局部变量的存储方式,也是局部变量最常使用的存储方式。

(1)自动变量属于局部变量的范畴,作用域限于定义它的函数或复合语句内。

(2)自动变量所在的函数或复合语句执行时,系统动态为相应的自动变量分配存储单元,当

自动变量所在的函数或复合语句执行结束后,自动变量失效,它所在的存储单元被系统释放,所以原来的自动变量的值不能保留下来。若对同一函数再次调用时,系统会对相应的自动变量重新分配存储单元。

自动(局部)变量的定义格式:其中:auto 为自动存储类别关键词,可以省略,缺省时系统默认auto 。 例如:

前面各章中的函数中的局部变量,尽管没有明确定义为auto 型,但它们都属于auto 型变量。 在函数中定义变量,下面两种写法是等效的。

int x,y,z;或auto int x,y,z;它们都定义了3个整型auto 型变量x,y,z 。 2、寄存器型存储方式(register )

register 型存储方式是C 语言使用较少的一种局部变量的存储方式。该方式将局部变量存储在CPU 的寄存器中,寄存器比内存操作要快很多,所以可以将一些需要反复操作的局部变量存放在寄存器中。

寄存器(局部变量)的定义格式:

其中:register 为寄存器存储类别关键词,不能省略。

值得注意的是:CPU的寄存器数量有限,如果定义了过多的register变量,系统会自动将其中的部分改为auto型变量。

静态存储方式

静态存储方式:在程序编译时就给相关的变量分配固定的存储空间(在程序运行的整个期间内都不变)的存储方式。C语言中,使用静态存储方式的主要有静态存储的局部变量和全局变量。

1、静态存储的局部变量

静态局部变量的定义格式:

其中:static是静态存储方式关键词,不能省略。

例如:在函数内定义:static int a=10,b;

说明:

(1)静态局部变量的存储空间是在程序编译时由系统分配的,且在程序运行的整个期间都固

定不变。该类变量在其函数调用结束后仍然可以保留变量值。下次调用该函数,静态局

部变量中仍保留上次调用结束时的值。

(2)静态局部变量的初值是在程序编译时一次性赋予的,在程序运行期间不再赋初值,以后

若改变了值,保留最后一次改变后的值,直到程序运行结束。

2、全局变量全部是静态存储的。

C语言中,全局变量的存储都是采用静态存储方式,即在编译时就为相应全局变量分配了

固定的存储单元,且在程序执行的全过程始终保持不变。全局变量赋初值也是在便宜时完成

的。

因为全局变量全部是静态存储,所以没有必要为说明全局变量是静态存储而使用关键词

static。

如果使用了static说明全局变量,不是说“此全局变量要用静态方式存储”(我们知道

全局变量天生是静态存储的),那是有另外的含义-令人困惑的全局变量的static说明。

3、全局变量的extern声明及令人困惑的全局变量的static定义。

全局变量的static定义,不是说明“此全局变量要用静态方式存储”(全局变量天生全

部是静态存储),而是说,这个全局变量只在本源程序模块有效(文件作用域)。

如果没有static说明的全局变量就是整个源程序范围有效(真正意义上的全局)。也就

是说,变量的作用域有:分程序(复合语句)作用域,函数作用域,文件(模块)作用域,整

个程序作用域。

在引用全局变量时如果使用“extern”声明全局变量,可以扩大全局变量的作用域。例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。

变量从数据类型的角度,可以分为整型、实型、字符型等。

变量的作用域:变量的有效范围或者变量的可见性。变量定义的位置决定了变量的作用域。

变量从作用域(变量的有效范围,可见性)的角度可以分为:局部变量,全局变量。

于局部变量。

(1)在函数体内定义的变量,在本函数范围内有效,作用域局限于函数体内。

(2)在复合语句内定义的变量,在本复合语句范围内有效,作用域局限于复合语句内。(3)有参函数的形式参数也是局部变量,只在其所在的函数范围内有效。

例如:

说明:

(1)不同函数中和不同的复合语句中可以定义(使用)同名变量。因为它们作用域不同,程序运行时在内存中占据不同的存储单元,各自代表不同的对象,所以它们互不干预。即:同名,不同作用域的变量是不同的变量。

(2)局部变量所在的函数被调用或执行时,系统临时给相应的局部变量分配存储单元,一旦函数执行结束,则系统立即释放这些存储单元。所以在各个函数中的局部变量起作用的时刻是不同的。

2、全局变量

全局变量:在函数之外定义的变量。(所有函数前,各个函数之间,所有函数后)

全局变量作用域:从定义全局变量的位置起到本源程序结束为止。

●在引用全局变量时如果使用“extern”声明全局变量,可以扩大全局变量的作用域。

例如,扩大到整个源文件(模块),对于多源文件(模块)可以扩大到其它源文件(模块)。

●在定义全局变量时如果使用修饰关键词static,表示此全局变量作用域仅限于本源

文件(模块)。

例如:

说明:

(1)全局变量可以和局部变量同名,当局部变量有效时,同名全局变量不起作用。

(2)使用全局变量可以增加各个函数之间的数据传输渠道,在一个函数中改变一个全局变量的值,在另外的函数中就可以利用。但是,使用全局变量使函数的通用性降低,使程序的模块化、结构化变差,所以要慎用、少用全局变量。

本章教学过程中注意问题:

1、编程能力的提高及良好编程习惯的培养

2、本章教学重点是函数的定义及调用。

本章讨论问题:

1、讨论使用自定义函数的好处。以具体的程序为例,请同学们对比使用函数和不使用函数的编程情况。

2、给定一个复杂的算法,小组内成员进行分工,完成相应的函数,并对函数的功能及使用进行说明,组合成一个完整的程序。

3、讨论函数中参数的传递方式,试图写一函数实现两个变量的交换,能实现吗?存在什么问题?

C语言 第七章 函数

第七章函数 一、选择题 1.【B】 分析:函数返回值的隐含类型是整型。 2.【B】 分析:main函数可以在任何地方出现。它是程序的入口。 3.【D】 分析:函数的调用有一个返回值或者实现一定的功能,因此可以作为独立的语句存在,也可以出现在表达式中,可以作为一个函数的实参(返回值是一个实际的值)。4.【B】 分析:实参与形参之间的数据传递,只能是实参传给形参,单向传递。 5.【B】 分析:任何函数(除了main函数)的使用通过调用实现。普能的函数都能被单独编译(一定要能过调用才能运行),不能在一个函数中嵌套定义另一个函数。 6.【CD】 分析:C选项程序就是由若干个函数组成,无论是否有其他函数,主函数一定得存在。每个程序都必须有且仅有一个主函数,但不是每个程序文件都必须有main()函数。因为一个程序可能包含多个程序文件。函数不能嵌套定义。 7.【D】 分析:函数调用时实参必须与形参在个数,类型,顺序上相同。A选项中的"abc"是字符串,所以错误。C选项中'65'本身就是错误的。函数的返回值为空,不能用于赋值运算,所以B选项错误。D选项的第二个32在传给形参时可以转换为实型,正确。8.【A】 分析:实参都是用逗号隔开,第二个实参是个加法表达式,第三个实参是个逗号表达式。9.【C】 分析:fl函数功能返回较大的值,f2函数的功能返回较小的值。f1(a,b)返回为4,f2(a,b)返回为3。 10.【C】 分析:void *fun();的含义是fun函数的返回值是无值型的指针类型。 11.【C】 分析:函数在调用时不会出现类型说明符,所以A,D错误。函数的返回值为空,不能用于赋值运算,所以B选项错误。 12.【D】 分析:fun函数的功能选择两个数中较大的一个作为返回值。x为3,y为8,z为6以实参传到形参中,所以fun(fun(x,y), 2*z)等价于fun(fun(3,8), 2*6)等价于fun(8, 12),最后r被赋12。答案选D。 13.【B】 分析:fun函数功能返回两个数之和。此题就是函数调用作为函数实参。a为2,b为5,c 为8传到fun((int)fun(a+c,b),a-c))中那么它等价于fun(15,-6)。所以答案选B。14.【C】 分析:此题关键的一点就是实参与形参数据是单向传递的,a为31以实参传到函数中或者说传到形参z中,而函数体z=x*x+y*y会使z发生改变,形参改变了,但是实参是不

C语言程序设计第四版第七章答案-谭浩强

第七章函数 7.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 maxyueshu(m,n) int m,n; { int i=1,t; for(;i<=m&&i<=n;i++) {if(m%i==0&&n%i==0) t=i; } return(t); } minbeishu(m,n) int m,n; {int j; if(m>=n) j=m; else j=n; for(;!(j%m==0&&j%n==0);j++); return j; } main() {int a,b,max,min; printf("enter two number is: "); scanf("%d,%d",&a,&b); max=maxyueshu(a,b); min=minbeishu(a,b); printf("max=%d,min=%d\n",max,min); } 7.2求方程的根,用三个函数分别求当b2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。 #include"math.h" float yishigen(m,n,k) float m,n,k; {float x1,x2; x1=(-n+sqrt(k))/(2*m); x2=(-n-sqrt(k))/(2*m); printf("two shigen is x1=%.3f and x2=%.3f\n",x1,x2); } float denggen(m,n) float m,n; {float x; x=-n/(2*m); printf("denggen is x=%.3f\n",x); }

c语言课后习题第7章函数

习 题 7 7.1 已有变量定义和函数调用语句:int a=1,b=–5,c ;c=fun(a,b);fun 函数的作用是计算 两个数之差的绝对值,并将差值返回调用函数,请编写fun 函数。 Fun(int x,int y) { } 7.1 求两数之差绝对值 #include fun(int x,int y) { return abs(x-y); } main() { int a=1,b=-5,c; c=fun(a,b); printf("|%d-%d|=%d\n",a,b,c); } 7.2 已有变量定义和函数调用语句:int x=57;isprime(x);函数isprime( );用来判断 一个整型数a 是否为素数,若是素数,函数返回1,否则返回0。请编写isprime 函数。 isprime(int a) { } 7.3 已有变量定义和函数调用语句int a ,b ;b=sum(a);函数sum()用以求∑=n k k 1,和数作为 函数值返回。若a 的值为10,经函数sum 的计算后,b 的值是55。请编写sum 函数。 Sum(int n) { } 7.3 求∑k #include sum(int n) { int k,s=0; for(k=1;k<=n;k++) s=s+k; return s; } main() { int a,b; printf("Input a: "); scanf("%d",&a); b=sum(a);

printf("%c(1,%d)=%d\n",228,a,b); } 7.4 一函数,输入一行字符,将此字符串中最长的单词输出。 7.4 输出最长的单词,假设只包含字母和空格,单词间以空格分隔,空格个数不限#include void fun(char a[]) { int n,i,j,k=0,len[80],p; char c[80][80],max[80]; n=strlen(a); for(i=0;i #include int fun(char a[]) { int i,n=0,m; for(i=0;a[i];i++) { if(isalpha(a[i])) /*如果a[i]是字母,求出相应的十进制数*/ switch(a[i]) { case 'a': case 'A': m=10; break;

C语言第7章函数

第七章函数 一、选择题 1.如果在一个函数的复合语句中定义了一个变量,则该变量()。 A)只在该复合语句中有效,在该复合语句外无效 B)在该函数中任何位置都有效 C)在本程序的源文件范围内均有效 D)此定义方法错误,其变量为非法变量 2.C语言规定,简单变量作实参,它与对应形参之间的数据传递方式是:。A)地址传递;B)单向值传递; C)双向值传递;D)由用户指定传递方式 3.以下关于C语言程序中函数的说法正确的是:。 A)函数的定义可以嵌套,但函数的调用不可以嵌套; B)函数的定义不可以嵌套,但函数的调用可以嵌套; C)函数的定义和调用均不可以嵌套; D)函数的定义和调用都可以嵌套。 4.以下正确的函数形式是:。 A)double fun(int x,int y)B)fun(int x,y) {z=x+y;return z;}{int z;return z;} C)fun(x,y)D)double fun(int x,int y) {int x,y;double z;{double z; z=x+y;return z;}z=x+y;return z;} 5.以下说法不正确的是:。 C语言规定 A)实参可以是常量、变量或表达式 B)形参可以是常量、变量或表达式 C)实参可以是任意类型 D)形参应与其对应的实参类型一致或赋值兼容 6.在下面的函数声明中,存在着语法错误的是。 A)BC(int a,int);B)BC(int,int); C)BC(int,int=5);D)BC(int x,int y); 7.以下错误的描述是。 函数调用可以 A)出现在执行语句中B)出现在一个表达式中 C)做为一个函数的实参D)做为一个函数的形参 8.下面叙述中正确的是。 A)对于用户自己定义的函数,在使用前必须加以说明 B)函数可以返回一个值,也可以什么值也不返回 C)说明函数时必须明确其参数类型和返回类型 D)空函数不完成任何操作,所以在程序设计中没有用处 9.下面叙述中错误的是。 A)主函数中定义的变量在整个程序中都是有效的

C语言基础题第七章:函数

第七章:函数 一、单选题 1、若已用k=fun( fun (a,b,&c ) , 5, &a ); 形式正确调用fun函数,则该函数的形参个数为 B A、2 B、3 C、4 D、5 2、以下叙述中正确的是。 D A、形参和实参均属于局部变量 B、形参和实参必须是变量 C、形参的默认类型是register D、形参的默认类型是auto 3、假设x为局部变量,而且在整个程序运行期间始终占据固定的存储单元,则它的存储类应是。B A、auto B、static C、extern D、register 4、int fun( int x , int y ) C { return x+y ; } main( ) { printf(“%d \n”, fun(fun(1,2), fun ( 3,4 ) ) ) ; } 程序运行后的输出结果是。 A、3 B、7 C、10 D、编译错误 5、void fun ( char *s ) B { s=s+2; *s = *s +2 ; } main () { char *a="12345 " ; fun ( a ) ; printf ( " % s \n ", a ); } 程序运行后的输出结果是。 A、12345 B、12545 C、345 D、545 6、void fun ( int *a, int * b) { int *t ; t=a ; a = b ; b = t ; ( *a )++ ; (* b) +=2 ; } main ( ) { int a=1, b=10 ; fun ( &a, & b) ; printf ( " %d, %d \n ",a , b ); } 程序运行后的输出结果是。 D A、1,10 B、10,1 C、12,2 D、3,11 7、void fun ( char *p ) B { p++ ; *p=' a ' ; } main ( ) { char a[20]= " 13579 " ; fun ( a +1 ) ; fun( a + 3) ; printf ( " %s\n ", a ); } 程序运行后的输出结果是。 A、1a5a B、13a7a C、1a5a9 D、a3a79

C语言 第七章 函数

C语言函数实验 【试验目的】 1、掌握C语言中函数定义、调用函数的方法。 2、掌握函数形参与实际参数的参数传递关系。 【试验内容】 1、以下程序的输出结果是()。 #include double f(int n) { int i; double s=1.0; for(i=1;i<=n;i++) s+=1.0/i; return s; } int main() { int i; double a=0.0; double f(int n); for(i=0;i<3;i++) a+=f(i); printf("a=%f\n",a); return 0; } 2、以下程序输出结果是()。 #include int fun(int b) { int d=5; d+=b++; printf("d1=%d\n",d); } int main() {

int a=2,d=3; int fun(int b); fun(a); d+=a++; printf("d2=%d\n",d); return 0; } 3、以下程序输出结果是()。#include int f(int g) { switch(g) { case 0: return 0; case 1: case 2: return 1; } return (f(g-1)+f(g-2)); } int main() { int k; int f(int g); k=f(5); printf("k=%d\n",k); } 4、以下程序的输出结果是()。#include int fun(int n) { int s; if(n==0) s=7; else s=n+fun(n-1); return s; } int main() { printf("%d\n",fun(3)); return 0; }

小甲鱼C语言第七章 函数

第七章函数 如果有人问你,这个地球上什么动物最聪明?我想不会有其他答案,这个地球上人类是最聪明的。我们去百度一下“人类”,会发现百度百科中是这样描述人类的:人的总称,是地球上一中相比较来说比较高智慧的生物,可以说是地球至今的统治者。《现代汉语词典》对人的解释是:能制造工具、并且能够熟练使用工具进行劳动的高等动物。 《现代汉语词典》中对人类的解释离不开“工具”这个词。我们人类的祖先在使用天然工具的过程中,逐渐学会了如何制造工具。工具是什么呢?工具往往具有某些特定的作用、可以实现某种功能。比如打火机,可以用于打火,当我们想抽烟的时候,只需要轻轻的按一下打火机就可以了,而不需要钻木取火,如果现在还有人钻木取火的话,除非那个人是想实验一下钻木取火的真实性,否则为了帮助这个社会,我们就可以打电话通知精神病院了。 工具简化了我们的生活,也丰富了我们的生活。当我们需要实现某种功能的时候,只需要把对应的工具拿过来使用就好了。C语言中也提供了这种使用某种“工具”来处理特定问题的方法,称之为函数。 7.1 函数概述 有些人在看到本章的标题的时候可能就会惊呼:我函数学的最差了!!我最讨厌函数了!!。没错,数学中的函数的确很讨厌(针对我个人来说),我也很不喜欢它。但是不要担心,这里不会讲数学中的函数,更不会告诉你一次函数和二次函数的差别。我们这里讲的是计算机语言中的函数。 函数,在有些语言当中也称为方法。要说计算机语言中的函数和数学中的函数完全不一样吗?其实也不然,在计算机语言当中,函数就是具有特定功能的“工具”。像我们目前使用过的printf函数和scanf函数,前者用于输出,后者用于输入。还有我们每次编写代码都会使用的main函数。只不过printf和scanf函数是C语言提供的,我们只需要会用就行了,而main函数的功能是我们自己编写的。 为了更好的理解函数的概念,我举个例子来说。日常生活中我们经常会用到ATM自动取款机,这是一个非常方便的工具,我们平常只需要把钱存在卡里,需要的时候可以24小时去取款机中取钱,我想大家都应该有过去取款机取钱的经历,回想一下这个过程:走到取款机面前,我们要把卡放进去,然后取款机会提示输入密码,密码正确之后,选择取款,然后输入取款金额,取款机会把相应的钱吐出来,随后将会提示你是否打印凭条,打印完之后点击取款机屏幕上的退出,便可以取回自己的银行卡。 取款机实现了“自动取款”这个功能,在使用这个功能的时候,我们首先需要把卡放进取款机里,而且还要输入正确的密码,当密码正确之后,我们使用取款这个功能取得相应的钱。最后这个功能完成了,打印一张凭条,打印了此次取款的记录,最后把卡退还给用户。 那么自动取款机就可以说是一个函数,它具有取钱、存钱、转账等等功能,而且我们不需要知道这种功能是如何实现的,我们只需要会使用就可以了。 我们在C语言中也使用函数来实现某种特定的功能。C语言中函数分为两类,一类是库函数,一类是自定义函数。C语言有着丰富的库函数,这个库函数又是个啥子东西?C语言的语句十分简单,如果要使用C语言的语句来完成printf()和scanf()的功能,就需要编写颇为复杂的程序,因为C语言的语句中没有提供可以用于输出或输入的语句。又如为了显示一段文字,或者输入一段文字,我们可以直接使用printf和scanf函数,可以直接用于输出和输入,我们不必去关心这两个函数是如何实现输出和输入功能的。但是,C语言是不可

相关主题
文本预览
相关文档 最新文档