实验三
task 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 char score_to_grade(int score){ 18 char ans; 19 20 switch(score/10){ 21 case 10: 22 case 9: ans = 'A';break; 23 case 8: ans = 'B';break; 24 case 7: ans = 'C';break; 25 case 6: ans = 'D';break; 26 default: ans = 'E'; 27 } 28 29 return ans; 30 }
运行结果:

回答:
1.函数score_to_grade的功能是将分数转换为等级;
形参即形式参数,是函数定义时写在函数参数列表中的变量,用于接收调用函数时传入的值,所以此代码中形参即为score_to_grade(int score)中的score,它的类型是int;
返回值是ans,类型为char。
2.①A.B.C.D均为双引号,双引号里的是字符串,与ans的类型不匹配,应将字符赋值给ans;
②case后没有break,回使代码从匹配的case一直运行到default结束,即导致所有的等级判断都是E。
task 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 int sum_digits(int n){ 18 int ans = 0; 19 20 while(n != 0){ 21 ans += n % 10; 22 n /= 10; 23 } 24 25 return ans; 26 }
运行结果:

回答:
1.函数sum_digits的功能是计算输入的整数的各位之和;
2.能实现同样的输出
(原来)这种算法运用的是迭代思想,运用循环,先取n的个位加到ans中,再去掉n的个位,
不断循环直到n = 0时停止;
(修改后)这种算法运用的是递归思想,将复杂问题不断拆解为具有同样解决思路的子问题,直道遇到最简单可以求解的情况即终止条件,再逐层返回,得到最原始问题的答案。
task 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 int power(int x, int n){ 18 int t; 19 20 if(n == 0) 21 return 1; 22 else if(n % 2) 23 return x*power(x,n-1); 24 else{ 25 t = power(x, n/2); 26 return t*t; 27 } 28 }
运行结果:

回答:
1.函数power的功能时计算x的n次幂;
2.函数power是递归函数,数学公式模型为:

task 4
源代码:
1 #include<stdio.h> 2 3 int is_prime(int n); 4 5 int main(){ 6 int n; 7 int total = 0; 8 9 printf("100以内的孪生素数:\n"); 10 for(n = 1;n <= 98;++n){ 11 if(is_prime(n)&&is_prime(n+2)){ 12 printf("%d %d\n",n,n+2); 13 total += 1; 14 } 15 } 16 printf("100以内的孪生素数共有%d个.",total); 17 return 0; 18 } 19 20 int is_prime(int n){ 21 int i; 22 if(n < 2) 23 return 0; 24 else if(n == 2) 25 return 1; 26 else{ 27 for(i=2;i < n; i++){ 28 if(n % i == 0) 29 return 0; 32 } 33 } 35 }
运行结果:

task 5
源代码:(迭代)
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 15 int func(int n,int m){ 16 int up=1, down_1 = 1,down_2 = 1; 17 int ans = 1; 18 int i, j, p; 19 for(i=1;i <= n;i++) 20 up *= i; 21 for(j=1;j <= m;j++) 22 down_1 *= j; 23 for(p=1;p <= (n-m);p++) 24 down_2 *= p; 25 26 ans = up/(down_1*down_2); 27 return ans; 28 29 }
(递归)
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 15 int func(int n,int m){ 16 if(m>n) 17 return 0; 18 else if(m == n||m == 0) 19 return 1; 20 else 21 return func(n-1,m)+func(n-1,m-1); 22 }
运行结果:

task 6
源代码:
1 #include<stdio.h> 2 3 int gcd(int a,int b,int c); 4 5 int main(){ 6 int a, b, c; 7 int ans; 8 9 while(scanf("%d%d%d",&a ,&b, &c)!= EOF){ 10 ans = gcd(a, b, c); 11 printf("最大公约数:%d\n\n",ans); 12 } 13 14 return 0; 15 } 16 17 int gcd(int a,int b,int c){ 18 int min = a; 19 if(b < min) 20 min = b; 21 if(c < min) 22 min = c; 23 int i; 24 for(i = min;i >= i;i--){ 25 if(a % i == 0 && b % i == 0 && c % i == 0) 26 return i; 27 } 28 }
运行结果:

task 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("input n:"); 10 scanf("%d",&n); 11 print_charman(n); 12 13 return 0; 14 } 15 16 void print_charman(int n){ 17 int i,j,k; 18 for(i=1;i<=n;i++){ 19 int total=2*(n-i+1)-1; 20 for(k=1;k<i;k++){ 21 printf("\t"); 22 } 23 for(j=1;j<=total;j++){ 24 printf(" O\t"); 25 } 26 printf("\n"); 27 for(k=1;k<i;k++){ 28 printf("\t"); 29 } 30 for(j=1;j<=total;j++){ 31 printf("<H>\t"); 32 } 33 printf("\n"); 34 for(k=1;k<i;k++){ 35 printf("\t"); 36 } 37 for(j=1;j<=total;j++){ 38 printf("I I\t"); 39 } 40 printf("\n\n"); 41 } 42 }
运行结果:



浙公网安备 33010602011771号