实验3

任务1

源代码

 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 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-16 192912

回答问题

问题1:函数score_to_grade的功能是把各个段的成绩分成不同等级,形参类型是整型,返回值类型是字符型

问题2:①单个字符常量应该使用单引号('),修改为双引号后编译报错

           ②case分支缺少break语句,修改后无论输入的分数是多少最终都会执行default,返回等级均为E

任务2

源代码

 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 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-16 195419

回答问题

问题1:函数sum_digits的功能是计算输入数字的各数位数字的和

问题2:修改代码后能实现同样的输出,修改前的代码应用的是递推思维的迭代法,修改后的代码用了函数自调用的递归法

任务3

源代码

 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 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-16 204637

回答问题

问题1:函数power的功能是求x的n次方

问题2:函数power是递归函数

23A2B16A6A442EA4A044BB9FD0468F87

任务4

源代码

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

运行结果截图

屏幕截图 2026-04-16 220708

 

任务5

迭代方式

源代码

 1 #include<stdio.h>
 2 
 3 int func(int n,int m);
 4 
 5 int main(){
 6     int n,m;
 7     int ans;
 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     return 0;
13 }
14 
15 int func(int n,int m){
16     if(m>n)
17     return 0;
18     if(m==0||m==n)
19     return 1;
20     if(m>n-m)
21     m=n-m;
22     int result=1;
23     int i;
24     for(i=1;i<=m;i++){
25         result=result*(n-m+i)/i;
26     }
27     return result;
28 }
View Code

运行结果截图

屏幕截图 2026-04-18 155707

 

递归方程

源代码

 1 #include<stdio.h>
 2 
 3 int func(int n,int m);
 4 
 5 int main(){
 6     int n,m;
 7     int ans;
 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     return 0;
13 }
14 
15 int func(int n,int m){
16     if(m>n)
17     return 0;
18     if(m==0||m==n)
19     return 1;
20     
21     return func(n-1,m)+func(n-1,m-1); 
22 }
View Code

运行结果截图

屏幕截图 2026-04-18 155328

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

运行结果截图

屏幕截图 2026-04-18 162807

任务7

源代码

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void print_charman(int n);
 5 void print_one_head();
 6 void print_one_body();
 7 void print_one_leg();
 8 
 9 int main(){
10     int n;
11     printf("Enter n:");
12     scanf("%d",&n);
13     print_charman(n);
14     
15     return 0;
16 }
17 void print_one_head(){
18     printf(" O\t");
19 }
20 void print_one_body(){
21     printf("<H>\t");
22 }
23 void print_one_leg(){
24     printf("I I\t");
25 }
26 void print_charman(int n){
27     int i,j,k;
28    for(i=0;i<n;i++){
29        for(j=0;j<i;j++){
30            printf("\t");
31        }
32     for(k=2*n-2*i-1;k>=1;k--){
33         print_one_head();
34     }  
35     for(j=0;j<i;j++){
36            printf("\t");
37        }
38     printf("\n");   
39        for(j=0;j<i;j++){
40            printf("\t");
41        }
42     for(k=2*n-2*i-1;k>=1;k--){
43         print_one_body();
44     }  
45     for(j=0;j<i;j++){
46            printf("\t");
47        }
48     printf("\n");   
49        for(j=0;j<i;j++){
50            printf("\t");
51        }
52     for(k=2*n-2*i-1;k>=1;k--){
53         print_one_leg();
54     }  
55     for(j=0;j<i;j++){
56            printf("\t");
57        }
58     printf("\n");   
59    } 
60 }
View Code

运行结果截图

屏幕截图 2026-04-18 211252

 

posted @ 2026-04-18 21:13  thinkbout  阅读(9)  评论(0)    收藏  举报