实验3

实验结论


 

任务一

源代码:

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

运行截图:

屏幕截图 2026-04-17 150420

 

问题1:根据用户输入的成绩按照已定好的规则分级,并将等级赋值给“ans”,然后返回“ans”;

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

问题2:① line3~line6,后面缺少break,那么当这个值比较大的时候,将会执行下面所有情况

            ② line3~line6,ABCD用的是双引号,这样的话,将赋不了值给ans,将会报错


 

任务二

源代码:

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

运行截图:

屏幕截图 2026-04-17 150740

 

问题1:把用户输入的数字的每一位相加,并返回最后的结果

问题2:可以,原来的是利用循环算出每一位的值,并把它加到ans,改后的版本则是利用递归调用,把一个比较大的数拆分成更小的,在本题中就像小数点不断向更高位挪动,一直调用自己重复计算


 

任务三

源代码:

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

运行截图:

屏幕截图 2026-04-17 151137

问题1:计算整数x的n(n>=0)次方

问题2:是,x^n=x*x*(n-1),n为奇数和x^n=[x^(n/2)]^2,n为偶数


 

任务四

源代码:

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

运行截图:

屏幕截图 2026-04-17 151521


 

任务五

迭代方式源代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int func(int n,int m);
 4 int main()
 5 {
 6     int n,m;
 7     int ans;
 8 
 9     while(scanf("%d%d",&n,&m)!=EOF)
10     {
11         ans=func(n,m);
12         printf("n=%d,m=%d,ans=%d\n\n",n,m,ans);
13     }
14     system("pause");
15     return 0;
16 }
17 int func(int n,int m)
18 {
19     int i,j;
20     int a=1,b=1;
21     for(i=1;i<=m;i++)
22     {
23         a=a*i;
24     }
25     for(j=n;j>=n-m+1;j--)
26     {
27         b=b*j;
28      }
29     return b/a;
30 }
View Code

迭代方式运行截图:

屏幕截图 2026-04-17 154201

递归方式源代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int func(int n,int m);
 5 
 6 int main()
 7 {
 8     int n,m;
 9     int ans;
10 
11     while(scanf("%d%d",&n,&m)!=EOF)
12     {
13     ans=func(n,m);
14     printf("n=%d,m=%d,ans=%d\n\n",n,m,ans);
15     
16     }
17    system("pause");
18    return 0;
19 }
20 
21 int func(int n,int m)
22 {
23     if(n==1)
24       return 1;
25     if(n==2)
26     {
27     if(m==2||m==0)
28         return 1;
29     if(m==1)
30         return 2;
31     }    
32     if(m==0)
33         return 1;
34     return func(n-1,m)+func(n-1,m-1);
35 }
View Code

递归方式运行截图:

屏幕截图 2026-04-17 161259


 

 任务六

源代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int gcd(int a,int b,int c);
 4 int main()
 5 {
 6     int a,b,c;
 7     int ans;
 8 
 9     while(scanf("%d%d%d",&a,&b,&c)!=EOF)
10     {
11         ans=gcd(a,b,c);
12         printf("最大公约数:%d\n\n",ans);
13     }
14 
15    system("pause");
16    return 0;
17 }
18 
19 int gcd(int a,int b,int c)
20 {
21     int i,m,q,w,e;
22     q=a;
23     w=b;
24     e=c;
25     if(a>=b)
26     {
27         if(b>=c)
28             m=c;
29         else
30             m=b;
31     }
32     else
33     {
34         if(a>=c)
35             m=c;
36         else
37             m=a;
38     }
39     for(i=m;i>=1;i--)
40     {
41         if(q%i==0&&w%i==0&&e%i==0)
42             return i;
43     }
44 }
View Code

运行截图:

屏幕截图 2026-04-17 210932


 

任务七

源代码:

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

运行截图:

屏幕截图 2026-04-17 225929


 

实验总结

1. 任务5,对于递归调用出口有了全新的认识——就是分到算不了为止,像x的n次方,最后就是n=0是结束,还有本任务中,出口就是一些分不了的组合数(m-1>0,n>2之类的)

2.任务7,复杂的东西要一步一步改,不断地根据运行结果去修改代码,同时理解每一行的作用,并逐步向给定结果靠拢

posted @ 2026-04-19 23:19  dfuty  阅读(10)  评论(0)    收藏  举报