实验三

实验任务1:

  1. 源代码
复制代码
 1 #include <stdio.h>
 2 char score_to_grade(int score);
 3 int main() {
 4     int score;
 5     char grade;
 6     while (scanf_s("%d", &score) != EOF) {
 7         grade = score_to_grade(score);
 8         printf("分数: %d, 等级: %c\n\n", score, grade);
 9     }
10     return 0;
11 }
12 char score_to_grade(int score) {
13     char ans;
14     switch (score / 10) {
15     case 10:
16     case 9: ans = 'A'; break;
17     case 8: ans = 'B'; break;
18     case 7: ans = 'C'; break;
19     case 6: ans = 'D'; break;
20     default:ans = 'E';
21     }
22     return ans;
23 }
  1. 运行结果截图:

3.问题回答:

ans1:函数score_to_grade的功能是将分数转化成对应的等级 形参类型是int 返回值类型是char

ans2:(1)由于返回值类型为char,故应该使用' '而不是" " (2)缺少break,case会一直向下,最终输出结果均为E

实验任务2:

1.源代码:

复制代码
 1 #include <stdio.h>
 2 int sum_digits(int n);
 3 int main() {
 4     int n;
 5     int ans;
 6     while (printf("Enter n: "), scanf_s("%d", &n) != EOF) {
 7         ans = sum_digits(n);
 8         printf("n = %d, ans = %d\n\n", n, ans);
 9     }
10     return 0;
11 }
12 int sum_digits(int n) {
13     int ans = 0;
14     while (n != 0) {
15         ans += n % 10;
16         n /= 10;
17     }
18     return ans;
19 }

2.运行结果截图:

3.问题回答:

ans1:函数sum_digits的功能是计算n各个数位上数字的和

ans2:能实现,原代码是运用循环算法,修改代码是运用递归算法

实验任务3:

1.源代码:

复制代码
 1 #include <stdio.h>
 2 int power(int x, int n);
 3 int main() {
 4     int x, n;
 5     int ans;
 6     while (printf("Enter x and n: "), scanf_s("%d%d", &x, &n) != EOF) {
 7         ans = power(x, n);
 8         printf("n = %d, ans = %d\n\n", n, ans);
 9     }
10 
11     return 0;
12 }
13 int power(int x, int n) {
14     int t;
15     if (n == 0)
16         return 1;
17     else if (n % 2)
18         return x * power(x, n - 1);
19     else {
20         t = power(x, n / 2);
21         return t * t;
22     }
23 }

2.运行结果截图:

3.问题回答:

ans1:函数power的功能是计算x的n次幂

ans2:是递归函数,在n为奇数和偶数时存在递归,数学公式为:

实验任务4:

1.源代码:

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

2.运行结果截图:

实验任务5:

1.源代码

迭代:

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

递归:

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

2.运行结果截图:

实验任务6:

1.源代码:

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

2.运行结果截图:

实验任务7:

1.源代码:

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 void print_charman(int n);
 4 int main() {
 5     int n;
 6     printf("Enter n:");
 7     scanf_s("%d", &n);
 8     print_charman(n);
 9     return 0;
10 }
11 void print_charman(int n)
12 {
13     int i, j, k;
14     for (i = n - 1; i >= 0; i--) {
15         for (k = n; k > i; k--)
16         {
17             printf("\t");
18         }
19         for (j = 0; j < 2 * i + 1; j++)
20         {
21             printf(" O\t");
22         }
23         printf("\n");
24         for (k = n; k > i; k--)
25         {
26             printf("\t");
27         }
28         for (j = 0; j < 2 * i + 1; j++)
29         {
30             printf("<H>\t");
31         }
32         printf("\n");
33         for (k = n; k > i; k--)
34         {
35             printf("\t");
36         }
37         for (j = 0; j < 2 * i + 1; j++)
38         {
39             printf("I I\t");
40         }
41         printf("\n");
42     }
43 }

2.运行结果截图: