2022年哈工大-C语言程序设计精髓第六-十二周编程题答案.docx
精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆6.1 下面代码的功能是将百分制成果转换为5 分制成果,详细功能是:假如用户输入的是非法字符或者不在合理区间内的数据(例如输入的是 a,或者 102 ,或-45 等),就程序输出 Input error.,并答应用户 重新输入 ,直到输入合法数据为止,并将其转换为 5 分制输出;目前程序存在 错误 ,请将其修改正确;并依据下面给出的运行示例检查程序;#include<stdio.h> #include <string.h> int main char score100; int flag = 0, i, s; char grade; printf"Please input score:n" while 1 flag=0; scanf"%s", score; for i = 0; i < strlenscore; i+ if scorei >= '0' && scorei <= '9' continue; 名师归纳总结 - - - - - - -第 1 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆 else flag = 1; break; s = atoiscore; if s < 0 | s > 100 | flag = 1 printf"Input error.n" printf"Please input score:n" continue; else break; s = atoiscore; if s >= 90 名师归纳总结 - - - - - - -第 2 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆 grade = 'A' else if s >= 80 grade = 'B' else if s >= 70 grade = 'C' else if s >= 60 grade = 'D' else grade = 'E' printf"grade: %cn", grade; return 0; 名师归纳总结 - - - - - - -第 3 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆 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的值;#include<stdio.h> #include<math.h> int main int n,a,i,j; double p=0,q=0; printf "Input a,n:n" ; scanf "%d,%d" ,&a,&n; for i=1;i<=n;i+ for j=0,p=0;j<i;j+ p=p+a*pow10,j; q=p+q; printf"sum=%.0fn",q; return 0; 6.3搬砖问题( 4 分)题目内容:n 块砖 27<n<=77 ,36 人搬,男搬 4,女搬 3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?请用穷举法编程求解,n 的值要求从键盘输入;输出结果依据男人数量升序给出(见下面示例3);#include "stdio.h" main 名师归纳总结 - - - - - - -第 4 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆int a, b, c; long n, i, t, s = 0; printf"Input n27<n<=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=%dn", a, b, c; 6.4 编程输出某年某月有多少天(考虑到闰年);(5 分)题目内容:从键盘输入一个年份和月份,输出该月有多少天(#include <stdio.h> int main int year,month,day; 考虑闰年 ),用 switch 语句编程;printf"Input year,month:n" scanf"%d,%d" ,&year,&month; switchmonth 名师归纳总结 case 1: day=31;break; 第 5 页,共 44 页case 2: day=28;break; case 3: day=31;break; - - - - - - -精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆case 4: day=30;break; case 5: day=31;break; "Input error.n" case 6: day=30;break; case 7: day=31;break; case 8: day=31;break; case 9: day=30;break; case 10: day=31;break ; case 11: day=30;break ; case 12: day=31;break ; default:day=-1;printf if year%4=0&&year%100.=0|year%400=0&&month=2 day=29; if day.=-1 printf "%d daysn" ,day; return 0; 7.1 递归法运算嬉戏人员的年龄(4 分)题目内容:有 n 个人围坐在一起,问第 n 个人多大年纪,他说比第 n-1 个人大 2 岁;问第 n-1 个人,他说比第 n-2 个人大 2 岁,., 问第 3 个人,他说比第 2 个人大 2 岁;问第 2 个人,他说比第 1 个人大 2 岁;第 1 个人说自己 10 岁,问第 n 个人多大年纪;递归函数原型:unsigned int ComputeAgeunsigned int n;提示:运算年龄的递归公式为:#include <stdio.h> unsignedint ComputeAgeunsignedint n main int i, j, k, s = 23, n, c, age; scanf "%d" , &n; printf "The person's age is %un" ,8+2*n; 7.2 递归法运算两个数的最大公约数(4 分)题目内容:名师归纳总结 - - - - - - -第 6 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆利用最大公约数的性质运算;对正整数a 和 b ,当 a>b 时,如 a 中含有与b 相同的公约数,就a中去掉 b 后剩余的部分 a-b 中也应含有与 b 相同的公约数, 对 a-b 和 b 运算公约数就相当于对 a和 b 运算公约数;反复使用最大公约数的上述性质,直到 a 和 b 相等为止,这时,a 或 b 就是它们的最大公约数;这三条性质,也可以表示为:性质 1 假如 a>b ,就 a 和 b 与 a-b 和 b 的最大公约数相同,即 性质 2 假如 b>a ,就 a 和 b 与 a 和 b-a 的最大公约数相同,即Gcda, b = Gcda-b, b Gcda, b = Gcda, b-a 性质 3 假如 a=b ,就 a 和 b 的最大公约数与a 值和 b 值相同,即Gcda, b = a = b #include<stdio.h> int gysint a,int b int r; r=a%b; if r=0 return b; else return gysb,r; main printf "Input a,b:" ; int a,b; scanf "%d,%d" , &a,&b; if a<=0 | b<=0 printf "Input error.n" ; else printf"%dn",gysa,b; 7.3 查找中位数 v1.0 (4 分)题目内容:编写一个函数返回三个整数中的中间数;函数原型为:int midint a, int b, int c; 函数功能是返回 a,b, c 三数中大小位于中间的那个数;输入格式 : "%d%d%d"输出格式: "The result is %dn"输入样例 1:12 6 18 输出样例 1:The_result_is_12名师归纳总结 - - - - - - -第 7 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆输入样例 2:-9 7 -2 输出样例 2:The_result_is_-2留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!(留意:在输出中,“ _”代表空格,假如直接将上段示例粘贴到代码中,应将其替换为空格;)#include <stdio.h> int medianint a, int b, int c if a<b if b<c return b; else return a<c. c: a; /a<c<b: c<a<b else if c>a return a; /c>a>b else return c>b. c: b; /a>c>b: a>b>c main int a,b,c; scanf "%d%d%d" , &a,&b,&c; printf "The result is %dn" ,median a,b,c; 7.4仍原算术表达式(4 分)题目内容:编写程序求以下算式中 XYZ 的值,其中两数 XYZ 与 YZZ 相加的和 n(99<n<1000 )的值要求从键盘输入;程序运行结果示例 1:名师归纳总结 - - - - - - -第 8 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆Input nn<1000:532 X=3,Y=2,Z=1程序运行结果示例 2:Input nn<1000:977 Invalid输入提示: "Input nn<1000:n"输入格式 : "%d"输出格式: "X=%d,Y=%d,Z=%dn"运算不胜利 无解 的输出提示: "Invalidn"留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!#include <stdio.h> main printf "Input nn<1000:n" ; int a,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 "X=%d,Y=%d,Z=%dn",a,b,c; printfelse printf"Invalidn" 8.1 矩阵转置 v1.0 (4 分)名师归纳总结 - - - - - - -第 9 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆题目内容:用二维数组作为函数参数,编程运算并输出n× n 阶矩阵的转置矩阵;其中,n 的值不超过10,n 的值由用户从键盘输入;程序运行结果示例 1:Input n: 3Input 3*3 matrix:1 2 3 4 5 6 7 8 9 The transposed matrix is: 1 4 7 2 5 8 3 6 9程序运行结果示例 2:Input n: 2Input 2*2 matrix:1 24 5The transposed matrix is: 1 4 2 5#include <stdio.h> int main printf "Input n:" ; int n; scanf "%d" ,&n; printf "Input %d*%d matrix:n" ,n,n; int mnn,i,j; for i=0;i<n;i+ for j=0;j<n;j+ scanf "%d" ,&mij; printf "The transposed matrix is:n" ; for i=0;i<n;i+ for j=0;j<n;j+ printf "%4d" ,mji; 名师归纳总结 - - - - - - -第 10 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆printf"n" return 0; 8.2 兔子生崽问题(4 分)题目内容:假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么假如每对成兔每个月都可以生一对小兔,一对新生的小兔从其次个月起就开头生兔子,试问从一对兔子开头繁衍,nn<=12月以后可有多少对兔子(即当年第 n 月份总计有多少对兔子,含成兔和小兔) ?请编程求解该问题, n 的值要求从键盘输入;参考答案:依题意,兔子的繁衍情形如下列图;图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔;观看分析此图可发觉如下规律:(1 )每月小兔对数 = 上个月成兔对数;(2 )每月成兔对数 = 上个月成兔对数 + 上个月小兔对数;综合( 1)和( 2)有:每月成兔对数 = 前两个月成兔对数之和;用 fn (n=1 , 2, )表示第#include <stdio.h> int main n 个月成兔对数,于是可将上述规律表示为如下递推公式:printf "Input nn<=12:n" ; int n,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=%dn",s+b; return 0; 名师归纳总结 - - - - - - -第 11 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆8.3 抓交通肇事犯(4 分)题目内容:一辆卡车违犯交通规章,撞人后逃跑;现场有三人目击大事,但都没记住车号,只登记车号的一些特点;甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:索帮忙警方找出车号以便尽快破案;四位的车号刚好是一个整数的平方;现在请依据以上线 提示 :假设这个4 位数的前两位数字都是i ,后两位数字都是j ,就这个可能的4 位数k = 1000*i + 100*i + 10*j + j式中, i 和 j 都在 09 变化;此外,仍应使k=m*m,m是整数;由于k 是一个 4 位数,所以m值不行能小于31;输入格式 : 无输出格式: "k=%d,m=%dn"留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!#include <stdio.h> int main int i,j,k,m,tk,tm; for i=0;i<=9;i+ for j=0;j<=9;j+ for m=31;m<100;m+ k = 1000*i + 100*i + 10*j + j; if i.=j && m*m=k tm=m; tk=k; break ; printf"k=%d,m=%dn",tk,tm; return 0; 8.4 检验并打印幻方矩阵;(4 分)题目内容:名师归纳总结 - - - - - - -第 12 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的;从键盘输入一个 5× 5 的矩 阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上;输入格式 : "%d" 输出格式:假如是幻方矩阵,输出提示信息 : "It is a magic square.n" "%4d" (换行使用 "n" )矩阵元素的输出:假如不是幻方矩阵,输出提示信息 : "It is not a magic square.n" 输入样例 1:17_24_1_8_15 23_5_7_14_16 4_6_13_20_22 10_12_19_21_3 11_18_25_2_9 输人样例中 “ _”代表空格 输出样例 1:It is a magic square.*17*24*1*8*15 *23*5*7*14*16 *4*6*13*20*22 *10*12*19*21*3 *11*18*25*2*9 输出样例中 “ *”代表空格 输入样例 2:1_0_1_6_1 3_1_1_1_1 1_1_1_1_2 1_1_1_1_1 9_1_7_1_1 输人样例中 “ _”代表空格 输出样例 2:It is not a magic square.留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!输人样例中 “ _”代表空格,输出样例中“ *”代表空格 #include<stdio.h> int main int a55,i,j,t,row5=0,col5=0,dl1=0,dl2=0,flag=1; for i=0;i<5;i+ for j=0;j<5;j+ scanf "%d" ,&aij; 名师归纳总结 - - - - - - -第 13 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆for i=0;i<5;i+ for j=0;j<5;j+ rowi+=aij; for i=0;i<5;i+ for j=0;j<5;j+ coli+=aji; for i=0;i<5;i+ dl1+=aii; dl2+=a4-i4-i; for i=0;i<4;i+ if coli.=coli+1 flag=0; break ; if rowi.=rowi+1 flag=0; break ; if col1.=row1 flag=0; if dl1.=dl2 flag=0; if dl1.=col1 flag=0; if flag "It is a magic square.n" printffor i=0;i<5;i+ for j=0;j<5;j+ printf "%4d" ,aij; printf"n" 名师归纳总结 - - - - - - -第 14 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆 else printf"It is not a magic square.n" return 0; 9.1 重复数字检查(4 分)题目内容:从键盘输入一个数, 检查这个数中是否有重复显现的数字;假如这个数中有重复显现的数字,就显示“Repeated digit.” ;否就显示“No repeated digit.” ;已知函数原型:int CountRepeatNumint count, int n;如有重复数字,就该函数返回重复显现的数字;否就返回-1.程序运行结果示例 1:Input n:28212 Repeated digit.程序运行结果示例 2:Input n:12345 No repeated digit.输入提示: "Input n:n" 输入格式 : "%ld"输出格式:有重复数字,输出信息 : "Repeated digit.n"没有重复数字,输出信息 : "No repeated digit.n"留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!#include <stdio.h> int main int log10= 0,a100; int b,i=0,n,c,d; printf "Input n:n" ; scanf "%d" ,&n; while n.=0 b=n%10; 名师归纳总结 - - - - - - -第 15 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆n/=10; ai=b; i+; ai=n; int flag=0; for c=0; c<i; c+ for d=c+1; d<i; d+ if ac=ad flag=1; break ; /if a0 = ai-1|a0 = a1 flag=1; if flag printf"Repeated digit.n" else printf"No repeated digit.n" 9.2 教授的课( 4 分)题目内容:教授正在为一个有N个同学的班级讲授离散数学课;他对某些同学缺乏纪律性很不中意,于是打算:假如课程开头后上课的人数小于K,就取消这门课程;从键盘输入每个同学的到达时间,请编程确定该课程是否被取消;假如该门课程被取消,就输出“ Yes” ,否就输出 “ No” ;假设教授在时刻 0 开头上课; 假如一个同学的到达时间是非正整数,就表示该同学在上课前进入教室; 假如一个同学的到达时间是正整数,就表示该同学在上课后进入教室;假如一个同学在时刻 0 进入教室,也被认为是在上课前进入教室;假设到达时间的肯定值不超过 100,同学数 N不超过 1000;要求在输入同学的到达时间之前,先输入 N和 K;已知函数原型:/ 函数功能:依据数组a 中记录的同学到达时间确定课程是否被取消,取消就返回1,否就返回0int IsCancelint a, int n, int k;程序运行结果示例 1:Input n,k:4,3-1 -3 4 2 YES名师归纳总结 程序运行结果示例2:第 16 页,共 44 页- - - - - - -精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆Input n,k:5,3-1 -2 -3 0 4 NO输入提示: "Input n,k:n" 输入格式 : "%d,%d""%d"输入包括两行数据:第 1 行是 n,k 的值;第 2 行是同学的到达时间;输出格式:课程被取消,输出 "YES"课程不取消,输出 "NO"留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!#include<stdio.h> a, int n, int k int IsCancelintint i,s=0; for i=0;i<n;i+ if ai<=0 s+; if s<k 1; return elsereturn 0; int main int a100; int i,n,k; printf "Input n,k:n" ; scanf "%d,%d" ,&n,&k; for i=0;i<n;i+ scanf "%d" ,&ai; ifIsCancela,n,k printf"YES" ; 名师归纳总结 else printf"NO" ; 第 17 页,共 44 页- - - - - - -精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆return 0; 9.3 查找鞍点( 4 分)题目内容:请编程找出一个 M*N矩阵中的鞍点, 即该位置上的元素是该行上的最大值,是该列上的最小值;假如矩阵中没有鞍点,就输出“No saddle point!”已知函数原型:void FindSaddlePointint aN, int m, int n;在该函数中输出有无鞍点的信息;程序运行结果示例 1:Input m,n:3,3Input matrix:1 2 3 4 5 6 7 8 9 a02 is 3程序运行结果示例 2:Input m,n:3,4Input matrix:3 4 7 5 0 1 8 2 9 3 2 6 No saddle point.输入提示:"Input m,n:n"“ Input matrix:n" 输入格式 : 输入矩阵大小:"%d,%d"输入矩阵元素:"%d"输出格式:找到鞍点的输出格式:"a%d%d is %dn" 没找到鞍点的输出格式:"No saddle point.n"留意:为防止显现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式掌握字符串!名师归纳总结 #include<stdio.h> 第 18 页,共 44 页- - - - - - -精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆#include <string.h> main int a100100,m; ; ; int n,i,j,k,max,flag=0,shit=0,l; printf"Input m,n:n"scanf"%d,%d",&n,&l; printf"Input matrix:n"fori=0; i<n; i+ for j=0; j<l; j+ scanf "%d" ,&aij; for i=0; i<n; i+ flag=0; m=ai0; for j=0; j<l; j+ if aij>m m=aij; max=j; for k=0; k<n; k+ if akmax<=m && k.=i flag=1; break ; ifflag=0 "a%d%d is %dn",i,max,m;shit=1;break; printf if shit=0 "No saddle point.n" printf 9.4 统计重复字符(4 分)题目内容:输入一串字符(字符数小于 80),以回车表示输入终止,编程运算并输出这串字符中连续重复次数最多的字符和重复次数;假如重复次数最多的字符有两个,就输出最终显现的那一个;已知函数原型:/函数功能:统计字符串中连续重复次数最多的字符及其重复的次数名师归纳总结 - - - - - - -第 19 页,共 44 页精选学习资料 - - - - - - - - - 学而不思就惘,思而不学就殆/函数参数: str 指向待统计的字符串,指针形参 /函数返回值:返回字符重复的次数 int CountRepeatStrchar str, int *tag;tag 返回重复字符最终显现的下标位置求解思路:设置一个计数器,遍历字符串中的全部字符,如 stri = stri+1,就计数器加 1,同时判定计数器的值是否大于记录的最大重复次数 max ,如大于,就用计数器的值更新 max ,并记录该字符最终显现的位置 i+1. 如 stri .= stri+1,就计数重视新初始化为 1;遍历终止时,函数返回 max的值;程序运行结果示例 1:Input a strin