当前位置:文档之家› 小甲鱼C语言第七章 函数

小甲鱼C语言第七章 函数

小甲鱼C语言第七章 函数
小甲鱼C语言第七章 函数

第七章函数

如果有人问你,这个地球上什么动物最聪明?我想不会有其他答案,这个地球上人类是最聪明的。我们去百度一下“人类”,会发现百度百科中是这样描述人类的:人的总称,是地球上一中相比较来说比较高智慧的生物,可以说是地球至今的统治者。《现代汉语词典》对人的解释是:能制造工具、并且能够熟练使用工具进行劳动的高等动物。

《现代汉语词典》中对人类的解释离不开“工具”这个词。我们人类的祖先在使用天然工具的过程中,逐渐学会了如何制造工具。工具是什么呢?工具往往具有某些特定的作用、可以实现某种功能。比如打火机,可以用于打火,当我们想抽烟的时候,只需要轻轻的按一下打火机就可以了,而不需要钻木取火,如果现在还有人钻木取火的话,除非那个人是想实验一下钻木取火的真实性,否则为了帮助这个社会,我们就可以打电话通知精神病院了。

工具简化了我们的生活,也丰富了我们的生活。当我们需要实现某种功能的时候,只需要把对应的工具拿过来使用就好了。C语言中也提供了这种使用某种“工具”来处理特定问题的方法,称之为函数。

7.1 函数概述

有些人在看到本章的标题的时候可能就会惊呼:我函数学的最差了!!我最讨厌函数了!!。没错,数学中的函数的确很讨厌(针对我个人来说),我也很不喜欢它。但是不要担心,这里不会讲数学中的函数,更不会告诉你一次函数和二次函数的差别。我们这里讲的是计算机语言中的函数。

函数,在有些语言当中也称为方法。要说计算机语言中的函数和数学中的函数完全不一样吗?其实也不然,在计算机语言当中,函数就是具有特定功能的“工具”。像我们目前使用过的printf函数和scanf函数,前者用于输出,后者用于输入。还有我们每次编写代码都会使用的main函数。只不过printf和scanf函数是C语言提供的,我们只需要会用就行了,而main函数的功能是我们自己编写的。

为了更好的理解函数的概念,我举个例子来说。日常生活中我们经常会用到ATM自动取款机,这是一个非常方便的工具,我们平常只需要把钱存在卡里,需要的时候可以24小时去取款机中取钱,我想大家都应该有过去取款机取钱的经历,回想一下这个过程:走到取款机面前,我们要把卡放进去,然后取款机会提示输入密码,密码正确之后,选择取款,然后输入取款金额,取款机会把相应的钱吐出来,随后将会提示你是否打印凭条,打印完之后点击取款机屏幕上的退出,便可以取回自己的银行卡。

取款机实现了“自动取款”这个功能,在使用这个功能的时候,我们首先需要把卡放进取款机里,而且还要输入正确的密码,当密码正确之后,我们使用取款这个功能取得相应的钱。最后这个功能完成了,打印一张凭条,打印了此次取款的记录,最后把卡退还给用户。

那么自动取款机就可以说是一个函数,它具有取钱、存钱、转账等等功能,而且我们不需要知道这种功能是如何实现的,我们只需要会使用就可以了。

我们在C语言中也使用函数来实现某种特定的功能。C语言中函数分为两类,一类是库函数,一类是自定义函数。C语言有着丰富的库函数,这个库函数又是个啥子东西?C语言的语句十分简单,如果要使用C语言的语句来完成printf()和scanf()的功能,就需要编写颇为复杂的程序,因为C语言的语句中没有提供可以用于输出或输入的语句。又如为了显示一段文字,或者输入一段文字,我们可以直接使用printf和scanf函数,可以直接用于输出和输入,我们不必去关心这两个函数是如何实现输出和输入功能的。但是,C语言是不可

能提供我们编写程序所需求的所有函数,所以我们还需要自定义函数,也就是由我们自己来编写函数,来实现我们需要的功能,这时候就需要动用我们自己聪明的大脑去编写函数中的代码。

