C及C++程序设计 修订本 教学课件 ppt 作者 张富 C语言基础 第9章

上传人:E**** 文档编号:89345456 上传时间:2019-05-23 格式:PPT 页数:106 大小:413KB
返回 下载 相关 举报
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第9章_第1页
第1页 / 共106页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第9章_第2页
第2页 / 共106页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第9章_第3页
第3页 / 共106页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第9章_第4页
第4页 / 共106页
C及C++程序设计 修订本  教学课件 ppt 作者  张富 C语言基础 第9章_第5页
第5页 / 共106页
点击查看更多>>
资源描述

《C及C++程序设计 修订本 教学课件 ppt 作者 张富 C语言基础 第9章》由会员分享,可在线阅读,更多相关《C及C++程序设计 修订本 教学课件 ppt 作者 张富 C语言基础 第9章(106页珍藏版)》请在金锄头文库上搜索。

1、第 9 章 函 数,9.1 函数概述 9.2 函数的定义、调用和返回 9.3 函数参数的传递方式 9.4 函数指针 9.5 函数的嵌套调用和递归调用 9.6 主函数main()的参数,函数是C和C+程序的基本模块,是构成结构化程序的基本单元。一个C程序由一个主函数或一个主函数和若干非主函数组成。本章最后介绍主函数main()的参数的使用。,9.1 函 数 概 述,函数之间是调用关系。所谓调用函数,是指一个函数(主调函数)暂时中断自己函数的运行,转去执行另一个函数(被调函数)的过程。被调函数执行完后,返回主调函数中断处继续主调函数的运行,这是返回过程。在这调用和返回两个过程中,两个函数之间发生信

2、息的交换。函数间的信息交换,是学习函数中的一个重要内容。,C程序从主函数开始执行,并在主函数中结束。它可以调用其他函数,用户自定义函数不能调用主函数。自定义函数之间则可以互相调用。 图9.1给出函数间的调用和返回过程的示意图。,图9.1 函数的调用与返回,9.2 函数的定义、调用和返回,9.2.1 函数的定义 函数定义的一般形式是: 数据类型 函数名(形式参数表) 形参说明 函数体 ,其中数据类型是函数返回值的类型,返回值是函数送回主调函数的数据。如果省略了“数据类型”项,则默认为返回值是整型,或者说,函数类型的缺省值为整型。 如果函数没有返回值,可设其返回值类型为void,称为void类型函

3、数。 形式参数(简称形参)表是由逗号分隔开的变量名构成,其作用是接收调用此函数时传送的实际参数值(简称实参)。实参是主调函数提供的。函数可以没有参数,这时参数表是空的,但圆括号不能省略。无参数函数的参数也可以写为void。,函数体是实现函数功能的一组语句。 形参说明用于定义形参的数据类型。 例9.2.1 定义一个求两个整型数和的函数sum()。不要求有返回值。 所要求的函数如下: int sum(x, y) /* 函数名为sum,形参为x和y */ int x,y; /* 说明形参x和y为整型 */, printf(“The sum is %dn”, x+y); /* 函数体:输出x+y的值

4、*/ 在函数的定义中,明确地标明了函数的返回值为整型,但可以省略。实际上,这个函数没有返回值。 在ANSI的新标准中规定,在定义函数时,可以将形参类型的说明部分写在形参表中。这时函数定义有如下的形式:,数据类型 函数名(形参说明列表) 函数体 本书将采用后一种新的函数定义形式。 按照这个函数定义格式,例9.2.1的函数可写为:,int sum(int x, int y) printf(“The sum is %dn“, x+y); 上面定义的函数中,函数并没有返回值,因此,可以将函数定义为无返回值类型: void sum(int x, int y) ,printf(“The sum is %d

5、n“, x+y); 既没有返回值也没有参数的函数还可以定义成下面的形式: void 函数名(void) 函数体 ,9.2.2 函数的返回 C语言设有返回语句return。返回语句return在函数中的作用是返回调用它的函数,同时向调用者送回计算结果(函数返回值)。返回语句一般有如下的两种形式: return; return(表达式);,在第一种情况下,返回语句只起返回主调用函数的作用,不送返回值。在第二种情况下,返回语句的功能是,在返回主调用函数的同时,将表达式给定的返回值送回给调用它的函数。表达式的括号可以省略。 归纳起来,return语句用于函数体内有两个作用:,(1)使程序立即从当前运行

6、的函数退出,转去执行调用者的代码; (2)在要求函数有返回值的情况下,向调用者返回一个值。这个返回值的表达式,写在return之后。 返回值表达式的类型必须和该函数的(返回值)类型一致。对于没有返回值的函数,如果函数的类型指定为void的,则return语句不能带有表达式。,在一个函数中可以没有return语句。这种函数运行到函数体的最后一条语句后,会自动返回调用它的函数。例9.2.1所定义的函数就属于此类。 一个函数可以有一个以上的return语句。程序执行到哪个return语句,哪个return语句就起作用。 例9.2.2 将例9.2.1的函数改为有整型返回值的函数。,int sum(in

7、t x,int y) return(x+y); 例9.2.3 多return语句的函数例子。 定义一个函数作两浮点数的除法运算。当除数为0时,函数不进行运算,给出相应信息后,返回调用它的函数。如果除数不为0,则返回计算结果。函数定义如下:,float div(float x, float y) if(y=0) printf(“problem with parameter 0!n“); return; /* 返回语句,没有返回值 */ return(x/y); /* 返回语句,有返回值 */ ,在这个例子中,函数类型为单精度实型,函数体中有两个返回语句。 没有返回值的函数,可以省略return返

