实验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、在条件的后面缺少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的功能是将一个正整数的每一位数相加求和。
问题2:可以实现同等效果。
修改之前是使用迭代的方法,将n的每一位数逐个相加;修改之后,使用递归的方法,将一个i位数n的每一位相加转化成(i-1)位数的每一位和加上它原来的个位上的数。
任务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:函数power的功能是计算x的n次方的值。
问题2:是。
任务4:
源代码
1 #include <stdio.h> 2 3 int is_prime(int n); 4 5 int main(){ 6 int a,b,i,count=0; 7 printf("100以内的孪生素数:\n"); 8 for(i=1;i<=100;i++){ 9 if(is_prime(i)&&is_prime(i+2)){ 10 a = i; 11 b = i+2; 12 printf("%d %d\n",a,b); 13 count+=1;} 14 } 15 printf("100以内的孪生素数共有%d个。",count); 16 17 return 0; 18 } 19 20 int is_prime(int n){ 21 int j; 22 if(n==1) 23 return 0; 24 else{ 25 for(j = 2;j<=n/2;j++) 26 if(n%j==0) 27 return 0; 28 if(j>n/2) 29 return 1; 30 } 31 }
任务5:
源代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 void 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 unsigned int n; 8 while(scanf("%u",&n)!=EOF){ 9 hanoi(n,'A','B','C'); 10 extern int count; 11 printf("\n一共移动了%d次。\n\n",count); 12 count = 0;} 13 return 0; 14 } 15 void hanoi(unsigned int n,char from,char temp,char to){ 16 if(n==1) 17 moveplate(n,from,to); 18 else{ 19 hanoi(n-1,from,to,temp); 20 moveplate(n,from,to); 21 hanoi(n-1,temp,from,to); 22 } 23 } 24 int count = 0; 25 void moveplate(unsigned int n,char from,char to){ 26 printf("%u:%c-->%c\n",n,from,to); 27 count+=1; 28 }
任务6:
源代码1
1 #include <stdio.h> 2 int func(int n,int m); 3 4 int main(){ 5 int n,m; 6 int ans; 7 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 13 return 0; 14 } 15 16 int func(int n,int m){ 17 int i,j,ans = 1; 18 for(i = n;i>=n-m+1;i--) 19 ans*=i; 20 for(j = m;j>=1;j--) 21 ans/=j; 22 return ans; 23 }
源代码2:
1 #include <stdio.h> 2 int func(int n,int m); 3 4 int main(){ 5 int n,m; 6 int ans; 7 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 13 return 0; 14 } 15 16 int func(int n,int m){ 17 if(n<m) 18 return 0; 19 else if(m == 0||n == m) 20 return 1; 21 else 22 return func(n-1,m)+func(n-1,m-1); 23 }
任务7:
源代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void print_charman(int n); 5 6 int main(){ 7 int n; 8 printf("Enter n:"); 9 scanf("%d",&n); 10 print_charman(n); 11 12 return 0; 13 } 14 15 void print_charman(int n){ 16 int i,j,k,x; 17 x = n; 18 for(i = 1;i<=n;i++){ 19 for(k = 1;k <=n-x;k++) 20 printf("\t"); 21 for(j = 2*x-1;j>=1;j--){ 22 printf(" O \t"); 23 if(j == 1) 24 printf("\n");} 25 for(k = 1;k <=n-x;k++) 26 printf("\t"); 27 for(j = 2*x-1;j>=1;j--){ 28 printf("<H>\t"); 29 if(j == 1) 30 printf("\n");} 31 for(k = 1;k <=n-x;k++) 32 printf("\t"); 33 for(j = 2*x-1;j>=1;j--){ 34 printf("I I\t"); 35 if(j == 1) 36 printf("\n");} 37 x-=1; 38 } 39 }