您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > lesson 13 程序的组织结构 函数调用
1/40Lesson13程序的组织结构2/40学习目标:31学会使用结构化程序设计方法编写程序3/403函数调用2函数调用的一般形式:函数名(实参列表);实参与形参的个数应相等,类型一致,顺序一一对应各个实参之间用逗号分隔调用无参函数时格式为:函数名();注意()不能省略4/403函数调用2函数调用的一般形式:函数名(实参列表);形式参数(形参):定义函数时写在函数名后括号内的变量,形参前必须有数据类型intfun(intn)实际参数(实参):调用函数时写在函数名后括号内的变量,实参仅写变量名sum+=fun(i)5/403函数调用2参数的传递当函数没有执行时,参数此时并不存在,只是用来说明在调用这个函数时需要在这个位置向函数提供的数据类型。在调用函数之后,参数传递需要经历两个基本步骤:首先,根据形式参数的声明格式,为每一个形式参数分配存储空间;然后再将实在参数的值赋给对应的形式参数。6/403函数调用2c=max(a,b);max(intx,inty){intz;z=xy?x:y;return(z);}intmax(intx,inty);intmain(){inta,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Maxis%d,c);return0;}intmax(intx,inty){intz;z=xy?x:y;return(z);}形参实参例1:函数执行过程7/403函数调用2例2:参数传递,分析程序结果#includestdio.hintmain(){intx=7,y=11;printf(x=%d,y=%d\n,x,y);printf(swapped:\n);swap(x,y);printf(x=%d,y=%d\n,x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}711x:y:调用前:调用结束:711x:y:调用:711a:b:711x:y:swap:711x:y:117a:b:temp实参和形参是单向值传递!一般地在函数体中修改形参的值是不会影响实参的!8/403函数应用3例3:输出乘法口诀表。9/403函数应用3例3:输出乘法口诀表。分析:它是一个9行9列的二维表格,加上一个行标题和一个列标题,显示出来应该是10行10列。10/403函数应用3问题分析行与行之间采用若干个“=”或“-”字符表示表格之间的线段,为此,可以定义一个函数,专门用来连续地显示若干个字符,以避免在每次需要显示线段的时候,都重复地书写相应的语句序列。11/40#includestdio.hvoiddrawLine(intn,charch);/*连续显示n个ch字符*/intmain(){inti,j;printf(\n9.9table\n);/*显示表名*/drawLine(30,'=');/*显示每列的标题*/printf(\n123456789);drawLine(30,'=');for(i=1;i=9;i++){/*显示每行的内容*/printf(\n%3d,i);for(j=1;j=9;j++)printf(%3d,i*j);if(i9)drawLine(30,'-');elsedrawLine(30,'=');}return0;}12/40voiddrawLine(intn,charch)/*连续显示n个ch字符*/{inti;putchar('\n');/*换行*/for(i=1;i=n;i++)putchar(ch);/*连续显示n个字符ch*/return0;}13/403函数应用3例4:计算要求精确度达到10-6。...!nx...!3x!2xx1en32x14/403函数应用3问题分析在这个公式中,第i项的分子是xi;分母是i!。为了便于计算每一项的数值,设计了两个函数power()和factorial()分别用来完成计算xi和i!的任务。另外,为了更好地体现模块化的设计思路,再设计一个函数e()用于计算ex。15/40算法描述开始结束1result1iresult+tmpresulti+1ireturnresultxi/i!tmp精度不够YN16/40#includestdio.hlongpower(intx,inty);longfactorial(intn);doublee(intx);intmain(){intx;printf(\nEnterx:);scanf(%d,&x);printf(\ne^%d=%f,x,e(x));return0;}longpower(intx,inty)/*计算xy*/{longp=1;inti;for(i=1;i=y;i++)p=p*x;returnp;}17/40longfactorial(intn)/*计算n!*/{inti;longf=1;for(i=2;i=n;i++)f=f*i;returnf;}doublee(intx)/*计算ex*/{doubleresult=1.0,tmp;inti=1;do{tmp=power(x,i)*1.0/factorial(i++);result+=tmp;}while(tmp=1E-6);/*精度的检查*/returnresult;}18/403课堂练习4!nm*!!(n-m)计算下式,n和m从键盘输入19/403函数应用3例5:从键盘输入一组文本行,求出最长行并且输出。20/403函数应用3问题分析从问题的求解要求可知,没有必要保存输入的所有文本行。只需保存已经输入各行中的最长行,以及刚输入的当前行。设计一个专门用于计算最长文本行的函数voidreadline(charmaxline[])。其实现过程为:一边输入文本行保存于数组line、一边与当前最长的文本行长度进行比较。如果新输入的文本行更长,则更新记录最长文本行的信息,最后得到的最长文本行将通过参数带出去。21/40算法描述开始结束0maxlength‘\0’line[0]非空行YN新长度maxlength保存新的最长行输入文本行lineline更长YN22/40#includestdio.h#includestring.hvoidreadline(charmaxline[]);intmain(){charmaxline[80]=;readline(maxline);/*输入并计算最长行*/printf(\nThelongestlineis:\n);puts(maxline);/*输出最长行*/return0;}23/40voidreadline(charmaxline[])/*输入并计算最长文本行*/{charline[80];intmaxlength,n;maxlength=0;/*初始化*/line[0]='\0';printf(\nEntertextlines:\n);do{gets(line);/*输入文本行*/n=strlen(line);if(nstrlen(maxline)){/*与记录的最长文本行进行比较*/maxlength=n;/*更新记录最长文本行的信息*/strcpy(maxline,line);}}while(n0);return;}24/40编写程序从键盘输入10个数保存在数组中,将数组中的10个数逆序后,然后输出。要求:使用3个函数,第1个函数从键盘输入10个保存在数组中,第二个函数将数组中的元素逆序,第三个函数将数组中的元素输出,main函数调用这些函数完成程序要求3课堂练习525/403递归算法与递归函数6C语言允许函数1、嵌套调用,即在函数中可以调用其它的函数。2、递归调用,即在函数内部直接地调用自己。26/403递归算法与递归函数6f()调f调f2调f1f1()f2()intf(intx){inty,z;……z=f(y);…….return(2*z);}intf1(intx){inty,z;……z=f2(y);…….return(2*z);}intf2(intt){inta,c;……c=f1(a);…….return(3+c);}27/403递归算法与递归函数6例6:计算阶乘的函数n!=n*(n-1)*(n-2)*…*2*1n!=n*(n-1)*(n-2)*…*2*1n!=n*(n-1)!1!=1递归关系终止条件算n!,必须算出(n-1)!;计算出(n-1)!,必须计算出(n-2)!;…;由此类推,直到推到1!=1,返回后即可依次计算出2!,3!,…,(n-1)!,n!。28/403递归算法与递归函数6当求解一个问题时,如果求解过程又用到自己则可以使用递归求解)1()!1()1,0(1!nnnnnfloatfaco(intn){floatr;returnr;}if(n==0||n==1)r=1;elser=faco(n-1)*n;intmain(){floatp;intn;printf(“输入:);scanf(%d,&n);p=faco(n);printf(%d!=%.0f,n,p);return0;}29/40主函数第一次调用第二次第三次第四次n=4p=facto(4)调用└→n=4r=4*facto(3)调用└→n=3r=3*facto(2)调用└→n=2r=2*facto(1)调用└→n=1return(1)┌←┘返回r=2*1=2return(2)┌←──┘返回r=3*2=6return(6)┌←───┘返回r=4*6=24return(24)┌←────┘返回p=24打印24递归返回过程递归调用过程递归程序的执行过程30/40facto(intn){intr;if(n==1)r=1;else{r=facto(n-1);r=n*r;}return(r);}facto(intn)intr;if(n==1)facto(intn){intr;if(n==1)r=1;else{r=facto(n-1);r=n*r;}return(r);}r=facto(n-1)facto(intn)intr;if(n==1)facto(intn){intr;if(n==1)r=1;else{r=facto(n-1);r=n*r;}return(r);}r=facto(n-1)facto(intn){intr;if(n==1)r=1;else{r=facto(n-1);r=n*r;}return(r);}facto(intn)facto(intn)intr;intr;if(n==1)if(n==1)r=facto(n-1)r=1return(1)r=n*r=2*1return(2)return(6)r=n*r=3*2r=n*r=4*6return(24)1234321N=4N=3N=2N=131/403课堂练习7使用递归计算数列1、1、2、3、5、8……的前20项#includestdio.hintmain(){intfaco(intn);inti,n;printf(输入数列最后一项的项数:\n);scanf(%d,&n);for(i=n;i=1;i--)printf(%d\t,faco(i));printf(\n);return0;}intfaco(intn){if(n==1||n==2)return1;elsereturnfaco(n-1)+faco(n-2);}32/403递归算法与递归函数6例7:采用递归方式实现二分查找。问题分析为提高二分查找算法的重用性,设一函数实现。二分查找算法描述为:对一个已经从小到大排序的数据序列,用给定数据key与查找区间中央位置的数据比较,如果相等则表明查找成功;否则,如果key比中央位置的数据小,则在前半个区间用同样的方法继续查找;否则在后半个区间用同样的方法继续查找。因此,这是一个递归的过程。当查找区间的长度为0时,说明查找不成功。33/40#includestdio.h#in
本文标题:lesson 13 程序的组织结构 函数调用
链接地址:https://www.777doc.com/doc-3400861 .html