作业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 // 函数定义
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 }

 

运行结果

问题1.函数 score_to_grade 的功能是根据输入的分数转换为对应的等级,形参类型是整型,返回值类型是字符。

问题2. 1.case后面没有了break,会执行后面的所有语句。

    2.单个字符需要用'  '进行引用

 

实验任务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;函数sum_digits的功能是将输入数字n各个位数上面的数字进行代数相加

问题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:函数的功能是进行幂指数的运算

问题2:是递归函数

    

实验任务4

代码

 1 #include <stdio.h>
 2 #include <math.h>
 3 int is_prime(int n);
 4 
 5 int main() {
 6     printf("100以内的了孪生素数\n");
 7     int n = 5;
 8     int sum = 0;
 9     while (n < 100) {
10         if (is_prime(n) == 1 && is_prime(n - 2) == 1) {
11             sum++;
12             printf("%d %d\n", n - 2, n);
13         }
14         n += 2;
15     }
16     printf("100以内的了孪生素数共有%d个", sum);
17     return 0;
18 }
19 
20 int is_prime(int n) {
21     int i = 2;
22     while (i <= n / 2) {
23         if ((n % i) != 0)i++;
24         if ((n % i) == 0)return 0;
25     }
26     return 1;
27 }

运行结果

 

 

实验任务5

代码

 1 #include<stdio.h>
 2 
 3 int hanio(int n, char f, char a, char t, int *c);
 4 void move(int n, char f, char t, int *c);//周一老师讲了后,用全局变量更好一些
 5 
 6 int main() {
 7     int n;
 8     int count;
 9     while (scanf ("%d", &n) != EOF) {
10         count = 0;
11         count = hanio(n, 'A', 'B', 'C', &count);
12         printf("一共移动了%d次\n\n", count);
13     }
14     return 0;
15 
16 }
17 
18 int hanio(int n, char f, char a, char t, int *c) {
19 
20     if (n == 1) {
21         move(n, f, t, c);
22 
23     } else {
24         hanio(n - 1, f, t, a, c);
25         move(n, f, t, c);
26         hanio(n - 1, a, f, t, c);
27     }
28     return *c;
29 }
30 
31 void  move(int n, char f, char t, int* c) {
32     printf("%d:%c-->%c\n", n, f, t);
33     (*c) ++;
34 }

运行结果

 实验任务6

代码1

 1 #include <stdio.h>
 2 int func(int n, int m);   // 函数声明
 3 int main() {
 4     int n, m;
 5     int ans;
 6     while (scanf("%d%d", &n, &m) != EOF) {
 7         ans = func(n, m);   // 函数调用
 8         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
 9     }
10 
11     return 0;
12 }
13 
14 int func(int n, int m) {
15     int a = 1 ;
16     for (int i = 1; i <= n; i++)a = a * i ;
17     int b = 1;
18     for (int i = 1; i <= m; i++)b =b * i ;
19      int c =1;
20     n = n - m;
21      for (int i = 1; i <= n; i++)c=c* i ;
22      m = a/(b*c);
23     return m;
24 }

运行结果1

 代码2

 1 #include <stdio.h>
 2 int func(int n, int m);   // 函数声明
 3 int main() {
 4     int n, m;
 5     int ans;
 6     while (scanf("%d%d", &n, &m) != EOF) {
 7         ans = func(n, m);   // 函数调用
 8         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
 9     }
10 
11     return 0;
12 }
13 
14 int func(int n, int m) {
15     if (m > n) return 0;
16     else if (m == 0 || m == n) return 1;
17     return func(n - 1, m) + func(n - 1, m - 1);
18 }

 

运行结果2

 实验7

代码

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

运行结果

 实验感想:更加体会理解了递归函数的使用和流程,用递归表示会让代码很简单,但比较难以理解。此外,递归中全局变量的使用有时也至关重要。

posted @ 2025-04-07 20:13  JXBwinner  阅读(26)  评论(0)    收藏  举报