目前我们接触的程序都很短小,主要是希望初学者通过简短的例子能理解知识点。在以后随着学习的深入,代码会变的越来越多,实现的功能也越来越多,这些功能好多都是重复的,我们就可以将其编写成一个个的函数,需要的时候直接使用这个函数就可以了。一般来说,一个较大的程序一般分为若干个程序模块,每一个模块用来实现一个特定的功能,这就是所谓的模块化编程。在C语言中,实现程序模块功能都是用函数来完成的。一个C语言程序可以由一个主函数(main)和若干个其他函数构成,这所谓的“若干个其他函数”大多数都是自定义函数,也可以使用他人编写好的函数,所以函数的定义和使用就变得尤为重要了。

C语言源程序可以放在不同的文件中,所以同一个源程序中的函数也可以放在不同的文件中,为方便起见,本书只讨论在同一个源文件中的函数的定义和使用。

7.2库函数

前面说过,C语言提供了丰富的库函数,其中包括好多常用的函数,包括数学运算函数、处理字符和字符串的函数、用于输入和输出的函数等等,大家应该了解这些函数,在需要使用的时候可以拿来直接使用,不必自己编写。

以下为使用一个数学运算函数为例讲解其中包含的知识点:

例7.1.1,计算2的3次方的值

#include

#include

int main(void)

{

int a=pow(2,3);//计算2的3次方的值

printf("a的值为%d\n",a);

return 0;

}

其运行结果为:

1.在调用其他文件中的函数时要使用的include命令行

非常高兴的是,程序的第一行不仅仅包含了#include,还包含了

#include,第一行的内容终于不再孤独,终于有一个看起来很像同类的代码和他在一起了。我相信好多初学者在前面的学习中总会有一个疑问,#include这玩意到底是啥,今天首先就要先搞明白这是个啥东西。在例7.1.1中,使用了一个函数,函数名为pow,我用蓝色字体并且加粗标注起来了。pow函数用于计算某个数的n次方的值(本例中就是计算2的3次方的值)。由于pow这个函数是放在math.h这个文件中的,这个文件也称为头文件。所以要在程序的最前面写上#include,用来告诉编译器,我这个程序要使用math.h这个文件中包含的函数(在本例中就是pow函数),系统提供的头文件都是以.h 作为后缀名的。而include命令的作用就是把本程序需要用到的其他文件中的函数导入到本程序中,以便使用。Include命令行一定要以#开头,文件名要使用一对尖括号<>或者双引号””包起来。另外要特别注意,include不是C语言的语句,所以不能在后面加上分号。对于include命令的使用,再后续的章节中会用更加详细的讲解。

2.关于主函数main()

int main(void)这一行相信大家应该很熟悉了,写C语言程序必须写的一个函数,被称为主函数。C语言程序总是从主函数开始执行,无论这一段程序中有多少函数总是从main 函数开始执行。一个程序只能有一个主函数,在主函数里可以编写执行代码或者调用其他函数来执行相应的功能。在我们以前接触过的程序中,都是直接在主函数编写代码,然后直接运行就可以了。

3.库函数的调用

在例7.1.1中,定义了一个变量a,然而变量a的值的初始化却和之前学过的方式不一样。之前的学习中,变量可以被初始化为一个值,或者初始化为其他变量的值。但是现在却出现pow(x,y)的形式,这就是库函数的调用方式。库函数的调用方式一般为:函数名(参数列表)

在例7.1.1中,我们使用pow(2,3)的方式获取到了2的3次方的值,pow为库函数的名字,其后的括号中为参数列表,目前来说,参数列表又是一个新的名词。那么如何理解这个参数列表呢?还记得7.1小节中我举的ATM机的例子吗?在使用ATM取款机执行取款之前,我们一定要把卡插进去,同时要输入正确的密码才行。这里的卡和密码就是参数,也就是ATM机要处理的条件和内容。pow函数也是一样的,我们调用pow函数是希望计算出某个数的n次方的值,所以,你一定要告诉它需要计算的是什么数,幂数是多少(也就是几次方),这个函数才能计算出最终的结果。

4.在C语言中,库函数的调用有两种方式:

1).出现在表达式当中,比如例7.1.1,用pow函数计算2的3次方的值然后赋值

给变量a

int a=pow(2,3);

2).作为独立的语句完成某种操作,比如

printf(“********”);

用于在屏幕上输出8个星号。

7.3自定义函数

