实验3

实验任务1:

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

问题1:将同学们的分数转化成ABCDE的等级,形参类型是整形(int),返回值类型是字符型(char)。

问题2:有,1.  没有break,switch语句就会一直往下执行,分数高的同学会输出好几个等级。

2.  ABCD用的双引号,编译会出错

实验任务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 int sum_digits(int n){
17     int ans = 0;
18     while(n!=0){
19         ans += n%10;
20         n/=10;
21     } 
22     return ans;
23 }

问题1:sum_digits的功能是输出输入的n的各个数位上的和。

问题2:能,原因:更改后的代码用了函数调用的嵌套,将n循环整除10,直到n被整除到首位(此时只剩下一位),此时停止函数的嵌套,输出首位,并返回到上次的函数调用输出第二位,一直返回到最后,输出个位。

逻辑思维:一个是迭代,一个是递归。

实验任务3:

 1 #include<stdio.h>
 2 
 3 int power(int x,int n);
 4 
 5 int main(){
 6     int n,x;
 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 int power(int n,int x){
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 }

 

 问题1:power的功能是求x的n次幂

问题2:是递归函数,公式:x的(2k+1)次幂等于x的2k次幂*x;x的2k次幂等于x的k次幂的平方;任何非零数的0次幂都是1

实验任务4:

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

实验任务5:

 

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

 

实验任务6:

 1 #include <stdio.h>
 2 
 3 int func(int n, int m);
 4 
 5 int main() {
 6     int n, m;
 7     int ans;
 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 ans=1;
16     for(int j=1;j<=m;j++){
17         ans=ans*n;
18         n--;
19     }
20     for (m;m>0;--m){
21         ans=ans/m;
22     }
23     return ans;
24 }

 1 #include <stdio.h>
 2 
 3 int func(int n, int m);
 4 
 5 int main() {
 6     int n, m;
 7     int ans;
 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(n==m||m==0){
16         return 1;
17     }
18     else if(n<m){
19         return 0;
20     }
21     else{
22     return func(n-1,m)+func(n-1,m-1);
23     }
24 }

实验任务7:

 

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

 

 

posted @ 2024-10-29 15:35  朱文宇  阅读(8)  评论(0编辑  收藏  举报