实验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 }