中国大学MOOC-哈工大-C语言程序设计精髓第六-十二周编程题答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

6.1下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出Inputerror!,并允许用户重新输入,直到输入合法数据为止,并将其转换为5分制输出。目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。#includestdio.h#includestring.hintmain(){charscore[100];intflag=0,i,s;chargrade;printf(Pleaseinputscore:\n);while(1){flag=0;scanf(%s,score);for(i=0;istrlen(score);i++){if(score[i]='0'&&score[i]='9'){continue;}else{flag=1;break;}}s=atoi(score);if(s0||s100||flag==1){printf(Inputerror!\n);printf(Pleaseinputscore:\n);continue;}else{break;}}s=atoi(score);if(s=90){grade='A';}elseif(s=80){grade='B';}elseif(s=70){grade='C';}elseif(s=60){grade='D';}else{grade='E';}printf(grade:%c\n,grade);return0;}6.2编程计算a+aa+aaa+…+aa…a(n个a)的值(4分)题目内容:编程计算a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。例如,当n=4,a=2,表示计算2+22+222+2222的值。#includestdio.h#includemath.hintmain(){intn,a,i,j;doublep=0,q=0;printf(Inputa,n:\n);scanf(%d,%d,&a,&n);for(i=1;i=n;i++){for(j=0,p=0;ji;j++){p=p+a*pow(10,j);}q=p+q;}printf(sum=%.0f\n,q);return0;}6.3搬砖问题(4分)题目内容:n块砖(27n=77),36人搬,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?请用穷举法编程求解,n的值要求从键盘输入。输出结果按照男人数量升序给出(见下面示例3)。#includestdio.hmain(){inta,b,c;longn,i,t,s=0;printf(Inputn(27n=77):\n);scanf(%d,&n);for(a=0;4*a=n;a++)for(b=0;4*a+3*b=n;b++)for(c=0;4*a+3*b+c/2=n;c+=2)if(4*a+3*b+c/2==n&&c%2==0&&a+b+c==36){printf(men=%d,women=%d,children=%d\n,a,b,c);}}6.4编程输出某年某月有多少天(考虑到闰年)。(5分)题目内容:从键盘输入一个年份和月份,输出该月有多少天(考虑闰年),用switch语句编程。#includestdio.hintmain(){intyear,month,day;printf(Inputyear,month:\n);scanf(%d,%d,&year,&month);switch(month){case1:day=31;break;case2:day=28;break;case3:day=31;break;case4:day=30;break;case5:day=31;break;case6:day=30;break;case7:day=31;break;case8:day=31;break;case9:day=30;break;case10:day=31;break;case11:day=30;break;case12:day=31;break;default:day=-1;printf(Inputerror!\n);}if((year%4==0&&year%100!=0||year%400==0)&&month==2)day=29;if(day!=-1)printf(%ddays\n,day);return0;}7.1递归法计算游戏人员的年龄(4分)题目内容:有n个人围坐在一起,问第n个人多大年纪,他说比第n-1个人大2岁;问第n-1个人,他说比第n-2个人大2岁,.....,问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,问第n个人多大年纪。递归函数原型:unsignedintComputeAge(unsignedintn);提示:计算年龄的递归公式为:#includestdio.hunsignedintComputeAge(unsignedintn){}main(){inti,j,k,s=23,n,c,age;scanf(%d,&n);printf(Theperson'sageis%u\n,8+2*n);}7.2递归法计算两个数的最大公约数(4分)题目内容:利用最大公约数的性质计算。对正整数a和b,当ab时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。反复使用最大公约数的上述性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。这三条性质,也可以表示为:性质1如果ab,则a和b与a-b和b的最大公约数相同,即Gcd(a,b)=Gcd(a-b,b)性质2如果ba,则a和b与a和b-a的最大公约数相同,即Gcd(a,b)=Gcd(a,b-a)性质3如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a,b)=a=b#includestdio.hintgys(inta,intb){intr;r=a%b;if(r==0)returnb;elsereturngys(b,r);}main(){printf(Inputa,b:);inta,b;scanf(%d,%d,&a,&b);if(a=0||b=0){printf(Inputerror!\n);}elseprintf(%d\n,gys(a,b));}7.3寻找中位数v1.0(4分)题目内容:编写一个函数返回三个整数中的中间数。函数原型为:intmid(inta,intb,intc);函数功能是返回a,b,c三数中大小位于中间的那个数。输入格式:%d%d%d输出格式:Theresultis%d\n输入样例1:12618↙输出样例1:The_result_is_12输入样例2:-97-2↙输出样例2:The_result_is_-2注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!(注意:在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。)#includestdio.hintmedian(inta,intb,intc){if(ab){if(bc){returnb;}else{returnac?c:a;}//acb:cab}else{if(ca){returna;}//cabelse{returncb?c:b;}//acb:abc}}main(){inta,b,c;scanf(%d%d%d,&a,&b,&c);printf(Theresultis%d\n,median(a,b,c));}7.4还原算术表达式(4分)题目内容:编写程序求以下算式中XYZ的值,其中两数XYZ与YZZ相加的和n(99n1000)的值要求从键盘输入。程序运行结果示例1:Inputn(n1000):532↙X=3,Y=2,Z=1程序运行结果示例2:Inputn(n1000):977↙Invalid输入提示:Inputn(n1000):\n输入格式:%d输出格式:X=%d,Y=%d,Z=%d\n计算不成功(无解)的输出提示:Invalid\n注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!#includestdio.hmain(){printf(Inputn(n1000):\n);inta,b,c,n,s,x,y,z,flag=0;scanf(%d,&n);for(x=1;x=9;x++){for(y=1;y=9;y++){for(z=0;z=9;z++){if(x*100+y*10+z+y*100+z*11==n){flag=1;a=x,b=y,c=z;break;}}}}if(flag)printf(X=%d,Y=%d,Z=%d\n,a,b,c);elseprintf(Invalid\n);}8.1矩阵转置v1.0(4分)题目内容:用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。程序运行结果示例1:Inputn:3↙Input3*3matrix:123↙456↙789↙Thetransposedmatrixis:147258369程序运行结果示例2:Inputn:2↙Input2*2matrix:12↙45↙Thetransposedmatrixis:1425#includestdio.hintmain(){printf(Inputn:);intn;scanf(%d,&n);printf(Input%d*%dmatrix:\n,n,n);intm[n][n],i,j;for(i=0;in;i++){for(j=0;jn;j++){scanf(%d,&m[i][j]);}}printf(Thetransposedmatrixis:\n);for(i=0;in;i++){for(j=0;jn;j++){printf(%4d,m[j][i]);}printf(\n);}return0;}8.2兔子生崽问题(4分)题目内容:假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题,n的值要求从键盘输入。参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:(1)每月小兔对数=上个月成兔对数。(2)每月成兔对数=上个月成兔对数+上个月小兔对数。综合(1)和(2)有:每月成兔对数=前两个月成兔对数之和。用fn(n=1,2,…)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:#includestdio.hintmain(){printf(Inputn(n=12):\n);intn,total=0,i,s=0,b=1,t;scanf(%d,&n);printf(%4d,1);for(i=2;i=n;i++){t=s;s=b;b=b+t;printf(%4d,s+b);}printf(\nTotal=%d\n,s+b);return0;}8.3抓交通肇事犯(4分)题目内容:一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。[提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数k=1000*i+100

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功