实验三
任务一
源代码
1 #include <stdio.h> 2 char score_to_grade(int score); 3 int main(){ 4 int score; 5 char grade; 6 while(scanf("%d",&score)!=EOF){ 7 grade=score_to_grade(score); 8 printf("分数:%d,等级:%c\n\n",score,grade); 9 10 11 12 } 13 14 15 return 0; 16 } 17 char score_to_grade(int score){ 18 char ans; 19 switch(score/10){ 20 case 10: 21 case 9: ans='A';break; 22 case 8: ans='B';break; 23 case 7: ans='C';break; 24 case 6: ans='D';break; 25 default: ans='E'; 26 } 27 28 29 return ans; 30 31 32 33 }
截图
问题一:score_to_grade的作用是把输入的分数按等级输出;形参类型是int,返回类型是char.
问题二:程序修改后有问题,无论输入什么数值,最后返回值都为'E'。
任务二
源代码
1 #include <stdio.h> 2 int sum_digits(int n); 3 int main(){ 4 int n; 5 int ans; 6 while(printf("Enter n:"),scanf("%d",&n)!=EOF){ 7 ans=sum_digits(n); 8 printf("n=%d,ans=%d\n\n",n,ans); 9 } 10 return 0; 11 } 12 int sum_digits(int n){ 13 int ans=0; 14 while(n!=0){ 15 ans+=n%10; 16 n/=10; 17 } 18 return ans; 19 20 }
截图
问题一:函数sum_digits的功能是计算一个数的所有数位上数字的和
问题二:能实现同等效果。方式一的算法思维是迭代,方式二是递归。
任务三
源代码
1 #include <stdio.h> 2 int power(int x, int n); 3 int main() { 4 int x, n; 5 int ans; 6 while (printf("Enter x and n:"), scanf("%d %d", &x, &n) != EOF) { 7 ans = power(x, n); 8 printf("n=%d,ans=%d\n\n", n, ans); 9 } 10 return 0; 11 } 12 int power(int x, int n) { 13 int t; 14 if (n == 0) 15 return 1; 16 else if (n % 2) 17 return x * power(x, n - 1); 18 else { 19 t = power(x, n / 2); 20 return t * t; 21 } 22 }
截图
问题一:函数power的功能是计算一个数的n次方
问题二:
任务四
源代码
1 #include <stdio.h> 2 int is_prime(int n); 3 int main(){ 4 printf("100以内的孪生素数:\n"); 5 int count=0; 6 for(int n=1;n<=100;n++){ 7 if(is_prime(n)&&is_prime(n+2)){ 8 printf("%d %d\n",n,n+2); 9 count+=1; 10 } 11 12 } 13 printf("100以内的孪生素数共有%d个",count); 14 return 0; 15 } 16 int is_prime(int n){ 17 if(n==1) 18 return 0; 19 int i=2; 20 for(;i<=n/2;i++){ 21 if(n%i==0) 22 return 0; 23 24 25 26 27 } 28 if(i>n/2) 29 return 1; 30 31 }
截图
任务五
源代码
1 #include <stdio.h> 2 void hanoi(unsigned int n,char from,char temp,char to); 3 void moveplate(unsigned int n,char from,char to); 4 int count=0; 5 int main(){ 6 unsigned int n; 7 8 while(scanf("%u",&n)!=EOF){ 9 count=0; 10 hanoi(n,'A','B','C'); 11 printf("\n一共移动了%d次\n",count); 12 13 } 14 15 16 17 18 return 0; 19 } 20 void hanoi(unsigned int n,char from,char temp,char to){ 21 if(n==1) 22 moveplate(n,from,to); 23 else{ 24 hanoi(n-1,from,to,temp); 25 moveplate(n,from,to); 26 hanoi(n-1,temp,from,to); 27 } 28 29 } 30 31 void moveplate(unsigned int n,char from,char to){ 32 33 printf("%u:%c-->%c\n",n,from,to); 34 count+=1; 35 }
截图
任务六
迭代
源代码
1 #include <stdio.h> 2 int func(int n,int m); 3 int power(int n); 4 int main(){ 5 int n,m; 6 int ans; 7 while(scanf("%d%d",&n,&m)!=EOF){ 8 ans=func(n,m); 9 printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); 10 } 11 return 0; 12 } 13 int func(int n,int m){ 14 if(m>n) 15 return 0; 16 if(n==m||m==0) 17 return 1; 18 else 19 return power(n)/(power(m)*power(n-m)); 20 } 21 int power(int n){ 22 int ans; 23 ans=1; 24 int flag_n; 25 flag_n=n; 26 if(n==0) 27 ans=1; 28 else{ 29 for(int i=1;i<=n;i++){ 30 ans*=flag_n; 31 flag_n-=1; 32 33 } 34 } 35 36 return ans; 37 38 }
截图
递归
源代码
1 #include <stdio.h> 2 int func(int n,int m); 3 int power(int n); 4 int main(){ 5 int n,m; 6 int ans; 7 while(scanf("%d%d",&n,&m)!=EOF){ 8 ans=func(n,m); 9 printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); 10 } 11 return 0; 12 } 13 int func(int n,int m){ 14 if(m>n) 15 return 0; 16 if(n==m||m==0) 17 return 1; 18 else 19 return func(n-1,m)+func(n-1,m-1); 20 }
1 #include <stdio.h> 2 int func(int n,int m); 3 int power(int n); 4 int main(){ 5 int n,m; 6 int ans; 7 while(scanf("%d%d",&n,&m)!=EOF){ 8 ans=func(n,m); 9 printf("n=%d,m=%d,ans=%d\n\n",n,m,ans); 10 } 11 return 0; 12 } 13 int func(int n,int m){ 14 if(m>n) 15 return 0; 16 if(n==m||m==0) 17 return 1; 18 else 19 return func(n-1,m)+func(n-1,m-1); 20 }
截图
任务七
源代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 void print_charman(int n); 4 int main(){ 5 int n; 6 printf("Enter n: "); 7 scanf("%d",&n); 8 print_charman(n); 9 return 0; 10 } 11 void print_charman(int n){ 12 int i,j,k,flag_n; 13 flag_n=n; 14 for(;flag_n>0;flag_n--){ 15 for(i=0;i<n-flag_n;i++) 16 printf("\t"); 17 for(i=1;i<=(2*flag_n-1);i++){ 18 printf(" O \t"); 19 } 20 printf("\n"); 21 for(j=0;j<n-flag_n;j++) 22 printf("\t"); 23 for(j=1;j<=(2*flag_n-1);j++){ 24 printf("<H>\t"); 25 } 26 printf("\n"); 27 for(k=0;k<n-flag_n;k++) 28 printf("\t"); 29 for(k=1;k<=(2*flag_n-1);k++){ 30 printf("I I\t"); 31 } 32 printf("\n"); 33 34 } 35 36 37 38 39 40 41 42 }
截图