您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 第5章 程序的组织结构
5.3自定义函数5.2标准函数5.1函数概述5.4函数与数组的应用实例5.5递归算法与递归函数第5章程序的组织结构5.1函数概述结构化程序设计方法的核心是自顶向下,逐步求精,具体的实现策略是将复杂的问题逐步分解成相对简单的子问题,这样将有利于降低解决问题的难度,提高程序开发的效率。将一个问题分解成若干个子问题的过程称为模块化。在C程序中,模块用函数实现。函数是构成C程序的基本单位。它由函数首部和函数体两个部分组成,函数首部包含函数的返回类型、函数名称和参数表的声明,函数体包含实现特定功能所需要执行的语句序列。5.2标准函数C语言提供了很多标准函数,它们被放置在一起,形成了一个标准函数库。函数原型函数原型是指不包含函数体的函数声明。C语言规定,所有的函数必须先定义后调用。对于标准函数而言,由于它们的定义已经在C语言提供的标准函数库中,所以,人们在调用它们的时候,只需要在程序的前面利用编译预处理命令include将相应的函数原型加入到程序中就可以了。例1:根据给定的两个坐标点(x1,y1)和(x2,y2),计算两点之间的距离。问题分析计算两点之间距离的公式为d=212212)yy()xx(在这个公式中含有平方和开平方的运算,可以直接利用C语言提供的标准函数实现这两个运算。算法描述开始输入两个坐标点输出计算结果结束计算两点之间的距离显示两个坐标点#includestdio.h#includemath.hmain(){intx1,y1,x2,y2;doubledistance;printf(\nEnter2coordinates(x1,y1,x2,y2)\n);scanf(%d%d%d%d,&x1,&y1,&x2,&y2);printf(\nThefirstcoordinateis(%d,%d),x1,y1);printf(\nThesecondcoordinateis(%d,%d),x2,y2);distance=sqrt(pow(x2-x1,2)+pow(y2-y1,2));printf(\nThedistanceis%f,distance);}程序代码例2:掷骰子游戏。骰子是一个有六个面的正方体,每个面分别印有1~6之间的小圆点代表点数。假设这个游戏的规则是:两个人轮流掷骰子6次,并将每次投掷的点数累加起来。点数多者获胜;点数相同平局。请编写程序,模拟这个游戏的过程,并给出玩100盘之后,谁是最终的获胜者。随机数的产生及应用实例问题分析由于每个人掷骰子所得到的点数是随机的,所以需要借助随机数发生器,每次产生一个1~6之间的整数,以此模拟玩者掷骰子的点数。为了计算在每盘中,甲、乙两人所掷的点数,需要定义两个int型变量d1,d2,用于作为记录每个人投掷点数的累加器。为了记录每个人的获胜盘数,需要再定义两个int型变量c1,c2,用于记录每个人获胜的盘数。算法描述开始输出最终获胜者信息结束0c1,c21ii=100两个人轮流掷骰子累加获胜盘数i+1iYN#includestdio.h#includestdlib.hmain(){intd1,d2,c1,c2,i,j;c1=c2=0;/*初始化*/randomize();/*初始化随机数产生器*/for(i=1;i=100;i++){/*模拟游戏过程*/d1=d2=0;for(j=1;j=6;j++){/*两个人轮流掷骰子*/d1=d1+random(6)+1;d2=d2+random(6)+1;}if(d1d2)c1++;/*累加获胜盘数*/elseif(d1d2)c2++;}if(c1c2)/*输出最终获胜者信息*/printf(\nThefirstwin.);elseif(c1c2)printf(\nThesecondwin.);elseprintf(Theytie.);}程序代码5.3自定义函数函数的定义基本格式函数返回类型函数名(参数表){函数体;}例:doubledistance(intx,inty){doubled;d=sqrt(x*x+y*y);returnd;}C语言规定,一个函数可以有返回值,也可以没有返回值。如果有返回值,返回值的类型在函数名前声明,并在函数体中利用return语句将返回值返回;如果没有返回值,在函数名前声明void。默认的返回类型是int。函数名不但应该符合C语言的自定义标识符命名规范,还应该“见名知意”。参数表是函数之间交换信息的接口。既可以通过它将外界的数据传递给函数,也可以通过它将函数的操作结果带出函数。如果形式参数属于一维数组类型,无须指出一维数组的元素个数。函数体是函数的核心部分,在这里列出了需要执行的语句序列。函数的调用函数调用语句的基本格式为:函数名(实在参数表);实在参数与形式参数的数据类型和个数一一对应。函数的返回值在声明函数的时候,函数名前使用了保留字void,说明这个函数没有返回值;否则,这个函数执行完毕后,应该返回一个相应类型的数值。return表达式;参数的传递定义函数时所给的参数被称为形式参数,这是由于当函数没有处于执行状态时,系统并不为这些参数分配存储空间,换言之,这些参数此时并不存在,只是用来说明在调用这个函数时需要在这个位置向函数提供的数据类型,因此,在调用函数之后,参数传递需要经历两个基本步骤:首先,根据形式参数的声明格式,为每一个形式参数分配存储空间;然后再将实在参数的值赋给对应的形式参数。例3:输出乘法口诀表。乘法口诀表又被称为“九九表”,是一种小学生在学习乘法运算时需要熟背的一个口诀表。它是一个9行9列的二维表格,加上一个行标题和一个列标题,显示出来应该是10行10列。自定义函数的应用实例问题分析行与行之间可以采用若干个“=”或“-”字符表示表格之间的线段,为此,可以定义一个函数,专门用来连续地显示若干个字符,以避免在每次需要显示线段的时候,都重复地书写相应的语句序列。#includestdio.hvoiddrawLine(intn,charch);/*连续显示n个ch字符*/main(){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,'=');}}voiddrawLine(intn,charch)/*连续显示n个ch字符*/{inti;putchar('\n');/*换行*/for(i=1;i=n;i++)putchar(ch);/*连续显示n个字符ch*/}例4:计算要求精确度达到10-6。...!nx...!3x!2xx1en32x问题分析在这个公式中,第i项的分子是xi;分母是i!。为了便于计算每一项的数值,设计了两个函数power()和factorial()分别用来完成计算xi和i!的任务。另外,为了更好地体现模块化的设计思路,再设计一个函数e()用于计算ex。算法描述开始结束1result1iresult+tmpresulti+1ireturnresultxi/i!tmp精度不够YN#includestdio.hlongpower(intx,inty);longfactorial(intn);doublee(intx);main(){intx;printf(\nEnterx:);scanf(%d,&x);printf(\ne^%d=%f,x,e(x));}longpower(intx,inty)/*计算xy*/{longp=1;inti;for(i=1;i=y;i++)p=p*x;returnp;}程序代码longfactorial(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;}程序代码5.4函数与数组的应用实例计算最长文本行所谓文本行是指以换行符‘\n’作为结束标志的文本序列。例5:从键盘输入一组文本行,求出最长行并且输出。问题分析从问题的求解要求可知,没有必要保存输入的所有文本行。只需保存已经输入各行中的最长行,以及刚输入的当前行。设计一个专门用于计算最长文本行的函数voidreadline(charmaxline[])。其实现过程为:一边输入文本行保存于数组line、一边与当前最长的文本行长度进行比较。如果新输入的文本行更长,则更新记录最长文本行的信息,最后得到的最长文本行将通过参数带出去。算法描述开始结束0maxlength‘\0’line[0]非空行YN新长度maxlength保存新的最长行输入文本行lineline更长YN#includestdio.h#includestring.hvoidreadline(charmaxline[]);main(){charmaxline[80]=;readline(maxline);/*输入并计算最长行*/printf(\nThelongestlineis:\n);puts(maxline);/*输出最长行*/}程序代码voidreadline(charmaxline[])/*输入并计算最长文本行*/{charline[80];intmaxlength;intn;maxlength=0;/*初始化*/line[0]='\0';printf(\nEntertextlines:\n);do{gets(line);/*输入文本行*/n=strlen(line);if(nstrlen(maxline)){/*与记录的最长文本行进行比较*/maxlength=n;/*更新记录最长文本行的信息*/strcpy(maxline,line);}}while(n0);}程序代码冒泡排序为了便于查找、统计,排序是一种经常需要进行的操作。排序的方法有很多种,上一章中介绍的简单选择排序是一种基于选择手段实现的排序方法。冒泡排序的基本思路是不断地将所有相邻数据进行比较,如果前面的数据大于后面的数据(a[j]a[j+1]),就将两个位置的数据进行交换,最终实现将所有的数据按照非递减的顺序重新排列的目的。问题分析将整个待排序的数据序列划分成有序区域和无序区域。初始状态有序区域为空,无序区域包括所有待排序的数据。对无序区域从前向后依次对相邻的两个数据进行比较,若逆序则将其交换,从而使得较小的数据像泡沫一样“飘浮”(向前),较大的数据“下沉”(向后)。每经过一趟冒泡排序,都会使无序区域中的最大数据进入有序区域。如果有n个数据等待排序,则最多经过n-1趟冒泡排序就可以将所有的数据排列好。例6:冒泡排序。算法描述开始结束NUM-1i0jvalue[j]value[j+1]Ni1YNjivalue[j]value[j+1]Yj+1ji-1iYN#includestdio.h#includestdlib.h#defineNUM10voidinput(intvalue[]);voidoutput(intvalue[]);voidsort(intvalue[]);main(){intvalue[NUM];/*存储待排序的数据数列*/input(value);output(value);sor
本文标题:第5章 程序的组织结构
链接地址:https://www.777doc.com/doc-859856 .html