您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 第5章函数(C语言程序设计)
第5章函数第5章函数第5章函数5.1C函数与C程序结构使用函数的目的是实现模块化程序设计C语言程序的基本单位是函数,而不是语句。什么是模块化程序设计思想?第5章函数考虑一个图书管理程序的实现主控模块借书还书馆藏图书图书查询C语言中一个模块就是一个函数第5章函数图书管理程序的C语言实现示意图借书模块函数(){…具体实现语句}还书模块实现函数(){…具体实现语句}每个模块编写成一个函数馆藏图书模块函数(){…具体实现语句}图书查询模块函数(){…具体实现语句}第5章函数主控模块实现函数:main(){}四条语句实现主模块简单清晰明了调用借书函数;调用还书函数;调用馆藏图书函数;调用图书查询函数;调用只是一条语句函数之间的关系通过调用实现—主调和被调没有调用就没关系第5章函数模块化软件结构的示意图图5.1模块化程序设计CBDEFGHIA思考:怎样用主调和被调说明A,B,C,…,I函数之间的关系第5章函数一个C语言程序由主函数和若干个(0个用户函数)组成。C语言中的函数没有隶属关系,即所有的函数都是独立定义的,不能嵌套定义。函数是通过调用来执行的,允许函数间互相调用,也允许直接或间接的递归调用其自身。main函数可以调用任何一个函数,而其他函数不能调用main函数。主动调用其它函数的函数称为主调函数,被调用的函数称为被调函数。系统函数不需要定义,只要在使用时调用就可以了如printf(),scanf()是系统函数用户函数需要先定义,后调用,不调用是不执行的第5章函数5.2函数的定义及构成[存储类型][数据类型]函数名([形式参数表]){声明变量语句可执行语句}通常把函数名和形参的说明部分称为“函数头”,用花括号括起来的部分称为“函数体”。voidprintstar(){printf(*******\n);}【例5.1】floatarea(floata,floatb){floats;s=a*b;returns;}【例5.2】存储类型:extern或staticextern外部函数(默认),static内部函数数据类型默认为int型:函数执行后会获得一个值无值类型:void函数名是一个标识符,它的命名规则同变量相同形式参数(简称形参)的说明形式如下:数据类型形式参数1,数据类型形式参数2,声明形参实际是定义变量,形参在函数体内不赋值!函数的返回值(函数的值)可以是常数、变量或表达式return表达式;return(表达式);return;也可以没有return语句(void类型)定义形参a,b时假定a,b有值(实际没有,形式上认为有)intsum(intx,inty,intz){intm;m=x+y+z;returnm;}定义形参x,y,z时内部没有赋值,形式上认为有值return是函数的逻辑结尾,可以出现多条,但只能执行一条intf(inta,intb){if(ab)return1;elseif(a==b)return0;elsereturn-1;}intsum(intx,inty,intz){}函数体:{}可以是空函数,只写出函数的形式,先考虑如何调用回头再实现定义体第5章函数5.3函数的调用函数名(实参表);s=sum(2,3,4);s=5*f(3,4,2);z=max(5,10);scanf(“%d”,&a);函数调用时的参数叫实际参数,简称实参实参和形参是一一对应的实参以值的形式表现printf(“x=%d”,x);printf(“x=%d”,max(5,10));形参以声明变量的形式表现第5章函数函数的调用过程floatf2(inta,intb){…return…;}f1(){…调用函数语句s=f2(x,y)…}主调函数被调用函数f1()floatf2(inta,intb)a=x;b=y第5章函数floatarea(inta,intb){floats;s=a*b;returns;}main(){floatlength,with,s;scanf(“%f,%f”,&length,&width);s=area(lengh,width);printf(“%5.2f”,s);}【例5.2】求长方形面积s2020,55area(lengh,width);ab205s100100s=10020,5100.00释放函数内变量释放main函数内变量第5章函数intsum(intx,inty,intz){intm;m=x+y+z;returnm;}main(){inti,j,k,s;scanf(“%d%d%d”,&i,&j,&k);if(!(i==0&&j==0&&k==0)){s=sum(i,j,k);printf(sum=%d\n,s);}}【例5.3】编写程序,计算3个不同时为0的整数之和。i20jks200-3sum(i,j,k);0-3xyz200-3m1717sum=17释放函数内变量释放main函数内变量第5章函数intf(inta,intb){if(ab)return1;elseif(a==b)return0;elsereturn-1;}C语言中,实参求值顺序不固定,TC从右向左。【例5.4】写出程序运行结果main(){inti=2,p;p=f(i,++i);printf(“%d”,p);}intf(inta,intb){if(ab)elseif(a==b)return0;}2ip33,f()3a3b000第5章函数问题:函数的执行顺序和它的书写顺序有什么关系?主调函数写在前?还是被调函数写在前?函数的书写顺序有两种类型:1.先定义,后调用2.先调用,后定义C语言规定函数的作用域从定义位置开始,直到源文件的末尾:书写顺序不同,函数的作用域不同第5章函数函数先定义,后调用的表现形式:max(inta,intb){if(ab)returna;elsereturnb;}【例】求两个数的最大值。main(){intx,y,z;scanf(“%d,%d”,&x,&y);z=max(x,y);printf(“maxnum=%d”,z);}编译时不会出现问题第5章函数函数先调用,后定义的表现形式:floatmax(floata,floatb){if(ab)returna;elsereturnb;}main(){intx,y,z;scanf(“%d,%d”,&x,&y);z=max(x,y);printf(“maxnum=%d”,z);}大部分情况下编译通不过修改:在调用函数前,声明函数的原型floatmax(inta,intb);floatmax(int,int);floatmax();放主调函数内也可特殊:函数类型是int,不需声明第5章函数【例5.5】编写函数,求一个整数的阶乘。/*先调用后定义*/main(){intn;longfac(int);scanf(%d,&n);printf(%d!=%ld,n,fac(n));}longfac(intx){inti;longy;if(x0)printf(dataerror\n);elsefor(i=1,y=1;i=x;i++)y=y*i;returny;}main()intn;nlongfac(int);scanf(%d,&n);33printf(%d!=%ld,n,fac(n));fac(n)longfac(intx);3xinti;ilongy;yif(x0)elsefori=1,y=111i=xy=y*i;y=1*11i++2i=xy=y*i;*2i++3i=xy=y*i;*326i++4i=xreturny;633!=63!=6第5章函数函数的调用可以是嵌套的,即在调用一个函数的过程中可以再调用另一个函数。C语言不允许嵌套定义,但可以嵌套调用。)!!*(!mnnmCnm【例5.6】计算组合数longcmn(intm,intn){return}main(){调用z=cmn()}longfac(intx){return}fac(m)fac(n)*fac(n-m)y=输出函数的设计原则:函数内尽量最简封装性要好不要输入输出语句第5章函数main(){intm,n;longfac(int);longcmn(int,int);printf(“inputtwointegers:”);scanf(“%d,%d”,&m,&n);if(mn||m0||n0)printf(“inputerror!\n”);elseprintf(“%ld”,cmn(m,n));}longfac(intx){inti;longy;for(i=1,y=1;i=x;i++)y=y*i;returny;}longcmn(intm,intn){longfc;fc=fac(m);fc=fc/fac(n);fc=fc/fac(m-n);returnfc;}intm,n;longfac(int);longcmn(int,int);printf(“inputtwointegers:”);intputtwuintegers:scanf(“%d,%d”,&m,&n);)!!*(!mnnmCnmm3n3,22if(mn||m0||n0)elseprintfcmn(m,n)longcmn(intm,intn)3m2nlongfcfcfac(m)longfac(intx)3xinti;ilongy;yfori=1,y=1;i=1,y=1;11i=x;y=y*i;y=1*1i++2i=x;y=y*i;*22i++3i=x;y=y*i;*36i++4i=x;returny;6longfac(intx){inti;longy;for(i=1,y=1;i=x;i++)y=y*i;returny;}6fc/fac(n)longfac(intx)2x2xyifor(i=1,y=1;i=x;i++)y=y*i;23returny;2longfac(intx){inti;longy;for(i=1,y=1;i=x;i++)y=y*i;returny;}6/3fc=fc/fac(m-n);1xiyfor(i=1,y=1;i=x;i++)y=y*i;returny;3/1longfac(intx){inti;longy;for(i=1,y=1;i=x;i++)y=y*i;returny;}3returnfc;33第5章函数5.4函数的递归调用在调用一个函数的过程中,又出现直接或间接地调用该函数本身。这种调用方式称递归调用实现递归调用的函数称为递归函数。直接调用自己称为直接递归,间接调用自己称为间接递归。第5章函数1.递归函数的特点递归函数常用于解决那些需要分多次求解,并且每次求解过程基本类似的问题。递归函数内部对自身的每一次调用都会导致一个与原问题相似而范围要小的新问题。直到停止递归函数的调用。构造递归函数的关键在于寻找递归算法和终结条件。)1()!1(*)1,0(1!nnnnn第5章函数2.递归函数的设计)1()!1(*)1,0(1!nnnnn【例5.7】longf(intn){}longy;if(n==0||n==1)y=1;elsey=n*f(n-1);自己调自己returny;main(){…z=f(x);…}第5章函数main(){}声明函数原型longfac(intn);n!递归完整演示过程:intn;n3scanf(“%d”,&n);printf(“%d!=%d”,n,fac(n));longfac(intn){}3longf;if(n==0||n==1)f=1;elsef=n*fac(n-1);3*fac(2);longfac(intn){}2longf;if(n==0||n==1)f=1;elsef=n*fac(n-1);2*fac(1);longfac(intn){}1longf;if(n==0||n==1)f=1;1returnf;f=2*1释放变量returnf;释放变量f=3*2;returnf;6释放变量33!=6第5章函数【例5.8
本文标题:第5章函数(C语言程序设计)
链接地址:https://www.777doc.com/doc-3811796 .html