task1.c
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 return 0; 11 } 12 char score_to_grade(int score) { 13 char ans; 14 switch(score/10) { 15 case 10: 16 case 9: ans = 'A'; break; 17 case 8: ans = 'B'; break; 18 case 7: ans = 'C'; break; 19 case 6: ans = 'D'; break; 20 default:ans = 'E'; 21 } 22 return ans; 23 }
问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
答:功能是把分数转化为相应的等级并且赋给grade,形参类型是int,返回值类型是char。
问题2:如果line21-28以下形式,有问题吗?如果有,指出有哪些问题?
答:有问题。
1.%c无法输出字符串,需要改为%s
2.char类型的变量无法存储字符串,需要使用char类型数组
因此无论输入什么都只可能输出E,或者导致程序出错
task2.c
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 }
问题1:函数 sum_digits 的功能是什么?
答:将n的各个位数相加,并返回给ans
问题2:如果保持 main 代码和函数 sum_digits 声明不变,把函数 sum_digits 定义成如下实现方
式,能实现同等的效果吗?
如果不能实现同等效果,分析原因。
如果能实现同等效果,说明两种实现方式背后的算法思维区别。
答:能。原代码的算法用的是迭代,用循环的方式来的到结果。
更改后的代码用的是递归的思想,通过一个函数不断引用自身来得到所需的结果。
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的n次方,并返回该值。
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模
型。
答:是。
task4.c
1 #include<stdio.h> 2 3 int is_prime(int n); 4 5 int main(){ 6 printf("100以内的孪生素数\n"); 7 int n,num=0; 8 for(n=2;n<100;n++){ 9 if(is_prime(n)==1) 10 if(is_prime(n+2)==1){ 11 printf("%d %d\n",n,n+2); 12 num++;} 13 } 14 printf("100以内的孪生素数有%d个",num); 15 return 0; 16 } 17 18 int is_prime(int n){ 19 int i; 20 for(i=2;i<n;i++){ 21 if(n%i==0) return 0; 22 } 23 return 1; 24 }
task5.c
1 #include<stdio.h> 2 #include<stdlib.h> 3 int i=0; 4 void hanoi(int n,char from,char temp,char to); 5 void moveplate(int n,char from,char to); 6 int main(){ 7 int n; 8 while(scanf("%d",&n)!=EOF){ 9 hanoi(n,'A','B','C'); 10 printf("一共移动了%d次\n",i); 11 system("pause"); 12 } 13 return 0; 14 } 15 void hanoi(int n,char from,char temp,char to) 16 { 17 if(n==1) 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 void moveplate(int n,char from,char to){ 25 printf("%d:%c-->%c\n",n,from,to); 26 i++; 27 } 28 }
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; 16 if(m>n){ 17 return 0; 18 } 19 else 20 {for(i=n-m+1;i<=n;i++) a*=i; 21 for(i=1;i<=m;i++) b*=i; 22 return a/b; 23 } 24 }
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) return 1; 17 else if(m==1) return n; 18 else return func(n-1,m)+func(n-1,m-1); 19 }
task7.c
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int 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 int print_charman(int n){ 17 int i,j,x,y=0,m=0; 18 for(i=n;i>0;i--){ 19 x=2*i-1; 20 for(j=x;j>0;j--){for(y;y>0;y--)printf(" ");printf(" O ");} 21 printf("\n"); 22 y=m; 23 for(j=x;j>0;j--){for(y;y>0;y--)printf(" ");printf("<H> ");} 24 printf("\n"); 25 y=m; 26 for(j=x;j>0;j--){for(y;y>0;y--)printf(" ");printf("I I ");} 27 printf("\n"); 28 m++; 29 y=m; 30 } 31 return 0; 32 }