C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章

上传人:E**** 文档编号:89372335 上传时间:2019-05-24 格式:PPT 页数:100 大小:755.50KB
返回 下载 相关 举报
C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章_第1页
第1页 / 共100页
C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章_第2页
第2页 / 共100页
C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章_第3页
第3页 / 共100页
C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章_第4页
第4页 / 共100页
C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章》由会员分享,可在线阅读,更多相关《C语言程序设计 教学课件 ppt 作者 柴世红_ 第9章(100页珍藏版)》请在金锄头文库上搜索。

1、,第9章 函 数,9.1 概述 9.2 自定义函数 9.3 函数的参数与函数的值 9.4 函数的嵌套调用 9.5 函数的递归调用 9.6 数组作为函数参数 9.7 局部变量和全局变量 9.8 变量的存储类别 9.9 案例学习,9.1 概 述 9.1.1 引入函数的优点 总的来讲,由于C语言采用了函数模块式的结构,因此容易实现结构化程序设计。同时也使程序的层次结构更加清晰,便于程序的编写、阅读、调试。,具体来讲,C语言程序引入函数有以下优点: (1) 避免重复代码的编写,便于提高程序设计的效率。 程序员可以识别出程序其他部分重复的指令,将其编写成函数,并且在程序的各个部分根据需要调用该函数,这样

2、可以极大地避免重复代码的编写。,【例9-1】 函数引入实例。,图9.1 例9-1运行结果,(2) 层次清楚、结构清晰,便于实现结构化程序设计。 程序员可以将总的任务分解为功能上相对独立的若干个子任务,将每一个子任务编写为一个单独的函数,然后将它们集成于一个统一的程序中。每个函数完成并经过完整测试后,可使其与程序的其他部分无缝耦合,且结构非常清晰。,【例9-2】 函数引入实例。,图9.2 例9-2运行结果,(3) 高效、快捷,便于程序的阅读与调试及便于多人合作。 一旦一个函数完成并且经过测试后就可以完成预定的工作。此函数也可以载入库中并且可在完全不同的另段程序中被反复调用。这样既能高效地进行各个

3、功能的测试,同时也可以满足多人同时编写程序代码,提高程序设计的效率。,9.1.2 函数的分类 在C语言中可从不同的角度对函数进行分类。 (1) 从函数定义的角度看,函数可分为标准函数和用户自定义函数两种。 (2) C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。 (3) 从主调函数和被调函数之间数据传送的角度看,函数又可分为无参函数和有参函数两种。 (4) 语言提供了极为丰富的标准函数,这些标准函数又可从功能角度作以下分类:, 字符类型函数: 转换函数: 目录路径函数: 诊断函数: 图形函数: 输入输出函数: 接口函数: 字符串函数:

4、 内存管理函数: 数学函数: 日期和时间函数:用于日期、时间的转换及操作。 进程控制函数:用于进程的管理和控制。 其它函数:,9.2 自 定 义 函 数 函数定义的一般形式可表示如下: 数据类型 函数名(参数1, 参数2) 声明部分; 执行部分; ,【例9-3】 函数调用实例。,图9.3 例9-3运行结果,9.2.1 无参函数的定义形式 无参函数指的是省略了形参的函数,其定义形式为: 类型标识符 函数名() 声明部分 语句 ,我们可以改写一个函数定义: 01 void Hello() 02 03 printf (“Hello,world n”); 04 Hello函数是一个无参函数,当被其它函

5、数调用时,输出Hello world字符串。,9.2.2 有参函数定义的一般形式 有参函数指的是带有形式参数的函数,其定义形式为: 类型标识符 函数名(形式参数列表) 声明部分 语句 ,例如,定义一个函数,用于求两个数中的较大数,代码可写为:,【例9-4】 函数定义实例。,图9.4 例9-4运行结果,【例9-5】 以下叙述中正确的是( )。 A构成C程序的基本单位是函数 B可以在一个函数中定义另一个函数 Cmain()函数必须放在其它函数之前 D所有被调用函数一定要放在调用函数之前 解析:C语言程序是由函数组成的,,因此,A选项是正确的。可以在一个函数中调用另一函数,但在定义时,不能嵌套定义,

6、故B选项是错误的。main()函数可放在其它函数之前,也可以放在其它函数之后,故C选项是错误的。被调函数可以放在调用函数之前,也可以放在调用函数之后,如果放在被调函数之后,前面一般要对函数声明,故D选项是错误的。,9.3 函数的参数与函数的值 9.3.1 形式参数和实际参数 函数的形参和实参具有以下特点: (1) 形参变量只有在被调用时才分配临时内存单元,在调用结束时,立即释放所分配的临时存储单元。因此,形参只有在函数内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。,(2) 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便

7、把这些值传送给形参。因此应预先用赋值、输入等办法使实参获得确定值。 (3) 实参和形参在数量上、类型上、顺序上应严格一致,否则会发生类型不匹配的错误。 (4) 函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。,图9.5 形参与实参的传递原理,【例9-6】 形参与实参的传递。,9.3.2 函数的返回值 函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。如调用正弦函数取得正弦值,调用max函数取得的最大数等。对函数的值(或称函数返回值)需要强调以下方面: (

8、1) 函数的值只能通过return语句返回主调函数。 return语句的一般形式为: return表达式; 或者 return (表达式);,【例9-7】 以下函数值的类型为( )。,解析:由于函数首部省略了数据类型,因此系统默认为int型,而在函数体内由于返回的是变量s的值,而s的值定义为float,与int型不符,这种情况下以定义类型为准,即返回值为int型。 (2) 如函数值为整型,在函数定义时可以省去类型说明。,(3) 不返回函数值的函数,可以明确定义为空类型,类型说明符为void。如例9-6中函数s并不向主函数返函数值,因此可定义为:,一旦函数被定义为空类型后,就不能在主调函数中使用

