实验三

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

截图

问题

1.功能为:将输入的分数的大小按一定的范围返还不同的等级字符;形参类型为int,返回值类型为char

2.错误一:case语句中ans是char类型,而"A"这种是字符串类型,应该将双引号改为单引号

错误二:在case9~6 的每个语句的最后缺少break,导致各个范围的分数都会返回所有的等级字符

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

截图

问题

1.功能:计算输入整数的各位数字和

2.能实现同样功能。

原来的程序使用  while  循环。每次循环通过n%10得到 n 的个位数字并加到 ans中,然后再 n /= 10 去掉个位数字,不断循环,直到n变为0 。
新的程序使用递归。当n< 10时,直接返回 n;递归的情形的返回值一部分是n / 10 得到的数,对其调用 sum_digits 函数递归,另一部分是n%10得到的个位数,将这两部分相加,层层递归得到最终结果。

实验任务3

代码

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

截图

问题

1.功能:计算x的n次方

2.是递归函数。递归模式:当n=0时,power(x,n)=1; 当n为奇数时时,power(x,n)= x*power(x,n-1);当n为偶数时,power(x,n)=power(x,n/2)*power(x,n/2)

实验任务4

代码

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

截图

实验任务5

代码

 1 #include <stdio.h>
 2 
 3 int hanoi(unsigned int n, char from, char temp, char to);
 4 void moveplate(unsigned int n, char from, char to);
 5 
 6 int main()
 7 {
 8     unsigned int n;
 9     while(scanf("%u", &n) != EOF)
10     {
11         int count = hanoi(n, 'A', 'B', 'C');
12         printf("\n\n");
13         printf("一共移动了%d次\n\n", count);
14     }
15     return 0;
16 }
17 
18 int hanoi(unsigned int n, char from, char temp, char to)
19 {
20     int count = 0;
21 
22     if(n == 1)
23     {
24         moveplate(n, from, to);
25         count++;
26     }
27     else
28     {
29         count += hanoi(n-1, from, to, temp);
30         moveplate(n, from, to);
31         count++;
32         count += hanoi(n-1, temp, from, to);
33     }
34     return count;
35 }
36 
37 void moveplate(unsigned int n, char from, char to)
38 {
39     printf("%u: %c --> %c\n", n, from, to);
40 }
View Code

截图

实验任务6

代码

task6_1.c

 1 #include <stdio.h>
 2 
 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     
14     return 0;
15 }
16 
17 // 函数定义
18 int func(int n, int m){
19     int i,j,up,down;
20     up=down=1;
21     if(m==0)
22         return 1;
23     if(n<m)
24         return 0;
25     if(n==m)
26         return 1;
27     for(i=n;i>=n-m+1;--i)
28         up*=i;
29     for(j=m;j>=1;--j)
30         down*=j;
31     return up/down;}
View Code

task6_2.c

 1 #include <stdio.h>
 2 
 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     
14     return 0;
15 }
16 
17 // 函数定义
18 int func(int n, int m){
19     if(m==0)
20         return 1;
21     if(n<m)
22         return 0;
23     if(n==m)
24         return 1;
25     
26     return func(n-1, m)+func( n-1,  m-1);}
View Code

截图

task6_1

task6_2

实验任务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     
24     if (b<a){
25         if(b<c)
26             i=b;
27         else
28             i=c;}
29     else{
30         if(c<a)
31             i=c;}
32     for(i;i>0;--i){
33         if(a%i==0&&b%i==0&&c%i==0)
34             return i;}
35 }
View Code

截图

 

posted @ 2025-04-07 12:19  在下广  阅读(16)  评论(0)    收藏  举报