实验三

任务一:

#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;
}

屏幕截图 2026-11-13 141330

问题一:功能是给输入的分数评定等级 int char

问题二:缺少break语句 数据类型不匹配

任务二:

#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;
}

屏幕截图 2026-11-13 141839

问题一:功能是计算各位数字之和

问题二:能 原来是while循环 新方式是递归

任务三:

#include <stdio.h>

int power(int x, int n);

int main() {
    int x, n;
    int ans;

    while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {
        ans = power(x, n);
        printf("n = %d, ans = %d\n\n", n, ans);
    }

    return 0;
}

int power(int x, int n) {
    int t;

    if(n == 0)
        return 1;
    else if(n % 2)
        return x * power(x, n-1);
    else {
        t = power(x, n/2);
        return t*t;
    }
}

屏幕截图 2026-11-13 142425

问题一:功能是计算并返回x的n次方

问题二:是 递归出口是n=0时返回1

问题三:正确 因为指数上是相等的 从性能角度 更复杂 原写法递归调用6次 修改后递归调用63次

任务四:

#include <stdio.h>

int classify_triangle(int a, int b, int c);

int main() {
    int a, b, c;
    
    while (scanf("%d %d %d", &a, &b, &c) != EOF) {
        int type = classify_triangle(a, b, c);
        
        switch (type) {
            case 0:
                printf("不能构成三角形\n");
                break;
            case 1:
                printf("普通三角形\n");
                break;
            case 2:
                printf("等边三角形\n");
                break;
            case 3:
                printf("等腰三角形\n");
                break;
            case 4:
                printf("直角三角形\n");
                break;
        }
    }
    
    return 0;
}

int classify_triangle(int a, int b, int c) {
    if (a <= 0 || b <= 0 || c <= 0) {
        return 0;
    }
    
    if (a + b <= c || a + c <= b || b + c <= a) {
        return 0;
    }
    
    if (a == b && b == c) {
        return 2;
    }
    
    if (a == b || a == c || b == c) {
        return 3;
    }
    
    long long a2 = (long long)a * a;
    long long b2 = (long long)b * b;
    long long c2 = (long long)c * c;
    
    if (a2 + b2 == c2 || a2 + c2 == b2 || b2 + c2 == a2) {
        return 4;
    }
    
    return 1;
}

屏幕截图 2026-11-13 145141

任务五:

#include <stdio.h>

int func(int n, int m);

int main() {
    int n, m;
    int ans;

    while(scanf("%d%d", &n, &m) != EOF) {
        ans = func(n, m);
        printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);
    }

    return 0;
}

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

屏幕截图 2026-11-13 145500

任务六:

#include <stdio.h>

int gcd(int a, int b, int c);

int main() {
    int a, b, c;
    int ans;

    while(scanf("%d%d%d", &a, &b, &c) != EOF) {
        ans = gcd(a, b, c);
        printf("最大公约数: %d\n\n", ans);
    }

    return 0;
}

int gcd(int a, int b, int c) {
    int min = a;
    if (b < min) min = b;
    if (c < min) min = c;

    for (int i = min; i >= 1; i--) {
        if (a % i == 0 && b % i == 0 && c % i == 0) {
            return i;
        }
    }
    
    return 1;
}

屏幕截图 2026-11-13 145813

任务七:

#include <stdio.h>
#include <stdlib.h>

void print_charman(int n);

int main() {
    int n;

    printf("Enter n: ");
    scanf("%d", &n);
    print_charman(n);

    return 0;
}

void print_charman(int n) {
    for (int i = n; i >= 1; i--) {
        for (int j = 0; j < n - i; j++) {
            printf("\t");
        }
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("0\t");
        }
        printf("\n");

        for (int j = 0; j < n - i; j++) {
            printf("\t");
        }
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("<H>\t");
        }
        printf("\n");

        for (int j = 0; j < n - i; j++) {
            printf("\t");
        }
        for (int j = 0; j < 2 * i - 1; j++) {
            printf("I I\t");
        }
        printf("\n\n");
    }
}

屏幕截图 2026-11-13 150935

(不知道为什么打出来的是歪脖子小人)

 

posted @ 2026-11-13 15:15  魏子翔  阅读(7)  评论(0)    收藏  举报