实验3

实验任务1

源代码task1.c

 1 #include <stdio.h>
 2 char score_to_grade(int score);
 3 int main() {
 4   int score;
 5   char grade;
 6   while(scanf("%d", &score) != EOF) {
 7     grade = score_to_grade(score);
 8     printf("分数: %d, 等级: %c\n\n", score, grade);
 9   }
10   return 0;
11 }
12 char score_to_grade(int score) {
13   char ans;
14   switch(score/10) {
15   case 10:
16   case 9:  ans = 'A'; break;
17   case 8:  ans = 'B'; break;
18       case 7:  ans = 'C'; break;
19   case 6:  ans = 'D'; break;
20   default:  ans = 'E';
21   }
22   return ans;
23 }
View Code

 运行结果截图

捕获1

问题1:

1.函数 score_to_grade 的功能是:根据输入的百分制分数,将其转换为对应的等级字符(A/B/C/D/E)。

2. 形参类型

形参:int score,类型为 int(整型),表示输入的百分制分数。

3. 返回值类型

返回值:char ans,类型为 char(字符型),表示转换后的等级字符。

问题2:

1.缺少break语句

2.赋值类型错误:用字符串常量 "A" 给字符变量赋值

实验任务2

源代码task2.c

 1 #include <stdio.h>
 2 int sum_digits(int n);
 3 int main() {
 4   int n;
 5   int ans;
 6   while(printf("Enter n: "), scanf("%d", &n) != EOF) {
 7     ans = sum_digits(n); 
 8     printf("n = %d, ans = %d\n\n", n, ans);
 9   }
10   return 0;
11 }
12 int sum_digits(int n) {
13   int ans = 0;
14   while(n != 0) {
15     ans += n % 10;
16     n /= 10;
17   }
18   return ans;
19 }
View Code

运行结果截图

捕获2

问题1:

sum_digits 函数的功能是:计算一个整数 n 的所有各位数字之和。

问题2:

能实现同样的输出。

迭代法:通过while循环重复执行“取个位、累加、去掉个位”三步,直到数字为0 

递归法:把“求n的各位和”拆成“求n/10的各位和 + n的个位”,直到满足n<10的终止条件,再层层回溯相加

实验任务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 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

运行结果截图

23

 问题1:

power(x, n) 函数的功能是:计算整数 x 的 n 次幂

 问题2:

是递归函数。运用了分治的递归模式,核心是按指数奇偶性分治。

IMG_086

实验任务4

源代码task4.c

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

 运行结果截图

24

实验任务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     return 0;
13 }
14 int func(int n, int m){
15     int i;
16     int result = 1;
17     if(m < 0||m > n)
18         return 0;
19     if(m == 0||m == n)
20         return 1;
21      
22     for( i = 1;i <= m; ++i){
23         result = result * (n - m + i) / i;
24     }
25     return result;
26 }
View Code

运行结果截图

26

递归方式task5_2.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     return 0;
13 }
14 int func(int n, int m){
15     if(m>n||m<0)
16         return 0;
17     if(m==0||m==n)
18         return 1;
19     return func(n-1,m)+func(n-1,m-1);
20 }
View Code

运行结果截图

25

实验任务6

源代码task6.c

 1 #include <stdio.h>
 2 int gcd(int a, int b, int c);
 3  
 4 int main(){
 5     int a, b, c;
 6     int ans;
 7      
 8     while(scanf("%d%d%d", &a, &b, &c) !=  EOF){
 9         ans = gcd(a, b, c);
10         printf("最大公约数:%d\n\n", ans);
11     }
12     return 0;
13 }
14 int gcd(int a, int b, int c){
15     int i = a;
16     if(b < i)
17         i = b;
18     if(c < i)
19         i = c;
20     for(i; i >= 1; --i){
21         if(a % i == 0 && b % i == 0 && c % i == 0){
22             return i;
23         }
24     }
25     return 1;
26 }
View Code

运行结果截图

27

实验任务7

源代码task7.c

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

运行结果截图

28

 运行结果截图

30

 

posted @ 2026-04-21 15:03  wuhahahaha  阅读(13)  评论(0)    收藏  举报