C语言虽然提供了很多库函数可以很方便的使用,但是毕竟库函数只提供了一些常用的操作,在程序的编写中经常会碰到好多C语言没有提供的库函数,这时候我们就要自己编写函数,也就是自定义函数。自定义函数在一个稍大的程序里占很大一部分,所以自定义函数的学习非常重要。

7.3.1自定义函数的语法

1).自定义函数的一般形式如下:

函数返回值函数名(类型名形式参数1,类型名形式参数2....) //这里函数首部

{

函数的功能代码 //这里是函数体

}

2).函数名和各个形式参数都是用户自定义标识符,必须符合自定义标识符的命名规则。在同一个程序源文件中,函数名不可以重复,形式参数的名字只要在同一个函数中不同名就可以了,同一个程序源文件中的不同函数里的形式参数的名字可以同名。

3)在一个函数中,不可以定义其他函数,但是可以调用其他函数。

4)如果在自定义函数的首部省略了函数返回值,即变成

函数名(类型名形式参数1,类型名形式参数2....)

这种形式,则默认返回值为int类型。

5)除了返回值为int类型的函数之外,函数必须先定义(或者声明)后使用。

6)如果某一个函数只是用来执行某个功能,而没有返回值,那么可以将这个函数的返回值定义为void(空)。

7)自定义函数的调用和库函数的调用的方式一致。

看了以上6条知识点的介绍,我想大家一定晕晕的,没有关系,下面我们通过实例来详细分析上面的知识点。

例7.1.2 求最大值

#include

int max(int a,int b)

{

if(a>b)

return a;

else

return b;

}

int main(void)

{

int x,y;

int t;

printf("请输入两个整数:\n");

scanf("%d",&x);

scanf("%d",&y);

t=max(x,y);

printf("最大的数为%d\n",t);

}

当我输入2和5,其运行结果如下图:

在这个例子中,我编写了一个函数,我已经用蓝色字体标注起来了。这个函数的名字是max,这个函数有两个形式参数,都为int类型的,这个函数的返回值也为int类型的。在这个函数中还出现了return语句的身影。即使看到这里我依旧相信有好多人对“形式参数”、“返回值”、return语句的作用还是不能理解,那么首先以这个例子来了解一下这几个概念。

1.形式参数:简称形参。在前面提到过ATM机的例子,还是这个例子,ATM机有一个插口,用于插入卡,还有一个密码框等待用户输入密码。这些功能都是ATM机提供好的,要想取钱或者转账就一定要有这两个步骤才行。那么这两个步骤是在ATM机的设计之初就设计好的,这两个功能就是等待用户插入卡和等待用户输入正确的密码。那么这就可以理解为两个形式参数,ATM机的插口和密码输入框的用处就是告诉用户:想要让我吐出钱来,就一定要给我两个数据,一个是卡,一个是正确的密码。你不能塞进去一个树叶,也不能输入错误的密码。在例7.1.2中的第二行,也就是max函数的首部中,函数名max后面的括号中的形式参数列表中,定义了两个形式参数,分别为int a,int b,那么这个函数的意思就是告诉程序开发的人员:你要是想让我帮你运算最大值,你就得先告诉我两个值,这两个值必须是int类型的。还有一点特别强调,在某一个函数中的形式参数,是可以直接在这个函数中使用的,而不用另外声明。

2.实际参数:简称实参。实参的概念和形参的概念是对立起来的,我相信理解了形参的概念就不难理解实参的概念。形参只是要求了一个函数能接受的数据,实参就是实际传递给这个函数的数据。在例7.1.2的第17行中,t=max(x,y);我们调用了max这个函数,在调用这个max函数的时候,我们在函数名后的括号中,写入了两个由我们自己输入的数据,分别为int类型的x,和int类型的y,这是我们输入的东西,输入了这些东西就是希望调用函数来处理这两个数据。简单来说,形参主要理解的就是形式参数的中形式两个字,在生活中我们可以知道,形式,往往都是没有任何实际内容的,而实际参数,就是实际要去操作、去处理的数据。

