实验3

一.任务一

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 char score_to_grade(int score);  //  函数声明
 5 
 6 
 7 int main() {
 8     int score;
 9     char grade;
10 
11     while (scanf("%d", &score) != EOF) {
12         grade = score_to_grade(score);  // 函数调用
13 
14         printf("分数: %d, 等级: %c\n\n", score, grade);
15     }
16 
17     return 0;
18 }
19 
20 // 函数定义
21 char score_to_grade(int score) {
22     char ans;
23 
24     switch (score / 10) {
25     case 10:
26     case 9:   ans = 'A'; break;
27     case 8:   ans = 'B'; break;
28     case 7:   ans = 'C'; break;
29     case 6:   ans = 'D'; break;
30     default:  ans = 'E';
31     }
32 
33     return ans;
34 }

2.运行结果截图

屏幕截图 2026-04-18 220437

3.回答问题

(1).问题1:

功能:将分数(score)转化为对应的等级(grade)

形参类型:有符号整型

返回值类型:字符型

(2).问题2:

存在的问题:

(i).将第二到第五个case语句后的单引号改为双引号,使ans变量无法正常获取数值,运行时系统报错

(ii).第二到第五个case语句后均缺失break语句,执行一个case语句后会会继续执行后,会续所有case直到default,运行时会出现评分始终为E

 

二.任务二

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 int sum_digits(int n);  // 函数声明
 5 
 6 int main() {
 7     int n;
 8     int ans;
 9 
10     while (printf("Enter n: "), scanf("%d", &n) != EOF) {
11         ans = sum_digits(n);    // 函数调用
12         printf("n = %d, ans = %d\n\n", n, ans);
13     }
14 
15     return 0;
16 }
17 
18 // 函数定义
19 int sum_digits(int n) {
20     int ans = 0;
21 
22     while (n != 0) {
23         ans += n % 10;
24         n /= 10;
25     }
26 
27     return ans;
28 }

2.运行结果截图

 屏幕截图 2026-04-19 095944

3.回答问题

(1).问题1:功能:计算一个整数的所有位数上的数字之和

(2).问题2:能。第一种是迭代方式,第二种是递归方式。

 

三.任务三

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 int power(int x, int n);    // 函数声明
 5 
 6 int main() {
 7     int x, n;
 8     int ans;
 9 
10     while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {
11         ans = power(x, n);  // 函数调用
12         printf("n = %d, ans = %d\n\n", n, ans);
13     }
14 
15     return 0;
16 }
17 
18 // 函数定义
19 int power(int x, int n) {
20     int t;
21 
22     if (n == 0)
23         return 1;
24     else if (n % 2)                  //n为奇数
25         return x * power(x, n - 1);
26     else {                          //n为偶数
27         t = power(x, n / 2);
28         return t * t;
29     }
30 }

2.运行结果截图

屏幕截图 2026-04-19 103505

3.回答问题

(1).问题1:功能:计算x的n次方

(2).问题2:是

屏幕截图 2026-04-19 111008

 

四.任务四

1.源代码

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

 

2.运行结果截图

 屏幕截图 2026-04-19 172111

 

五.任务五

(一).迭代法

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 int func(int n, int m);  // 函数声明
 5 int main() {
 6     int n, m;
 7     int ans;
 8     while (scanf("%d%d", &n, &m) != EOF) {
 9         ans = func(n, m);  // 函数调用
10         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
11     }
12 
13     return 0;
14 }
15 //函数定义
16 //迭代法
17 int func(int n, int m) {
18     double ans;
19     if (n < m)
20         ans = 0;
21     else if (m == 0)
22         ans = 1;
23     else {
24         for (int i = 1; i <= n; ++i) {
25             ans = ans * n / m;
26             n--;
27             m--;
28         }
29     }
30     return ans;
31 }

2.运行结果截图

屏幕截图 2026-04-19 233233

(二).递归函数

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 int func(int n, int m);  // 函数声明
 5 int main() {
 6     int n, m;
 7     int ans;
 8     while (scanf("%d%d", &n, &m) != EOF) {
 9         ans = func(n, m);  // 函数调用
10         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
11     }
12 
13     return 0;
14 }
15 //函数定义
16 
17 //递归法
18 int func(int n, int m) {
19     int ans;
20     if (n < m)
21         ans = 0;
22     else if (m == 0)
23         ans = 1;
24     else 
25         ans = func((n - 1), m) + func((n - 1), (m - 1));
26     
27     return ans;
28 }

2.运行结果截图

屏幕截图 2026-04-19 234154

 

六.任务六

1.源代码

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

2.运行结果截图

 屏幕截图 2026-04-21 082953

 

七.任务七

1.源代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 
 4 // 函数声明
 5 void print_charman(int);
 6 
 7 int main() {
 8     int n;
 9     printf("Enter n: ");
10     scanf("%d", &n);
11     print_charman(n); // 函数调用
12 
13     return 0;
14 }
15 
16 // 函数print_charman定义
17 void print_charman(int n) {
18     int i, j, k = n;  //k用于控制每行小人打印数量
19     //
20     for (i = 0; i < n; ++i) {
21         for (j = 0; j < i; ++j) {
22             printf("\t");
23         }
24         for (j = 0; j < 2 * k - 1; ++j) {
25             printf(" 0 \t");
26         }
27         printf("\n");
28     //
29         for (j = 0; j < i; ++j) {
30             printf("\t");
31         }
32         for (j = 0; j < 2 * k - 1; ++j) {
33             printf("<H>\t");
34         }
35         printf("\n");
36     //
37         for (j = 0; j < i; ++j) {
38             printf("\t");
39         }
40         for (j = 0; j < 2 * k - 1; ++j) {
41             printf("I I\t");
42         }
43         printf("\n");
44         k--;
45     }
46 }

2.运行结果截图

 屏幕截图 2026-04-21 091425

屏幕截图 2026-04-21 091408

 

 

八.实验总结

1.通过这次实验,我对递归函数的理解更进一步,对递归函数的编写能力得到提升。

2.对循环的使用有了新的认识,能更加熟练地使用循环语句。

posted @ 2026-04-21 09:18  昵称不足4个字符  阅读(12)  评论(0)    收藏  举报