实验3

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 // 函数定义
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的功能是确定函数定义名称,将分数转换为等级输出

形参类型:int

返回值类型:char

问题二:字符型要用单引号''

每段需要加break用来返回,否则会往下执行

task2.c

复制代码
 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:能,原来的采用定义循环的方法,改完采用的是递归的方法

task3.c

复制代码
 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:是递归函数

task4.c

复制代码
 1 #include <stdio.h>
 2 
 3 int is_prime(int n);
 4 
 5 int main(){
 6     int n,sum=0;
 7     printf("100以内的孪生素数:\n");
 8     for(n=1;n<100;++n){
 9         if(is_prime(n)==1&&is_prime(n+2)==1){
10         printf("%d %d\n",n,n+2);
11         sum+=1;}    }
12         printf("100以内的孪生素数共有%d个",sum);
13 }
14 int is_prime(int n){
15     int i;
16     if(n<=1){return 0;
17     }
18     for(i=2;i<=(n-1);++i){
19         if (n%i==0)
20         return 0;
21     }
22     return 1;
23 }

运行结果截图

task5.c

复制代码
 1 #include <stdio.h>
 2 
 3 void hanoi(int n, char from, char to, char via, int *count) {
 4     if (n == 1) {
 5         printf("1: %c --> %c\n", from, to);
 6         (*count)++;
 7     } else {
 8         hanoi(n - 1, from, via, to, count);
 9         printf("%d: %c --> %c\n", n, from, to);
10         (*count)++;
11         hanoi(n - 1, via, to, from, count);
12     }
13 }
14 
15 int main() {
16     int n;
17     while (scanf("%d", &n) != EOF) {
18         int count = 0;
19         hanoi(n, 'A', 'C', 'B', &count);
20         printf("一共移动了%d次.\n\n", count);
21     }
22     return 0;
23 }

运行结果截图

task6.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         
13     return 0;
14 }
15 int func(int n,int m){
16     int i,c=1;
17     int d=1;
18     int e=1;
19     for(i=1;i<=n;++i){
20     c*=i;    
21     }
22     for(i=1;i<=m;++i){
23     d*=i;    
24     }
25     for(i=1;i<=(n-m);++i){
26     e*=i;    
27     }
28     return c/(d*e);
29 }
30 // 函数定义
31 // 待补足。。。(分别用迭代和递归实现)

运行结果截图

递归

复制代码
 1 #include <stdio.h>
 2 int func(int n, int m);// 函数声明
 3 int main() {
 4  int n, m;
 5  int ans;
 6  while(scanf("%d%d", &n, &m) != EOF) {
 7  ans = func(n, m);// 函数调用
 8  printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
 9   }
10  
11  return 0;
12 }
13 int func(int n, int m){
14     if(m>n)
15     return 0;
16     if(m==n||m==0)
17     return 1;
18     return func(n-1,m)+func(n-1,m-1);
19 }

运行结果截图

task7.c

复制代码
 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 i,j;
19     if(a<b && a<c){
20         i=a;
21     }
22     if(b<=a&&b<=c){i=b;
23     }
24     if(c<=a&&c<b){i=c;
25     }
26     for(j=i;j>=1;--j){if(a%j==0 && b%j==0 && c%j==0)
27     return j;
28     }
29 }

运行结果截图