3.return语句:在我们编写第一个程序的时候,我们都会在main函数的函数体的最后看到一条return 0; 我相信这也是大家一直疑问到现在的问题。还是ATM机的例子,我去ATM取款,我输入密码,输入取款金额之后,不可能就这么走了吧,ATM机得把钱吐给我呀,还得给我打印一张凭条。这是在ATM机取完钱之后,ATM机告诉你:取钱的操作完成了,你把钱拿走,把凭条打印走收好,并且把你的卡还给你。在例7.1.2中,max函数是用来计算两个整数的最大值。max函数的功能一句话就说完了,但是仅仅是计算吗?我们还需要通过这个函数把这个最大值像结果一样告诉我们。那么函数把结果告诉我们的方法就是通过return语句来完成,return语句的意思是”返回“。例7.1.2中有两条return语句,它们

存在于max函数中的if-eles语句中,如果谁大,就把谁给返回了。那么这时候就可以理解返回值以及返回值类型的概念了,既然一个函数要经过计算之后得到一个结果,那么就要把这个结果返回给调用的语句。在例7.1.2中,t=max(x,y);我们在=号右边调用了max函数,经过计算之后,返回了一个最大值赋值给t。同时我们可以看到在max函数的首部,我们可以看到i nt max(int a,int b) 返回值为int,那么这个int的意思就是,这个函数最终计算机之后,会返回一个int类型的结果。

那么看到这里,再去回头看看例7.1.2是不是轻松多了呢?下面我把上面的例子加上注释和调用函数的跳转流程标注一下:

#include

int max(int a,int b)//函数的定义

{

int t;//函数的功能开始执行

if(a>b)

return a;//如果a大于b就返回a

返回a或b

else

return b;//否则返回b 传递x和y }

int main(void)//主函数。

{

int x,y;//定义俩变量

int t;//定义一个用于接受函数返回值的变量

printf("请输入两个整数:\n");

scanf("%d",&x);//输入两个值

scanf("%d",&y);

t=max(x,y);/*调用max函数,并且将x和y作为实参传入max函数进行运算得到结果*/

printf("最大的数为%d\n",t);//显示结果

}

1.从主函数开始执行

2.定义俩变量,用于接受用户输入的两个数据,并且定义一个数据用于接受函数返回值。

3.执行输入的操作。

4.t=max(x,y);这时候首先开始=号右边表达式的计算,也就是调用max函数。在标注的例子中,我使用向上的箭头标注了此时的程序流程,将x和y传递到max函数的首部,分别对应形参的a和b,随后max函数中开始对比a和b的值,最终得到结果通过return语句返回。

5.返回的结果作为表达式赋值给t,最后显示出来。

最后我们总结一下自定义函数的知识点:

1.函数名和形参名可以按照标识符的规则随意定义。

2.函数返回值的类型可以称作函数的类型,函数的类型可以是整型、浮点型、字符型、指针、结构体等等。

3.函数名后的圆括号中是形式参数列表,在例7.1.2中有两个形式参数。定义函数的时候可以定义多个形式参数,每个形式参数由逗号,隔开。

4.函数体可以是空的,比如void max() {} 圆括号内可以没有形参,大括号内也可以没有函数体。但是圆括号是不可以省略的。这样的函数是空函数,这是一个什么也不执行的函数,但是在程序开发的过程中作为一个虚设的部分往往是很有用的。

5.函数的返回语句,也就是return返回的类型要和函数首部定义的返回值类型一致。若类型不一致,则以函数首部定义的返回值类型为准,进行类型转换。

6.当程序执行到return语句的时候,程序的流程就停止到该位置,退出这个函数并且返回此时运算得到的结果。在同一个函数内,可以根据需要,比如在例

7.1.2中,可以多次出现return语句,在函数体不同的位置退出并且返回相应的值。但是无论函数体中有多少个return语句,return语句只可能执行一次。

7.return语句中也可以不包含任何表达式,也就是没有可以返回的值,那么这时候就应该定义函数的类型为void类型,它的作用只是使流程返回到调用函数,并没有返回具体的值。

7.4自定义函数的调用

7.4.1函数的两种调用方式

函数的一般调用形式为

函数名(实参列表)

实参(实际参数简称)的个数多于一个的时候,各个实参之间用逗号隔开,实参的个数必须与所调用函数中的形参相同,类型也要一一对应匹配,若函数无形参,调用形式为函数名()

注意,函数名后的一对圆括号不可少

在一般取款下,可用两种方式调用函数

1)当所调用的函数用于求某个值的时候,也就是函数最终会返回一个结果,那么函数的调用可以作为表达式出现在任何允许出现表达式的地方。例如例7.1.2例中的max函数,即可以使用下面的语句调用该函数,求出10和18的最大值,最后赋值给y:int y=max(10,18);

