C语言程序设计课件:第7章 用函数实现模块化程序设计

上传人:努力****83 文档编号:56961270 上传时间:2022-02-22 格式:PPTX 页数:35 大小:206.40KB
返回 下载 相关 举报
C语言程序设计课件:第7章 用函数实现模块化程序设计_第1页
第1页 / 共35页
C语言程序设计课件:第7章 用函数实现模块化程序设计_第2页
第2页 / 共35页
C语言程序设计课件:第7章 用函数实现模块化程序设计_第3页
第3页 / 共35页
点击查看更多>>
资源描述
第7章用函数实现模块化程序设计一、概述一、概述 二二、函数定义的一般形式函数定义的一般形式三、三、函数参数和函数的值函数参数和函数的值 四四、函数调用函数调用五、函数的嵌套调用五、函数的嵌套调用 六六、函数的递归调用、函数的递归调用七、数组作为函数的参数七、数组作为函数的参数 八八、局部变量和全局变量、局部变量和全局变量C程序源程序文件1源程序文件2预编译文件函数1说明部分执行部分函数n源程序文件3C程序结构程序结构 一个一个C程序可由一个主函数和若干个函数构成。程序可由一个主函数和若干个函数构成。 由主函数调用其他函数。由主函数调用其他函数。 其他函数可以相互调用。其他函数可以相互调用。 同一函数可以被一个或多个函数调用任意多次。同一函数可以被一个或多个函数调用任意多次。基本概念基本概念分类分类从用户使用的角度看:从用户使用的角度看:标准函数和用户自定义函数标准函数和用户自定义函数从函数的形式看:从函数的形式看:无参函数和有参函数无参函数和有参函数(一)(一)举例举例(二)(二)函数的定义函数的定义先来看一个函数使用的例子先来看一个函数使用的例子输入两个数,输出最大值。(判断的两个数的最大值用函数)输入两个数,输出最大值。(判断的两个数的最大值用函数)int main()int a,b,c; c=max(a,b); printf(“The max is %d”,c); return 0;int max(int x,int y)int z; if (xy) z=x; else z=y; return(z);函数调用函数调用函数定义函数定义类型标识符类型标识符 函数名(函数名(形参列表形参列表 ) 声明部分声明部分 语句部分语句部分int max(int x,int y)int z; if (xy) z=x; else z=y; return(z);函数首部函数首部函数体函数体格式格式int: 函数类型函数类型max:函数名函数名int x,int y: 形参及其定义形参及其定义声明部分:声明部分:int z;说明函数内部用到的变量。说明函数内部用到的变量。语句部分:语句部分:if . 说明函数的功能说明函数的功能return(z) 返回函数的结果返回函数的结果1、函数的返回值是通过函数中的、函数的返回值是通过函数中的return语句获得的。语句获得的。 一个函数中可以有一个以上的一个函数中可以有一个以上的return语句。只有一个起作用。语句。只有一个起作用。2、return (z); return z;3、如果函数值的类型和、如果函数值的类型和return语句中表达式的值不一致,则以函数类型语句中表达式的值不一致,则以函数类型为准。为准。4、如果被调用函数中没有、如果被调用函数中没有return语句,一般表示此函数完成一定操作,语句,一般表示此函数完成一定操作,并不带回任何值。并不带回任何值。5、为了明确表示、为了明确表示“不带回值不带回值”,可以用,可以用“void”定义定义“无类型无类型”。函数的返回值函数的返回值函数参数形参与实参形参:定义函数时函数名后面括号中的变 量名实参:调用函数时函数名后面括号中的表 达式说明:(1)形参在函数被调用前不占内存; (2)函数调用时为形参分配内存; 调用结束,释放内存(3)实参可以是常量、变量或表达式 (4)在被定义的函数中,必须指 定形参的类型(5)形参与实参类型一致,个数相同 (6)若形参与实参类型不一致,自 动按形参类型转换(函数调用 转换)(7)实参对形参与进行“值传递” (8)形参与实参占用不同的内存 单元, 单向传递函数的返回值返回语句形式: return (表达式); 或 return 表达式 ;说明:函数中可有多个return语句若函数类型与return语句中表达式值的类型不一致,自动转换为函数类型-函数调用转换函数返回值类型 缺省 int int 型函数无返回值 void型例 无返回值函数 void swap(int x,int y) int temp; temp=x; x=y; y=temp; printstar( ) printf(*);main( ) int a; a=printstar( ); printf(%d,a);void printstar( )printf(*);main( ) int a; a=printstar( ); printf(%d,a); 正确。函数printstar()没有说明类型表示整型,在main()中,语句a=printstar( );执行函数调用,因为在函数定义时没有定义返回值,所以返回一个随机整数。运行结果: *1010就是返回的随机整数。错误!在编译时将提示下列信息:cannot convert from void to int即不能将void转换为int举例格式格式函数名(实参列表函数名(实参列表 )方式方式1.函数语句函数语句 printstar()2.函数表达式函数表达式 c=a*max(a,b)3.函数参数函数参数 m=max(a,max(b,c)int main()int a,b,c; c=max(a,b); printf(“The max is %d”,c); return 0;函数调用函数调用实际参数与形式参数的关系实际参数与形式参数的关系对应关系对应关系个数对应个数对应顺序对应顺序对应类型对应(类型相同或赋值相容)类型对应(类型相同或赋值相容)传递关系传递关系实参传递给形参实参传递给形参值传递(单向传递)值传递(单向传递)对被调用函数的声明和函数原型对被调用函数的声明和函数原型标准函数标准函数函数外使用函数外使用#include调用有关库函数。调用有关库函数。#include #include 用户自定义函数用户自定义函数1.当函数定义出现在函数调用之后时,在主调函数中,采用当函数定义出现在函数调用之后时,在主调函数中,采用函数原函数原型型对被调用函数进行声明。对被调用函数进行声明。2.在以下情况下可不用进行函数声明。在以下情况下可不用进行函数声明。 函数定义出现在函数调用之前函数定义出现在函数调用之前 函数定义出现在函数调用之后,但函数类型为整形函数定义出现在函数调用之后,但函数类型为整形 在所有函数定义之前,在函数外部做了函数声明,则在主调函在所有函数定义之前,在函数外部做了函数声明,则在主调函数中不必对所调用的函数再作声明。数中不必对所调用的函数再作声明。举例举例C(m,n)=m!/(n!*(m-n)!) (mn)int main()float c; int m,n; float fac(int x); printf(“input m,n:”); scanf(“%d%d”,&m,&n); c=fac(m)/(fac(n)*fac(m-n); printf(“The result is %8.1f”,c); return 0;float fac(int x)int i; float t=1; for (i=1;iy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )调用函数dif输出结束dif函数max函数调用函数max调用函数minmin函数 在调用一个函数的过程中又出现直接或间接地调用该函数本身,成为函在调用一个函数的过程中又出现直接或间接地调用该函数本身,成为函数的数的递归调用。递归调用。举例:用递归方法求举例:用递归方法求n!。float fac(int n)float f;if(n0)printf(n0,dataerror!);f=-1;else if(n=0 | n=1) f=1;else f=fac(n-1)*n;return (f);int main() int n; float y; printf(input a inter numer:); scanf(%d,&n); y=fac(n); printf(%d! =%15.0fn,n,y); return 0;数组元素作函数实参v值传递数组名作函数参数v地址传递v在主调函数与被调函数分别定义数组,且类型应一致v形参数组大小(二维数组的第一维)可不指定v形参数组名是地址变量例 数组元素与数组名 作函数参数比较(数组元素作为参数)void swap( int x,int y ) int z; z=x; x=y; y=z;int main( ) int a2=1,2; swap(a0,a1); printf(a0=%dna1=%dn,a0,a1); return 0;值传递12a调用前a0a112a调用a0a112xy21xy交换12a返回例 数组元素与数组名 作函数参数比较(数组名作为参数)void swap( int x ) int z; z=x0; x0=x1; x1=z;int main( ) int a2=1,2; swap(a); printf(a0=%dna1=%dn,a0,a1); return 0;地址传递12a调用前12ax调用21ax交换21a返回例 (数组名作函数参数)求学生的平均成绩 #include float average(int stu10, int n); int main() int score10, i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(score,10); printf(Average is:%.2f, av); return 0; float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; int stu .2109score562312.88stu局部变量l定义:在函数内定义,只在本函数内有效l说明:umain中定义的变量只在main中有效u不同函数中同名变量,占不同内存单元u形参属于局部变量u局部变量可用存储类型:auto register static(默认为auto)全局变量-外部变量l定义:在函数外定义的变量l有效范围:从定义变量的位置开始到本源文件结束l应尽量少使用全局变量float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效int p=1,q=5;float f1(int a) int b,c; .int f3 ( ).char c1,c2;char f2(int x,int y) int i,j; main ( ) int m,n; .c1,c2的作用范围p,q的作用范围例 不同函数中同名变量(局部变量)int main( )int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b); return 0;sub( ) int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4float max,min;float average(float array, int n) int i; float sum=array0; max=min=array0; for(i=1;imax) max=arrayi; else if(arrayimin) min=arrayi; sum+=arrayi; return(sum/n);int main() int i; float ave,score10; /*Input */ ave=average(score,10); printf(max=%6.2fnmin=%6.2fn average=%6.2fn,max,min,ave); return 0;作用域maxmin例 全局变量说明n设置全局变量的作用是增加函数间数据联系的渠道。可以通过全局变量在函数之间传递值;n建议不在必要时不使用全局变量,原因如下:全局变量在程序的全部执行过程中都占用存储单元,而不是需要时才开辟存储单元;它使函数的通用性降低,因为函数在执行时要依赖于其所在的程序文件中定义的外部变量;使用全局变量多了,会降低程序的清晰性,使人难以判断出每个瞬间各个外部变量的值;如果在同一源文件中,外部变量与局部变量同名,则局部变量的作用范围内,外部变量将被“屏蔽”,即它不起作用变量的存储方式和生成期p变量的生存期,即变量值存在的时间。p变量的存储方式静态存储方式程序运行期间由系统分配固定的存储空间的方式。动态存储方式程序运行期间根据需要进行动态的分配存储空间的方式。p存储空间的组成程序区静态存储区动态存储区p全局变量存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕后释放。自动变量(auto变量)n函数中的局部变量,如果不是专门声明static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。n函数中的形参和函数中定义的变量均属于自动变量。nint a; 与 auto int a; 等价。n即关键字“auto”可以省略。静态变量(static局部变量)n静态局部变量属于静态存储类别,在静态存储区中分配存储单元。在程序整个运行期间不释放。n静态局部变量在编译时赋初值,只赋一次初值,在程序运行时它已经有初值。以后每次调用函数时不再重新赋初值而只保留上次函数调用后的值。n如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0或空字符n虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。因为是局部变量。寄存器变量(register变量)n寄存器变量是将变量的存储单元分配在CPU的寄存器中;n用于在程序执行过程中频繁调用的变量,以提高运行速度存储类别小结按变量的生成期分动态存储静态存储自动变量(本函数内有效)寄存器变量(本函数内有效)形式参数(本函数内有效)静态局部变量(本函数内有效)静态外部变量(本文件内有效)外部变量(用extern声明后,其他文件可引用)按作用域角度分局部变量全局变量自动变量,即动态局部变量(离开函数,值就消失)静态局部变量(离开函数,值仍保留)寄存器变量(离开函数,值就消失)(形式参数可以定义为自动变量或寄存器变量)静态外部变量(只限本文件引用)外部变量(即非静态的外部变量,允许其他文件引用)存储类别小结按变量值存放的位置分内存中静态存储区静态局部变量静态外部变量(函数外部静态变量)外部变量(可为其他文件引用)内存中动态存储区:自动变量和形式参数CPU中的寄存器:寄存器变量内部函数n如果一个函数只能被本文件中其他函数所调用,称为内部函数。n在定义内部函数时,在函数名和函数类型的前面加static。 static 类型名 函数名(形参表);n内部函数又称为静态函数。函数的作用域只限于所在文件。外部函数n在定义函数时,在函数首部的最左端加关键字extern,则函数为外部函数,可供其他文件调用。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!