《lesson12程序的组织结构函数定义.ppt》由会员分享,可在线阅读,更多相关《lesson12程序的组织结构函数定义.ppt(37页珍藏版)》请在三一办公上搜索。
1、Lesson 12 程序的组织结构,1,学习目标:,1,掌握结构化程序设计的思想使用函数,2,分而治之的思想,3,分而治之的思想,复杂问题(任务),解决问题方法,解决子问题1,解决子问题2,解决子问题3,解决子问题5,解决子问题n,4,结构化程序设计方法的核心是自顶向下,逐步求精,具体的实现策略是将复杂的问题逐步分解成相对简单的子问题,这样将有利于降低解决问题的难度,提高程序开发的效率。将一个问题分解成若干个子问题的过程称为模块化。,在C语言中,这些独立的简单的模块就是函数。,5,函数:是C语言中模块化编程的最小单位,“一个程序应该是轻灵自由的,它的子过程就象串在一根线上的珍珠。”-Geoff
2、rey James的编程之道,我们需要做两件事:如何得到珍珠;(定义函数)如何将珍珠串在这根线上(调用函数),6,1、如何得到“珍珠”,即如何完成需要实现的模块(函数),解决子问题i,7,1、标准函数:C语言提供了很多标准函数,它们被放置在一起,形成了一个标准函数库。2、自定义函数:自己定义的函数。,两类函数,8,函数原型 函数原型是指不包含函数体的函数声明。C语言规定,所有的函数必须先定义后调用。对于标准函数而言,由于它们的定义已经在C语言提供的标准函数库中,人们在调用它们的时候,只需要在程序的前面利用include将相应的函数原型加入到程序中就可以了。,9,10,调用函数时,不但需要了解函
3、数的功能,还要通过函数原型弄清楚函数需要的参数格式以及函数的返回类型,11,例1:根据给定的两个坐标点(x1,y1)和(x2,y2),计算两点之间的距离。,问题分析计算两点之间距离的公式为 d=,在这个公式中含有平方和开平方的运算,可以直接利用C语言提供的标准函数实现这两个运算。,12,算法描述,13,#include#include int main()int x1,y1,x2,y2;double distance;printf(nEnter 2 coordinates(x1,y1,x2,y2)n);scanf(%d%d%d%d,14,例2:掷骰子游戏。骰子是一个有六个面的正方体,每个面分别
4、印有16之间的小圆点代表点数。假设这个游戏的规则是:两个人轮流掷骰子6次,并将每次投掷的点数累加起来。点数多者获胜;点数相同平局。请编写程序,模拟这个游戏的过程,并给出玩100盘之后,谁是最终的获胜者。,15,问题分析由于每个人掷骰子所得到的点数是随机的,所以需要借助随机数发生器,每次产生一个16之间的整数,以此模拟玩者掷骰子的点数。为了计算在每盘中,甲、乙两人所掷的点数,需要定义两个int型变量d1,d2,用于作为记录每个人投掷点数的累加器。为了记录每个人的获胜盘数,需要再定义两个int型变量c1,c2,用于记录每个人获胜的盘数。,16,算法描述,17,#include#include in
5、t main()int d1,d2,c1,c2,i,j;c1=c2=0;/*初始化*/srand(time(0);/*用当前时间设置种子,并生成伪随机序列*/for(i=1;id2)c1+;/*累加获胜盘数*/else if(d1c2)/*输出最终获胜者信息*/printf(nThe first win.%d-%d,c1,c2);else if(c1c2)printf(nThe second win.%d-%d,c2,c1);else printf(They tie.%d-%d,c1,c2);return 0;,18,实现一个模块前需要:1、该模块需要解决一个什么问题,完成一个什么任务2、解决
6、该问题需要知道些什么条件,如何实现一个模块(函数)?,19,类型 函数名(类型 参数1,类型 参数2,),返回值类型,标识符,参数表:需要知道的条件,返回值,函数出口,函数体;return 表达式;,主要部分:完成模块需要完成的功能(任务),20,例题:定义一个函数,求一对坐标点到原点的距离,1、该模块需要解决一个什么问题:求到原点距离2、需要知道些什么条件 坐标点的坐标,把他作为参数,在该模块中算出他(参数)到原点的距离,21,例:double distance(int x,int y)double d;d=sqrt(x*x+y*y);return d;,22,C语言规定,一个函数可以有返回
7、值,也可以没有返回值。如果有返回值,返回值的类型在函数名前声明,并在函数体中利用return 语句将返回值返回;如果没有返回值,在函数名前声明void。默认的返回类型是int。函数定义不能放在另一个函数里面,不能嵌套定义。函数名不但应该符合C语言的自定义标识符命名规范,还应该“见名知意”。,23,参数表是函数之间交换信息的接口。既可以通过它将外界的数据传递给函数,也可以通过它将函数的操作结果带出函数(通过指针)。如果形式参数属于一维数组类型,无须指出一维数组的元素个数,一般通过其他参数指出。函数体是函数的核心部分,在这里列出需要执行的语句序列。,24,函数的返回值在声明函数的时候,函数名前使用
8、了保留字void,说明这个函数没有返回值;否则,这个函数执行完毕后,应该返回一个相应类型的数值。return 表达式;,25,编写一个函数求一个数的阶乘,26,#includeintmain()int n;double mul;double factorial(int n);printf(“请输入计算阶乘的数值N(120)rintf(“输入有误,请重新输入:n);else break;while(1);mul=factorial(n);printf(“数%d的阶乘=%.0lfn,n,mul);return 0;double factorial(int n)int i;double t=1.0;
9、for(i=1;i=n;i+)t*=i;return t;,函数的调用 函数调用语句的基本格式为:();实在参数与形式参数的数据类型和个数一一对应。,27,例3:计算:s=1+(1*2)+(1*2*3)+(1*2*3*4*10),分析:sum=1+2!+3!+4!+10!定义一个函数求阶乘,28,#include int fun(int n);int main()int i=0,sum=0;for(i=1;i=10;i+)sum+=fun(i);printf(“1!+2!+3!+=%d”,sum);return 0;int fun(int n)int i=0,s=1;for(i=1;i=n;i
10、+)s*=i;return s;,29,30,#includeintmain()int sum,summation(int n,int m);sum=summation(3,23)+summation(5,30)+summation(8,33);printf(sum=%dn,sum);return 0;int summation(int n,int m)int i,t=0;for(i=n;i=m;i+)t+=i;return t;,例4:使用函数的方法,编写程序求数组的最大值,分析:定义一个函数max,在该函数中传入一个数组,求该数组的最大值,31,#include int getMax(in
11、t d,int len);int main()int max,data10=1,2,4,5,3,10,9,6,8,7;max=getMax(data,10);printf(“最大值是:%dn”,max);return 0;int getMax(int d,int len)int i=0,m=d0;for(i=0;im)m=di;return m;,注意:参数为数组的定义方法len:数组的长度,注意:调用时直接传数组名,32,1、使用函数求:1*2*3+4*5*6+7*8*9+100*101*1022、使用函数求水仙花数3、使用函数打印等腰三角形4、使用函数求所有的1,1000范围内的完数(完数
12、:因子(不包括自身)和等于自身的数),33,34,#includeintmain()int i,sum=0,mul(int n,int m,int k);for(i=1;i=102;i+=3)sum+=mul(i,i+1,i+2);printf(sum=%dn,sum);return 0;int mul(int n,int m,int k)return n*m*k;,35,#include int main(void)int i,narcissistic_number(int n);for(i=100;i1000;i+)if(narcissistic_number(i/100)+narciss
13、istic_number(i/10%10)+narcissistic_number(i%10)=i)printf(水仙花是为:%dn,i);return 0;narcissistic_number(int n)return n*n*n;,36,#include int main()int i,print_triangle(int n);doprintf(请输入等腰三角形的高h(080)printf(输入有误,请从新输入h:n0;continue;else if(h=0)return 0;print_triangle(h);while(1)return 0;int print_triangle(
14、int n)int i,j;for(i=1;i=9;i+)for(j=1;j=10-i;j+)printf();for(j=1;j=i;j+)printf(%c,0+j);for(j=1;ji;j+)printf(%c,0+i-j);printf(n);,37,#include int main()int i,k;int end_few(int n);for(i=2;i1000;i+)if(end_few(i)!=0)printf(End of a few:%dn,end_few(i);return 0;int end_few(int n)int j,sum=0;for(j=1;jn;j+)if(n%j=0)sum+=j;if(sum=n)return n;else return 0;,求所有的1,1000范围内的完数,