max函数也可以出现在if语句中作为进行判断的表达式:

if(max(10,18)>0)

{...}

2)C语言中的函数可以仅进行某些操作而不返回任何函数值,这时函数的调用可以作为一条独立存在的语句,例如将例7.1.2的max函数做如下修改:

int max(int a,int b)

{

int t;

if(a>b)

printf(“最大值为%d\n”,a);

else

printf(“最大值为%d\n”,b);

}

在主函数中即可以写为:

int main(void)

{

int x,y;

printf("请输入两个整数:\n");

scanf("%d",&x);

scanf("%d",&y);

max(x,y);

return 0;

}

即max函数不仅仅包含了计算,还包含了输出语句,那么max函数就是可以直接完成计算+输出的功能,故不需要在主函数中单独定义一个变量用于接受了,调用一次函数即可完成所有功能。

7.4.2 函数调用时的语法要求

函数调用时有以下语法要求:

1)调用函数的时候,函数名必须与所调用的函数的名字完全一致。

2)实参的个数必须与形参的格式一致。实参可以是表达式,在类型上应该按照位置与形参一一对应匹配,比如例7.1.2中的max函数,在调用的时候可以写成max((2+1),5),只要在对应的形参位置上传递一个类型与之匹配的实参就可以了,其中当然可以包括表达式。如果类型不匹配,C编译程序将会按照赋值兼容的规则进行转换。若实参和形参的类型不赋值兼容,通常并不会给出出错信息,且程序仍然执行,只是不会得到正确的结果。所以应该特别注意实参和形参的类型匹配。

3)C语言规定,函数必须先定义,后调用(函数的返回值类型为int或者为char时除外)。例如例7.1.2中的max函数,它与被调用函数(main函数)在源程序中的位置应该如下:

int max(int a,int b)

{

...

}

int main(void)

{

...

int t=max(x,y);

...

}

4)在C语言中,函数可以直接或者间接的调用自己,称为递归调用。有关函数递归调用的内容将在后续章节中详细介绍,这里不做相信阐述,先搞明白基础的,再去学习深一点的内容。

7.5函数的说明(声明)

7.5.1函数说明的形式

在我们之前学习过的变量与常量一章当中,特别提醒大家一定要先声明变量再使用变量。函数中亦然,除主函数之外,都要遵循先定义,后使用的原则。凡是在调用某个函数之前没有定义过这个函数,C编译程序都默认该函数的返回值类型为int类型。对于返回值为其他类型的函数,若把函数的定义放在被调用函数之后,应该在调用之前对函数进行说明,也可以称作函数原型说明,函数说明的一般形式如下:

类型名函数名(参数类型1,参数类型2....)

我们通过修改7.1.2来理解

例7.1.3.函数原型说明

#include

int max(int,int);

int main(void)

{

int x,y;

int t;

printf("请输入两个整数:\n");

scanf("%d",&x);

scanf("%d",&y);

t=max(x,y);

printf("最大的数为%d\n",t);

return 0;

}

int max(int a,int b)

{

if(a>b)

return a;

else

return b;

}

其运行结果与例7.1.2无差别。

在例7.1.3中,我们可以看到,max函数被放到了main函数之后才进行定义,而main函数里已经调用了max函数。所以我们要在max函数被调用之前进行函数原型的说明,这样main 函数才能正确的调用max函数。在程序的第二行,我们按照函数原型声明的语法规则对max 函数进行了说明,要注意的是,函数说明中,函数名后的圆括号中不包含形参的名字,只包含形参的类型。形参的类型和数量要和函数定义中的一致。

函数说明可以像例7.1.3中那样独立一条语句存在,如

int max(int,int);

也可以与普通变量一起出现在同一个类型定义语句中,比如在main函数中:int x,y,max(int,int)

对函数进行说明能使C语言的编译程序在编译时进行有效的类型检查,当调用函数的时候,若实参的类型与形参的类型不能赋值兼容而进行非法转换时,C编译程序将会发现错误并且报错当实参的个数与形参的个数不同的时候,编译程序也将报错。使用函数说明能及时通知程序员出错的地方。

7.5.2 函数说明的位置