8、回语句。Turbo C+系统则建议所有的非void类型函数,包括主函数main(),都应该含有返回语句。如果函数中没有返回语句,系统会给出相应的编译信息: Warning 程序文件名:Function should return a value in function 函数名.,9.2.3 函数的调用 当一个函数需要使用某个函数的功能时,就可以调用该函数,并给出实参(如果是带参数的函数),如果没有参数,则实参表空着。调用函数的一般有如下的两种格式: 函数名(实参列表); 函数名(实参列表),其中实参是有确定值的变量或表达式,各参数间用逗号分开。在实参表中,实参的个数与顺序必须和形参的个数与顺序

9、相同,实参的数据类型必须和对应的形参数据类型相同。实参的作用就是把参数的具体数值传递给被调用的函数。 第一种调用格式是以语句的形式调用函数。 例9.2.4 编写main()函数,用第一种格式调用例9.2.1定义的函数。,#include main() int a, b; a=10; b=5; sum(a, b); /* 调用函数sum() */ ,在这个例子中实参a和b,传递给函数sum,函数sum计算并输出结果,然后返回主函数。程序结束。 例9.2.5 编写main()函数,用第二种调用函数的格式调用例9.2.2定义的函数。 #include main() ,int a, b,c; a =

10、10; b = 5; c=sum(a, b); /* 调用函数sum(),并将返回值赋给变量c */ printf(“The sum is %dn“, c); 这里表达式“sum(a,b)”既实现调用,同时接收返回值。也可以将例9.2.5主函数中的最后两个语句合并为一个语句:,printf(“The sum is %dn“, sum(a, b); 但在C的标准中,实参表的求值顺序并不是确定的。有的系统按自右向左的顺序计算,而有的系统则相反。本系统采用自右向左的计算顺序。 例9.2.6 实参表求值顺序的影响。 #include main() ,int a=10,c; c=sum(a,a=a+3)

11、; /* 实参的求值顺序是自右向左 */ printf(“%dn“,c); sum(int x,int y) return(x+y); ,因为本系统实参是按自右向左的规则运算的,所以,第一个实参为13,第二个实参也为13,程序的输出为26。如果实参是按自左向右的规则运算的话,第一个实参为10,第二个实参为13,输出应该是23。,9.2.4 函数原型的使用 为了通知编译系统有关函数返回类型信息,在调用非整型函数时,可以通过所谓的函数原型(prototype)对所调用函数进行说明。 函数原型的一般格式为: 数据类型 函数名(参数数据类型表);,函数原型一般是写在程序的开头或者放在头文件中。其中参数

12、数据类型表可以按函数的定义的顺序,只写数据类型,不写参数变量名。 在什么情况下,必须使用函数原型呢?这与程序中各函数的书写顺序有关。,在多函数程序的情况下,如果函数在程序清单中出现的顺序,遵守这样一个原则:“先定义后引用”,则一般不需要使用函数原型。例如,程序中有三个函数,其调用关系是:主函数调用函数a,函数a调用函数b,而函数b又调用函数c。三个函数在程序中定义的顺序应写成:,定义函数c() 定义函数b() 定义函数a() 定义函数main() 反之,在各函数定义的顺序上出现了“先引用后定义”的情况,应事先在程序头上写一条被引用函数的函数原型语句,只有整型函数不需要遵守这个规则。,例9.2.

13、7 求两个浮点数中较小的数。 程序定义了一个浮点型函数min()。它有两个浮点类型的参数。在这个程序清单中,两个函数的顺序是,main函数在前min函数在后,而min函数又不是整型函数,需要有min函数的类型说明语句,即min函数原型: float min(float, float);,主函数main()接收用户从键盘输入的两个浮点数,以此为实参调用函数min()。函数main输出函数min()返回的计算结果。 程序清单如下: #include “stdio.h“ float min(float, float); /* 函数类型说明 */ main() ,float a, b; printf(

14、“Enter two float numbers: “); scanf(“%f%f“, /* 先引用函数min()*/ ,float min(float x, float y) /* 后定义函数min()*/ if(x=y) printf(“They are equal. “); return x ; else if(xy) return x; else return y ; ,如果被调用的函数的定义出现在主调用函数之前,如本例中将函数min()的定义写在main()函数之前,则函数原型可以省略。 函数原型语句可以写函数之外,也可以写在主函数main里面。,9.2.5 指针类型函数 返回值为一

15、指针的函数称为指针类型函数。指针类型函数定义的格式为: 指针类型 *函数名(参数类型表) 函数体 return (地址); ,例9.2.8 指针类型函数的例子。 在这个程序中,用户输入两个整型数。然后,调用指针类型函数sum()计算这两个数的和,返回计算的存储结果指针。主函数用返回的指针,输出计算结果。 程序如下: #include ,int *sum(int x, int y) /* 定义指针类型函数 */ int z; z=x+y; return main() ,int a, b; int *c; printf(“Enter two integers: “); scanf(“%d%d“,

16、/* 调用指针型函数,返回值为指针 */,printf(“The sum is %dn“, *c); 程序运行输出举例如下(带下划线的数据是用户从键盘输入的): Enter two integes: 15 20 The sum is 35,在C语言中调用函数时,有两种不同的参数传递方式:值传递方式和地址传递方式。,9.3 函数参数的传递方式,9.3.1 值传递方式 值传递方式是主调函数把实参的值赋给(拷贝给)形参。这种调用方式称为值调用。被调用函数运行时,使用的是形参,形参的任何变化不会影响实参的值。形参一般都是变量,实参可以是变量、常量,也可以是表达式。,当函数被调用时,系统为形参变量分配内存,并将实参的值存入对应形参的内存单元。当函数返回时,系统将为形参

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号