版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/6/24,1,第7章 函数与变量作用域,C语言是通过函数来实现模块化程序设计的。 教学目的: 掌握函数的定义与调用,变量的作用域; 了解函数的嵌套与递归调用,内部、外部函数特点,以及变量的存储特性。,2020/6/24,2,教学内容: 7.1* 函数的定义与调用 7.2 函数的嵌套调用与递归调用 7.3 内部函数与外部函数 7.4* 内部变量与外部变量 7.5 变量的存储特性 本章要点 本章作业与上机实践,2020/6/24,3,7.1* 函数定义与函数调用,7.1.1 函数定义 任何函数都是由函数说明和函数体两部分组成。 1分类 根据函数有无参数,将函数分为无参函数和有参函数。,2
2、020/6/24,4,(1)无参函数 函数类型 函数名( void ) 说明语句部分; 可执行语句部分; (2)有参函数 函数类型 函数名(数据类型 参数,数据类型 参数2 ) 说明语句部分; 可执行语句部分; ,形参表。调用有参函数时,由调用函数为形参提供实际值,简称为实参。,在新标准中,函数不可缺省参数表;用“void”表示不需要参数。,2020/6/24,5,2函数的返回值与函数类型 语言的函数,还可分为有返回值函数和无返回值函数两种。 (1) 有返回值函数与return语句 一般格式: return( 返回值表达式 ); 功能:返回调用函数,并将“返回值表达式”的值带给调用函数。 注意
3、:函数中无return语句,返回1个不确定的值。可用“void”定义成“无(空)类型” ,明确表示不返回值 。,括号可以缺省,2020/6/24,6,(2) 函数类型 函数类型应与return语句中“返回值表达式”的类型一致。 如果不一致,则以函数类型为准。 如果缺省函数类型,则系统一律按int型处理。 良好的程序设计习惯: 为了使程序具有良好的可读性并减少出错,将无返回值函数定义为空类型void; 同时,也不使用系统对函数类型的缺省处理。,2020/6/24,7,案例7.1 定义一个求两个整数中极大值的max()函数。 /*功能:求2个整数中的较大数 */ /*形参:2个,整型 */ /*返
4、回值: 2个整数中的较大数 */ int max( int n1, int n2) /*函数定义 */ return ( n1 n2 ? n1 : n2); /*/ void main( void ) int max(int n1, int n2); /*对被调用函数进行说明*/ int num1,num2; printf(input two numbers: ); scanf(%d%d, ,2020/6/24,12,显然,对于被多个函数调用的自定义函数而言,采用预先统一说明方式进行说明,可以有效地减少函数说明次数。 注意: 如果被调用函数的定义体,出现在调用函数之前,可以缺省说明。,2020
5、/6/24,13,2、函数调用 函数名(实参表) 例如,在案例7.1的主函数中: printf(, max (num1, num2) ); 注意:调用有参函数,必须提供实参(常量/变量/表达式/函数) 。调用时,实参必须具有确定的值,且与形参个数相等、类型匹配。,2020/6/24,14,(1) 调用方式 语句方式无返回值函数的调用,可作为一条独立的语句。 例如,printf()、scanf ()等库函数的调用,均作为一条独立的语句。 表达式方式有返回值函数作为表达式的一项,以函数返回值参与表达式的运算。 例如,“max = max(x, y)”是一个赋值表达式,把max()函数的返回值赋予变
6、量max。,2020/6/24,15,(2) 断点与函数调用的返回 断点被调用函数执行完毕,返回调用函数后继续执行的位置。 调用函数中的断点位置分两种情况: 语句调用方式:断点为函数调用语句的下一条语句。 例如,案例7.1中的语句调用“printf();”,其断点为该语句的下一条语句“getch();” 。,2020/6/24,16, 表达式调用方式:断点为函数调用所在的表达式。 例如,在案例7.1中,“printf(, max(num1, num2) );”语句中的表达式调用“max(num1, num2)”: 其断点为该表达式调用所在的表达式“max(num1, num2)”(在本例中,“
7、max(num1, num2)”函数调用既是表达式调用,本身又构成一个简单表达式)。,2020/6/24,17,7.1.3 参数传递 发生函数调用时,根据参数值的性质不同,将参数传递分为两种: (1) 值传递参数值是一个一般数据(整形、实型、字符型数据等)。 系统把实参值复制1份给形参;被调用函数结束时,形参值不能传回给实参。 (2) 地址(引用)传递参数值是一个地址。,2020/6/24,18,执行案例7.1时的参数传递: int max( int n1, int n2) return ( n1 n2 ? n1 : n2); main( ) int max(int n1, int n2);
8、int num1,num2; printf(input two numbers: ); scanf(%d%d, /*调用函数sum( )*/ void sum(int num) sum += factor (loop); /*求累计和*/ long factor (int num) /*求num的阶乘*/ ,2020/6/24,24,在案例7.3中,主函数main()调用求和函数sum( ),sum( ) 又循环调用求阶乘的函数factor( )。 一般地说,函数的嵌套调用是指,在执行被调用函数时,该函数又调用其它函数的情形。 注意:被调用函数执行完毕后,将返回到调用函数的断点继续执行。 简言
9、之,谁调用,返回到谁的断点继续执行。,2020/6/24,25,7.2.2 函数的递归调用 案例7.4 用递归法计算n!(1! = 1,n! = (n-1)! * n (n2))。 算法设计要点: (1) 根据计算n!的递归定义可知,为了计算n!,必须首先计算(n-1)!;以此类推,直至1!(1! = 1)。 (2) 依据1!求2!=1!*2,再依据2!求3!=2!*3;同理,依据(n-1)!求n!= (n-1)!*n。,2020/6/24,26,long factor( int num ) long fact; if( num 1) fact = factor( num 1 ) * num;
10、 else fact = 1; return( fact ); 以num = 5为例,其执行过程详见教材7.2.2。,递归调用自己,2020/6/24,27,语言允许函数直接(或间接)地调用它自己,称为递归调用;这种函数称为递归函数。 例如,案例7.4中的函数factor()就是一个递归函数。 防止递归调用无终止地进行的常用办法:添加1个继续(或终止)递归调用的条件判断。 例如,案例7.4中函数factor( )中的“if( num 1)” 。 返回,2020/6/24,28,7.3 内部函数和外部函数,C语言程序中的函数,是通过被调用而执行的,所以一个函数需要被其它函数调用。 但是,当一个程
11、序由多个源文件组成时,在一个源文件中定义的函数,能否被其它源文件中的函数调用呢? 语言据此将函数分为内部函数和外部函数。,2020/6/24,29,7.3.1 内部函数(又称静态函数) 如果在一个源文件中定义的函数,只能被本源文件中的其它函数调用,这种函数称为内部函数。 1定义 static 函数类型 函数名(形参表) 2 特点:只能被本文件中的函数所调用。 3 好处:不用担心与其它源文件中的函数同名,因为即使同名也没关系。,2020/6/24,30,7.3.2 外部函数 如果在某源文件中定义的函数,可被同一程序中所有源文件中的函数调用,这种函数称为外部函数。 1定义:extern 函数类型
12、函数名( 形参表 ) 2特点:允许被所有源文件中的函数所调用。 3调用其它源文件中的外部函数时,需要对其进行说明: extern 函数类型 函数名(形参表),函数名2(形参表2 );,2020/6/24,31,案例7.5 将加、减、乘、除和求余数运算练习程序(第3版)的源文件组织形式改为:实现加、减、乘、除和求余数运算的程序段,均作为1个独立的函数、存储在1个独立的源文件中。 程序框架如下(完整程序详见案例源代码):,2020/6/24,32, /*外部函数说明*/ extern void addition(int n1, int n2); extern void subtraction(in
13、t n1, int n2); extern void multiplication (int n1, int n2); extern void division(int n1, int n2); extern void remainder(int n1, int n2); void main() ,2020/6/24,33,7.3.3 多个源文件的编译和连接 在软件工程项目中,采用结构化方法进行程序设计与编程,通常会产生多个源文件(例如源程序文件、数据结构定义文件等)。 那么,如何将这些源文件编译、连接成一个统一的可执行文件呢? 一般有两种方法:,2020/6/24,34,(1)分别编译、一并
14、连接 C编译程序是以源文件为编译单位。 当一个程序中的函数和数据结构分放在多个源文件中时:先将各文件分别编译,再通过link命令产生一个可执行文件(.exe) 。 (2)集中编译、连接 利用编译预处理命令#include,将其它源文件包含到主函数main( )所在的源文件的开头;然后直接编译该文件即可。,2020/6/24,35,例如,在案例7.5中的主函数main()所在的源文件case75_1.c的开头添加如下几行: /*将其它各源文件包含进来*/ #include case75_2.c #include case75_3.c #include case75_4.c #include ca
15、se75_5.c #include case75_6.c void main( ) 返回,2020/6/24,36,7.4* 内部变量与外部变量,语言中的变量,定义位置不同,其作用域也不同,据此将变量分为内部变量和外部变量。 7.4.1 内部变量 1、内部变量在函数内(函数说明+函数体)定义的变量。 2、作用域只在该函数范围内有效。 所以内部变量也称“局部变量”。,2020/6/24,37,例如,在案例7.4中,主函数main( ) 中定义的变量num就是内部变量,它仅在主函数main()中才能使用; 求阶乘的factor( )函数,函数说明中的形参变量num,以及函数体中定义的变量fact,
16、均属内部变量,都只能在factor( )函数中使用。 说明:在不同的函数中,允许使用同名内部变量。它们代表不同的对象,互不干扰。 例如,在案例7.4中,主函数main()中的内部变量num,与函数factor()中的内部变量num同名。,2020/6/24,38,案例 内部变量的应用。 void main( ) void sum(int num); int num = 100; printf(“num_main()=%dn”, num); /*调用前实参的值*/ sum( num ); /*调用函数*/ printf(num_main()=%dn, num); /*调用后实参的值*/ getc
17、h(); void sum(int num) int i; printf(num_sum()=%dn, num); /*改变前的形参值*/ for(i=num-1; i=1; i-) num += i; /*改变形参的值*/ printf(num_sum()=%dn, num); /*改变后的形参值*/ ,2020/6/24,39,7.4.2 外部变量 1、外部变量在函数外部定义的变量。 2、作用域:从外部变量的定义位置开始,到本文件结束为止。 外部变量不从属于任何一个函数,可被作用域内的所有函数使用,所以外部变量又称全局变量。,2020/6/24,40,案例7.6 设计一个函数cuboid(
18、int length, int width, int height)(3个参数依次为长方体的长、宽、高),用于求长方体的体积及正、侧、顶三个面的面积。 算法设计要点: 函数cuboid (int length, int width, int height)本身只能返回1个值(本案例选定体积),正、侧、顶三个面的面积就只能通过外部变量来进行数据共享。 参考程序框架如下:,2020/6/24,41, long area1, area2, area3; /*定义3个外部变量,用于数据共享*/ long cuboid (int length, int width, int height); /*函数说
19、明*/ void main( ) volume = cuboid (length, width, height); printf(n volume = %ld, area1 = %ld, area2 = %ld, area3 = %ld , volume, area1, area2, area3); ,2020/6/24,42,long cuboid (int length, int width, int height) long volume; volume = length * width * height; /*计算体积*/ area1= length * width; /*计算3个面的
20、面积*/ area2= width * height; area3= length * height; return( volume); /*返回体积值*/ ,2020/6/24,43,3、说明 (1)外部变量的作用域:从定义点到本文件结束。 为方便使用,建议:将外部变量的定义放在文件开头,如 案例7.6所示。 (2)在同一源文件中,允许外部变量和内部变量同名。 在内部变量的作用域内,外部变量不起作用。,2020/6/24,44,(3)外部变量可实现函数之间的数据共享,但又使这些函数依赖这些外部变量,因而使得这些函数的独立性降低。 注:从模块化程序设计观点来看,这是不利的。因此不是非用不可时,
21、不要使用外部变量。,2020/6/24,45,案例 内部、外部变量的同名应用。 int len=3, width=4, high=5; int vs(int len, int width) int vol; vol = len * width * high;/*引用外部变量high*/ return v; main() int len=5; printf(len=%d, width=%d, high=%d , vol=%d, len, width, high, vs(len, width); ,len = ? width = ?,len = ?,2020/6/24,46,7.4.3 小结 1内部变量在函数内(函数说明+函数体)定义的变量,其作用域:只在该函数范围内有效。 不同函数中的同名内部变量,互不干扰。 2外部变量在函数外部定义的变量,其作用域:从外部变量的定义位置开始,到本文件结束为止。 允许内部、外部变量同名。在内部变量的作用域内,外部变量不起作用。 返回,2020/6/24,47,7.5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学地理(平原地貌)试题及答案
- 2025年中职机电设备(机电安装调试)试题及答案
- 2025年高职第三学年(语文教育)现代汉语教学阶段测试题及答案
- 2025年高职电工电子技术(电路装调)试题及答案
- 2025年中职中药资源与开发(种植技术)试题及答案
- 2025年中职计算机应用(办公自动化应用)试题及答案
- 2025年中职(大数据与会计)税务申报实训阶段测试题及答案
- 2025年中职土木建筑(建筑构造基础)试题及答案
- 2025年大学大三(护理)儿科护理技术试题及答案
- 2025年中职烹饪工艺与营养(面包制作基础)试题及答案
- 《建筑工程定额与预算》课件(共八章)
- (完整版)设备安装工程施工方案
- 跨区销售管理办法
- 超声年终工作总结2025
- 钻井工程施工进度计划安排及其保证措施
- 管培生培训课件
- 梗阻性黄疸手术麻醉管理要点
- 民用机场场道工程预算定额
- 重生之我在古代当皇帝-高二上学期自律主题班会课件
- 膀胱切开取石术护理查房
- 混凝土试块标准养护及制作方案
评论
0/150
提交评论