只要在调用函数之前对函数进行函数说明都是有效的。函数说明也可以放在调用函数内。假如在main函数内部进行说明,则只能在main函数内部才能识别该函数,其他函数仍旧无法识别。这也是大部分函数说明都写在所有的函数的前面的原因。

7.6函数之间的数据传递

在C语言中,经常会编写各种函数以供程序需求,函数与函数之间就变成了调用函数0和被调用函数的关系,就像喜欢一个女孩,我就是喜欢,她就是被喜欢。如果某个函数具有形参,那么在调用这个函数的时候,就要传递相应的参数给调用的函数。调用函数与被调用函数之间的数据可以通过三种方式传递:

1)实参和形参之间进行数据传递

2)通过return语句把函数最终结果返回到调用函数

3)通过全局变量。但是这不是一种好的方式,通常不提倡使用,故本章节只讲解前两种方式。

在C语言当中,数据只能从实参单向传递给形参,称为”按值“传递。也就是说,当简单变量作为实参传递时,其实是将实参的值复制给对应的形参,用户不可能在函数中改变实参的值。

例7.1.3 函数按值传递执行过程

#include

void swap(int,int);

int main(void)

{

int x,y;

int t;

printf("请输入两个整数:\n");

scanf("%d",&x);

scanf("%d",&y);

printf("在main函数中,没有调用swap之前,x和y分别为:%d

和%d\n",x,y);

swap(x,y);

printf("在main函数中,调用完swap函数之后,x和y的值分别为:%d 和%d\n",x,y);

return 0;

}

void swap(int a,int b)

{

int t;

t=a;

a=b;

b=t;

printf("在swap函数中,a和b的值分别为:%d和%d\n",a,b);

}

在这段程序中编写了一个swap函数,用于交换两个变量的值,大家想一想最终结果会输出什么呢?

其运行结果如下:

这个运行结果可能出乎大家的意料。明明把3和5传递给了swap函数进行了交换,为什么会到main函数之后,两个变量的值依旧是3和5呢?

在前面已经说过,调用函数,如果形参要求传递一些简单类型的变量,比如int、double,那么当我们将实参传递到调用函数的时候,实际上是将实参的值复制给了形参,而实参变量本身并不受任何影响。

在例7.13中,首先输入两个数据,分别为3和5,然后输出我输入的数据。之后,调用函数swap,把变量x和y的值3和5传递到swap函数,此时将x的值3复制给了形参a,将y的值5复制给了形参b,然后在swap函数内部进行交换的操作,这时候交换的对象是swap内部的形参a和b,并不是交换了x和y。所以在swap函数中,显示的数据,其实是a 和b交换后的结果,当swap函数执行完毕之后,返回到main函数,main函数中的x和y 值依旧为3和5。

有同学可能会问,那编写这样一个函数有什么作用呢?又起不到真正交换的作用。别着急,在下一章节讲解指针的时候将会改写这个程序,到时候就可以完成真正意义上的交换功能,同时可以更深层次的理解指针以及函数按值传递的含义了。

特别注意:

1.C语言提供了丰富的库函数,在使用这些库函数之前,要了解这个函数的返回值类型以及形参的类型才可以去使用。

2.在调用函数的时候,无论是库函数还是自定义函数,实参和形参的类型和数量都要一一匹配。

3.按值传递的方式其实只是把实参的值复制给形参,在函数内部对形参进行运算处理,并不会影响到实参的值。

4.最后可能大家会觉得少讲了点什么,那就应该是main函数了。main函数是一个特殊的函数,C语言程序总是从main函数开始执行。那么我们也看到了标准写法上,main函数也是有返回值int、一个void空参数和一个return 0的,那么main函数有没有参数?main 函数返回个什么呢?main函数是可以有参数的,下面是main函数带参数的形式:int main(int argc,char *argv[]) 是包含一个整型和一个字符指针数组的,当一个C的源程序经过编译、链接后,会生成扩展名为.EXE的可执行文件(对windows操作系统而言),这是可以在操作系统下直接运行的文件,换句话说,就是由系统来启动运行的。对main()函数既然不能由其它函数调用和传递参数,就只能由系统在启动运行时传递参数了。

那么既然main函数是由系统启动的,那么main函数的返回值自然也就返回给了系统。main 函数的返回值,一般返回一个整数。 main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。

对于第4个问题,目前大家可以不用深究,了解即可。

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语言是不可

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