[工学]第5章-模块设计.ppt
《[工学]第5章-模块设计.ppt》由会员分享,可在线阅读,更多相关《[工学]第5章-模块设计.ppt(76页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、5.1函数的概念函数的概念函数式的程序函数式的程序结构结构有且只能有一个名为有且只能有一个名为main的主函数的主函数C程序的执行总是程序的执行总是从从main函数开始,在函数开始,在main中结束中结束函数不能嵌套定义函数不能嵌套定义,可以嵌套调用可以嵌套调用较大的程序一般分为若干个程序模块较大的程序一般分为若干个程序模块。每个模块实现一个特定的功能。每个模块实现一个特定的功能。 常将一些常用的功能模块编写成函数,以被多个程序调用常将一些常用的功能模块编写成函数,以被多个程序调用。 main( ) f1( ); f2( ); f1( ) f11( ); f2( ) f21( ); f22(
2、); f11( ) f21( ) f22( ) main( )f1( )f2( )f11( )f21( )f22( )例5-1求两个整数的和#includemain() int x,y,z;scanf(“%d,%d”,&x,&y);z=x+y;printf(“n the sum ix %d.”,z);int sum(int a,int b) int s; s=a+b; return s;main( ) int x,y,z; int sum(int ,int ); scanf(“%d,%d”,&x,&y); z=sum(x,y); printf(“n the sum is %d.”,z); 从用
3、户角度从用户角度标准函数(库函数):由系统提供标准函数(库函数):由系统提供用户自定义函数用户自定义函数 从参数形式从参数形式无参函数无参函数有参函数有参函数 从返回值角度从返回值角度有返回值函数有返回值函数:return无返回值函数无返回值函数: void使用使用库函数库函数应注意:应注意:1 1、函数功能、函数功能2 2、函数参数的数目和顺序,及各参数意义和类型、函数参数的数目和顺序,及各参数意义和类型3 3、函数返回值意义和类型、函数返回值意义和类型4 4、需要使用的包含文件、需要使用的包含文件函数分类 ()现代风格:(ANSI C格式) 一般形式一般形式用户定义用户定义的合法标的合法标
4、识符识符函数返回值类型函数返回值类型缺省缺省int型型无返回值无返回值void函数体函数体例 有参函数(现代风格) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有参函数(现代风格) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函数 dummy( ) 函数体为空例 无参函数 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 函数的定义可选项可选项一般形式为: , ()传统风格:(K&R格式)例例 有参函数(传统风格)
5、有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 函数传统风格和例子函数传统风格和例子例例 有参函数(传统风格)有参函数(传统风格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 函数的定义函数定义不允许嵌套。 在语言中,所有函数(包括主函数main())都是平行的。一个函数的定义,可以放在程序中的任意位置,主函数main()之前或之后。但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义。函数的定义注意注意:func1() func2() func1() fu
6、nc2() /*嵌套定义嵌套定义*/main( ) int x,y,z; int sum(int ,int ); scanf(“%d,%d”,&x,&y); z=sum(x,y); printf(“n the sum is %d.”,z);int sum(int a,int b) int s; s=a+b; return s;p116例形参与实参形参与实参 形式参数:定义函数时函数名后面括号中的变量名形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式实际参数:调用函数时函数名后面括号中的表达式C C语言的参数传递规则是按值传递语言的参数传递规则是按值传递
7、 方式:函数调用时,为形参分配单元,并将实参的值方式:函数调用时,为形参分配单元,并将实参的值复制复制到形参中;调用结束,形参单元被释放,实参单到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值元仍保留并维持原值 特点:特点:形参与实参占用形参与实参占用不同不同的内存单元的内存单元单向单向传递传递实参和形参在数量上、类型上、顺序上严格一致。函数的参数函数的参数例5-2 #includemain() int n; printf(“Input number:”); scanf(“%d”,&n); s(n); printf(“n=%dn”,n); int s(int n) int i; f
8、or(i=n-1;i=1;i-) n=n+i; printf(“n=%dn”,n);运行结果:Input number: 100n=5050n=100711x:y:调用前:调用结束:711x:y:#include main() int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y);swap(int a,int b) int temp; temp=a; a=b; b=temp;调用:711a:b:711x:y:swap:711x:y:117a:b:temp例 交换两
9、个数形参实参分析下面程序运行结果分析下面程序运行结果int swap(int a,int b) int t; printf(a=%d,b=%dn,a,b); t=a;a=b;b=t; printf(a=%d,b=%dn,a,b); main() int x=3,y=5; swap(x,y); printf(x=%d,y=%dn,x,y); 例例程序运行结果是什么?#includeint sum(int n) int i,s=0; for(i=0;in;i+) if(i%10= =9) s=s+i; return s;main()printf(“%d”,sum(69);204204#includ
10、eint fun(int n) if(nm?k:m); 例例 多个多个return语句语句 int cp(int x,int y ) if(xy) return 1; else if(xy) return 2; return 0; 在程序中,是通过对函数的调用来执行函数体的在程序中,是通过对函数的调用来执行函数体的函数调用的一般形式:函数调用的一般形式:说明:说明: 调用函数时,函数名称必须与具有该功能的自定义函调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。数名称完全一致。 实参与形参实参与形参个数相等,类型一致,按顺序一一对应个数相等,类型一致,按顺序一一对应,才能正确地进行
11、数据传递才能正确地进行数据传递 实参表求值顺序,因系统而定(实参表求值顺序,因系统而定(Turbo C Turbo C 自右向左自右向左)C C语言规定,在调用函数之前,必须有相应的函语言规定,在调用函数之前,必须有相应的函数说明或函数定义。数说明或函数定义。 5.2.2 函数的调用函数名函数名( )或或函数名函数名(实参表实参表);函数调用语句:函数调用语句: 例:例: printstar();printstar(); printf(“Hello,World!n”); printf(“Hello,World!n”);函数表达式:函数表达式: 例:例: m=max(a,b)m=max(a,b)
12、* *2;2;函数参数:函数参数: 例:例: printf(“%d”,max(a,b);printf(“%d”,max(a,b); m=max(a,max(b,c); m=max(a,max(b,c);函数的调用调用方式:调用方式:#include main() int k=1,j; j=f(k,+k); /*函数调用函数调用*/ printf(%dn,j); int f(int a,int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); 函数调用时求值的顺序例例 m=3;printf(%d,%d,m,m+);c=ma
13、x(a,b);(main 函数)(max 函数)max(int x, int y) int z; z=xy?x:y; return(z); 例 比较两个数并输出大者#include main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z); 对被调用函数要求:对被调用函数要求:必须是必须是已存在已存在的函数的函数库函数库函数: : #include #include .h用户自定义函数用户自定义函数: : 函数声明函数声明
14、函数声明函数声明采用函数原型方式,对被调用函数进行说明采用函数原型方式,对被调用函数进行说明一般形式:一般形式: ( ); );作用:告诉编译系统函数类型、参数个数及类型,以作用:告诉编译系统函数类型、参数个数及类型,以便检验便检验函数定义函数定义与与函数说明函数说明不同不同函数说明位置:函数说明位置:程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)下列情况下,可不作函数说明下列情况下,可不作函数说明函数返值是函数返值是intint型型被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前函数的声明: 对在本函数中要调用的函数所做的说明对在本函数中要调用的函数所做的说
15、明 double fun(int n) main() fun(1); 函数声明与定义的对应关系main()double fun(int n); fun(1); double fun(int n) double fun(int n); main() fun(1); double fun(int n) 现代风格:不需要声明:main() fun(1); int fun(int n) 例: (先定义后使用)#includefloat f(float x) return 2*x*x+3*x+1;void main( ) float x;scanf(%f,&x);printf(y=%fn,f(x); 例
16、:(后定义,原形说明)#includefloat f(float);void main( ) float x;scanf(%f,&x);printf(y=%fn,f(x);float f(float x) return 2*x*x+3*x+1;找出函数定义部分和声明部分找出函数定义部分和声明部分 main( ) double new_style(int a,double x); double new_style(int a,double x) /*函数体*/ #include long sum(int a, int b); long factorial(int n);main() int n1
17、,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); long sum(int a, int b);long factorial(int n);文件包含编译预处理命令函数说明函数定义函数调用函数调用函
18、数返回值形参实参例子解析main( ) int a=3,b=5; void swap(int x,int y); swap(a,b); printf(“a=%d,b=%dn”,a,b); void swap(int x,int y) int temp; temp=x, x=y, y=temp; printf(“x=%d,y=%dn”,x,y);函数调用函数调用 函数定义函数定义形参形参 实参实参 执行函数体执行函数体返回函数值返回函数值释放相应空间释放相应空间函数声明函数声明 实参实参形参形参x=5,y=3a=3,b=55.3函数调用中参数的传递 1 值传递方式 2 地址传递方式:指针 3 数
19、组作为函数参数: 与普通变量的值传递方式相同,单向的值传送.例5-4:求一个整数数组中各元素的绝对值.#includevoid fun(int n)if(n=0) printf(%3d,n);else printf(%3d,-n);main( ) int a10,i;printf(input 10 numbers:n);for(i=0;i10;i+) scanf(%d,&ai); fun(ai); 数组元素作函数参数例#include main( ) int a7=3,2,6,9,10,4,8; int i,x; int cc(int); /*函数声明*/ for(i=0;i7;i+) x=c
20、c(ai); /*用数组元素作为函数的实参*/ if(x=1) printf(%dn,ai); int cc(int y) /*函数定义*/ int z=0; if(y % 2 = =1) z=1; return(z);分析下面程序的运行结果例,下面的程序完成什么功能?#includeint max(int x,int y) return(xy?x:y);void main() int a10,i,m;printf(enter 10 numbers:n);for(i=0;i10;i+) scanf(%d,&ai);m=a0;for(i=0;i10;i+)m=max(m,ai);printf(m
21、ax is %d,m);求求1010个数中的最大数个数中的最大数数组名作为函数实参 用数组名作函数实参时,形参和实参都必须是同类型的数组,而且都有明确的数组说明。若函数的形参是数组,则对应的实参必须是数组。说明:1.实参与形参数组的类型必须一致。2.用数组作参数时,传递的是数组的首地址,因此形参数组可以不指定大小,但需另指定一个参数,传递数组元素的个数。3.数组做为函数参数时,实参和形参数组共享同一内存单元。如果形参数组元素被改变,则实参数组也就被改变了5-5数组a中存放10个实型数据,求平均#includefloat aver(float b10) int i;float av,s=b0;f
22、or(i=0;i10;i+) s=s+bi; av=s/10;return av; main() float a10,av;int i;printf(input 10 scores:n);for(i=0;i10;i+) scanf(%f,&ai); av=aver(a);printf(“average score is %5.2f”,av);5-6#includevoid fun(int a10)int i;for(i=0;i10;i+) if(ai0) ai=-ai; printf(%3d,ai); main() int b10,i;printf(input 10 numbers:n);fo
23、r(i=0;i10;i+) scanf(%d,&bi;for(i=0;i10;i+) printf(%d,bi);fun(b); for(i=0;i10;i+) printf(%d,bi);5-7#includevoid fun(int a8)int i;for(i=0;i8;i+) if(ai0) ai=-ai; printf(%3d,ai); main() int b10,i;printf(input 10 numbers:n);for(i=0;i10;i+) scanf(%d,&bi;for(i=0;i10;i+) printf(%d,bi;fun(b); for(i=0;i10;i+)
24、 printf(%d,bi); includeint max(int x10) int i,m; m=x0;for(i=0;i10;i+)if(mxi) m=xi;return m;void main() int a10,i;printf(enter 10 numbers:n);for(i=0;i10;i+) scanf(%d,&ai);printf(max is %d,max(a);includeint max(int x,int n) int i,m; m=x0;for(i=0;in;i+)if(mxi) m=xi;return m;void main() int a10,i;printf
25、(enter 10 numbers:n);for(i=0;i10;i+) scanf(%d,&ai);printf(max is %d,max(a,10);形参和实参总结实参形参传递方式常量、变量、表达式,数组元素变量传值(单向)数组名数组传数组首地址 概述概述 变量是对程序中数据的存储空间的抽象变量是对程序中数据的存储空间的抽象内存.main() int a; a=10; printf(“%d”,a);编译或函数调用时为其分配内存单元编译或函数调用时为其分配内存单元200020015.4 变量的存储类别与作用域10程序中使用变量名对内存操作程序中使用变量名对内存操作 变量的属性变量的属性数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工学 模块 设计
限制150内