1.实验任务1

task1.c

源代码

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

 

运行结果截图

task1.333.c

 

问题1:功能是输出学生的分数所对应的等级,90-100为A级,80-89为B级,70-79为C级,60-69为D,小于60分是E级

形参类型是整型,返回值类型是字符型。

问题2:缺少break语句,数据类型不匹配。

2.实验任务2

task2.c

源代码

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

运行结果截图

task2.333.c

 

问题1:将输入数字n的各位的数累加起来。

问题2:能实现同等效果,算法思维区别:前者使用了迭代的思维,后者则使用了递归的思维。

3.实验任务3

task3.c

源代码

 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("%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 // 函数定义
18 int power(int x, int n) {
19     int t;
20 
21     if(n == 0)
22         return 1;
23     else if(n % 2)
24         return x * power(x, n-1);
25     else {
26         t = power(x, n/2);
27         return t*t;
28     }
29 }

 

运行结果截图

task3.3333.c

 

问题1:计算出x的n次方即为xn

问题2:是递归函数,数学模型:函数

 

 

4.实验任务4

task4.c

源代码

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

 

运行结果截图

task4.33333.c

 

5.实验任务5

task5_1.c

源代码

 1 #include <stdio.h>
 2 int func(int n, int m);   // 函数声明
 3 
 4 int main() {
 5     int n, m;
 6     int ans;
 7 
 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 temp=1,i;
20     if(m>n){
21         return 0;
22     }
23     for(i=1;i<=n;i++)
24         temp*=i;
25 
26     for(i=1;i<=m;i++)
27         temp/=i;
28 
29     for(i=1;i<=(n-m);i++)
30         temp/=i;
31     return temp;
32 }

 

运行结果截图

task5

 

task5_2.c

源代码

 1 #include <stdio.h>
 2 int func1(int n, int m);   // 函数声明
 3 
 4 int main() {
 5     int n, m;
 6     int ans;
 7 
 8     while(scanf("%d%d", &n, &m) != EOF) {
 9         ans = func1(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 func1(int n, int m){
19     if(m>n)
20         return 0;
21     if(n==m)
22         return 1;
23     if(m==0)
24         return 1;
25     return func1(n-1,m)+func1(n-1,m-1);
26 }

 

运行结果截图

task5

 

 

6.实验任务6

task6.c

源代码

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

 

运行结果截图

task6.333.c

 

 

7.实验任务7

task7.c

源代码

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

 

运行结果截图

task7.3333.c

 

五.实验总结

学会了函数的完整使用,掌握了“声明-定义-调用”的流程,能把复杂的打印逻辑封装成独立函数,让代码更整洁。熟练用多层循环控制字符的排版和位置,能精准实现缩进、递减的小人阵列效果。关注了程序运行细节,比如用  system("pause")  解决窗口闪退问题,让程序更实用。 函数封装能降低代码修改难度,后续改小人样式只需调函数,不用动主逻辑,模块化确实很实用。复杂的循环排版要分步做,先实现核心效果,再优化格式和细节,这样不容易出错,也更易理清思路。