实验三
实验任务1: task1.c源代码:
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 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';break; 26 } 27 return ans; 28 }
运行结果:
回答问题:
问题1:
score_to_grade函数的功能是运用分支结构判断成绩的等级
问题2:
没有了break语句,case语句就会接着往下执行直到default语句为止,比如,输入85的话,程序会输出BCDE
实验任务2:
task2.c源代码:
1 #include <stdio.h> 2 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 }
运行结果:
回答问题:
问题1:
函数sum_digits(int n)的功能是将整数分解,再输出每个数位上的数字的和
问题2:
能实现同等效果,前者是迭代算法,后者是递归算法
实验任务3:
task3.c源代码:
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 }
运行结果:
回答问题:
问题1:
函数power的功能是实现x的幂运算
问题2:
是递归模式,当n等于0时,输出1;当n大于0时,返回值为x再乘以x(n个)
数学公式:
实验任务4:
task4.c源代码:
1 #include <stdio.h> 2 3 int is_prime(int n); 4 5 int main() 6 { 7 int n=4; 8 int count=0; 9 10 printf("100以内的孪生素数:\n"); 11 12 for (n=4;n<=100;n++){ 13 if(is_prime(n)==1 && is_prime(n-2)) { 14 printf("%d %d\n",n,n-2); 15 count++; 16 } 17 } 18 printf("100以内的孪生素数共有%d个",count); 19 return 0; 20 } 21 22 int is_prime(int n) 23 { 24 int i=2; 25 for(i=2;i<n;i++) 26 { 27 if(n%i==0) return 0; 28 } 29 return 1; 30 }
运行结果:
实验任务5:
task5.c源代码:
1 #include <stdio.h> 2 void move(int n,char start,char end); 3 void hanoi(int n,char start,char temp,char end); 4 int count=0; 5 6 int main(){ 7 int n; 8 while (scanf("%d",&n)!=EOF) 9 { 10 hanoi(n,'A','B','C'); 11 printf("一共移动了%d次\n",count); 12 count=0; 13 } 14 return 0; 15 } 16 void hanoi(int n,char start,char temp,char end) 17 { 18 if (n==1){ 19 move(n,start,end); 20 } 21 else { 22 hanoi(n-1,start,end,temp); 23 move(n,start,end); 24 hanoi(n-1,temp,start,end); 25 } 26 27 } 28 void move(int n,char start,char end){ 29 printf("%d:%c-->%c\n",n,start,end); 30 count++; 31 }
运行结果:
实验任务6:
task6_1.c源代码:
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 return 0; 13 } 14 int func(int n,int m){ 15 int i,a=1,b=1,c=1; 16 for (i=1;i<=n;i++){ 17 a*=i; 18 } 19 for (i=1;i<=m;i++){ 20 b*=i; 21 } 22 for (i=1;i<=n-m;i++){ 23 c*=i; 24 } 25 return a/b/c; 26 }
运行结果:
task6_2.c源代码:
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 return 0; 13 } 14 int func(int n,int m){ 15 if(m>n) return 0; 16 else if(n==m||m==0) return 1; 17 else return func(n-1,m)+func(n-1,m-1); 18 }
运行结果:
实验任务7:
task7.c源代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 int print_charman(int n); 4 int r; 5 int main(){ 6 int n; 7 8 printf("Enter n:"); 9 scanf("%d",&n); 10 r=n; 11 print_charman(n); 12 13 return 0; 14 } 15 int print_charman(n){ 16 if(n>0){ 17 int s,z; 18 for(s=2*n-1;s>0;s--) printf(" o \t"); 19 printf("\n"); 20 for(z=r-n;z>0;z--) printf("\t"); 21 for(s=2*n-1;s>0;s--) printf("<H>\t"); 22 printf("\n"); 23 for(z=r-n;z>0;z--) printf("\t"); 24 for(s=2*n-1;s>0;s--) printf("I I\t"); 25 printf("\n\n"); 26 for(z=r-n+1;z>0;z--) printf("\t"); 27 print_charman(n-1); 28 } 29 30 }
运行结果: