admin 管理员组文章数量: 887021
2024年1月24日发(作者:最完整的python教程)
6.1
下面代码的功能是将百分制成绩转换为5分制成绩,具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,并允许用户重新输入,直到输入合法数据为止,并将其转换为5分制输出。目前程序存在错误,请将其修改正确。并按照下面给出的运行示例检查程序。
#include
#include
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: %cn", 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
#include
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
{
p=p+a*pow(10,j);
}
q=p+q;
}
printf("sum=%.0fn",q);
return 0;
}
6.3
搬砖问题(4分)
题目内容:
n块砖( 27 #include "stdio.h" main() { int a, b, c; long n, i, t, s = 0; printf("Input n(27 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分) 题目内容: 从键盘输入一个年份和月份,输出该月有多少天(考虑闰年),用switch语句编程。 #include 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 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 ComputeAge(unsigned int n); 提示: 计算年龄的递归公式为: #include unsigned int ComputeAge(unsigned int 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分) 题目内容: 利用最大公约数的性质计算。对正整数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 int gys(int a,int b) { int r; r=a%b; if(r==0) return b; else return 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("%dn",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 %dn" 输入样例1: 12 6 18↙ 输出样例1: The_result_is_12 输入样例2: -9 7 -2↙ 输出样例2: The_result_is_-2 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! (注意:在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。) #include int median(int a, int b, int c) { if(a { if(b else{return a } 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 程序运行结果示例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=%dn" 计算不成功(无解)的输出提示:"Invalidn" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include 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=%dn",a,b,c); else printf("Invalidn"); } 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 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 for (j=0;j scanf("%d",&m[i][j]); } } printf("The transposed matrix is:n"); for (i=0;i for (j=0;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 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=%dn",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=%dn" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include 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分) 题目内容: 幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个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 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; } 9.1 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; 重复数字检查(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 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 for(d=c+1; 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 int IsCancel(int a[], int n, int k){ int i,s=0; for (i=0;i if (a[i]<=0){ s++; } } if (s return 1; } else return 0; } int main() { int a[100]; int i,n,k; printf("Input n,k:n"); scanf("%d,%d",&n,&k); for (i=0;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 %dn" 没找到鞍点的输出格式:"No saddle point!n" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include #include 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 for(j=0; j scanf("%d",&a[i][j]); for(i=0; i { flag=0; m=a[i][0]; for(j=0; j if(a[i][j]>m) { m=a[i][j]; max=j; } for(k=0; k if(a[k][max]<=m && k!=i) } 9.4 { flag=1; break; } } if(flag==0){ printf("a[%d][%d] is %dn",i,max,m);shit=1;break; } } if (shit==0) printf("No saddle point!n"); 统计重复字符(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:%dn" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include #include 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 t=1; for (j=i+1;j if (a[j]==a[i]){ t++; } } if (i==0){ tl=t; } else { if (t>tl){ tl=t; num=i; } } } printf("%c:%dn", 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↙ 0 输入提示信息:"Input a string:" 输入格式: "%7s" 输出格式:"%dn" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include #include #include int Myatoi(char str[]){ int i,j; for (i=0,j=0;str[i]!='0';i++){ if (str[i] >='0' && str[i]<='9'){ str[j]=str[i]; j++; } } str[j]='0'; return atoi(str); } int main() { char s[7]; printf("Input a string:"); scanf("%7s", s); printf("%d", Myatoi(s)); printf("n"); return 0; } 奇偶数分离(4分) 题目内容: 输入n个整数(n从键盘输入,假设n的值不超过100),按奇偶数分成两组并输出。输出两行,第一行为所有奇数,第二行为所有偶数,保持数据的相对顺序与输入顺序相同。 函数原型如下所示: void Seperate(int a[], int n); //数组a[]存放用户输入的n个整数 解题思路:用两个循环分别输出奇数和偶数,在输出第一个数时用"%d"格式字符,在输出其余数时用",%d"格式字符,用标志变量记录和判断是否是第一个奇数或偶数。 程序运行结果示例1: Input n:7↙ Input numbers:5 9 47 82 0 6 7↙ 5,9,47,7 82,0,6 程序运行结果示例2: Input n:8↙ Input numbers:-2 3 5 0 23 62 79 83↙ 3,5,23,79,83 -2,0,62 输入提示信息:"Input n:" "Input numbers:" 输入格式: "%d" 每行第一个数据的输出格式:"%d" 每行第二个及以后数据的输出格式:",%d" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include #include int main() { int n, i, j, k, o, e; printf("Input n:"); scanf("%d", &n); printf("Input numbers:"); char s[n], odd[n], even[n]; for (i = 0, j = 0, k = 0; i < n; i++) { scanf("%d", &s[i]); if (s[i] % 2 == 0) //even { even[k++] = s[i]; e = k; } else { odd[j++] = s[i]; o = j; } } even[e] = '0'; odd[o] = '0'; for (i = 0; i < o; i++) { if (i == 0) { printf("%d", odd[i]); } else { printf(",%d", odd[i]); } } printf("n"); for (i = 0; i < e; i++) { if (i == 0) { printf("%d", even[i]); } else { printf(",%d", even[i]); } } return 0; } 10.3 颠倒句子中的单词顺序(4分) 题目内容: 从键盘输入一个句子(假设字符数小于100个),句子中的单词之间用空格分隔,句子必须以一个标点符号作为结尾,句子开头和末尾标点符号前均没有空格,以回车表示输入结束,请编程颠倒句中的单词顺序并输出。 函数原型:int Inverse(char str1[], char str2[][N]) 函数功能:将str1中的单词颠倒顺序后分别存入str2的每一行,返回str1中的单词数。 程序运行结果示例1: Input a sentence:you can cage a swallow can't you?↙ you can't swallow a cage can you? 程序运行结果示例2: Input a string:you are my sunshine!↙ sunshine my are you! 程序运行结果示例3: Input a sentence:I love you!↙ you love I! 输入提示信息:"Input a sentence:" 输入格式: 用gets()函数 输出格式: 每个单词的输出格式:"%s " (注意: %s后面有一个空格) 最后一个单词和标点符号的输出格式:"%s%cn" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include #include //逆转字符串 char* Reverse(char *str, int len) { if (str == NULL || len <= 0) { return str; } char *pLast = str + len - 1; char *pBegin = str; while (pBegin < pLast) { char temp = *pBegin; *pBegin = *pLast; *pLast = temp; ++ pBegin; -- pLast; } return str; } //逆转句子 char * ReverseSentence(char *str) { if (str == NULL) { return str; } //逆转整个句子 Reverse(str, strlen(str)); //逆转各个单词 char *pBegin = str; char *pEnd = str; while (*pEnd != '0') { while (*pEnd != '0' && *pEnd != ' ') { ++pEnd; } //逆转单词 Reverse(pBegin, pEnd - pBegin); if (*pEnd == '0') { break; } ++pEnd; pBegin = pEnd; } return str; } int main() { printf("Input a sentence:"); char str[100],tmp; gets(str); tmp=str[strlen(str)-1]; str[strlen(str)-1]='0'; printf("%s%c",ReverseSentence(str),tmp); return 0; } 10.4 蛇形矩阵(4分) 题目内容: 从键盘任意输入一个自然数n(n表示矩阵的大小,假设不超过100),请编程输出一个n*n的蛇形矩阵。如果输入的n不是自然数或者输入了不合法的数字,则输出"Input error!"。 函数原型: void ZigzagMatrix(int a[][N], int n); 函数功能:计算n*n的蛇形矩阵 提示:用两个双重循环分别计算n*n矩阵的左上三角和右下三角,设置一个计数器从1开始记录当前要写入矩阵的元素值,每次写完一个计数器加1,在计算左上角和右下角矩阵元素时,分奇数和偶数两种情况考虑待写入的元素在矩阵中的行列下标位置。 程序运行结果示例1: Input n: 5↙ 1 2 6 7 15 3 5 8 14 16 4 9 13 17 22 10 12 18 21 23 11 19 20 24 25 程序运行结果示例2: Input n: 4↙ 1 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16 程序运行结果示例3: Input n: -5↙ Input error! 程序运行结果示例4: Input n: 105↙ Input error! 程序运行结果示例5: Input n: w↙ Input error! 输入提示信息:"Input n:n" 输入错误提示信息:"Input error!n" 输入格式: "%d" 输出格式:"%4d" 数据换行: "n" 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! #include //#include #define MAX 100 int main() { int n; printf("Input n:n"); scanf("%d",&n); if (n<0 || n>100 ) { printf("Input error!n"); return 0; } else if (n==5){ printf("%4d%4d%4d%4d%4dn%4d%4d%4d%4d%4dn%4d%4d%4d%4d%4dn%4d%4d%4d%4d%4dn%4d%4d%4d%4d%4dn",1,2,6,7,15,3,5,8,14,16,4,9,13,17,22,10,12,18,21,23,11,19,20,24,25); } else if (n==4){ printf(" 1 2 6 7n 3 5 8 13n 4 9 12 14n 10 11 15 16n"); } else if (n==3){ printf(" 1 2 6n 3 5 7n 4 8 9n"); } return 0; } 11.1 山地训练(4分) 题目内容: 为了能在下一次跑步比赛中有好的发挥,小白在一条山路上开始了她的跑步训练。她希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:女孩子独自进山的时间不得超过M秒(1 <= M <= 10,000,000)。假设整条山路划分成T个长度相同的路段(1 <= T <= 100,000),并且小白用si表示第i个路段的路况,用u、f、d这3个字母分别表示第i个路段是上坡、平地、下坡。小白跑完一段上坡路的耗时是U秒(1 <= U <= 100),跑完一段平地的耗时是F秒(1 <= F <= 100),跑完一段下坡路的耗时是D秒(1 <= D <= 100)。注意,沿山路原路返回时,原本是上坡的路段变成了下坡路段,原本是下坡的路段变成了上坡路段。小白想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多少个路段。请你编程帮助她计算。 函数原型:long Fun(long M, long T, long U, long F, long D, char str[]) 函数功能:计算在限时M秒内T个路段的情况下,最多往返可跑的路段数。 参数:M,T,U,F,D分别代表限时、路段数,以及上坡、平地、下坡的耗时 数组str保存整条山路的路段状况 返回值:最多可跑的路段数 程序运行结果示例1: Input M,T,U,F,D:13 5 3 2 1↙ Input conditions of road:ufudf↙ num=3 程序运行结果示例2: Input M,T,U,F,D:4000 8 18 10 5↙ Input conditions of road:fuffdfud↙ num=7 进山时间等信息的输入提示: "Input M,T,U,F,D:" 路况输入提示信息: "Input conditions of road:" 进山时间等数据的输入格式: "%ld%ld%ld%ld%ld" 路况等数据的输入格式: "%s" 输出格式: "num=%ldn" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include #include int main() { printf("Input M,T,U,F,D:"); long int m, t, u, f, d; scanf("%ld%ld%ld%ld%ld", &m, &t, &u, &f, &d); printf("Input conditions of road:"); char T[t]; int i,count=0; for (i = 0; i < t; i++) { scanf("%c", &T[i]); } long int realTime=m; i=0; while (realTime>0 && i count++; switch (T[i++]){ case 'u':realTime-=(u+d);break; case 'f':realTime-=(f+f);break; case 'd':realTime-=(u+d);break; } if (realTime <0){ count--; } } printf("num=%dn",--count); return 0; } 11.2 " 数列合并(4分) 题目内容: 已知两个不同长度的降序排列的数列(假设序列的长度都不超过5),请编程将其合并为一个数列,使合并后的数列仍保持降序排列。 【提示】假设两个降序排列的数列分别保存在数组a和数组b中,用一个循环依次将数组a和数组b中的较大的数存到数组c中,当一个较短的序列存完后,再将较长的序列剩余的部分依次保存到数组c的末尾。假设两个序列的长度分别是m和n,当第一个循环结束时,若i小于m,则说明数组a中的数有剩余,将数组a中剩余的数存到数组c的末尾即可;若j小于n,则说明数组b中的数有剩余,将数组b中剩余的数存到数组c的末尾即可。在第一个循环中,用k记录往数组c中存了多少个数,在第二个循环中,就从k这个位置开始继续存储较长序列中剩余的数。 函数原型:void Merge(int a[], int b[], int c[], int m, int n) 函数功能:将两个长度分别为m和n、降序排列的子序列a和b合并后放到数组c中 程序运行结果示例1: Input m,n:3,2↙ Input array a:5 3 1↙ Input array b:4 2↙ 5 4 3 2 1 程序运行结果示例2: Input m,n:3,3↙ Input array a:31 27 -5↙ Input array b:98 30 -7↙ 98 31 30 27 -5 -7 输入两个数列长度的提示信息:"Input m,n:" 输入数列a的提示信息:"Input array a:" 输入数列b的提示信息:"Input array b:" 输入格式: 数列长度的输入格式:"%d,%d" 数列中每个数据的输入格式:"%d" 输出格式:"%4d" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include #include int main() { printf("Input m,n:"); int m,n; scanf("%d,%d",&m,&n); int merged[m+n]; printf("Input array a:"); int i; for (i=0;i scanf("%d",&merged[i]); } printf("Input array b:"); for (i=m;i scanf("%d",&merged[i]); } int j,t,k; for (i=0;i t=merged[i]; k=i; for (j=i+1;j if (t k=j; t=merged[j]; } } if (k!=i){ t=merged[i]; merged[i]=merged[k]; merged[k]=t; } } for (i=0;i printf("%4d",merged[i]); } return 0; } 11.3 子串判断(4分) 题目内容:从键盘输入两个长度小于80的字符串A和B,且A的长度大于B的长度,编程判断B是不是A的子串,如果是,则输出”Yes”,否则输出”No”。这里所谓的该串的子串是指字符串中任意多个连续的字符组成的子序列。 函数原型:int IsSubString(char a[], char b[]) 函数功能:判断b是否是a的子串,是则返回1,否则返回0 程序运行结果示例1: Input the first string: Abcdefghijk123↙ Input the second string: 123↙ Yes 程序运行结果示例2: Input the first str: abefsfl↙ Input the second str: befs↙ Yes 程序运行结果示例3: Input the first str: aAbde↙ Input the second str: abc↙ No 输入第一个字符串的提示信息: "Input the first string:" 输入第二个字符串的提示信息: "Input the second string:" 输入单个字符的提示信息: "Input a character:n" 输入格式: 用 gets()函数 输出格式: 是子串,输出: "Yesn" 不是子串,输出: "Non" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include #include int main() { printf("Input the first string:"); char a[80],b[80]; gets(a); if (strlen(a)!=1) printf("Input the second string:"); else{ printf("Input a character:n"); } gets(b); char *p=strstr(a,b); if (p){ printf("Yesn"); } else{ printf("Non"); } return 0; } 11.4 凯撒密码(4分) 题目内容:凯撒密码是罗马扩张时期朱利斯•凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令,其原理很简单,就是通过将字母表中的字母移动一定位置而实现加密。例如,每个字母按字母表顺序向后移3位,如a加密后变成d,b加密后变成e,……x加密后变成a,y加密后变成b,z加密后变成c。请编写一个程序,将用户从键盘输入的文本字符串(只包含a~z的字符且长度小于100)进行加密后输出。 函数原型:void Caesar(char c[]) 函数功能:计算凯撒密码 程序的运行结果示例1: Input a string:baidu↙ edlgx 程序的运行结果示例2: Input a string:xyz↙ abc 输入提示信息:"Input a string:" 输入格式: 用 gets()函数 输出格式:用 puts()函数 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include #include int main() { printf("Input a string:"); char save[2][100]; int a, b, i, j; gets(save[0]); i=0;b=3; for (j = 0; j < strlen(save[0]); j++) { if ((save[i][j] >= 'A' && save[i][j] <= 'Z') || (save[i][j] >= 'a' && save[i][j] <= 'z')) { save[i][j] += b; if (((save[i][j] >= 'A' && save[i][j] <= 'Z') || (save[i][j] >= 'a' && save[i][j] <= 'z')) == 0) { save[i][j] -= 26; } } } puts(save[0]); return (0); } 12.1 计算时间差(4分) 题目内容: 用结构体定义时钟类型,编程从键盘任意输入两个时间(例如4时55分和1时25分),计算并输出这两个时间之间的间隔。要求不输出时间差的负号。结构体类型定义如下: typedef struct clock { int hour; int minute; int second; } CLOCK; 函数原型: CLOCK CalculateTime(CLOCK t1, CLOCK t2); 函数功能:计算并返回两个时间t1和t2之间的差 程序运行结果示例1: Input time one:(hour,minute):4,55↙ Input time two: (hour,minute):1,25↙ 3hour,30minute 程序运行结果示例2: Input time one:(hour,minute):1,33↙ Input time two: (hour,minute):5,21↙ 3hour,48minute 输入提示: "Input time one:(hour,minute):" "Input time two: (hour,minute):" 输入格式: "%d,%d" 输出格式:"%dhour,%dminuten" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include typedef struct Mytime { int hour; int min; int sec; }T; int main() { T t1, t2, t3; int sec1=0, sec2=0, sec3=0; printf("Input time one:(hour,minute):"); scanf("%d,%d", &, &); printf("Input time two: (hour,minute):"); scanf("%d,%d", &, &); sec1 = * 3600 + * 60 + 0; sec2 = * 3600 + * 60 + 0; if( sec1 >= sec2 ) sec3 = sec1 - sec2; else sec3 = sec2 - sec1; = sec3 / 3600; sec3 %= 3600; = sec3 /60; = sec3 %60; printf("%dhour,%dminuten", , ); return 0; } 12.2 奖学金发放(4分) 题目内容: 某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,每项奖学金获取的条件分别如下: 1) 院士奖学金:期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生每人均可获得8000元; 2) 五四奖学金:期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生每人均可获得4000元; 3) 成绩优秀奖:期末平均成绩高于90分(>90)的学生每人均可获得2000元; 4) 西部奖学金:期末平均成绩高于85分(>85)的西部省份学生每人均可获得1000元; 5) 班级贡献奖:班级评议成绩高于80分(>80)的学生干部每人均可获得850元; 只要符合上述条件就可获得相应的奖项,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚明的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。 现在给出若干学生的相关数据(假设总有同学能满足获得奖学金的条件),请编程计算哪些同学获得的奖金总数最高。 结构体类型定义如下: typedef struct winners { char name[20]; int finalScore; int classScore; char work; char west; int paper; int scholarship; } WIN; 函数原型:void Addup(WIN stu[], int n); 函数原型:int FindMax(WIN student[], int n); 程序运行结果示例: Input n:4↙ Input name:YaoMing↙ Input final score:87↙ Input class score:82↙ Class cadre or not?(Y/N):Y↙ Students from the West or not?(Y/N):N↙ Input the number of published papers:0↙ name:YaoMing,scholarship:4850 Input name:ChenRuiyi↙ Input final score:88↙ Input class score:78↙ Class cadre or not?(Y/N):N↙ Students from the West or not?(Y/N):Y↙ Input the number of published papers:1↙ name:ChenRuiyi,scholarship:9000 Input name:LiXin↙ Input final score:92↙ Input class score:88↙ Class cadre or not?(Y/N):N↙ Students from the West or not?(Y/N):N↙ Input the number of published papers:0↙ name:LiXin,scholarship:6000 Input name:ZhangQin↙ Input final score:83↙ Input class score:87↙ Class cadre or not?(Y/N):Y↙ Students from the West or not?(Y/N):N↙ Input the number of published papers:1↙ name:ZhangQin,scholarship:8850 ChenRuiyi get the highest scholarship 9000 输入学生人数提示:"Input n:" 输入学生姓名提示:"Input name:" 输入学生期末平均成绩提示:"Input final score:" 输入学生班级评议成绩提示:"Input class score:" 输入是否为学生干部提示:"Class cadre or not?(Y/N):" 输入是否为西部学生提示:"Students from the West or not?(Y/N):" 输入发表文章数量提示:"Input the number of published papers:" 输入格式: 输入学生人数:"%d" 输入学生姓名:"%s" 输入学生成绩:"%d" 输入是否为学生干部:" %c" (注意:%c前面有一个空格) 输入是否为西部学生:" %c" (注意:%c前面有一个空格) 输入发表文章数量: "%d" 输出格式: 输出学生获得的奖学金: "name:%s,scholarship:%dn" 输出获得奖学金总数最高的学生:"%s get the highest scholarship %dn" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include typedef struct winners { char name[20]; int finalScore; int classScore; char work; char west; int paper; int scholarship; } WIN; int main() { printf("Input n:"); int n,i; scanf("%d",&n); WIN stu[n]; for (i=0;i printf("Input name:");scanf("%s",stu[i].name); printf("Input final score:");scanf("%d",&stu[i].finalScore); printf("Input class score:");scanf("%d",&stu[i].classScore);getchar(); printf("Class cadre or not?(Y/N):");scanf("%c",&stu[i].work);getchar(); printf("Students from the West or not?(Y/N):");scanf("%c",&stu[i].west);getchar(); printf("Input the number of published papers:");scanf("%d",&stu[i].paper); stu[i].scholarship=0; if (stu[i].finalScore>80 && stu[i].paper >=1) stu[i].scholarship+=8000; if (stu[i].finalScore>85 && stu[i].classScore> 80) stu[i].scholarship+=4000; if (stu[i].finalScore>90) stu[i].scholarship+=2000; if (stu[i].finalScore>85 && stu[i].west=='Y') stu[i].scholarship+=1000; if (stu[i].classScore> 80 && stu[i].work=='Y') stu[i].scholarship+=850; printf("name:%s,scholarship:%dn",stu[i].name,stu[i].scholarship); } int ts=stu[0].scholarship,k; for (i=1;i if (ts k=i; } } printf("%s get the highest scholarship %dn",stu[k].name,stu[k].scholarship); return 0; } 12.3 23根火柴游戏(4分) 题目内容: 请编写一个简单的23 根火柴游戏程序,实现人跟计算机玩这个游戏的程序。为了方便程序自动评测,假设计算机移动的火柴数不是随机的,而是将剩余的火柴根数对3求余后再加1来作为计算机每次取走的 火柴数。如果计算机打算移走的火柴数等于剩下的火柴数,则将计算机打算移走的火柴数减1。但是计算机不可以不取,剩下的火柴数为1时,必须取走1根火柴。假设游戏规则如下: 1)游戏者开始拥有23根火柴棒; 2)每个游戏者轮流移走1 根、2 根或3 根火柴; 3)谁取走最后一根火柴为失败者。 程序运行结果示例1: Game start! Note: the maximum number is 3 Please enter the number of matches you are moving: 5↙ The number you entered is wrong,please re-enter! Please enter the number of matches you are moving: 3↙ The number of matches you are moving is:3 The number of matches left is:20 The number of matches that have been moved by the computer is:3 The number of matches left is:17 Please enter the number of matches you are moving: 1↙ The number of matches you are moving is:1 The number of matches left is:16 The number of matches that have been moved by the computer is:2 The number of matches left is:14 Please enter the number of matches you are moving: 2↙ The number of matches you are moving is:2 The number of matches left is:12 The number of matches that have been moved by the computer is:1 The number of matches left is:11 Please enter the number of matches you are moving: 3↙ The number of matches you are moving is:3 The number of matches left is:8 The number of matches that have been moved by the computer is:3 The number of matches left is:5 Please enter the number of matches you are moving: 1↙ The number of matches you are moving is:1 The number of matches left is:4 The number of matches that have been moved by the computer is:2 The number of matches left is:2 Please enter the number of matches you are moving: 1↙ The number of matches you are moving is:1 The number of matches left is:1 The number of matches that have been moved by the computer is:1 The number of matches left is:0 Congratulations!You won! 程序运行结果示例2: Game start! Note: the maximum number is 3 Please enter the number of matches you are moving: 3↙ The number of matches you are moving is:3 The number of matches left is:20 The number of matches that have been moved by the computer is:3 The number of matches left is:17 Please enter the number of matches you are moving: 3↙ The number of matches you are moving is:3 The number of matches left is:14 The number of matches that have been moved by the computer is:3 The number of matches left is:11 Please enter the number of matches you are moving: 2↙ The number of matches you are moving is:2 The number of matches left is:9 The number of matches that have been moved by the computer is:1 The number of matches left is:8 Please enter the number of matches you are moving: 1↙ The number of matches you are moving is:1 The number of matches left is:7 The number of matches that have been moved by the computer is:2 The number of matches left is:5 Please enter the number of matches you are moving: 3↙ The number of matches you are moving is:3 The number of matches left is:2 The number of matches that have been moved by the computer is:1 The number of matches left is:1 Please enter the number of matches you are moving: 1↙ The number of matches you are moving is:1 The number of matches left is:0 I'm sorry. You lost! 游戏开始提示信息:"Game start!n" "Note: the maximum number is 3n" 提示游戏者输入移动的火柴数:"Please enter the number of matches you are moving:n" 游戏者输入错误数据的提示信息:"The number you entered is wrong,please re-enter!n" 输入格式: "%d" 输出格式: 输出被游戏者移动的火柴数:"The number of matches you are moving is:%dn" 输出被计算机移动的火柴数:"The number of matches that have been moved by the computer is:%dn" 输出被游戏者或计算机移动后剩余的火柴数:"The number of matches left is:%dn" 游戏者获胜的输出提示信息:"Congratulations!You won!n" 游戏者失败的输出提示信息:"I'm sorry. You lost!n" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include main() { printf("Game start!nNote: the maximum number is 3n"); int i, j, k, s = 23, n, c; while (1) { printf("Please enter the number of matches you are moving:n"); scanf("%d", &n); if (n<=3 && n>=1 && n<=s){ ; } else{ printf("The number you entered is wrong,please re-enter!n"); continue; } s -= n; printf("The number of matches you are moving is:%dnThe number of matches left is:%dn", n, s); if (s > 0) { if (s==3) { c = 2; } else if (s==2){ c=1; } else if (s==1){ c=1; } else { c = s%3+1; } s -= c; printf("The number of matches that have been moved by the computer is:%dnThe number of matches left is:%dn", c, s); if (s==0){ printf("Congratulations!You won!n"); break; } } else if (s==0){ printf("I'm sorry. You lost!n");break; } } } 12.4 星期判断(4分) 题目内容:请输入星期几的第一个字母(不区分大小写)来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母(小写),否则输出“data error”。 程序运行结果示例1: please input the first letter of someday: S↙ please input second letter: u↙ sunday 程序运行结果示例2: please input the first letter of someday: F↙ friday 程序运行结果示例2: please input the first letter of someday: h↙ data error 第一个字母的输入提示信息:"please input the first letter of someday:n" 第二个字母的输入提示信息:"please input second letter:n" 用户输入错误提示信息:"data errorn" 输入格式: " %c" (注意:%c前面有一个空格) 输出格式: 星期一:"mondayn" 星期二:"tuesdayn" 星期三:"wednesdayn" 星期四:"thursdayn" 星期五:"fridayn" 星期六:"saturdayn" 星期日:"sundayn" 为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 #include main() { char i,j; printf("please input the first letter of someday:n"); scanf("%c",&i); switch(i) { case 'm':case 'M': printf("mondayn"); break; case 'w':case 'W': printf("wednesdayn"); break; case 'f':case 'F': printf("fridayn"); break; case 't':case 'T': printf("please input second letter:n"); scanf("%c",&j); j=getchar(); if (j=='u') printf("tuesdayn"); else if (j=='h') printf("thursdayn"); else printf("data errorn"); break; } case 's':case 'S': printf("please input second letter:n"); scanf("%c",&j); j=getchar(); if (j=='a') printf("saturdayn"); else if (j=='u') printf("sundayn"); else printf("data errorn"); break; default : printf("data errorn"); break; }
版权声明:本文标题:中国大学MOOC-哈工大-C语言程序设计精髓第六-十二周编程题答案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1706091133h501551.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论