实验3

实验任务1

源代码:

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

运行结果:

image

问题回答:

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?

  功能:显示输入的数字分数对应的字母等级。

  形参类型:int;

  返回值类型:字符型char。
问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。

image

   如果将代码改为赋值为"A"——"D",会存在数据类型不匹配的问题。"A"代表字符串字面量,而变量ans为char类型。将字符串的地址赋值给char类型变量会导致编译警告或错误。

实验任务2

源代码:

 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("%d", &n) != EOF) {
 7         ans = sum_digits(n);    // 函数调用
 8         printf("n = %d, ans = %d\n\n", n, ans);
 9     }
10     return 0;
11 }
12 // 函数定义
13 int sum_digits(int n) {
14     int ans = 0;
15     while (n != 0) {
16         ans += n % 10;
17         n /= 10;
18     }
19     return ans;
20 }
View Code

运行结果:

image

问题回答:

问题1:函数 sum_digits 的功能是什么?

  计算并返回一个整数n的各位数字之和。
问题2:如果把函数 sum_digits 定义成如下实现方式,能实现同样的输出吗?如果能,说明两种实现方式的算法思维区别;如果不能,分析原因。

image

   能实现同样的输出结果。

  区别:原代码采用的是迭代算法,通过while循环不断对数字取余和整除,累加求和。新代码采用的是递归算法,它将原问题分解为求最后一位数字加上剩余位数字之和的子问题,通过函数调用自身来解决,直到当数字小于10时直接返回数字本身。

实验任务3

源代码:

 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("%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 // 函数定义
14 int power(int x, int n) {
15     int t;
16     if (n == 0)
17         return 1;
18     else if (n % 2)
19         return x * power(x, n - 1);
20     else {
21         t = power(x, n / 2);
22         return t * t;
23     }
24 }
View Code

运行结果:

image

问题回答:

问题1: 函数 power 的功能是什么?

  计算x的n次幂。
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。(在纸上写出这个递归模式对应的数学公式,拍照后以图片方式放到这里;也可使用公式编辑器(如果会使用))

16463BEAE0548C68D4C3537E85D113A8

实验任务4

源代码:

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

运行结果:

image

实验任务5

源代码:

迭代:

View Code

递归:

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

运行结果:

用迭代方式实现计算组合数 func() 的完整源代码task5_1.c,及,运行测试截图

image

用递归函数实现计算组合数 func() 的完整源代码task5_2.c,及,运行测试截图

image

实验任务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     while (scanf("%d%d%d", &a, &b, &c) != EOF) {
 9         ans = gcd(a, b, c); 
10         printf("最大公约数: %d\n\n", ans);
11     }
12     return 0;
13 }
14 
15 int gcd(int a, int b, int c) {
16     int min = a;
17     if (b < min) min = b;
18     if (c < min) min = c;
19 
20     for (int i = min; i >= 1; i--) {
21         if (a % i == 0 && b % i == 0 && c % i == 0) {
22             return i; 
23         }
24     }
25     return 1;
26 }
View Code

运行结果:

image

实验任务7

源代码:

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

运行结果:

image

 

 

posted @ 2026-04-21 09:18  yailly  阅读(11)  评论(0)    收藏  举报