
第9章丞数 §程序设计有两大最高级的艺术 ★算法设计艺术 ★结构设计艺术 §函数(function)是结构设计的最基本单位 §“一个程序应该是轻灵自由的,它的子过程就 象串在一根线上的珍珠。” -Geoffrey James的《编程之道》
第9章 函数 §程序设计有两大最高级的艺术 算法设计艺术 结构设计艺术 §函数(function)是结构设计的最基本单位 §“一个程序应该是轻灵自由的,它的子过程就 象串在一根线上的珍珠。” -Geoffrey James的《编程之道》

用丞数解决问题 §函数把较大的任务分解成若干个较小的 任务,并提炼出公用任务 §程序员可以在其他函数的基础上构造程 序,而不需要从头做起 §设计得当的函数可以把具体操作细节对 程序中不需要知道它们的那些部分隐藏 掉,从而使整个程序结构清楚 开发方法:自上向下,逐步分解,分而治之
用函数解决问题 §函数把较大的任务分解成若干个较小的 任务,并提炼出公用任务 §程序员可以在其他函数的基础上构造程 序,而不需要从头做起 §设计得当的函数可以把具体操作细节对 程序中不需要知道它们的那些部分隐藏 掉,从而使整个程序结构清楚 开发方法: 自上向下,逐步分解,分而治之

★函数分类 冬从用户角度 ●标准函数(库函数):由系统提供 ●用户自定义函数 从函数形式 ·无参函数 ·有参函数 使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件
函数分类 ❖从用户角度 ⚫标准函数(库函数):由系统提供 ⚫用户自定义函数 ❖从函数形式 ⚫无参函数 ⚫有参函数 使用库函数应注意: 1、函数功能 2、函数参数的数目和顺序,及各参数意义和类型 3、函数返回值意义和类型 4、需要使用的包含文件

函数返回值类型 §9.2用户函数的1 缺省int型 一、定义格式 无返回值void 合法标识符 现代风格: 函数类型 函数名(形参类型说明表) 函数体 说明部分 语句部分 例无参函数 printstar() {printf(***n”)方 或 printstar(void) 为空 { printf(****n”)方
§9.2 用户函数的定义、调用 一、定义格式 合法标识符 函数返回值类型 缺省int型 无返回值void 函数体 函数类型 函数名(形参类型说明表) { 说明部分 语句部分 } 现代风格: 例 有参函数(现代风格) int max(int x,int y) { int z; z=x>y?x:y; return(z); } 例 有参函数(现代风格) int max(int x, y) { int z; z=x>y?x:y; return(z); } 例 空函数 dummy( ) { } 函数体为空 例 无参函数 printstar( ) { printf(“**********\n”); } 或 printstar(void ) { printf(“**********\n”); }

传统风格: 函数类型 函数名(形参表) 形参类型说明 说明部分 语句部分 例 有参函数(传统风格) int max(xy) int x,y, int z; z=x>y?x:y, return(z);
函数类型 函数名(形参表) 形参类型说明 { 说明部分 语句部分 } 传统风格: 例 有参函数(传统风格) int max(x,y) int x,y; { int z; z=x>y?x:y; return(z); }

二、函数的调用 ★调用形式 函数名(实参表); ★调用方式 函数语句: 例printstarO); printf(Hello,World!\n): 必函数表达式: 例 m=max(a,b)*2; 函数参数: 例 printf(d",max(a,b)); m=max(a,max(b,c));
调用方式 ❖函数语句: 例 printstar(); printf(“Hello,World!\n”); ❖函数表达式: 例 m=max(a,b)*2; ❖函数参数: 例 printf(“%d”,max(a,b)); m=max(a,max(b,c)); 二、函数的调用 调用形式 函数名(实参表);

无参函数的定义与调用 打印如下图形 m void star() The first one: (i 米 int i,j; * f利 for(i=1;i<=4;i++) **米 f **** (for0=1j<=ij++) The second one: printf("*"方 printf("\n"); * ** p *大大女 f return; 3 main() printf("The first one:In"); star);*调用前面定义的函数star*/ printf("The second one:In"); star0;~调用前面定义的函数star*/
main( ) { int i,j; printf("The first one:\n"); for(i=1;i<=4;i++) { for(j=1;j<=i;j++) printf("*"); printf("\n"); } printf("The second one:\n"); for(i=1;i<=4;i++) { for(j=1;j<=i;j++) printf("*"); printf("\n"); } } 无参函数的定义与调用 The first one: * ** *** **** The second one: * ** *** **** void star() { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=i;j++) printf("*"); printf("\n"); } return; } main() { printf("The first one:\n"); star(); /*调用前面定义的函数star*/ printf("The second one:\n"); star(); /*调用前面定义的函数star*/ } 打印如下图形

有参函数的定义与调用 例、输入圆环内外半径,求圆环面积 main() float area(float r)) {float r1,r2,s; float s; scanf("%f%f",&r1,&r2); s=3.14159*r*r; s=3.14159*(r1*r1-r2*r2); return s; printf("s is %fn",s); main() {float r1,r2,s; scanf("%f%f",&r1,&r2); s=area(r1)-area(r2); printf("s is %fn",s);
有参函数的定义与调用 例、输入圆环内外半径,求圆环面积 main( ) {float r1,r2, s; scanf("%f%f",&r1,&r2); s=3.14159*(r1*r1-r2*r2); printf("s is %f\n", s); } float area(float r ) { float s; s=3.14159*r*r; return s; } main( ) {float r1,r2, s; scanf("%f%f",&r1,&r2); s=area(r1)-area(r2); printf("s is %f\n", s); }

§9.3函数参数和返回值 ★形参与实参 冬形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式 例比较两个数并输出大者 main() int a,b,c; scanf("%d,%d",&a &b); c=max(a,b); (main函数) c=max(a,b)月 实参 max(intx,inty)(max函数) printf("Max is %d",c); int z; z-x>y?x.y, max(int x,int y) return(z); 形参 int z, z-x>y?x:y, return(Z);
§9.3 函数参数和返回值 形参与实参 ❖形式参数:定义函数时函数名后面括号中的变量名 ❖实际参数:调用函数时函数名后面括号中的表达式 c=max(a,b); (main 函数) max(int x, int y)(max 函数) { int z; z=x>y?x:y; return(z); } 例 比较两个数并输出大者 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=x>y?x:y; return(z); } 形参 实参

§9.3函数参数和返回值 ★形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式 说明: ●实参必须有确定的值 ●形参必须指定类型 ·实参与形参个数相等,类型一致,按顺序一一对应 ●若形参与实参类型不一致,自动按形参类型转换一 一一函数调用转换 ●形参在函数被调用前不占内存;函数调用时为形参分 配内存;调用结束,内存释放
❖说明: ⚫实参必须有确定的值 ⚫形参必须指定类型 ⚫实参与形参个数相等,类型一致,按顺序一一对应 ⚫若形参与实参类型不一致,自动按形参类型转换— ——函数调用转换 ⚫形参在函数被调用前不占内存;函数调用时为形参分 配内存;调用结束,内存释放 §9.3 函数参数和返回值 形参与实参 ❖形式参数:定义函数时函数名后面括号中的变量名 ❖实际参数:调用函数时函数名后面括号中的表达式