版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2020/7/10,1,第7章 函数与预处理命令,7.1 概述 7.2 函数的定义与调用 7.3 数组作函数参数 7.4 函数的嵌套调用和递归调用 7.5 局部变量和全局变量及其作用域 7.6 变量的存储类别及变量的生存期 7.7 函数的存储分类,2020/7/10,2,7.1 概述, 程序结构清晰,可读性好。 减少重复编码的工作量。 可多人共同编制一个大程序,缩短程序设计周期,提高程序设计和调试的效率。,使用函数的 好处,2020/7/10,3,【例7.1】求一个整数的立方。,int cube (int x) /* 函数定义 */ return (x * x * x); main( ) in
2、t f, a; printf(nEnter an integer number:); scanf(%d, ,程序运行情况如下: Enter an integer number:2 2 * 2 * 2 = 8,函数调用,程序的执行总是 从main函数开始,2020/7/10,4, 一个C源程序可以由一个或多个源程序文件组成。C编译系统在对C源程序进行编译时是以文件为单位进行的。 一个C源程序文件可以由一个或多个函数组成。所有函数都是独立的。主函数可以调用其它函数,其它函数可以相互调用。 在一个C程序中,有且仅有一个主函数main。C程序的执行总是从main函数开始,调用其它函数后最终回到main
3、函数,在main函数中结束整个程序的运行。,说明,2020/7/10,5, 函数的种类,从函数定义形式分: 有参函数: 在主调(用)函数和被调(用)函数之间通过参数进行数据传递, 如: int cube (int x) 无参函数: 如:getchar( ) 在调用无参函数时,主调函数不需要将数据传递给无参函数。,从使用的角度看: 标准函数(库函数) 库函数是由系统提供的。如:getchar( )、sin(x)等。在程序中可以直接调用它们。附录A列出了C的部分库函数。 用户自定义函数。 如:例7.1中的cube函数。,2020/7/10,6,7.2.1 函数的定义,函数定义的一般形式,函数类型
4、函数名(类型名 形式参数1, ) 说明语句 执行语句 ,例如:求两个数的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z ); ,类型省略时默认为int类型,2020/7/10,7,int max(x,y) int x,y; int z; z = x y ? x : y; return( z ); ,int max(x,y) int x,y; 或 int max(int x,y) ,或 int max(x,y) int x,y,z; z = x y ? x : y; return( z ); ,花括号中也可以为空,这种函数叫
5、空函数 。 不能在函数体内定义其他函数,即函数不能嵌套定义。,形参也可以这样定义,2020/7/10,8,函数名(实参表列),在C语言中,把函数调用也作为一个表达式。因此凡是表达式可以出现的地方都可以出现函数调用。例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);,7.2.2 函数的调用,函数调用的一般形式:,2020/7/10,9,int sum100( ) int i,t=0; for (i=1; i=100; i+) t+=i; return (t); main( ) int s; s=sum100( ); pr
6、intf(%dn, s); ,程序输出结果: 5050,int sum ( int x ) int i,t=0; for (i=1; i=x; i+) t+=i; return (t); main( ) int s; s=sum (100); printf(%dn, s); ,【例7.3】求1100的累加和。,思考:两个程序有何不同,程序输出结果: 5050,?,2020/7/10,10,void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y); main( ) int a= 10,b=20; swap(a,b)
7、; printf(na=%d,b=%dn,a,b); ,7.2.3 函数参数与函数的返回值,1函数的形式参数与实际参数,程序输出结果: x=20,y=10 a=10,b=20,形式参数(形参),实际参数(实参),【例7.4】编一程序,将主函数中的两个变量的值传递给swap函数中的两个形参,交换两个形参的值。,单向值传递,2020/7/10,11,有关形参和实参的说明:, 当函数被调用时才给形参分配内存单元。调用结束,所占内存被释放。 实参可以是常量、变量或表达式,但要求它们有确定的值。 实参与形参类型要一致,字符型与整型可以兼容。 实参与形参的个数必须相等。在函数调用时,实参的值赋给与之相对应
8、的形参。“单向值传递”。,注意:在TC中,实参的求值顺序是从右到左。,2020/7/10,12,【例7.8】计算并输出圆的面积。,s(int r) return 3.14*r*r; main( ) int r,area; scanf(%d, ,自动转换为int型,思考: 若要得到单精度实型的圆面积,程序应如何修改,程序运行情况如下: 2 12,?,2020/7/10,13,7.2.4 对被调函数的声明和函数原型,变量要先定义后使用,函数也如此。即被调函数的定义要出现在主调函数的定义之前。如swap函数: 允许整型函数(且参数也是整型)的定义出现在主调函数之后。如max函数: 如果非整型函数在主
9、调函数之后定义,则应在主调函数中或主调函数之前对被调函数进行声明。,void swap(int x, int y) main( ) swap(a,b); ,main( ) c=max(a,b); max(int x,int y) ,2020/7/10,14,7.3.2 一维数组名作函数参数,数组名表示数组在内存中的起始地址。 例如:数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值,是指针类型的数据(第8中将介绍指针类型),不能把它看成是整型或其他类型数据。 实参是数组名,形参也应定义为数组形式,形参数组的长度可以省略,但 不能省,否则就不是数组形式了。 【例7.12】
10、用冒泡法将10个整数排序。,2020/7/10,15,void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10); printf(After sort:n); printarr(a); ,void printarr(int b10) int i; for (i=0; i10; i+) printf(%5d,bi); printf(n);,void sort(int b
11、 , int n) int i,j,t; for (i=1; ibj+1) t=bj;bj=bj+1;bj+1=t; ,2020/7/10,16,图7.3 调用sort函数,2000,b,形参 b 实际是一个 可以存放地址的变量,a:2000,实参赋给形参,2020/7/10,17,以二维数组为例。二维数组名作实参时,对应的形参也应该定义为一个二维数组形式。对形参数组定义时可以指定每一维的大小,也可以省略第一维的大小说明。 【例7.14】编程序,将矩阵转置。设转置前为a矩阵,转置后为b矩阵,如下所示:,思路:将a00b00,a01 b10,a02b20, a10b01,aijbji,。,7.3
12、.3 多维数组作函数参数,2020/7/10,18,7.4.2 函数的递归调用,1递归的基本概念,递归调用:一个函数直接或间接地调用了它本身,就称为函数的递归调用。 递归函数:在函数体内调用该函数本身。,int sub(int x) int y,z; if( ) z=sub(y); else return ; ,例如:,直接调用sub 函数本身,2020/7/10,19,2递归函数的执行过程,【例7.16】编一递归函数求n!。,思路:以求4的阶乘为例: 4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。 递归结束条件:当n=1或n=0时,n!=1。 递归公式:,2020/7/
13、10,20,递归调用过程,2020/7/10,21,3编制递归函数的方法, 数值型问题递归函数的编程方法 对于数值型问题,首先要找出解题的数学公式,这个公式必须是递归定义的,且所处理的对象要有规律地递增或递减,然后确定递归结束条件。 【例7.17】编一递归函数求xn 。 思路:首先把xn转化成递归定义的公式,再找出递归结束条件:当n=0时,xn=1。,2020/7/10,22,程序如下:,long xn(int x,int n) long f=0; if (n0) printf(n0,data error!n); else if (n=0) f=1; else f=x*xn(x,n-1); r
14、eturn (f); main( ) int n,x; long y; scanf(%d,%d, ,程序运行情况如下: 2,10 1024,2020/7/10,23,7.5.3 全局变量及其作用域,全局变量(外部变量):在函数外部定义的变量。 作用域:从定义变量的位置开始到本源文件结束。如在其作用域内的函数或分程序中定义了同名局部变量,则在局部变量的作用域内,同名全局变量暂时不起作用。,【例7.20】全局变量和局部变量的作用域。,2020/7/10,24,7.6.2 变量的存储类别,变量的属性,数据类型: 决定为变量分配内存单元的长度, 数据的存放形式, 数的范围。,存储类别: 决定了变量的生
15、存期, 给它分配在哪个存储区。,2020/7/10,25,变量定义语句的一般形式,存储类别 数据类型 变量名1, , 变量名n ;,auto(自动的) register(寄存器的)static(静态的) extern(外部的),1自动变量(auto类别) 局部变量可以定义为自动变量。,2020/7/10,26, 内存分配 调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。 变量的初值 定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数被调用时执行一次赋值操作。 生存期 在函数或分程序执行期间。 作用域 自动变量所在的函数内或分程序内。,自
16、动变量,2020/7/10,27,2静态变量(static类别),除形参外,局部变量和全局变量都可以定义为静态变量。,2020/7/10,28, 内存分配 编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。 静态变量的初值 若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值 。 生存期 整个程序的执行期间。 作用域 局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。,静态变量,2020/7/10,29,int c; static int a; main( ) float x,
17、y; char s; f( ) static int b=1; ,3.外部变量(extern类别),在函数外定义的变量若没有用 static说明,则是外部变量。外部变量只能隐式定义为extern类别,不能显式定义。,2020/7/10,30, 内存分配 编译时,将其分配在静态存储区,程序运行结束释放该单元。 变量的初值 若定义变量时未赋初值,在编译时,系统自动赋初值为0。 生存期 整个程序的执行期间。 作用域 从定义处开始到本源文件结束。 此外,还可以用extern进行声明,以使其作用域扩大到该程序的其它文件中。,外部变量,问题:全局静态变量的作用域可以扩展到本程序的其它文件吗?,2020/7
18、/10,31,外部变量声明的一般格式,extern 数据类型 变量名1,变量名n; 或 extern 变量名1,变量名n;,注意: 外部变量声明用关键字extern,而外部变量的定义不能用extern,只能隐式定义。 定义外部变量时,系统要给变量分配存储空间,而对外部变量声明时,系统不分配存储空间,只是让编译系统知道该变量是一个已经定义过的外部变量,与函数声明的作用类似。,2020/7/10,32,4.寄存器变量(register类别),只有函数内定义的变量或形参可以定义为寄存器变量。寄存器变量的值保存在CPU的寄存器中。 受寄存器长度的限制,寄存器变量只能是char、int和指针类型的变量。,【例7.26】寄存器变量的使用。 main( ) long int sum=0; register int i; for (i=1; i=1000; i+) sum+=i; printf(sum=%ldn ,sum); ,程序输出结果: sum
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南成考专升本教育理论核心考点真题内部题库
- 2026南航航服部(明珠公司)招聘5人(10月)考试备考试题及答案解析
- 2026青海果洛州达日县紧密型县域医共体招聘考试备考题库及答案解析
- 长春市双阳区事业单位面向2025、2026届高校毕业生征集就业见习人员笔试备考题库及答案解析
- 2027四川新川航空仪器有限责任公司招聘笔试备考试题及答案解析
- 2026年楚雄彝族自治州中医医院编外人员招聘(8人)笔试参考题库及答案解析
- 2026年贵州水投毕节市水务集团有限公司招聘18人笔试模拟试题及答案解析
- 兴业银行南昌分行2027届校园招聘笔试备考试题及答案解析
- 大余县2026年面向全县事业单位选调县属国企中层管理工作人员【20人】笔试参考题库及答案解析
- 2026年10月黑龙江佳木斯汤原县招聘公益性岗位人员24人笔试备考试题及答案解析
- 2024年成都大邑县总工会招聘真题
- 肾上腺肿瘤课件
- 化工中试车间设计
- 红色管理课件
- 测绘工程终止合同范本
- 2025年康复治疗师职业资格考试试题及答案
- 北师大版八年级数学上册-一次函数压轴题分类归纳(超详细)
- 双峰驼血浆外泌体的分离鉴定及其差异miRNA生物信息学分析
- 有限空间作业审批制度(2篇)
- 卤水中锂的测定 火焰原子吸收光谱法 编制说明
- (高清版)WST 227-2024 临床检验项目标准操作程序编写要求
评论
0/150
提交评论