实验三

实验三

test1

源代码

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

运行截图

4f34cb32b3a7fde1c523cc345af25bf4

问题回答

1.本函数char score_to_grade,作用是将分数转换为等地,参数类型是int score,返回值类型是char
2.ans后的引用应用单引号,case后要有break。

test2

源代码

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

运行截图

29e43ed50e86d2dc4db4e55b9cc0da62

问题回答

1.sum_digits的功能是计算一个整数n的各位数字之和。
2.能同样输出,思维不同一个是循环一个是递归,使用while循环,每次取出最低位累加,然后除以10去掉最低位,直到n变为0。用递归,当n<10时直接返回n否则返回sum_digits(n/10)+n%10。

test3

源代码

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

运行截图

a409671fe3db292dbb24f8ce8c597199

问题回答

1.power的功能是计算x的n次幂。
2.当n==0时,返回1。当n为奇数时xn=x*x(n-1)。当n为偶数时,xn=(x(n/2))^2。
72526bbfab7ece4e811c3cdd8c215f62

test4

源代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int classify_triangle(int a, int b, int c);
int main() {
    int a, b, c;
    int ret;
    while (scanf("%d%d%d", &a, &b, &c) != EOF) {
        ret = classify_triangle(a, b, c);
        switch (ret) {
        case 0: printf("不能构成三角形\n\n"); break;
        case 1: printf("普通三角形\n\n"); break;
        case 2: printf("等腰三角形\n\n"); break;
        case 3: printf("等边三角形\n\n"); break;
        case 4: printf("直角三角形\n\n"); break;
        default: printf("未知\n\n");
        }
    }
    return 0;
}


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

运行截图

55f3d389040ff50889e7ac3c2266a1a5

test5

源代码(循环)

#define _CRT_SECURE_NO_WARNINGS
#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;  
    if (m > n - m) m = n - m;
    int res = 1;
    for (int i = 1; i <= m; i++) {
        res = res * (n - m + i) / i;   
    }
    return res;
}

源代码(递归)

#define _CRT_SECURE_NO_WARNINGS
#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);
}

运行截图

41837bc6f1edf846cfcb45564e4c9e2b

test6

源代码

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

运行截图

73c229f3497dbfa3f5b58d2dd9b63c8e

test7

源代码

#include <stdio.h>
#include <stdlib.h>
void print_charman(int n);
int main() {
    int n;
    printf("Enter n: ");
    while(scanf("%d", &n) != EOF){
        printf("input n: %d\n", n); 
        print_charman(n);           
        printf("\nEnter n: ");   
    }
    return 0;
}
void print_charman(int n) {   
    for (int i = 1; i <= n; i++) {      
        for (int j = 1; j < i; j++) {
            printf("\t"); 
        }
        for (int j = 1; j <= 2 * (n - i) + 1; j++) {
            printf("  O  \t"); 
        }
        printf("\n");              
        for (int j = 1; j < i; j++) {
            printf("\t");
        }
        for (int j = 1; j <= 2 * (n - i) + 1; j++) {
            printf(" <H> \t");
        }
        printf("\n");               
        for (int j = 1; j < i; j++) {
            printf("\t");
        }
        for (int j = 1; j <= 2 * (n - i) + 1; j++) {
            printf(" I I \t"); 
        }
        printf("\n");
    }
}

运行截图

649122004ab6271523cb38e0130ffe3c

实验总结

收获:
函数声明告诉编译器函数的返回类型、函数名和参数类型及个数。
函数调用时,实参传递给形参,参数传递是值传递。
形参与实参的区别
形参:函数定义时括号内的变量,只在函数内部有效。
实参:调用函数时传递给函数的具体值或变量。
实参的值被复制给形参,函数内部对形参的修改不会影响实参本身。
递归函数必须有一个明确的递归基(终止条件),否则会导致无限递归。
递归函数将大问题分解为规模更小的同类子问题,通过函数自身调用来求解。
使用循环结构(while、for),效率高,但可能代码冗长。
递归代码简洁、逻辑清晰,但可能因函数调用开销较大、栈深度受限而性能较差。
穷举法,在实验6(求最大公约数)中,从最小数开始向下试探,直到找到最大公约数。
穷举法简单直观,适用于问题规模较小的情况。
理解 scanf 的返回值(成功读取的元素个数),利用 EOF 实现多组输入循环。

问题:在图形输出中,如何更灵活地控制每个小人的宽度,以适应不同字符宽度的字体?

posted @ 2026-04-15 18:02  kkpptt  阅读(9)  评论(0)    收藏  举报