实验三

实验任务1

代码:

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

截图:

 问题1:函数功能是将输入的分数转化为对应的字符等级,形参类型是int整型,返回值类型为char字符型

问题2:switch语句缺少break,使每个分支运行后会跳转到下一个分支而不是跳出选择,依次输出所有选项

 

实验任务2

代码:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int sum_digits(int n);  // 函数声明
 6 
 7 int main() {
 8     int n;
 9     int ans;
10 
11     while (printf("Enter n: "), scanf("%d", &n) != EOF) {
12         ans = sum_digits(n);    // 函数调用
13         printf("n = %d, ans = %d\n\n", n, ans);
14     }
15 
16     return 0;
17 }
18 
19 // 函数定义
20 int sum_digits(int n) {
21     int ans = 0;
22 
23     while (n != 0) {
24         ans += n % 10;
25         n /= 10;
26     }
27 
28     return ans;
29 }
View Code

截图:

 问题1:函数通过循环除以10取余得到每位数的数值并累加到ans

问题2:也可以,原本是循环先取余获得位数再相加,后者是判断先计算末尾再截取循环

 

 

实验任务3:

代码:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int power(int x, int n);    // 函数声明
 6 
 7 int main() {
 8     int x, n;
 9     int ans;
10 
11     while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {
12         ans = power(x, n);  // 函数调用
13         printf("n = %d, ans = %d\n\n", n, ans);
14     }
15 
16     return 0;
17 }
18 
19 // 函数定义
20 int power(int x, int n) {
21     int t;
22 
23     if (n == 0)
24         return 1;
25     else if (n % 2)
26         return x * power(x, n - 1);
27     else {
28         t = power(x, n / 2);
29         return t * t;
30     }
31 }
View Code

截图:

 问题1:函数是用于以第一个数为底,第二个数为幂的指数运算,同时定义幂指数为0时输出1

问题2:是,公式如下:

power(x,n)=1,n=0

power(x,n)=x Xpower(x,n-1),n为奇数

power(x,n)=power(x,n-1)Xpower(x,n-1),n为不为0的偶数

 

 

实验任务4

代码:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int is_prime(int n) {
 6     if (n < 2) {
 7         return 0;
 8     }
 9     for (int i = 2; i * i <= n; i++) {
10         if (n % i == 0) {
11             return 0;
12         }
13     }
14     return 1;
15 }
16 
17 int main() {
18     int count = 0;
19     printf("100以内的孪生素数:\n");
20     for (int i = 2; i + 2 <= 100; i++) {
21         if (is_prime(i) && is_prime(i + 2)) {
22             printf("%d, %d\n", i, i + 2);
23             count++;
24         }
25     }
26     printf("100以内的孪生素数共有%d个\n", count);
27     return 0;
28 }
View Code

截图:

 

 

实验任务5

代码:

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

截图:

 

 

 

实验任务6

代码(1):

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int func(int n, int m);   // 函数声明
 6 
 7 int main() {
 8     int n, m;
 9     int ans;
10 
11     while(scanf("%d%d", &n, &m) != EOF) {
12         ans = func(n, m);   // 函数调用
13         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
14     }
15         
16     return 0;
17 }
18 
19 // 迭代方式计算组合数
20 int func(int n, int m) {
21     if (m > n) return 0;
22     if (m == 0 || m == n) return 1;
23     int result = 1;
24     for (int i = 1; i <= m; i++) {
25         result *= (n - (m - i));
26         result /= i;
27     }
28     return result;
29 }
View Code

代码(2):

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int func(int n, int m);   // 函数声明
 6 
 7 int main() {
 8     int n, m;
 9     int ans;
10 
11     while(scanf("%d%d", &n, &m) != EOF) {
12         ans = func(n, m);   // 函数调用
13         printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
14     }
15         
16     return 0;
17 }
18 
19 // 递归方式计算组合数
20 int func(int n, int m) {
21     if (m > n) return 0;
22     if (m == 0 || m == n) return 1;
23     return func(n - 1, m) + func(n - 1, m - 1);
24 }
View Code

截图:

 

 

 

实验任务7

代码:

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include <stdio.h>
 3 
 4 // 函数声明
 5 int gcd(int a, int b, int c);
 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 min = a;
23     if (b < min)min = b;
24     if (c < min)min = c;
25 
26     for (int i = min; i >= 1; i--) {
27         if (a % i == 0 && b % i == 0 && c % i == 0) {
28             return i;
29         }
30     }
31     return 1;
32 }
View Code

截图:

 

posted @ 2025-04-07 16:08  朱云帅  阅读(3)  评论(0)    收藏  举报