实验3
任务1
源代码:
1 #include <stdio.h> 2 3 char score_to_grade(int score); // 函数声明 4 5 int main() { 6 int score; 7 char grade; 8 9 while(scanf("%d", &score) != EOF) { 10 grade = score_to_grade(score); // 函数调用 11 printf("分数: %d, 等级: %c\n\n", score, grade); 12 } 13 14 return 0; 15 } 16 17 // 函数定义 18 char score_to_grade(int score) { 19 char ans; 20 21 switch(score/10) { 22 case 10: 23 case 9: ans = 'A'; break; 24 case 8: ans = 'B'; break; 25 case 7: ans = 'C'; break; 26 case 6: ans = 'D'; break; 27 default: ans = 'E'; 28 } 29 30 return ans; 31 }
结果截图:
问题回答:
问题1:功能是调用程序将各分数段与等级对应;形参类型为int整数型;返回值类型为char字符型。
问题2:
错误(1)——各个等级之间的代码未加break,执行完对应的case语句后不会结束将依次执行下面的语句,对应的输出为“BCDE” "CDE"类似;
错误(2)——ans为char型,相对应的赋值形式也应该是char型,而“A”为字符串型,前后对应形式不符。
任务2
源代码:
1 #include <stdio.h> 2 3 int sum_digits(int n); // 函数声明 4 5 int main() { 6 int n; 7 int ans; 8 9 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 10 ans = sum_digits(n); // 函数调用 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 // 函数定义 18 int sum_digits(int n) { 19 int ans = 0; 20 21 while(n != 0) { 22 ans += n % 10; 23 n /= 10; 24 } 25 26 return ans; 27 }
结果截图:

问题回答:
问题1:计算各位数之和。
问题2:能。源代码使用迭代,当n != 0时跳出while循环;而问题2中的算法是递归思维,满足if(n < 10)的条件就终止,且每一次调用自身都会累加各个位数的和。
任务3
源代码:
1 #include <stdio.h> 2 3 int power(int x, int n); // 函数声明 4 5 int main() { 6 int x, n; 7 int ans; 8 9 while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 10 ans = power(x, n); // 函数调用 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 // 函数定义 18 int power(int x, int n) { 19 int t; 20 21 if(n == 0) 22 return 1; 23 else if(n % 2) 24 return x * power(x, n-1); 25 else { 26 t = power(x, n/2); 27 return t*t; 28 } 29 }
结果截图:

问题回答:
问题1:计算x的n次幂。
问题2:

任务4
源代码:
1 #include<stdio.h> 2 #include<math.h> 3 #include<stdlib.h> 4 5 int classify_triangle(int a, int b, int c){ 6 if(a + b <= c || a + c <= b || b + c <= a) 7 return 0; 8 if(a == b && b == c) 9 return 2; 10 if(a * a == b * b + c * c || b*b == c*c + a*a || c*c == b*b + a*a) 11 return 4; 12 if( a == b || b == c || a == c) 13 return 3; 14 return 1; 15 } 16 17 int main(){ 18 int a, b, c; 19 while(scanf("%d %d %d", &a, &b, &c)!= EOF){ 20 int ans = classify_triangle( a, b, c); 21 switch(ans){ 22 case(0):printf("不能够成三角形\n");break; 23 case(2):printf("等边三角形\n");break; 24 case(3):printf("等腰三角形\n");break; 25 case(4):printf("直角三角形\n");break; 26 case(1):printf("普通三角形\n");break; 27 28 } 29 30 } 31 return 0; 32 }
结果截图:

任务5
源代码:
递归
1 #include<stdio.h> 2 int func(int n, int m); 3 4 int main(){ 5 int n, m; 6 int ans; 7 while(scanf("%d%d", &n, &m) != EOF) { 8 ans = func(n, m); // 函数调用 9 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 10 } 11 return 0; 12 } 13 14 int func(int n, int m){ 15 16 if(m < 0 || m > n) 17 return 0; 18 if(m == 0 || m == n) 19 return 1; 20 21 return func(n - 1, m) + func(n - 1, m - 1); 22 }
迭代
1 #include<stdio.h> 2 int func(int n, int m); 3 4 int main(){ 5 int n, m; 6 int ans; 7 while(scanf("%d%d", &n, &m) != EOF) { 8 ans = func(n, m); // 函数调用 9 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 10 } 11 return 0; 12 } 13 14 int func(int n, int m){ 15 int a=1, b=1; 16 int i, j; 17 for (i = n-m+1; i <= n; i++) 18 a *= i; 19 for (j = 1; j <= m; j++) 20 b *= j; 21 return a / b; 22 }
结果截图:

任务6
源代码:
1 #include<stdio.h> 2 int gcd(int a, int b, int c); 3 4 int main() { 5 int a, b, c; 6 int ans; 7 while(scanf("%d %d %d", &a, &b, &c) != EOF) { 8 ans = gcd(a, b, c); // 函数调用 9 printf("最大公约数: %d\n\n", ans); 10 } 11 return 0; 12 } 13 // 函数定义 14 // 待补足... 15 int gcd(int a, int b, int c){ 16 int min, i; 17 min = a; 18 if(b < min){ 19 min = b; 20 } 21 if(c < min){ 22 min = c; 23 } 24 25 for(i = min; i >= 1; i--){ 26 if(a%i == 0 && b%i == 0 && c%i == 0) 27 return i; 28 } 29 return 1; 30 }
结果截图:

任务7
源代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void print_charman(int n); 5 6 int main() { 7 int n; 8 printf("Enter n: "); 9 scanf("%d", &n); 10 print_charman(n); // 函数调用 11 return 0; 12 } 13 14 void print_charman(int n){ 15 int i, j, t; 16 t = 0; 17 for(i = 1; i <= 3 * n; i++){ 18 for(j = 1; j <= 2 * n - 1; j++){ 19 if(j > (t/3) && j < 2 * n - (t/3)){ 20 switch( i % 3){ 21 case 1:printf(" O\t");break; 22 case 2:printf("<H>\t");break; 23 case 0:printf("I I\t"); 24 } 25 26 } 27 else 28 printf(" \t"); 29 } 30 t += 1; 31 32 printf("\n"); 33 } 34 }
结果截图:


实验总结:感觉这次实验要编写的代码综合性很强。之前的环节哪怕有一点没学好在写代码上都很困难。!
还有就是现在写代码要学会从结果逆推逻辑belike: task5中可根据结果写出递归的出口,这样不易重复不易遗漏。
写完发现卡得最久的是task7:一开始就没分析清楚逻辑,导致无论怎么修改都不尽人意,后来无奈之下参考了已经交了作业的同学的代码~(很不好意思 orz)理清逻辑之后再独立编写,过程中发现逻辑严密性的重要,一个小小的for循环条件有细微不同都会影响结果(‘<=’ ---> ‘ < ’就会让打印的小人数量错误)

浙公网安备 33010602011771号