9、被调函数的函数值了。例如,在定义s为空类型后,在主函数中写下述语句: sum=s(n); 就是错误的。 为了增强程序的可读性并减少出错,凡不要求返回值的函数都应定义为空类型。,9.3.3 函数的调用 1函数调用基本原理 调用函数时要提供函数的调用标识,然后即可从相应的位置开始执行。当编译器遇到这个标识时,就会将控制权交给函数,然后执行函数体。,2函数调用的一般形式 在程序中是通过对函数的调用来执行函数体的,其过程与其它语言的子程序调用完全相同。 C语言中,函数调用的一般形式为: 函数名(实际参数表),3函数调用的方式 在C语言中,可以用以下几种方式调用函数: (1) 函数表达式:函数作为表达式

10、中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。 例如:z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。 (2) 函数语句:函数调用的一般形式加上分号即构成函数语句。 例如:printf (“%d“,a); 和scanf (“%d“, 都是以函数语句的方式调用函数。,(3) 函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。 例如:printf(“%d“,max(x,y); 即是把max调用的返回值又作为printf函数的实参来使用的。在函数调用中还应该注意的一个问题

11、是求值顺序的问题。所谓求值顺序,是指对实参表中各量是自左至右使用,还是自右至左使用。对此,各系统的规定不一定相同。,【例9-8】 函数调用实例。,4被调用函数的声明和函数原型 在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。 函数声明的一般形式为: 类型说明符 被调函数名(类型 形参,类型 形参,); 或可以表示为: 类型说明符 被调函数名(类型,类型,);,9.4 函数的嵌套调用 9.4.1 函数嵌套调用的原理 C程序中的

12、函数定义是互相独立的,函数和函数之间没有从属关系,即一个函数内不允许包含另一个函数的定义。C语言不能嵌套定义,但可以嵌套调用,即在一方函数调用另一方函数的同时,又调用了第三方函数,其关系如图9.6所示。,图9.6 函数嵌套调用原理,9.4.2 函数嵌套调用实例 【例9-9】 函数嵌套调用示例。,图9.7 例9-9运行结果,【例9-10】 阶乘求和,计算s=1!+2!+3!+n!。,9.5 函数的递归调用 9.5.1 函数递归调用原理 一个函数在它的函数体内调用其自身称为递归调用,这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每

13、调用一次就进入新的一层。,例如,有函数f如下:,(1) 直接递归调用:一个函数可直接调用该函数本身的情况称为直接递归调用。例如:,(2) 间接递归调用:一个函数可间接地调用该函数本身的情况称为间接递归调用。例如:,9.5.2 函数递归调用实例 【例9-11】 函数递归调用的简单例子。,图9.8 例9-11运行结果,【例9-12】 用递归法计算n!。 用递归法计算n!可用下述公式表示: n!=1 (n=0,1) n(n-1)! (n1),按公式可编程如下:,【例9-13】 Hanoi塔问题。 一块板上有三根针A,B,C。A针上套有64个大小不等的圆盘,大的在下,小的在上。现要把这64个圆盘从A针

14、移动C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。本题算法分析如下:,设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则 (1) 将A上的n-1(等于1)个圆盘移到B上; (2) 将A上的一个圆盘移到C上; (3) 将B上的n-1(等于1)个圆盘移到C上。,如果n=3,则 (1) 将A上的n-1(等于2,令其为n)个圆盘移到B上(借助于C),步骤如下: 将A上的n-1(等于1)个圆盘移到C上; 将A上的一个圆盘移到B上; 将C上的n-1(等于1)个圆盘移到B上。,(2) 将A上的一个圆盘移到上

15、C上; (3) 将B上的n-1(等于2,令其为n)个圆盘移到C上(借助A),步骤如下: 将B上的n-1(等于1)个圆盘移到A上; 将B上的一个盘子移到C上; 将A上的n-1(等于1)个圆盘移到C上。 到此,完成了三个圆盘的移动过程。,从上面分析可以看出,当n2时,移动的过程可分解为三个步骤: 第一步:把A上的n-1个圆盘移到B上; 第二步:把A上的一个圆盘移到C上; 第三步:把B上的n-1个圆盘移到C上,其中第一步和第三步是一样的。,当n=3时,第一步和第三步又分解为类似的三步,即把n-1个圆盘从一个针移到另一个针上,这里的n=n-1。显然这是一个递归过程,因此代码可编写如下:,图9.9 例9-13运行结果,9.6 数组作为函数参数 9.6.1 数组元素作函数实参 数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。,【例9-14】 判断一个整数数组中各元素的值,若大于0则输出该值,若小于等于0则输出0值。编程如下:,9.6.2 数组名作为函数参数 用数组名作函数参数与用数组元素作实参有几点不同。 (

展开阅读全文
相关资源
相关搜索

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

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