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

屏幕截图 2026-11-13 141807

问题1:根据传入的百分制分数,判断其所在的分数段,并返回对应的等级字符;int;char。

问题2:1.ans应该用单引号赋值。2.缺少break语句,导致所有输出结果全为E。

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

屏幕截图 2026-11-13 143212

问题1:计算并返回一个非负整数n的各位数字之和

问题2:能。原代码使用循环解决问题,代码运行效率高,新代码使用递归法,代码结构更加简洁。

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

屏幕截图 2026-11-13 145517

问题1:高效地计算x的n次方

问题2:

问题3:1.正确,结果均为x的n次方 2.因为产生大量子问题重复计算,因此性能会大幅下降,原写法调用6次,修改后调用47次

任务4

 

 1 #include <stdio.h>
 2 
 3 int classify_triangle(int a, int b, int c);
 4 
 5 int main() {
 6     int a, b, c;
 7     int ans;
 8 
 9     while (scanf("%d%d%d", &a, &b, &c) != EOF) {
10         ans = classify_triangle(a, b, c); 
11         
12         switch (ans) {
13             case 0:
14                 printf("不能构成三角形\n");
15                 break;
16             case 1:
17                 printf("普通三角形\n");
18                 break;
19             case 2:
20                 printf("等边三角形\n");
21                 break;
22             case 3:
23                 printf("等腰三角形\n");
24                 break;
25             case 4:
26                 printf("直角三角形\n");
27                 break;
28         }
29     }
30 
31     return 0;
32 }
33 
34 int classify_triangle(int a, int b, int c) {
35     long long x, y, z;
36 
37     if (a <= 0 || b <= 0 || c <= 0) return 0;
38     if (a + b <= c || a + c <= b || b + c <= a) return 0;
39 
40     if (a == b && b == c) return 2;
41 
42     if (a == b || a == c || b == c) return 3;
43 
44     x = a; y = b; z = c;
45     if (x * x + y * y == z * z || 
46         x * x + z * z == y * y || 
47         y * y + z * z == x * x) {
48         return 4;
49     }
50 
51     return 1;
52 }

屏幕截图 2026-11-14 113047

任务5

 1 #include <stdio.h>
 2 
 3 int func(int n, int m);
 4 
 5 int main() {
 6     int n, m;
 7     int ans;
 8 
 9     while(scanf("%d%d", &n, &m) != EOF) {
10         ans = func(n, m); 
11         printf("n = %d, m = %d, ans = %d\n", n, m, ans);
12     }
13 
14     return 0;
15 }
16 
17 int func(int n, int m) {
18     if (m < 0 || m > n) {
19         return 0;
20     }
21     
22     if (m == 0 || m == n) {
23         return 1;
24     }
25     
26     return func(n - 1, m) + func(n - 1, m - 1);
27 }

屏幕截图 2026-11-14 223945

 1 #include <stdio.h>
 2 
 3 int func(int n, int m);
 4 
 5 int main() {
 6     int n, m;
 7     int ans;
 8 
 9     while(scanf("%d%d", &n, &m) != EOF) {
10         ans = func(n, m); 
11         printf("n = %d, m = %d, ans = %d\n", n, m, ans);
12     }
13 
14     return 0;
15 }
16 
17 int func(int n, int m) {
18     long long ans = 1;
19     int i;
20     
21     if (m < 0 || m > n) {
22         return 0;
23     }
24     if (m == 0 || m == n) {
25         return 1;
26     }
27     
28     if (m > n - m) {
29         m = n - m;
30     }
31 
32     for (i = 1; i <= m; i++) {
33         ans = ans * (n - m + i) / i;
34     }
35 
36     return (int)ans;
37 }

屏幕截图 2026-11-14 224204

任务6

 1 #include <stdio.h>
 2 
 3 int gcd(int a, int b, int c);
 4 
 5 int main() {
 6     int a, b, c;
 7     int ans;
 8 
 9     while (scanf("%d%d%d", &a, &b, &c) != EOF) {
10         ans = gcd(a, b, c);
11         printf("最大公约数: %d\n\n", ans);
12     }
13 
14     return 0;
15 }
16 
17 int gcd(int a, int b, int c) {
18     int min = a;
19     int i;
20 
21     if (b < min) {
22         min = b;
23     }
24     if (c < min) {
25         min = c;
26     }
27 
28     for (i = min; i >= 1; i--) {
29         if (a % i == 0 && b % i == 0 && c % i == 0) {
30             return i;
31         }
32     }
33 
34     return 1;
35 }

屏幕截图 2026-11-14 224433任务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 
12     return 0;
13 }
14 
15 void print_charman(int n) {
16     int i, j, k;
17     int count;
18 
19     for (i = 1; i <= n; i++) {
20         count = 2 * (n - i + 1) - 1;
21 
22         for (k = 1; k < i; k++) {
23             printf("\t");
24         }
25         for (j = 1; j <= count; j++) {
26             if (j > 1) printf("\t");
27             printf(" 0 "); 
28         }
29         printf("\n");
30 
31         for (k = 1; k < i; k++) {
32             printf("\t");
33         }
34         for (j = 1; j <= count; j++) {
35             if (j > 1) printf("\t");
36             printf("<H>");
37         }
38         printf("\n");
39 
40         for (k = 1; k < i; k++) {
41             printf("\t");
42         }
43         for (j = 1; j <= count; j++) {
44             if (j > 1) printf("\t");
45             printf("I I");
46         }
47         printf("\n");
48 
49         if (i < n) {
50             printf("\n");
51         }
52     }
53 }

屏幕截图 2026-11-14 224813

屏幕截图 2026-11-14 224841

 

posted @ 2026-11-14 22:49  NOVAIL  阅读(2)  评论(0)    收藏  举报