实验3

1.实验任务1

源代码

#include <stdio.h>
char score_to_grade(int score); //函数声明
int main() {
    int score;
    char grade;
    while(scanf("%d", &score) != EOF) {
        grade = score_to_grade(score);  // 函数调用
        printf("分数: %d, 等级: %c\n\n", score, grade);
    }
    return 0;
}
// 函数定义
char score_to_grade(int score) {
    char ans;
    switch(score/10) {
    case 10:
    case 9:   ans = 'A'; break;
    case 8:   ans = 'B'; break; 
	case 7:   ans = 'C'; break;
    case 6:   ans = 'D'; break;
    default:  ans = 'E';
    }
    return ans;
}

运行结果截图:

{F1FCCDC9-706F-4C29-9BE1-246AFEEFDA32}

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?答1:功能是计算输入的分数属于哪一种等级,并返回等级给主函数。形参类型是int,返回值类型是char。

问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。

1 switch(score/10) {
2 case 10: 
3 case 9:   ans = "A"; 
4 case 8:   ans = "B"; 
5 case 7:   ans = "C"; 
6 case 6:   ans = "D"; 
7 default:  ans = 'E';
8 }

答2:字符应该用单引号,而不是双引号。同时ans=' '(空格为ABCD)后缺少break;

 

2.实验任务2

源代码

#include <stdio.h>
int sum_digits(int n);  // 函数声明
int main() {
    int n;
    int ans;
    while(printf("Enter n: "), scanf("%d", &n) != EOF) {
        ans = sum_digits(n);    // 函数调用
		printf("n = %d, ans = %d\n\n", n, ans);
    }
    return 0;
}
// 函数定义
int sum_digits(int n) {
    int ans = 0;
    while(n != 0) {
        ans += n % 10;
        n /= 10;
    }
    return ans;
}

  运行结果截图:

{F25B76CA-1F1B-4083-AD43-A9B039ECF1F8}

问题1:函数sum_digits的功能是什么?答1:将主函数输入的n的每一位数字相加为ans,返回ans。

问题2:如果把函数sum_digits定义成如下实现方式,能实现同样的输出吗? 如果能,说明两种实现方式的算法思维区别;如果不能,分析原因

1 int sum_digits(int n) {
2     if(n < 10)
3         return n;
4     return sum_digits(n/10) + n%10;
5 }

答2:不能实现。如果n不只有个位数和十位数时,计算的就不是每一位相加了,例如输入2049,这个错误代码会输出204+9=213,而正确应该是15。

 

 3.实验任务3

源代码

 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     
11     return 0;
12 }
13 // 函数定义
14 int power(int x, int n) {
15     int t;
16     if(n == 0)
17         return 1;
18     else if(n % 2)
19         return x * power(x, n-1);
20     else {
21         t = power(x, n/2);
22         return t*t;
23     }
24 }

运行结果截图:

{854F04B9-EC9F-4587-84DC-F532132D65FC}

问题1: 函数 power 的功能是什么?答1:功能是计算 x 的 n 次幂(n ≥ 0 的整数)。

问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。 (在纸上写出这个递归模式对应的数学公式,拍照后以图片方式放到这里;也可使用公式编辑器(如果 会使用))答2:是递归函数,数学公式如下

{6C1586BD-AF1E-4CED-8D4B-A480E6A9672C}

 

4.实验任务4

源代码

 1 #include <stdio.h>
 2 int classify_triangle(int a, int b, int c);    // 函数声明
 3 int main() {
 4     int a,b,c;
 5     while( scanf("%d%d%d", &a, &b,&c) != EOF) 
 6     {
 7         classify_triangle(a,b,c);  // 函数调用
 8         switch(classify_triangle(a,b,c)){
 9             case 4:printf("直角三角形\n");break;
10             case 3:printf("等腰三角形\n");break;
11             case 2:printf("等边三角形\n");break;
12             case 1:printf("普通三角形\n");break;
13             case 0:printf("不能构成三角形\n");break;
14     }
15 }
16     return 0;
17 }
18 int classify_triangle(int a, int b, int c)   // 函数定义
19 {
20     if(a<=0||b<=0||c<=0)
21         return 0;
22     if(!(a+b>c&&b+c>a&&a+c>b))
23         return 0;
24     if(a==b&&b==c)
25         return 2;
26     if(a==b||b==c||a==c)
27         return 3;
28        if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a)
29         return 4;
30     else if(a+b>c||b+c>a||a+c>b)
31         return 1;
32 }

运行结果截图:

{06A0E90E-C2FF-4009-92BB-F9C21FDF106F}

 

 5.实验任务5

用递归函数实现

源代码:

 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     return 0;
11 }
12 int func(int n, int m)   // 函数定义
13 {
14     if(m<0||m>n)
15         return 0;
16     if(m==0||m==n)
17         return 1;
18     return func(n-1,m)+func(n-1,m-1);
19 }

运行结果截图:

{6A21DBD0-FFA8-43B2-B539-772DDACAB015}

用迭代方式实现

源代码:

 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     return 0;
11 }
12 int func(int n, int m)   // 函数定义
13 {
14     if (m < 0 || m > n) 
15         return 0;
16     if (m == 0 || m == n) 
17         return 1;
18     if (m > n - m) 
19         m = n - m;
20     int res = 1;
21     for (int i = 1; i <= m; i++) {
22         res = res * (n - m + i) / i;
23     }
24     return res;
25 }

运行结果截图:

{6A21DBD0-FFA8-43B2-B539-772DDACAB015}

6.实验任务6

源代码:

 1 #include <stdio.h>
 2 int func(int n, int m);    // 函数声明
 3 int main() {
 4    int a, b, c;
 5    int ans;
 6    while(scanf("%d%d%d", &a, &b, &c) != EOF) {
 7         ans = gcd(a, b, c);     // 函数调用
 8         printf("最大公约数: %d\n\n", ans);
 9    }
10    return 0;
11 }
12 int gcd(int a, int b, int c)   // 函数定义
13 {
14     int i;
15     if(a<b&&a<c)
16         i=a;
17     if(b<a&&b<c)
18         i=b;
19     if(c<a&&c<b)
20         i=c;
21     for(;i>=1;i--)
22         if(a%i==0&&b%i==0&&c%i==0)
23             return i;
24 }

运行结果截屏:

{AAE23FFD-6294-417F-9636-6D8ED4F7EA25}

 

7.实验任务7

源代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 void print_charman(n);//函数声明
 4 int main() {
 5     int n;
 6     printf("Enter n: ");
 7     scanf("%d", &n);
 8     print_charman(n);      // 函数调用   
 9     return 0;
10 }
11 void print_charman(n){   //函数print_charman定义
12     int i,j,k,n;
13     for(i=0;i<=n;i++)
14         for(j=0;j<i;j++)
15             printf("\t");
16     for(k=0;k<=(n(n-1)-1);k++)
17         printf("O\t");
18     printf("\n");
19 
20     for(j=0;j<i;j++)
21             printf("\t");
22     for(k=0;k<=(n(n-1)-1);k++)
23         printf("<H>\t");
24     printf("\n");
25 
26     for(j=0;j<i;j++)
27             printf("\t");
28     for(k=0;k<=(n(n-1)-1);k++)
29         printf("I I\t");
30     printf("\n");
31 }

 

posted @ 2026-04-21 21:16  202283300498石欣源  阅读(8)  评论(0)    收藏  举报