实验3

task1

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


问题1:
函数 score_to_grade 的功能:该函数的作用是依据输入的分数来判定对应的等级。分数范围在 90 - 100 为 'A',80 - 89 为 'B',70 - 79 为 'C',60 - 69 为 'D',60 分以下为 'E'。
形参类型:int 类型,意味着接收一个整数作为输入的分数。返回值类型:char 类型,即返回一个字符来表示对应的等级。
问题2:
类型不匹配:ans 被定义为 char 类型,然而 "A"、"B"、"C"、"D" 属于字符串常量(类型为 const char*),把字符串常量赋值给 char 类型的变量会引发类型不匹配的错误。这里应当使用字符常量 'A'、'B'、'C'、'D'。
缺少 break 语句:在每个 case 分支里都没有 break 语句,这会造成一旦匹配到某个 case,程序就会继续执行后续的 case 分支,直至遇到 break 或者 switch 语句结束。这样就无法正确实现依据不同分数范围来确定等级的功能。

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


问题 1
sum_digits 函数的功能是计算整数 n 的各位数字之和。原实现通过 while 循环,不断取 n 最后一位数字累加,再去掉该位,直至 n 为 0。
问题 2
两种实现能达到同等效果。原实现运用迭代思维,用 while 循环逐步缩小问题规模。新实现采用递归思维,将问题分解为 n/10 和 n % 10 两部分,当 n 小于 10 时终止递归,二者本质都是计算 n 的各位数字之和。

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


问题 1
函数 power 的功能是计算整数 x 的 n 次幂
问题 2
函数 power 是递归函数。递归函数指的是在函数的定义里调用自身的函数,power 函数在其定义中就调用了自身。
递归模式
当 n 等于 0 时,函数直接返回 1。
当 n 为奇数(即 n % 2 为真)时,power(x, n) 等于 x 乘以 power(x, n - 1)。
当 n 为偶数(即 n % 2 为假)时,先计算 power(x, n / 2) 的结果并赋值给 t,然后返回 t * t。
数学公式模型
设 P(x,n)表示 power(x, n) 的计算结果,该递归模式对应的数学公式模型如下:

task4

 #include <stdio.h>
int is_prime(int n) {
    if (n <= 1) {
        return 0;
    }
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int count = 0;
    printf("100以内的孪生素数有:\n");
    for (int n = 2; n <= 98; n++) {
        if (is_prime(n) && is_prime(n + 2)) {
            printf("%d, %d\n", n, n + 2);
            count++;
        }
    }
    printf("100以内的孪生素数有:%d\n", count);
    return 0;
}  

task5

#include <stdio.h>
int c = 0;
void hanoi(int n, char source, char target, char auxiliary) {
    if (n > 0) {
        hanoi(n - 1, source, auxiliary, target);
        printf("%d: %c --> %c\n", n, source, target);
        c++;
        hanoi(n - 1, auxiliary, target, source);
    }
}
void getInput() {
    int n;
    while (scanf("%d", &n) != EOF) {
        c = 0;
        printf("\n");
        hanoi(n, 'A', 'C', 'B');
        printf("一共移动了%d次.\n", c);
    }
}
int main() {
    getInput();
    return 0;
}   

task6

#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 1;
    if(m>n)
        return 0;
    return  func(n-1,m)+func(n-1,m-1);
} 

task7

#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 m;
    int i;
    if (a <= b && a <= c)
        m = a;
    else if (b <= a && b <= c)
        m = b;
    else
        m = c;
    for (i = m; i > 0; i--) {
        if (a % i == 0 && b % i == 0 && c % i == 0)
            break;
    }
    return i;
} 

posted @ 2025-04-09 21:06  提拉米苏ac  阅读(22)  评论(0)    收藏  举报