实验3

实验3

task1

 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_s("%d", &score,1) != EOF) {
10         grade = score_to_grade(score);  
11         printf("分数: %d, 等级: %c\n\n", score, grade);
12     }
13 
14     return 0;
15 }
16 
17 char score_to_grade(int score) {
18     char ans;
19 
20     switch (score / 10) {
21     case 10:
22     case 9:   ans = 'A'; break;
23     case 8:   ans = 'B'; break;
24     case 7:   ans = 'C'; break;
25     case 6:   ans = 'D'; break;
26     default:  ans = 'E';
27     }
28 
29     return ans;
30 }
View Code

屏幕截图 2026-04-15 103539

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型分别是什么?功能是对输入的分数进行
判断,判断该分数属于哪一等级。形参为int类型,返回值为char类型。
问题2:如果line21-28改成以下写法,代码存在哪些问题?请逐一指出。switch 标签之间的尾随 fallthrough
(es.78)。会导致无论输入成绩为多少,输出等级都为“E”。

task2

 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_s("%d", &n,1) != EOF) {
10         ans = sum_digits(n);    
11         printf("n = %d, ans = %d\n\n", n, ans);
12     }
13 
14     return 0;
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 }
View Code

屏幕截图 2026-04-15 154921

问题1:函数 sum_digits 的功能是什么?将输入数字所有位数上数字相加。
问题2:如果把函数 sum_digits 定义成如下实现方式,能实现同样的输出吗?如果能,说明两种实现方式的算
法思维区别;如果不能,分析原因。可以。改之前的算法利用了循环,将n的末位数字加到ans,之后n整除10,
直到n等于0停止;改之后利用了递归,一层层往下,直到n<10,返回n,之后再一层层往上返回。

task3

 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_s("%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 }
View Code

屏幕截图 2026-04-15 160542

问题1: 函数 power 的功能是什么?计算输入x的n次方为多少。
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
是。
微信图片_20260415161707_61_2

task4

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

屏幕截图 2026-04-15 103031

task5

task5_1

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

task5_2

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

屏幕截图 2026-04-15 163441

task6

 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     int t;
14     if (a <= b && a <= c)
15         t = a;
16     else if (b <= a && b <= c)
17         t = b;
18     else
19         t = c;
20     for (int i = t; i >=1; --i) {
21         if (a % i == 0 && b % i == 0 && c % i == 0)
22             return i;
23     }
24     return 1;
25 }
View Code

屏幕截图 2026-04-17 170854

 

 

task7

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void print_charman(int n);
 5 int main() {
 6     int n;
 7     printf("Enter n: ");
 8     scanf_s("%d", &n);
 9     print_charman(n); // 函数调用
10     return 0;
11 }
12 
13 void print_charman(int n) {
14     int m = 2 * n - 1;
15     for (int i = 0; i < n; ++i) {
16         for (int j = 0; j < i; ++j)
17             printf("\t");
18         for (int k = m-2*i; k >= 1; k--)
19             printf(" o \t");
20         printf("\n");
21         for (int j = 0; j < i; ++j)
22             printf("\t");
23         for (int k = m-2*i; k >= 1; k--) 
24             printf("<H>\t");
25         printf("\n");
26         for (int j = 0; j < i; ++j)
27             printf("\t");
28         for (int k = m-2*i; k >= 1; k--) 
29             printf("I I\t");
30         printf("\n\n");
31     }
32 }
View Code

屏幕截图 2026-04-18 131657

那么,问题来了,给出的框架中包含了头文件#include<stdlib,h>,而实际写下来并没有用到这个。管他呢,来点帅气的颜色吧(doge)。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void print_charman(int n);
 5 int main() {
 6     int n;
 7     printf("Enter n: ");
 8     scanf_s("%d", &n);
 9     print_charman(n); // 函数调用
10     return 0;
11 }
12 
13 void print_charman(int n) {
14     int m = 2 * n - 1;
15     system("color 8A");
16     for (int i = 0; i < n; ++i) {
17         for (int j = 0; j < i; ++j)
18             printf("\t");
19         for (int k = m-2*i; k >= 1; k--)
20             printf(" o \t");
21         printf("\n");
22         for (int j = 0; j < i; ++j)
23             printf("\t");
24         for (int k = m-2*i; k >= 1; k--) 
25             printf("<H>\t");
26         printf("\n");
27         for (int j = 0; j < i; ++j)
28             printf("\t");
29         for (int k = m-2*i; k >= 1; k--) 
30             printf("I I\t");
31         printf("\n\n");
32     }
33 }
View Code

屏幕截图 2026-04-18 132211

实验总结

1.task7想尝试一下是否能将一个小人作为一个整体,再写一个新的函数嵌套进去,在新的函数中,我利用了printf("\033[3A")试图将光标归位,但最后出来的小人身首分离(sorry啦)。于是我借助了AI的帮助(瞎写),最终小人的头离身体更远了。好吧,又是一次脑子一抽的尝试,但起码我对\033[A有了更多的了解。

2.嘿嘿,《c语言程序设计与游戏开发教程》到了,先来个精彩刺激的Q弹小球吧(当然得是绿色咯)。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<windows.h>
 4 int main() {
 5     int x = 0,y = 5;
 6     int left = 0, right = 50, top = 0, bottom = 20;
 7     int v_x = 1, v_y = 1;
 8     system("color 0A");
 9         
10     while (1) {
11         x += v_x;
12         y += v_y;
13         system("cls");
14         for (int i = 0; i <=bottom; ++i) {
15             for (int j = 0; j <= right; ++j) {
16                 if ((i == 0) || (i == bottom) || (j == 0) || (j == right))
17                     printf("#");
18                 else if(i == x&&j == y)
19                     printf("o");
20                 else
21                     printf(" ");
22             }
23             printf("\n");
24         }
25     
26         Sleep(20);
27 
28         if ((x == top) || (x == bottom)) {
29             v_x = -v_x;
30             Beep(700, 100);
31         }
32         if ((y == left) || (y == right)) {
33             v_y = -v_y;
34             Beep(900, 100);
35         }
36     }
37     return 0;
38 }
View Code

 屏幕截图 2026-04-18 145214

(视频咋传不上去呢,shift)

                                                                                                                             2026-04-18

posted @ 2026-04-18 14:33  dd-ding  阅读(9)  评论(0)    收藏  举报