实验3

任务1

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 
 4 char score_to_grade(int score);  // 函数声明
 5 
 6 int main() {
 7     int score;
 8     char grade;
 9 
10     while(scanf("%d", &score) != EOF) {
11         grade = score_to_grade(score);  // 函数调用
12         printf("分数: %d, 等级: %c\n\n", score, grade);
13     }
14 
15     return 0;
16 }
17 
18 // 函数定义
19 char score_to_grade(int score) {
20     char ans;
21 
22     switch(score/10) {
23     case 10:
24     case 9:   ans = 'A'; break;
25     case 8:   ans = 'B'; break;
26     case 7:   ans = 'C'; break;
27     case 6:   ans = 'D'; break;
28     default:  ans = 'E';
29     }
30     system("pause");
31     return ans;
32 }

问题1: 90分及以上赋等级为A;80-90赋为B;70-80赋为C;60-70赋为D;60以下赋为E     形参为整型  返回值类型为字符型

问题2:1.字母为字符型应用'   ',而不应用字符串"   "

             2.少了四个break; 会导致运行时从一个case  进入后执行当层,也执行接下来的case 分支,将ans 最后赋为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 // 函数定义
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 }

问题1:将输入数字的各位数相加

问题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 // 函数定义
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 }

 

问题1:实现x的n次方计算

问题2:

 

 

 

任务4:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<math.h>
 4 int is_prime(int m);
 5 int main()
 6 {
 7    int i=1;
 8    int a,b,sum=0;
 9    printf("100以内的孪生素数:\n");
10    for(i=2;i<=98;++i)
11      {  a=is_prime(i);
12         b=is_prime(i+2);
13         if(a && b)
14             {printf("%d,%d\n", i,i+2);
15              sum=sum+1;
16             }
17    }
18    
19        printf("总数为%d\n", sum);
20        system("pause");
21            return 0;
22 }
23 
24 int is_prime(int m){
25     int i;
26     for(i=2;i<=m/2;++i)
27         if(m%i==0)
28           break;
29     if(i>m/2)
30         return 1;
31     else
32         return 0;
33 
34 
35 
36 
37 }

任务5

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int count = 0; 
 5 
 6 
 7 void hanoi(int n, char A, char B, char C) {
 8     if (n == 1) {
 9         printf("1: %c --> %c\n", A, C);
10         count++;
11     } else {
12         hanoi(n - 1, A, C, B);
13         printf("%d: %c --> %c\n", n, A, C);
14         count++;
15         hanoi(n - 1, B, A, C);
16     }
17 }
18 
19 int main() {
20     int n;
21     while (scanf("%d", &n) != EOF) {
22         count = 0;
23         hanoi(n, 'A', 'B', 'C');
24         printf("一共移动了%d次.\n", count);
25     }
26     system("pause");
27     return 0;
28 }

 

任务6

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 int func(int n, int m);   // 函数声明
 4 
 5 int main() {
 6     int n, m;
 7     int ans;
 8 
 9     while(scanf("%d%d", &n, &m) != EOF) {
10         ans = func(n, m);   // 函数调用
11         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
12     }
13         system("pause");
14     return 0;
15 }
16 
17 // 函数定义
18 // 待补足。。。(分别用迭代和递归实现)
19 int func(int n, int m) // 函数声明
20 {
21     int i,j,up=1,down=1,a;
22     if(m>n)
23         {a=0;
24     return a;}
25     if(m==0|| m==n)
26     { a=1;
27     return a;}
28     for(i=1;i<=m;++i)
29         {up=up*(n-i+1);
30     down=down*i;}
31         a=up/down;
32      return a;
33 
34 
35 }

 

 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 int func(int n, int m)
18 {    
19     int ans;
20     if (n < m) {
21         return 0;
22     }
23     if (m == 0 || m == n) {
24         return 1;
25     }
26     
27     return func(n - 1, m) + func(n - 1, m - 1);
28     
29 }

任务7

 1 #include <stdio.h>
 2 
 3 
 4 int gcd(int a, int b, int c);
 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 int gcd(int a, int b, int c) {
22     int i=a;
23     if (i > b) {
24         i = b;
25         if (i > c) {
26             i = c;
27         }
28     }
29     for (; i > 0; --i) {
30         if (a % i == 0 && b % i == 0 && c % i == 0) {
31             return i;
32         }
33     }
34 
35 }

实验结论:知道大概的思路,写起来还是会有各种漏洞,同时写的时候要顾全所有情况,在任务6中,一开始就只关注了主函数,没有考虑特殊情况。

posted @ 2025-04-10 07:35  雾曦  阅读(30)  评论(0)    收藏  举报