中国大学MOOC-哈工大-C语言程序设计精髓第六-十二周编程题答案
更新时间:2023-05-28 15:13:01 阅读量: 实用文档 文档下载
6.1 下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,并允许用户重新输入,直到输入合法数据为止,并将其转换为5分制输出。目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。
#include<stdio.h>
#include <string.h>
int main()
{
char score[100];
int flag = 0, i, s;
char grade;
printf("Please input score:\n");
while (1)
{
flag=0;
scanf("%s", score);
for (i = 0; i < strlen(score); i++)
{
if (score[i] >= '0' && score[i] <= '9')
{
continue;
}
else
{
flag = 1;
break;
}
}
s = atoi(score);
if (s < 0 || s > 100 || flag == 1)
{
printf("Input error!\n");
printf("Please input score:\n");
continue;
}
else{
break;
}
}
s = atoi(score);
if (s >= 90)
{
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: %c\n", grade); return 0;
}
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*pow(10,j);
}
q=p+q;
}
printf("sum=%.0f\n",q);
return 0;
}
6.3
搬砖问题(4分)
题目内容:
n块砖( 27<n<=77 ),36人搬,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?请用穷举法编程求解,n的值要求从键盘输入。输出结果按照男人数量升序给出(见下面示例3)。
#include "stdio.h"
main()
{
int a, b, c;
long n, i, t, s = 0;
printf("Input n(27<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=%d\n", a, b, c);
}
}
6.4
编程输出某年某月有多少天(考虑到闰年)。(5分)
题目内容:
从键盘输入一个年份和月份,输出该月有多少天(考虑闰年),用switch语句编程。
#include<stdio.h>
int main()
{int year,month,day;
printf("Input year,month:\n");
scanf("%d,%d",&year,&month);
switch(month)
{
case 1: day=31;break;
case 2: day=28;break;
case 3: day=31;break;
case 4: day=30;break;
case 5: day=31;break;
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("Input error!\n");
}
if((year%4==0&&year%100!=0||year%400==0)&&month==2) day=29;
if (day!=-1)
printf("%d days\n",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 ComputeAge(unsigned int n);
提示:
计算年龄的递归公式为:
#include<stdio.h>
unsignedint ComputeAge(unsignedint n){
}
main()
{
int i, j, k, s = 23, n, c, age;
scanf("%d", &n);
printf("The person's age is %u\n",8+2*n);
}
7.2递归法计算两个数的最大公约数(4分)
题目内容:
利用最大公约数的性质计算。对正整数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的最大公约数相同,即Gcd(a, b) = Gcd(a-b, b)
性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd(a, b) = Gcd(a, b-a)
性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd(a, b) = a = b
#include<stdio.h>
int gys(int a,int b)
{
int r;
r=a%b;
if(r==0) return b;
elsereturn gys(b,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("%d\n",gys(a,b));
}
7.3 寻找中位数v1.0(4分)
题目内容:
编写一个函数返回三个整数中的中间数。函数原型为:int mid(int a, int b, int c);
函数功能是返回a,b,c三数中大小位于中间的那个数。
输入格式: "%d%d%d"
输出格式:"The result is %d\n"
输入样例1:
12 6 18↙
输出样例1:
The_result_is_12
输入样例2:
-9 7 -2↙
输出样例2:
The_result_is_-2
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(注意:在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。)
#include<stdio.h>
int median(int 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 %d\n",median (a,b,c));
}
7.4
还原算术表达式(4分)
题目内容:
编写程序求以下算式中XYZ的值,其中两数XYZ与YZZ相加的和n(99<n<1000)的值要求从键盘输入。
程序运行结果示例1:
Input n(n<1000):
532↙
X=3,Y=2,Z=1
程序运行结果示例2:
Input n(n<1000):
977↙
Invalid
输入提示:"Input n(n<1000):\n"
输入格式: "%d"
输出格式:"X=%d,Y=%d,Z=%d\n"
计算不成功(无解)的输出提示:"Invalid\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#include<stdio.h>
main()
{
printf("Input n(n<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)
printf("X=%d,Y=%d,Z=%d\n",a,b,c);
else printf("Invalid\n");
}
8.1矩阵转置v1.0(4分)
题目内容:
用二维数组作为函数参数,编程计算并输出n×n阶矩阵的转置矩阵。其中,n的值不超过10,n的值由用户从键盘输入。
程序运行结果示例1:
Input n:3↙
Input 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:2↙
Input 2*2 matrix:
1 2↙
4 5↙
The 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 m[n][n],i,j;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
scanf("%d",&m[i][j]);
}
}
printf("The transposed matrix is:\n");
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf("%4d",m[j][i]);
}
printf("\n");
}
return 0;
}
8.2 兔子生崽问题(4分)
题目内容:
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,n(n<=12)月以后可有多少对兔子(即当年第n月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题,n的值要求从键盘输入。
参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:
(1)每月小兔对数= 上个月成兔对数。
(2)每月成兔对数= 上个月成兔对数+ 上个月小兔对数。
综合(1)和(2)有:每月成兔对数= 前两个月成兔对数之和。
用fn(n=1,2,…)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:
#include<stdio.h>
int main(){
printf("Input n(n<=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=%d\n",s+b);
return 0;
}
8.3
抓交通肇事犯(4分)
题目内容:
一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
[提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数
k = 1000*i + 100*i + 10*j + j
式中,i和j都在0~9变化。此外,还应使k=m*m,m是整数。由于k是一个4位数,所以m值不可能小于31。
输入格式: 无
输出格式:"k=%d,m=%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#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=%d\n",tk,tm);
return 0;
}
8.4
检验并打印幻方矩阵。(4分)
题目内容:
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个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 a[5][5],i,j,t,row[5]={0},col[5]={0},dl1=0,dl2=0,flag=1;
for (i=0;i<5;i++){
for (j=0;j<5;j++){
scanf("%d",&a[i][j]);
}
}
for (i=0;i<5;i++){
for (j=0;j<5;j++){
row[i]+=a[i][j];
}
}
for (i=0;i<5;i++){
for (j=0;j<5;j++){
col[i]+=a[j][i];
}
}
for (i=0;i<5;i++){
dl1+=a[i][i];
dl2+=a[4-i][4-i];
}
for (i=0;i<4;i++){
if (col[i]!=col[i+1]){
flag=0;
break;
}
if (row[i]!=row[i+1]){
flag=0;
break;
}
}
if (col[1]!=row[1]){
flag=0;
}
if (dl1!=dl2){
flag=0;
}
if (dl1!=col[1]){
flag=0;
}
if (flag){
printf("It is a magic square!\n");
for (i=0;i<5;i++){
for (j=0;j<5;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
}
else{
printf("It is not a magic square!\n");
}
return 0;
}
9.1
重复数字检查(4分)
题目内容:
从键盘输入一个数,检查这个数中是否有重复出现的数字。如果这个数中有重复出现的数字,则显示“Repeated digit!”;否则显示“No repeated digit!”。
已知函数原型:
int CountRepeatNum(int 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 log[10]= {0},a[100];
int b,i=0,n,c,d;
printf("Input n:\n");
scanf("%d",&n);
while(n!=0)
{
b=n%10;
n/=10;
a[i]=b;
i++;
}
a[i]=n;
int flag=0;
for(c=0; c<i; c++)
for(d=c+1; d<i; d++)
{
if(a[c]==a[d])
{
flag=1;
break;
}
}
//if (a[0] == a[i-1]||a[0] == a[1]) 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,否则返回0
int IsCancel(int a[], int n, int k);
程序运行结果示例1:
Input n,k:
4,3↙
-1 -3 4 2↙
YES
程序运行结果示例2:
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>
int IsCancel(int a[], int n, int k){
int i,s=0;
for (i=0;i<n;i++){
if (a[i]<=0){
s++;
}
}
if (s<k){
return 1;
}
elsereturn 0;
}
int main()
{
int a[100];
int i,n,k;
printf("Input n,k:\n");
scanf("%d,%d",&n,&k);
for (i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(IsCancel(a,n,k)) printf("YES");
else printf("NO");
return 0;
}
9.3
寻找鞍点(4分)
题目内容:
请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!”
已知函数原型:
void FindSaddlePoint(int a[][N], int m, int n);
在该函数中输出有无鞍点的信息。
程序运行结果示例1:
Input m,n:
3,3↙
Input matrix:
1 2 3↙
4 5 6↙
7 8 9↙
a[0][2] is 3
程序运行结果示例2:
Input m,n:
3,4↙
Input 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 %d\n"
没找到鞍点的输出格式:"No saddle point!\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#include<stdio.h>
#include<string.h>
main()
{
int a[100][100],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");
for(i=0; i<n; i++)
for(j=0; j<l; j++)
scanf("%d",&a[i][j]);
for(i=0; i<n; i++)
{
flag=0;
m=a[i][0];
for(j=0; j<l; j++)
if(a[i][j]>m)
{
m=a[i][j];
max=j;
}
for(k=0; k<n; k++){
if(a[k][max]<=m && k!=i)
{
flag=1;
break;
}
}
if(flag==0){
printf("a[%d][%d] is %d\n",i,max,m);shit=1;break;
}
}
if (shit==0)
printf("No saddle point!\n");
}
9.4
统计重复字符(4分)
题目内容:
输入一串字符(字符数小于80),以回车表示输入结束,编程计算并输出这串字符中连续重复次数最多的字符和重复次数。如果重复次数最多的字符有两个,则输出最后出现的那一个。
已知函数原型:
//函数功能:统计字符串中连续重复次数最多的字符及其重复的次数
//函数参数:str指向待统计的字符串,指针形参tag返回重复字符最后出现的下标位置
//函数返回值:返回字符重复的次数
int CountRepeatStr(char str[], int *tag);
求解思路:设置一个计数器,遍历字符串中的所有字符,若str[i] == str[i+1],则计数器加1,同时判断计数器的值是否大于记录的最大重复次数max,若大于,则用计数器的值更新max,并记录该字符最后出现的位置i+1.若str[i] != str[i+1],则计数器重新初始化为1。遍历结束时,函数返回max 的值。
程序运行结果示例1:
Input a string:
2344455555↙
5:5
程序运行结果示例2:
Input a string:
sgf222257↙
2:4
输入提示信息:"Input a string:\n"
输入格式: 用gets()输入字符串
输出格式:"%c:%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#include<stdio.h>
#include<string.h>
int main()
{
char a[80];
int b, i,j,t=1,tl,num=0;
printf("Input a string:\n");
gets(a);
for (i=0;i<strlen(a);i++){
t=1;
for (j=i+1;j<strlen(a);j++){
if (a[j]==a[i]){
t++;
}
}
if (i==0){
tl=t;
}
else {
if (t>tl){
tl=t;
num=i;
}
}
}
printf("%c:%d\n", a[num],tl);
}
10.1
数字字符串转换为整型数(4分)
题目内容:
从键盘输入一串字符(假设字符数少于8个),以回车表示输入结束,编程将其中的数字部分转换为整型数并以整型的形式输出。
函数原型为int Myatoi(char str[]);
其中,形参数组str[]对应用户输入的字符串,函数返回值为转换后的整型数。
解题思路的关键是:1)判断字符串中的字符是否是数字字符;2)如何将数字字符转换为其对应的数字值;3)如何将每一个转换后的数字值加起来形成一个整型数。
程序运行结果示例1:
Input a string:7hg09y↙
709
程序运行结果示例2:
Input a string:9w2k7m0↙
9270
程序运行结果示例3:
Input a string:happy↙
输入提示信息:"Input a string:"
输入格式: "%7s"
输出格式:"%d\n"
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int Myatoi(char str[]){
int i,j;
for (i=0,j=0;str[i]!='\0';i++){
正在阅读:
中国大学MOOC-哈工大-C语言程序设计精髓第六-十二周编程题答案05-28
初中语法介词练习题03-26
龙小龙05-31
县长在全县疫情防控工作推进会议上的总结发言讲话范文模板08-04
名校系列专题9.2+法拉第电磁感应定律+自感现象(押题专练)-201903-14
持枪戒备姿势教案09-11
幼儿园小班语言教案:小老鼠的魔术棒07-04
女生节创意开幕式策划09-04
这样学英语三个月超过你过去学三年的效果09-14
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 中国大学
- 哈工大
- 精髓
- 程序设计
- 答案
- 语言
- 编程
- MOOC
- 十二
- 实验三:Linux系统下C编程
- 昆仑通泰mcgs中级教程
- 电渣压力焊工艺试验报告
- 商场、市场消防安全知识
- 水泥厂粉磨系统工艺方案评价
- 临床试验观察表(CRF)
- 中国婚庆开拓培训教育的意义
- 【名师一号】2014-2015学年北师大版高中数学必修5双基限时练15]
- 初中英语数词用法总结
- 房地产企业现金流量状况分析——以“万科”为案例
- COSO内部控制要素
- 晋林资发2007125号
- 会计学模拟试题(带解析)11
- 何人可(工业设计史)章节重点笔记(精华8页)
- 本科毕业论文质量影响因素有哪些
- 波形发生器的设计
- Is letter writing better than calling
- 081128舍得品鉴会国学讲座
- 2008年--2012年广东省佛山市中考英语试题参考答案
- 凝胶渗透色谱仪操作规程 岛津 class vp