121、已知四边形边长a、b、c、d及一条对角线长e,求四边形面积。2、用字符‘*’打印一个梯形。3、用函数求m个元素中取n个的组合。公式:定义函数:main:实现I/O、调用comp函数;comp:按公式计算、调用阶乘函数fact;fact:阶乘函数;4、输入1~32767之间的正整数,用递归方式分离各数符并反序输出。如:2466425、给出年、月、日,问是星期几(星期日~六用0~6表示)。6、用递归法将一个整数转换成字符串输出。7、有一篇三行文字的文章,每行最多80个字符,编写函数,由实参传递字符串,分别统计文章中大写字母、小写字母、数字、空格及其它字符的个数。分析:自定义函数需返回多个统计结果,可采用一个专门的数组存放统计结果,并将其作为函数参数,在被调函数中计数。用自定义函数判断一个数是否素数;在主函数main中输出100~200之间的全部素数。abcde)!(!!nmnmCnm3函数调用举例例:已知四边形边长a、b、c、d及一条对角线长e,求四边形面积。abcde分析:可分解为求任意三角形面积的问题。将求三角形面积的功能独立出来,用自定义函数实现。4#includemath.hfloatss(floata,floatb,floatc)/*函数定义*/{floatt,s;t=(a+b+c)/2.0;s=sqrt(t*(t-a)*(t-b)*(t-c));return(s);}main(){┇}5main(){floata,b,c,d,e,area;inti,j;floatss(float,float,float);/*函数声明*/printf(\nInputa,b,c,d,e:);scanf(%f,%f,%f,%f,%f,&a,&b,&c,&d,&e);i=a+be&&a+eb&&e+ba;j=c+de&&c+ed&&e+dc;if(i&&j){area=ss(a,b,e)+ss(c,d,e);/*函数调用*/printf(\tarea=%7.2f\n,area);}elseprintf(\tDATAERROR!\n);}YS6例:用字符‘*’打印一个梯形。main(){voidpstar(int);inti,n;printf(Enterlinenumber:);scanf(%d,&n);for(i=1;i=n;i++)pstar(i*2+3);}voidpstar(intsn)/*有参无返回值*/{intj;for(j=1;j=sn;j++)printf(*);printf(\n);return;}*****5个*******7个*********9个***********11个*************13个YS76.5函数的嵌套调用在一个函数被调用的过程中,又发生了对另一个函数的调用,这种现象称为函数嵌套调用;嵌套的层次可是多层的。例:用函数求m个元素中取n个的组合。公式:定义函数:main:实现I/O、调用comp函数;comp:按公式计算、调用阶乘函数fact;fact:阶乘函数;)!(!!nmnmCnm8调用关系:maincompfactmain(){intn,m;longc;longcomp(int,int);/*原形声明*/printf(Enterm,n:);scanf(%d,%d,&m,&n);c=comp(m,n);/*调用函数*/printf(C(%d,%d)=%ld\n,m,n,c);}┇9main(){┅}longcomp(intm,intn){longs;longfact(int);/*声明函数*/s=fact(m)/(fact(n)*fact(m-n));/*嵌套调用*/return(s);}longfact(intx){inti;longf=1;for(i=1;i=x;i++)f=f*i;return(f);}YS10例:输入1~32767之间的正整数,用递归方式分离各数符并反序输出。如:246642voidfun(intn){intd;d=n%10;/*取n当前的个位*/printf(%d,d);n=n/10;if(n!=0)fun(n);}/*条件成立递归调用*/main(){intn;do{printf(\nEntern(1-32767):);scanf(%d,&n);}while(!(n=1&&n=32767));fun(n);}11例:给出年、月、日,问是星期几(星期日~六用0~6表示)。intisleap(inty)/*是闰年返回1,否则为0*/{return((y%4==0&&y%100!=0)||y%400==0);}intdays_pm(inty,intm)/*返回y年m月的天数*/{intdpm[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};returndpm[m]+(m==2?isleap(y):0);}12intlastyear(inty)/*返回y-1年12月31日是星期几*/{inti,n=y-1;/*每年365天为52个星期多1天*/for(i=1;iy;i++)n+=isleap(i);/*加上闰年天数*/returnn%7;}main(){inty,m,d,n,i;printf(\nInputdate(yyyy-mm-dd):);scanf(%d-%d-%d,&y,&m,&d);for(n=d+lastyear(y),i=1;im;i++)n+=days_pm(y,i);printf(%d\n,n%7);}13【例】用递归法将一个整数转换成字符串输出。#includestdio.hcharch[12]={0};/*定义全局数组*/main(){voidinttostr(long);longnum;scanf(%ld,&num);inttostr(num);puts(ch);}voidfun(longn){staticinti=0;if(n0){ch[0]='-';i++;n=-n;}if(n/10!=0)fun(n/10);/*递归调用*/ch[i]=n%10+'0';/*数值转换为字符*/i++;return;}14【例】有一篇三行文字的文章,每行最多80个字符,编写函数,由实参传递字符串,分别统计文章中大写字母、小写字母、数字、空格及其它字符的个数。分析:自定义函数需返回多个统计结果,可采用一个专门的数组存放统计结果,并将其作为函数参数,在被调函数中计数。15#includestdio.hmain(){charstr[3][80];staticintc[5],i;/*c各元素为0*/voidcount(char[][80],int[]);for(i=0;i=2;i++)/*输入三行字串*/gets(str[i]);count(str,c);/*实参:两个数组指针*/for(i=0;i=4;i++)/*输出统计结果*/printf(%5d,c[i]);}voidcount(chars[3][80],intc[5]){……}16main(){…;count(str,c);…;}voidcount(chars[3][80],intc[5]){inti,j;chart;/*用临时变量t提高效率*/for(i=0;i=2;i++)for(j=0;(t=s[i][j])!=0;j++)if(t='A'&&t='Z')c[0]++;elseif(t='a'&&t='z')c[1]++;elseif(t='0'&&t='9')c[2]++;elseif(t==32)c[3]++;elsec[4]++;return;}17【例】用自定义函数判断一个数是否素数;在主函数main中输出100~200之间的全部素数。#includemath.hmain(){intnum,m,count=0,prime(int);for(num=101;num=199;num=num+2){m=prime(num);if(m){printf(%5d,num);count++;if(count%10==0)printf(\n);}}}18main(){…;for(num=101;num=199;num=num+2){m=prime(num);if(m){…;}}}intprime(intn){inti,k,mark=1;k=sqrt(n);for(i=2;i=k;i++)if(n%i);/*余数非零为真*/else{mark=0;break;}/*出现约数中断*/return(mark);}