实验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         return 0;
14     }
15     
16      char score_to_grade(int score) {
17          char ans; 
18          
19          switch(score/10) { 
20              case 10: 
21              case 9: ans = 'A'; break;
22              case 8: ans = 'B'; break;
23              case 7: ans = 'C'; break; 
24              case 6: ans = 'D'; break; 
25              default: ans = 'E'; 
26             }
27             
28          return ans;
29          }

运行结果截图

image

问题回答

问题1:作用是将输入的整数类型的分数转换为对应的等级字符;int;char。

问题2:1.ans是char类型变量,而"A"是字符串常量,无法直接赋值给字符变量。

             2.缺少break来终止当前分支,会使得其会继续执行后续所有case和default代码,无法得到正确等级。

实验任务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     return 0; 
14     
15 }
16 
17 int sum_digits(int n) { 
18     int ans = 0;
19     
20     while(n != 0) { 
21         ans += n % 10; 
22         n /= 10; 
23     }
24     
25     return ans; 
26 }

运行结果截图

image

问题回答

问题1:功能是计算输入的整数n的各位数字之和。

问题2:能实现;

             原代码是迭代思维,通过while循环,直到n变为0,逐步完成计算。

             修改后是递归思维,通过函数自身调用,将问题逐步缩小,直到终止。    

实验任务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 int power(int x, int n) { 
18     int t;
19     
20     if(n == 0)
21         return 1; 
22     else if(n % 2) 
23         return x * power(x, n-1);
24     else {
25         t = power(x, n/2); 
26         return t*t;
27     }
28 }

运行结果截图

image

问题回答

问题1:功能是计算整数x的n次幂,n为非负整数。

问题2:

478b3e7cf19913dccbe08d1aa8ce48f9_720

 

实验任务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, res;
 7 
 8     while (scanf("%d%d%d", &a, &b, &c) != EOF) {
 9         res = classify_triangle(a, b, c);
10 
11         switch (res) {
12             case 0: printf("不能构成三角形\n"); break;
13             case 1: printf("普通三角形\n"); break;
14             case 2: printf("等边三角形\n"); break;
15             case 3: printf("等腰三角形\n"); break;
16             case 4: printf("直角三角形\n"); break;
17         }
18     }
19     return 0;
20 }
21 
22 int classify_triangle(int a, int b, int c) {
23     if(!(a+b>c&&b+c>a&&a+c>b)){
24         return 0;
25     }
26     
27     if (a + b <= c || a <= 0)
28         return 0;
29 
30     if (a == b && b == c)
31         return 2;
32 
33     if (a*a + b*b == c*c||a*a + c*c == b*b||b*b +c*c == a*a)
34         return 4;
35 
36     if (a == b || b == c || a == c)
37         return 3;
38 
39     return 1;
40 }

运行结果截图

image

实验任务5

源代码1

 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", n, m, ans);
12     }
13     return 0;
14 }
15 
16 int func(int n, int m) {
17     if (m > n || m < 0) {
18         return 0;
19     }
20 
21     if (m > n - m) {
22         m = n - m;
23     }
24     long long result = 1;
25     for (int i = 1; i <= m; i++) {
26         result = result * (n - m + i) / i;
27     }
28     return (int)result;
29 }

运行结果截图

image

源代码2

 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", n, m, ans);
12     }
13     return 0;
14 }
15 
16 int func(int n, int m) {
17     if (m == 0 || m == n) {
18         return 1;
19     }
20     if (m > n || m < 0) {
21         return 0;
22     }
23 
24     return func(n - 1, m) + func(n - 1, m - 1);
25 }

运行结果截图

image

实验任务6

源代码

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

运行结果截图

image

实验任务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("input n: ");
 9     scanf("%d", &n);
10     print_charman(n);
11     
12     return 0;
13 }
14 
15 void print_charman(int n) {
16     for (int i = 0; i < n; i++) {
17         
18         for (int j = 0; j < i; j++){
19             printf("\t");
20         }
21         for (int j = 0; j < 2*n - 1 - 2*i; j++){
22             printf(" 0 \t");
23         }    
24         printf("\n");
25 
26         for (int j = 0; j < i; j++){
27             printf("\t");
28         }
29         for (int j = 0; j < 2*n - 1 - 2*i; j++){
30             printf("<H>\t");
31         }    
32         printf("\n");
33 
34         for (int j = 0; j < i; j++){
35             printf("\t");
36         }    
37         for (int j = 0; j < 2*n - 1 - 2*i; j++){
38             printf("I I \t");
39         }    
40         printf("\n");
41     }
42 }

运行结果截图

image

image

posted @ 2026-04-20 23:08  X++++++++++++  阅读(6)  评论(0)    收藏  举报