您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言程序设计第四版PPT-谭浩强
第7章函数引例求阶乘n!inti,n;floatfac=1;printf(n=);scanf(%d,&n);for(i=1;i=n;i++)fac=fac*i;printf(%d!=%.0f\n,n,fac);引例求任意3个正整数的阶乘的和a!+b!+c!fa=1;for(i=1;i=a;i++)fa=fa*i;fb=1;for(i=1;i=b;i++)fb=fb*i;fc=1;for(i=1;i=c;i++)fc=fc*i;printf(%d!+%d!+%d!=%.0f,a,b,c,fa+fb+fc);引例求任意3个正整数的阶乘的和a!+b!+c!#includestdio.hintmain(){floatfactorial(intn);inta,b,c;floatsum;printf(a=);scanf(%d,&a);printf(b=);scanf(%d,&b);printf(c=);scanf(%d,&c);sum=factorial(a)+factorial(b)+factorial(c);printf(%d!+%d!+%d!=%.0f,a,b,c,sum);return0;}floatfactorial(intn){inti;floatfac;fac=1;for(i=1;i=n;i++)fac=fac*i;returnfac;}引例求任意3个正整数的阶乘的和a!+b!+c!使用函数可减少程序的重复段落使用函数可使程序功能相对独立,便于维护——模块化的程序设计应用程序源程序文件1函数1函数2函数3源程序文件2函数1函数2C应用程序的构成函数的概念#includestdio.hintmain(){intmax(intx,inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max=%d,c);return0;}intmax(intx,inty){intz;if(xy)z=x;elsez=y;returnz;}程序必备的main函数有返回值的函数函数的概念上述问题也可只用一个main函数实现intmain(){inta,b,c;scanf(%d,%d,&a,&b);if(ab)c=a;elsec=b;printf(max=%d,c);return0;}函数的概念intmain(){voidstars();stars();printf(Hello!\n);stars();printf(Bye!\n);stars();return0;}voidstars(){inti;for(i=1;i=8;i++)printf(*);printf(\n);}无返回值的函数函数的概念intmain(){voidstars(intn);intn=20;stars(10);printf(Hello!\n);stars(5);printf(Bye!\n);stars(n);return0;}voidstars(intn){inti;for(i=1;i=n;i++)printf(*);printf(\n);}有参数,无返回值函数的概念intmain(){voidstars(int,char);intn=20;stars(10,'%');printf(Hello!\n);stars(5,'-');printf(Bye!\n);stars(n,'$');return0;}voidstars(intn,charc){inti;for(i=1;i=n;i++)printf(%c,c);printf(\n);}两个参数,无返回值函数的概念functionn.官能,功能,作用,职责,典礼,仪式,[数]函数vi.(器官等)活动,运行,行使职责模块化程序设计的基本方法:分解程序的功能,使每个模块的功能相对简单而独立,通过调用函数、模块来实现整个功能,使程序的编写、调试思路清晰,实现工业化的生产方式。函数的分类有返回值(有类型)调用方式有无参数库函数(内部函数)用户自定义函数有参函数无参函数无返回值(空类型void)函数的返回值函数的定义指定函数名指定函数的类型指定参数名称和类型函数的功能intmax(intx,inty){intz;if(xy)z=x;elsez=y;returnz;}函数首部函数体函数的返回值,类型与首部定义一致函数首部,不是语句,行尾无分号函数的定义关于函数类型的说明无返回值的函数类型为void;有返回值的函数,其类型根据返回值类型决定;省略类型时默认为int(建议不要省略)函数的调用调用函数的准备工作——包含或声明调用库函数应在C文件开头部分使用#include头文件名要调用其他自定义函数,应在本函数体开始的声明部分加上被调用函数的声明(与函数首部内容相同的一个语句),供编译时使用——如果被调用函数出现在本函数之前可省略此部分详见7.4节函数的调用函数(实参列表)调用无返回值的函数可以把上述函数直接作为语句使用,以完成其功能。例如:stars(10);函数的调用函数(实参列表)调用有返回值的函数,应注意返回值的处理,如赋值或输出等。例如:c=max(a,b);或printf(%d,max(a,b));函数的参数形式参数(形参,Formalparameter):定义函数时首部括号中定义的变量实际参数(实参,Actualparameter):调用函数时,在函数名后括号中使用的表达式调用函数时,实参将值传递给形参函数的参数形式参数和实际参数voidmain(){intmax(intx,inty);inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max=%d,c);return0;}intmax(intx,inty){intz;if(xy)z=x;elsez=y;returnz;}函数的参数形式参数和实际参数形参在函数调用时分配内存单元,调用结束后释放;实参可以是常量、变量、表达式实参与形参的数目、类型应一致C语言中,实参向形参传递其值——“值传递”,不传递地址,形参值变化不影响实参函数的返回值通过函数体return语句中的表达式值获得,例如:intmax(intx,inty){returnxy?x:y;}无返回值的函数可省略return语句函数执行到return语句结束关于例题和习题通过本章例题、习题,不仅要掌握函数定义和调用的语法,也要掌握更多算法和编程技巧。正如学习语文、英语要大量阅读一样,学习计算机语言也要阅读例题,掌握一些基本的编程思路、技巧和表达,才可能对新的问题较快地找到解决方法;同时要多了解语法规则——相当于认字。另外,还应对计算机的工作原理和方式多一些了解。例:最大公约数函数和最小公倍数函数求最大公约数的算法:①从1开始,逐个找公约数,直至两数中较小的一个;②辗转求余(循环结构实验指导有流程图);......求最小公倍数的算法:①从两数中较大的一个开始,由小到大找公倍数,直至找到;②两数的乘积/两数的最大公约数。函数的嵌套调用调用最小公倍数函数(两数乘积/两数的最大公约数),当中需要调用最大公倍数函数函数的嵌套调用:在一个被调用的函数中调用另一个函数例:P183例7.5函数的递归调用概念:在一个被调用的函数中直接或间接地调用函数本身n!=1,n=0,1n(n-1)!,n1函数的递归调用递归的另一个典型实例——汉诺塔(P.189例7.8)算法讲解动画演示自己玩一下数组作为函数的参数两个完全不同的概念以数组元素作为函数的参数——实参是数组元素,对应的形参是变量以数组名作为函数的参数——实参和形参都是数组名数组元素作为函数的参数数组元素作为实参——形参是普通变量,值传递intmain(){inta[11],i;floatfac(intn);for(i=1;i=10;i++){a[i]=i;printf(%d!=%.0f\n,a[i],fac(a[i]));}return0;}floatfac(intn){floatt=1;inti;for(i=1;i=n;i++)t=t*i;returnt;}等价于普通变量数组作为函数的参数以数组名作为函数的参数——实参向形参传递首元素地址intmain(){intmax(inta[],intn);intx[6],i;for(i=0;i=5;i++)scanf(%d,&x[i]);printf(max=%d,max(x,6));return0;}intmax(inta[],intn){intm,i;m=a[0];for(i=1;in;i++)if(a[i]m)m=a[i];returnm;}实参为数组名形参为数组,不指定大小数组作为函数的参数以数组名作为函数的参数——注意事项形参和实参都是数组名,类型要一致;形参中不指定数组大小,指定无实际作用;形参数组名获得实参首元素的地址,即形参第一个元素与实参第一个元素占用相同的地址——这就是“地址传递”方式,形参值改变会引起实参值的变化为了使形参获得实参数组的大小(元素个数),通常在形参和实参对应地增加一个数值型的参数数组作为函数的参数以数组名作为函数的参数考虑:如何写一个排序函数?多个函数组成的程序中变量引用的一些规则C应用程序的构成应用程序源程序文件1函数1函数2函数3源程序文件2函数1函数2变量作用域——局部变量和全局变量局部变量——只在一个函数内或只在一个复合语句内有效的变量(“花括号内有效”)全局变量(外部变量)——在一个模块内多个函数中均有效扩展的外部变量——在多个程序文件的函数中有效(extern)变量作用域——局部变量和全局变量局部变量——函数内定义,只在该函数有效#includestdio.hintmain(){inta,b,c;......}floatfac(intn){floatt=0;......returnt;}主函数中不存在变量n和tfac函数中不存在变量a和b变量作用域——局部变量和全局变量局部变量——复合语句内定义,只在语句内有效编译错误:变量k未定义intmain(){inti;for(i=0;i=10;i++){intk;k=i*2;printf(%d\n,k);}printf(%d\n,i);printf(%d\n,k);}变量作用域——局部变量和全局变量局部变量在函数内定义,只在该函数内有效在复合语句内定义,只在该语句内有效形式参数也是局部变量,只在函数内有效变量作用域——局部变量和全局变量全局变量——在函数外定义,在其后的多个函数中均有效#includestdio.hintA,B,C;intmain(){}intX,Y;floatf1(intn){}intf2(){}变量作用域——局部变量和全局变量全局变量例:#includestdio.hintA,B,C;intmain(){intf1(intn);voidf2();printf(%d\n,f1(3));printf(main:%d\n,A);A=88;f2();}intf1(intn){intm;m=n*n;A=n*n*n;returnm;}voidf2(){printf(f2:%d\n,A);}变量作用域——局部变量和全局变量扩展的外部变量——在多个程序文件的函数中有效(见7.9.3节)在程序中可以调用其他文件中的函数(外部函数)可通过全局变量在函数间传递多个数据变量作用域——局部变量和全局变量判断下面程序的运行结果:#includestdio.hinta,b,n;intmain(){voidf1(intn);a=18;b=100;n=20;printf(main:a=%d,b=%d;n=%d\n,a,b,n);f1(50);}voidf1(intn){floata=13.89;printf(f1:a=%f,b=%d;n=%d\n,a,b,n);}变量作用域
本文标题:C语言程序设计第四版PPT-谭浩强
链接地址:https://www.777doc.com/doc-7490549 .html