实验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 }

问题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 }

问题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 }

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

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 }

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 }
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 }

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 }

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 }

那么,问题来了,给出的框架中包含了头文件#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 }

实验总结
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 }

(视频咋传不上去呢,shift)
2026-04-18

浙公网安备 33010602011771号