
程序设计基础(C语言):Ch6_程序结构与函数.ppt
33页1Chapter 6Program Organization & Function 2学习指导学习指导(Learning Guide)•内容概述•重要内容•教学目标•重要例题和习题•难点3内容概述内容概述(Contents in Brief) •高效程序的编写方法高效程序的编写方法•函数的声明及调用 函数的声明及调用 •函数间数据传递的方法函数间数据传递的方法•变量的作用域及存储类型变量的作用域及存储类型•多函数和多文件程序的编写多函数和多文件程序的编写 4重要内容重要内容((Important Parts))6.2 函数的定义6.3 函数间数据的仁传递方法6.4 函数的调用 5教学目标教学目标(Objectives) •掌握函数的定义和使用方法掌握函数的定义和使用方法•掌握变量作参数时数据传递的特点掌握变量作参数时数据传递的特点•掌握数组名作参数时数据传递的特点掌握数组名作参数时数据传递的特点•理解静态局部变量和全局变量的概念理解静态局部变量和全局变量的概念*•用递归函数求解递归问题用递归函数求解递归问题*6重要例题和习题重要例题和习题(Important Examples and Exercises)(Important Examples and Exercises)l例题例题: 6.9 用递归法计算用递归法计算n!l习题习题: 一、二、三一、二、三 7难点(难点(Difficulties))l函数间数据传递的方法8l高效程序的编写方法高效程序的编写方法-函数机制(The Mechanism of Function) e.g. 求m中取n的组合数 组合数等于:m!/((m-n)!n!) 9i.i.假设假设((Assumption)) f1----m! f2----(m-n)! f3----n!存在若干类似程序段,程序效率不高。
存在若干类似程序段,程序效率不高而使用函数机制可提高程序效率而使用函数机制可提高程序效率for(f1=1,i=2;i<=m;i++)f1*=i;for(f2=1,i=2;i<=m-n;i++)f2*=i;for(f3=1,i=2;i<=n;i++)f3*=i;printf(“%f\n”,f1/(f2*f3));ii. 程序程序((Source ))iii. 分析分析(Analysis)10iv. iv. 重写程序重写程序重写程序重写程序((((Rewrite the program Rewrite the program ))))程序程序1:#include
它们均称为函数的程序段它们均称为函数fac函数代替了前面函数代替了前面 三个类似的程序段函数的作用:根据自变量的值求出相应的三个类似的程序段函数的作用:根据自变量的值求出相应的函数值 11程序2:#include
它们是与函数f(x,y)的自变量对应的量[3]该语句的含义:将等于f(x,y)函数的运算结果返回到使用它的C函数[4] int是被返回的运算结果的类型15ⅱ.ⅱ.函数函数maxmax的使用示例的使用示例void main( ) {int max(int x,int y); /* 对被调用函数对被调用函数max进行引用性声明进行引用性声明*/int a, b, c; scanf(″%%d,%%d″,&a,&b); c=max(a,b); (调用所定义的调用所定义的max函数求函数值函数求函数值,并把它赋给并把它赋给c)printf(”max=%%d\n”,c); }int max(int x, int y) { int z; if (x>y) z=x; else z=y; return (z); } (返回运算结果到调用处)(返回运算结果到调用处)e.g.求二个整数的最大所编程序要求使用C函数max 函数调用函数调用函数调用函数调用max(a,bmax(a,b) )的含义:的含义:的含义:的含义:对于代表自变量具体值的a和b,调用所定义的函数max求函数值。
该值就是表达式max(a,b)的值它是通过执行max函数的函数体中的return语句而得到的这里:a和b称为实际参数16iii.max(a,biii.max(a,b) )的执行过程的执行过程 此过程包含三个阶段:数据的传递;函数体的执行;控制及运算结果的返回下面以a=3, b=2为例加以说明a. 首先,3,2由实参a,b被传递到形参x,y然后,b. 执行函数体中的语句求z(z为3)然后c. 执行语句return (z)即将z的值3作为运算结果以int型返回到调用函数main并使之成为表达式max(a,b)之值此外,控制亦由max函数返回到main函数的对max函数的调用处 17AssignmentEx.1 程序填空将程序填空将100~200之间的所有素数输出之间的所有素数输出 #include
虚参而实参不受被调用函数的影响而改变此特点亦被称作单向性此特点亦被称作单向性 19- - - -示例示例示例示例e.g. 下面程序的输出是什么?下面程序的输出是什么?#include
的影响而改变21b.图示232/33/2函数函数main函数函数swap a0 a1 (实参实参) b0 b1 (虚参虚参)23Given a0=2,a1=3Notes:[1]方框为被分配的存储单元 [2]箭头表示“传送” [3]符号“/”后的数为执行swap函数的函数体之后所产生的结果22l递归函数递归函数 e.g. 有有5个人坐在一起,问第个人坐在一起,问第5个人多少岁,他个人多少岁,他说比第说比第4个人大个人大2岁问第4个人岁数,他说比个人岁数,他说比第第3个人大个人大2岁问第3个人岁数,他说比第个人岁数,他说比第2个个人大人大2岁问第2个人岁数,他说比第个人岁数,他说比第1个人大个人大2岁最后问第岁最后问第1个人,他说是个人,他说是10岁请问第岁请问第5个个人多大?人多大? 若一个函数直接或间接地调用它自己,则这种函数称递归函数在递归函数中,对自身的调用称递归调用23i.i.思路思路age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2age(1)=10 age(2)=12age(3)=14 age(4)=16 age(5)=18“递递”过程过程“归归”过程过程该问题的求解过程是一个递归过程 24ii.ii.递归的数学表达递归的数学表达 10 n=1age(n)= age(n-1)+2 n>1 25iii.iii.用用C C函数函数ageage来描述上述递归过程来描述上述递归过程 int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c;}Note: age(n-1)称递归调用。
age函数称递归函数 26iv.iv.利用利用C C函数函数ageage求第求第5 5个人年龄个人年龄int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c;}void main() { int age(int n); printf(”%d\n”,age(5));}27vi.vi.函数调用:函数调用:age(5)age(5)的执行过程的执行过程 递归函数 递归函数age共被调用了共被调用了5次这些调用次这些调用是:是:age(5),age(4),age(3),age(2),age(1)其中其中age(5)发生在发生在main中,其余在中,其余在age函函数中,这些调用均为递归调用数中,这些调用均为递归调用age(5)age(4)age(3)age(2)age(1)c=10mainn←5n←4n←3n←2n←1return 10return 12return 14return 16return 181828l变量的作用域及存储类型变量的作用域及存储类型-静态局部变量静态局部变量 这种变量的声明在函数内。
用于保 这种变量的声明在函数内用于保持函数调用所产生的结果此结果持函数调用所产生的结果此结果可为下次调用服务可为下次调用服务29e.g.下面程序的运行结果是什么?#include
全局变量用于函数间的数据共享31e.g.e.g.程序的运行结果是什么程序的运行结果是什么? ?#include
而实参不受被调用函数的传送到虚参而实参不受被调用函数的影响而改变此特点亦称单向性 影响而改变此特点亦称单向性 n函数调用过程包含三个阶段:数据的传函数调用过程包含三个阶段:数据的传递,函数体的执行,控制的返回以及运递,函数体的执行,控制的返回以及运算结果的返回算结果的返回(如果有的话如果有的话)33l思路图(思路图(Mind MapMind Map))高效程序 函数 全局变量函数调用静态局部变量单向性编译指令重要实例递归过程递归函数函数间数据传递求n!求模块保持结果特点若干函数间共享数据。