C第5章函数习题答案.doc_第1页
C第5章函数习题答案.doc_第2页
C第5章函数习题答案.doc_第3页
C第5章函数习题答案.doc_第4页
C第5章函数习题答案.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 函数与预处理1利用递归函数调用方式,将所输入的5个字符以相反顺序打印出来。#include using namespace std;int main()int i=5;void palin(int n);cout请输入5个字符:;palin(i);coutendl;return 0;void palin(int n)char next;if(n=1)next=getchar();coutnext;elsenext=getchar();palin(n-1);coutnext;2编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),其中Euclid算法:(1)如果a除以b能整除,则最大公约数是b。(2)否则,最大公约数等于b和a%b的最大公约数。#include using namespace std;int GCD(int a,int b) if(a%b=0)return b;elsereturn GCD(b,a%b);int main() int i,x,y;coutxy;i=GCD(x,y);coutx与y的最大公约数为:iendl;return 0;3编写递归函数求Fibonacci数列的第n项,这个数列是这样定义的:fib(0)=1fib(1)=1fib(n)=fib(n-1)+fib(n-2)#include using namespace std;int fib(int n)if(n=0)return 1;else if (n=1)return 1;elseint i;i=fib(n-1)+fib(n-2);return i;int main(void)int i,z;coutz;i=fib(z);coutfibonacci数列的第z项为:iendl;return 0; 4编写函数,计算s=22!+32!。#include using namespace std;int fact(int n)if(n=0|n=1) return 1;else return n*fact(n-1);int main()long s;s=fact(22)+fact(32);cout22!+32!=sendl;return 0;5编写函数,判断一个整数数组中各元素的值,若大于0则输出该值,若小于等于0则输出0值。#include using namespace std;void nzp(int b,int n) int i; for(i=0;i0)coutbi ;elsecout0 ;int main() int a5,i;cout请输入5个数:;for(i=0;iai;nzp(a,5);coutendl;return 0;6编写函数,求存放在数组中若干个数的平均值。#include using namespace std;float aver(int b,int m)int i,sum=0;float pjz;for(i=0;im;i+) sum=sum+bi; pjz=sum*1.0/m; return pjz;int main() int i,n,a1000; cout请输入数组元素的个数n(nn;for(i=0;iai; cout数组元素的平均值为:aver(a,n)endl;return 0;7编写函数,求一个字符串的长度,要求在main函数中输入一个字符串,并输出其长度值。#include using namespace std;int stringLength(char str)/*函数,求一个字符串的长度*/int length=0,i=0;while(stri+!=0) length+;return length;int main()char s1000;int len;cout请输入字符串s,长度不超过1000endl;gets(s);len = stringLength(s);cout输入字符串s的长度为:lenendl;return 0;8.编写函数,它接受两个整型参数和一个提示用户输入字符串参数,函数会提示所输入的值应在参数指定的范围之内,函数应一直提示用户输入值,直到输入的值有效为止。在程序中使用该value_input()函数,获取用户的生日,验证月份、日期、年份是否有意义,最后以下面的格式在屏幕上输出该生日:Noverber 21, 1977。这个程序应使各个函数(month(), year(), day())管理对数字的输入,最后注意不要忘了闰年。#include using namespace std;int month_days = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31;char month_m1310=0,January,February,March,April,May,June,July,August,September,October,November,December;char message315=year error,month error,day error;int y,m,d;int year(int y)if( (y%4 = 0 & y%100 != 0) | (y%400 = 0) )return 1;else return 0;int month(int m)if(m=1&m=1&d=1&d=month_daysm+1)dayture=1;return dayture;void value_input(int y1,int y2,char message15) int mtrue,dtrue;while(1) coutymd; if(y=y1&y=y2)mtrue=month(m);if(mtrue)dtrue=day(d);if(dtrue)break;elsecoutmessage2endl;elsecoutmessage1endl; elsecoutmessage0endl; int main() char message315=year error,month error,day error;int year1,year2;coutyear1year2;value_input(year1,year2,message);coutmonth_mm d,yendl;return 0;9.编写函数,生成斐波纳契级元素,即,序列,其中每个数都等于前两个数之和,元素的个数由用户输入。#include using namespace std;int f(int n) if(n=1|n=2) return 1; else return f(n-2)+f(n-1); int main() int i,n;coutn;cout斐波那契数列的元素为:;for(i=1;i=n;+i) coutf(i) ;coutendl;return 0;10给定某班级所有学生某门课程分数,分别求其平均分、最高分和最低分。#include using namespace std;float aver(int b,int n)int i,sum=0;float avg;for(i=0;in;i+)sum=sum+bi;avg=sum*1.0/n;return avg;int max_value(int b,int n)int i,max;max=b0;for(i=0;imax) max=bi;return max;int min_value(int b,int n)int i,min;min=b0;for(i=0;in;i+) if(bimin) min=bi;return min;int main() int a200,i,n; coutn;cout请输入某一门课程的n个成绩:; for(i=0;iai;cout这门课程的平均分数为:aver(a,n)endl; cout这门课程的最高分为:max_value(a,n)endl; cout这门课程的最低分为:min_value(a,n)endl;return 0; 11用递归函数完成以下运算:sum(n)=1+2+3+n。#include using namespace std;long sum(int n) if(n=1) return 1; Else return n+sum(n-1);int main() int n;coutn;cout和为:sum(n)endl;return 0; 12.编写函数求组合数:c(m,n)=(m!)/(n!)*(m-n)!)。#include using namespace std; double fact(int n) double result=0; if (n=0) return 1; else return fact(n-1)*n; return result; double result(double m, double n) return fact(n)/(fact(n)*fact(m-n);int main() double m=0,n=0; coutm; coutn; cout结果为:result(m,n)endl return 0;13.用递归方法求解Ackerman函数。Ackerman函数的定义描述如下:n+1( 当m=0时)Ack(m,n)= Ack(m-1,1)( 当m0,n=0时)Ack(m-1,Ack(m,n-1)( 当m0,n0时)#include using namespace std; int acm(int m,int n) if(m=0)return n+1; if(n=0&m!=0)return acm(m-1,1); if(n0&m0)return acm(m-1,acm(m,n-1); int main() int m,n; docoutmn;if(m0)coutm值不能小于0!endl;if(n0)coutn值不能小于0!endl;while(m0|n0);coutack(m,n)=acm(m,n)endl; return 0;14编写一个宏定义MYALPHA(c),用以判断c是否是字母字符,是,得1;否,得0。#include using namespace std; #define MYALPHA(c) (c=a&c=A&c=Z?1:0)int main()char c;coutc;coutMYALPHA(c)endl; return 0;15.编写一个宏定义AREA(a,b,c),用以求一个边长为a,b,c的三角形的面积。其公式为:s=(a+b+c)/2,area=sqrt(s*(s-a)*(s-b)*(s-c)。#include using namespace std;#include #define S(a,b,c) (a+b+c)/2 #define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)int main()int a,b,c;coutabc;if(a(b+c)|(b(a+c)|(c(a+b)cout不能构成三角形!endl;elsecoutAREA=AREA(a,b,c)endl;return 0;16.编写程序求1+2+n之和,要求用带参宏实现。#include using namespace std;#define sum(n) (1+(n)*(n)/2int main() int n,sum; coutn; sum=sum(n); coutthe sum is sumendl;return 0;17.写出程序的运行结果,并说明原因。(1)运行结果为:8 原因:主函数定义的局部变量a和全局变量a同名,局部变量被赋值为8,进行函数调用时的传递过去的值为8,8和3进行比较求取最大值,返回8,故此结果为8。(2)运行结果为:333537原因:因为在函数f中c为静态存储变量,能够保留上一次循环时c的值,在第一次循环中c的值变为7,a+b+c=20+6+7=33,在第二次循环时c的值变为7+2=9,a+b+c=20+6+9=35,在第三次循环时,c的值变为9+2=11,a+b+c=20+6+11=37,所以结果为33 35 37。(3)运行结果为:817原因:在函数func中使用了静态存储变量,原因与本题中(2)的原因类似。(4)运行结果为: a= 300 b= 400 a= 300 b= 400 原因:调用函数printab时,输出传递过去的参数a,b的值300和400,printab函数执行过程中改变了printab函数中局部变量a,b的值,并不影响main函数中的a,b的值,所以在main函数输出a,b的值时,依然是300和4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论