2019/9/9电气与信息工程学院计算机系制作Lesson12程序的组织结构2019/9/9电气与信息工程学院计算机系制作学习目标:31掌握结构化程序设计的思想使用函数2019/9/9电气与信息工程学院计算机系制作3标准函数4函数:根据输入,经过一系列运算过程(步骤),得到结果y=sin(30)30acbsin(30)的含义:如图中:b/a2019/9/9电气与信息工程学院计算机系制作3函数31、标准函数:C语言提供了很多标准函数,它们被放置在一起,形成了一个标准函数库。2、自定义函数:自己定义的函数。两类函数2019/9/9电气与信息工程学院计算机系制作3标准函数4头文件函数类别math.h包含与数学有关的函数ctype.h包含与字符处理有关的函数string.h包含与字符串有关的函数stdio.h包含与输入输出有关的函数2019/9/9电气与信息工程学院计算机系制作3标准函数4函数原型功能描述doublesin(doublex)返回double型x的正弦,x是弧度doublesqrt(doublex)返回double型x的平方根doublepow(doublex,doubley)返回xy调用函数时,不但需要了解函数的功能,还要通过函数原型弄清楚函数需要的参数格式以及函数的返回类型2019/9/9电气与信息工程学院计算机系制作3标准函数4例1:根据给定的两个坐标点(x1,y1)和(x2,y2),计算两点之间的距离。问题分析计算两点之间距离的公式为d=212212)yy()xx(在这个公式中含有平方和开平方的运算,可以直接利用C语言提供的标准函数实现这两个运算。2019/9/9电气与信息工程学院计算机系制作算法描述开始输入两个坐标点输出计算结果结束计算两点之间的距离显示两个坐标点2019/9/9电气与信息工程学院计算机系制作#includestdio.h#includemath.hintmain(){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);return0;}lesson12_01.c2019/9/9电气与信息工程学院计算机系制作3自定义函数6引例:计算如下式子的和338305233iiiiii2019/9/9电气与信息工程学院计算机系制作3自定义函数2#includestdio.hintmain(){inti,sum=0,sum1=0,sum2=0,sum3=0;for(i=3;i=23;i++)sum1+=i;for(i=5;i=30;i++)sum2+=i;for(i=8;i=33;i++)sum3+=i;sum=sum1+sum2+sum3;printf(sum=%d\n,sum);return0;}lesson12_0.c2019/9/9电气与信息工程学院计算机系制作3自定义函数2#includestdio.hintmain(){inti,sum=0,sum1=0,sum2=0,sum3=0;for(i=3;i=23;i++)sum1+=i;for(i=5;i=30;i++)sum2+=i;for(i=8;i=33;i++)sum3+=i;sum=sum1+sum2+sum3;printf(sum=%d\n,sum);return0;}这里三个过程都一样,都是给定一个起始、结束(输入)的区间得到期间整数的和(输出)2019/9/9电气与信息工程学院计算机系制作3自定义函数5实现一个实现前需要明确:1、该模块需要解决一个什么问题,完成一个什么任务2、解决该问题需要知道些什么条件如何自定义一个函数?2019/9/9电气与信息工程学院计算机系制作3自定义函数5类型函数名(类型参数1,类型参数2,……)返回值类型标识符参数表:需要知道的条件返回值函数出口{}函数体;return表达式;主要部分:完成模块需要完成的功能(任务)2019/9/9电气与信息工程学院计算机系制作3自定义函数5例题:给定一个区间,计算其间整数的和1、该模块需要解决一个什么问题:求整数的累加和2、需要知道些什么条件区间的起始值、结束值把他作为参数循环求和2019/9/9电气与信息工程学院计算机系制作3自定义函数5例:intsumTo(intstart,intend){inti,s=0;for(i=start;i=end;i++)s+=i;returns;}2019/9/9电气与信息工程学院计算机系制作#includestdio.hintsumTo(intstart,intend);intsumTo(intstart,intend){inti=0,s=0;for(i=start;i=end;i++)s+=i;returns;}intmain(){inti,sum=0,sum1=0,sum2=0,sum3=0;sum1=sumTo(3,23);sum2=sumTo(5,30);sum3=sumTo(8,33);sum=sum1+sum2+sum3;printf(sum=%d\n,sum);return0;}声明,告诉C语言有这样一个函数调用,使用该函数,得到3-23整数之和3、实现,编写代码实现过程lesson12_0_1.c2019/9/9电气与信息工程学院计算机系制作3自定义函数5C语言规定,一个函数可以有返回值,也可以没有返回值。如果有返回值,返回值的类型在函数名前声明,并在函数体中利用return语句将返回值返回;如果没有返回值,在函数名前声明void。默认的返回类型是int。函数定义不能放在另一个函数里面,不能嵌套定义。函数名不但应该符合C语言的自定义标识符命名规范,还应该“见名知意”。2019/9/9电气与信息工程学院计算机系制作3自定义函数5参数表是函数之间交换信息的接口。既可以通过它将外界的数据传递给函数,也可以通过它将函数的操作结果带出函数(通过指针)。如果形式参数属于一维数组类型,无须指出一维数组的元素个数,一般通过其他参数指出。函数体是函数的核心部分,在这里列出需要执行的语句序列。2019/9/9电气与信息工程学院计算机系制作3自定义函数5函数的返回值在声明函数的时候,函数名前使用了保留字void,说明这个函数没有返回值;否则,这个函数执行完毕后,应该返回一个相应类型的数值。return表达式;2019/9/9电气与信息工程学院计算机系制作3函数调用7函数的调用函数调用语句的基本格式为:函数名(实在参数表);实在参数与形式参数的数据类型和个数一一对应。2019/9/9电气与信息工程学院计算机系制作3函数应用8例3:计算:s=1+(1*2)+(1*2*3)+…+(1*2*3*4*…*10)分析:sum=1!+2!+3!+4!+……+10!存在这样一个过程:输入一个n,得到n的阶乘定义一个求n的阶乘的函数2019/9/9电气与信息工程学院计算机系制作intfun(intn){inti=0,s=1;for(i=1;i=n;i++)s*=i;returns;}lesson12_03.c2019/9/9电气与信息工程学院计算机系制作#includestdio.hintfun(intn);intmain(){inti=0,sum=0;for(i=1;i=10;i++){sum+=fun(i);}printf(“1!+2!+3!+…=%d”,sum);return0;}intfun(intn){inti=0,s=1;for(i=1;i=n;i++)s*=i;returns;}lesson12_03.c2019/9/9电气与信息工程学院计算机系制作3课堂练习9计算:s=1/1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)n的值从键盘输入2019/9/9电气与信息工程学院计算机系制作3函数应用8数组作为函数参数问题:在主函数中定义了一个数组intdata[]={1,2,3,4,5,6,7,8,9,0}在sum函数中要对该数组求和,如何定义sum函数才能将数组data传到sum函数中呢2019/9/9电气与信息工程学院计算机系制作3函数应用8数组作为函数参数定义形式类型名函数名(类型名数组名[],类型名参数名)intsum(inta[],intlen){inti,s=0;for(i=0;ilen;i++)s+=a[i];returns;}2019/9/9电气与信息工程学院计算机系制作#includestdio.hintsum(inta[],intlen);intmain(){intdata[]={1,2,3,4,5,6,7,8,9,0},s;s=sum(data,10);printf(s=%d,s);return0;}intsum(inta[],intlen){inti,s=0;for(i=0;ilen;i++)s+=a[i];returns;}2019/9/9电气与信息工程学院计算机系制作3函数应用8例4:使用函数的方法,编写程序求数组的最大值分析:定义一个函数getMax,在该函数中传入一个数组,求该数组的最大值2019/9/9电气与信息工程学院计算机系制作#includestdio.hintgetMax(intd[],intlen);intmain(){intmax,data[10]={1,2,4,5,3,10,9,6,8,7};max=getMax(data,10);printf(“最大值是%d”,max);return0;}intgetMax(intd[],intlen){inti=0,m=d[0];for(i=0;ilen;i++)if(d[i]m)m=d[i];returnm;}注意:参数为数组的定义方法len:数组的长度注意:调用时直接传数组名lesson12_04.c2019/9/9电气与信息工程学院计算机系制作3函数应用8课堂练习:使用函数的方法,计算一个数组中的奇数和要求:定义一个函数sum(intdata[],intlen),该函数的功能是计算数组data中的奇数和在主函数中定义一个数组a,从键盘给该数组的每个元素输入值,调用该函数,输出其中的奇数和2019/9/9电气与信息工程学院计算机系制作3课后练习101、使用函数求1*2*3+4*5*6+7*8*9+…100*101*1022、使用函数求水仙花数3、使用函数打印等腰三角形4、使用函数求所有的[1,1000]范围内的完数(完数:因子(不过括自身)和等于自身的数)