实验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 }
View Code

结果截图:

1 

问题回答:

问题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 }
View Code

结果截图:

2

 

问题回答:

问题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 }
View Code

结果截图:

 3

问题回答:

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

问题2:

77cda7e2df3b783a35ddc0d1300476d2

任务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 }
View Code

结果截图:

 4

任务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 }
View Code

迭代

 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 }
View Code

结果截图:

52

任务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 }
View Code

结果截图:

 6

任务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 }
View Code

结果截图:

71

72

 

实验总结:感觉这次实验要编写的代码综合性很强。之前的环节哪怕有一点没学好在写代码上都很困难。!

还有就是现在写代码要学会从结果逆推逻辑belike: task5中可根据结果写出递归的出口,这样不易重复不易遗漏。

写完发现卡得最久的是task7:一开始就没分析清楚逻辑,导致无论怎么修改都不尽人意,后来无奈之下参考了已经交了作业的同学的代码~(很不好意思 orz)理清逻辑之后再独立编写,过程中发现逻辑严密性的重要,一个小小的for循环条件有细微不同都会影响结果(‘<=’  ---> ‘ < ’就会让打印的小人数量错误)

 

 

 

posted @ 2026-04-17 23:04  Bob欧巴  阅读(1)  评论(0)    收藏  举报