实验3_C语言函数应用编程

任务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 // 函数定义
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 }

问题一:该函数功能为将学生成绩转换为对应的等级,形参是整数类型,返回值是字符型。

问题二:line2缺少break语句,line3-6应该使用单引号表示

 

任务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 // 函数定义
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 }

问题一:计算一个整数n的各个数字之和。

问题二:能实现同等效果。原函数为迭代法,第二种为函数的递归法。

 

任务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 // 函数定义
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 }

问题一:计算x的n次幂;

问题二:是递归函数,函数模型为

 

任务4

源代码:

 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<stdlib.h>
 4  int is_prime(int n);
 5 
 6  int main(){
 7      int i = 0;
 8      int n;
 9      printf("100以内的孪生素数对:\n");
10      for (n = 3; n <= 99; n+=2){
11          if (is_prime(n) && is_prime(n +2)){
12              printf("%d %d\n", n, n+2);
13              i++;
14          }
15      }
16      printf("100以内的孪生素数对共有 %d 个\n", i);
17      system("pause");
18      return 0;
19  }
20 
21  int is_prime(int n){
22      int i;
23      if(n<2){
24          return 0;
25      }
26      for (i = 2; i * i <= n; i++)
27      {
28          if(n % i == 0){
29              return 0;
30         }
31      }
32     return 1;
33  }

 

任务5

源代码:

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

 

任务6

源代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int func(int n, int m);
 4 
 5 int main() {
 6     int n, m;
 7     int ans;
 8     while (scanf_s("%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     system ("pause");
13     return 0;
14 }
15 
16 int func(int n, int m) {
17     int i,numerator,denominator;
18     if (m > n) {
19         return 0;
20     }
21     if (m == 0 || m == n) {
22         return 1;
23     }
24     numerator = 1;  
25     denominator = 1;  
26     for (i = 0; i < m; i++) {
27         numerator *= (n - i);
28         denominator *= (m - i);
29     }
30     return numerator / denominator;
31 }
#include <stdio.h>
#include <stdlib.h>
int func(int n, int m);

int main() {
    int n, m;
    int ans;
    while (scanf_s("%d %d", &n, &m)!= EOF) { 
        ans = func(n, m);
        printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
    }
    system("pause");
    return 0;
}


int func(int n, int m) {
    if (m > n) {
        return 0;
    }
    if (m == 0 || m == n) {
        return 1;
    }
    return func(n - 1, m) + func(n - 1, m - 1);
}

 

任务7

源代码:

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

实验总结:

在函数应用编程实验中,通过实践巩固了函数的定义、声明和调用等知识。在实现计算多个数平均值功能时,起初参数传递和返回值处理出错,经调试和查阅资料解决。这让我明白细心和自主排查问题的重要性,后续会多做实验提升编程能力。

 

posted @ 2025-04-09 16:43  恐陈  阅读(35)  评论(0)    收藏  举报