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

task1.c

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

image

问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型分别是什么?

回答1:功能:将输入的整数分数(score)转换为对应的等级字符。形参类型:int(接收一个整数分数)。返回值类型:char(返回对应的等级字符)。

问题2:存在以下两处关键问题:1)类型不匹配:原代码中使用字符常量(如'A')给char类型的ans赋值,而修改后使用字符串常量(如"A")2)缺少 break 语句导致逻辑错误。

 

task2.c

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

image

问题1:函数 sum_digits 的功能是什么?
回答1:函数 sum_digits 的功能是计算输入整数 n 的各位数字之和。
问题2:如果把函数 sum_digits 定义成如下实现方式,能实现同样的输出吗?
回答2:能实现同样的输出。递归版本的逻辑是:若 n < 10(即 n 是个位数),直接返回 n(本身就是各位和);否则,返回 n 去掉最后一位后的数字的各位和(sum_digits(n/10))加上 n 的最后一位(n%10)。其与原循环版本完全一致,都是通过分解数字并累加各位,因此对于任意整数 n(包括正数、负数、0),两者的计算结果完全相同。

task3.c

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

image

问题1: 函数 power 的功能是什么?

回答1:在多数编程场景中,power函数的功能是计算一个数的幂。例如,若函数定义为power(x, n),则其功能通常是返回xn次幂(即x^n,其中x为底数,n为指数,且n通常为非负整数)。

问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。

回答2:是递归函数。

image

 

 

 task4.c

#include <stdio.h>

// 判断一个正整数n是否是素数,是则返回1,否则返回0
int is_prime(int n) {
    if (n <= 1) {  // 小于等于1的数不是素数
        return 0;
    }
    if (n == 2) {  // 2是素数
        return 1;
    }
    if (n % 2 == 0) {  // 偶数(除2外)不是素数
        return 0;
    }
    int i;
    // 检查从3到sqrt(n)的奇数是否能整除n
    for (i = 3; i * i <= n; i += 2) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    int count = 0;  // 统计孪生素数的对数
    printf("100以内的孪生素数对:\n");
    int n;

    // 遍历可能的n,n+2需≤100,因此n≤98
    for (n = 2; n <= 98; n++) {
        // 若n和n+2都是素数,则为孪生素数对
        if (is_prime(n) && is_prime(n + 2)) {
            printf("%d %d\n", n, n + 2);
            count++;
        }
    }

    printf("100以内孪生素数的总数为:%d\n", count);
    return 0;
}

image

 

 

task5-1.c

#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;
    }
    // 边界条件:取0个或取n个元素,组合数为1
    if (m == 0 || m == n) {
        return 1;
    }
    if (m > n - m) {
        m = n - m;
    }
    int i;
    int numerator = 1;   // 分子
    int denominator = 1; // 分母
    for (i = 1; i <= m; i++) {
        numerator *= (n - m + i);
        denominator *= i;
    }
    return numerator / denominator;
}

image

 

#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;
    }
    // 边界条件:取0个或取n个元素,组合数为1
    if (m == 0 || m == n) {
        return 1;
    }
    // 递归公式:C(n,m) = C(n-1,m) + C(n-1,m-1)
    return func(n - 1, m) + func(n - 1, m - 1);
}

image

 

 

task6.c

#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_val = a;
    if (b < min_val) {
        min_val = b;
    }
    if (c < min_val) {
        min_val = c;
    }
    int i;
    // 从最小值开始向下穷举,寻找最大公约数
    for (i = min_val; i >= 1; i--) {
        if (a % i == 0 && b % i == 0 && c % i == 0) {
            return i; // 找到最大公约数,立即返回
        }
    }
    
    return 1; 
}

image

 

 

task7.c

#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) {
    int i,s,j;
    for (i = n; i >= 1; i--) {
        int count = 2 * i - 1;  // 每行小人的数量(奇数,随i递减)
        int space = n - i;      // 每行前的缩进制表符数量(随i递减而增加)
        
        // 打印头部行(" O \t")
        for (s = 0; s < space; s++)
            printf("\t");
        for (j = 0; j < count; j++)
            printf(" O \t");
        printf("\n");
        
        // 打印身体行("<H>\t")
        for (s = 0; s < space; s++)
            printf("\t");
        for (j = 0; j < count; j++)
            printf("<H>\t");
        printf("\n");
        
        // 打印腿部行("I I\t")
        for (s = 0; s < space; s++)
            printf("\t");
        for (j = 0; j < count; j++)
            printf("I I\t");
        printf("\n\n"); 
    }
}

 

image

 

image

 

posted @ 2025-10-30 11:13  F_avor  阅读(7)  评论(1)    收藏  举报