实验3

实验3

四、任务结论

1.实验任务1

  • task1.c源代码,及,运行测试截图
  • 回答实验任务1中提出的问题

    问题1:函数score_to_grade 的功能是什么?形参类型、返回值类型是什么?
    问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。

#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

  • Q1 评定分数对应等级;int;char;
  • Q2 缺少break语句,所有输出都是E;

2.实验任务2

  • task2.c源代码,及,运行结果截图
  • 回答问题

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

#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

  • Q1 求x各数位数字之和;
  • Q2 可以;前者直接求和;后者采用了递归调用的方式求和;

3.实验任务3

  • task3.c源代码,及,运行结果截图
  • 回答问题

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

#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

  • Q1 求x的n次方;
  • Q2 是;

\[f(x, n) = \begin{cases} 1 & n = 0 \\ x \cdot f(x, n-1) & n \equiv 1 \pmod 2 \\ f(x, n/2)^2 & n \equiv 0 \pmod 2 \end{cases} \]

4.实验任务4

  • task4.c源代码,及,运行结果截图
#include <stdio.h>
char classify_triangle(int a, int b, int c){
    if (a + b > c && a + c > b && b + c > a) {
        if (a * a == b * b + c * c || b * b == a * a + c * c || c * c == a * a + b * b) {
            return 4;
        }
        else if (a == b && b == c) {
            return 2;
        } 
        else if (a == b || b == c || a == c) {
            return 3;
        } 
        else {
            return 1;
        }
    } 
    else {
        return 0;
    }
}
int main() {
    int a, b, c;
    while (scanf(" %d %d %d", &a, &b, &c) == 3) {
        switch(classify_triangle(a, b, c)){
            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;
}

image

5.实验任务5

  • 用迭代方式实现计算组合数func() 的完整源代码task5_1.c,及,运行测试截图
#include <stdio.h>
int func(int n, int m){
    if(n < m){
        return 0;
    }
    long long ans = 1;
    for (int i = n - m + 1; i <= n; i++){
        ans *= i;
    }
    for (int i = 1; i <= m; i++){
        ans /= i;
    }
    return ans;
}   // 函数声明
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;
}

image

  • 用递归函数实现计算组合数func() 的完整源代码task5_2.c,及,运行测试截图
#include <stdio.h>
int func(int n, int m){
    if(n < m){
        return 0;
    }
    if(m == 0){
        return 1;
    }
    if(n == m){
        return 1;
    }
    int ans = func(n - 1, m) + func(n - 1, m - 1);
    return ans;
}   // 函数声明
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;
}

image

6.实验任务6

  • task6.c源代码,及,运行结果截图
#include <stdio.h>
#include<math.h>
int gcd(int a, int b, int c){
    int k = fmin(fmin(a, b), fmin(a, c));
    int ans = 1;
    for (int i = 1; i <= k; i++){
        if(a % i == 0 && b % i == 0 && c % i == 0){
            ans = i;
        }
    }
    return ans;
}
// 函数声明
// 待补足....
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;
}

image

7.实验任务7

  • task7.c源代码,及,运行结果截图
#include <stdio.h>
#include <stdlib.h>
void one_line(int spacenum, int mannum){
    for (int i = 1; i <= spacenum; i++){
        printf("      ");
    }
    for (int i = 1; i <= mannum; i++){
        printf(" o    ");
    }
    printf("\n");
    for (int i = 1; i <= spacenum; i++){
        printf("      ");
    }
    for (int i = 1; i <= mannum; i++){
        printf("<H>   ");
    }
    printf("\n");
    for (int i = 1; i <= spacenum; i++){
        printf("      ");
    }
    for (int i = 1; i <= mannum; i++){
        printf("I I   ");
    }
    printf("\n");
}
void print_charman(int n){
    for (int linenum = n; linenum >= 1; linenum--){
        int spacenum = n - linenum;
        int mannum = 2 * linenum - 1;
        one_line(spacenum, mannum);
    }
}
// 函数声明
// 待补足
// xxx
int main() {
    int n;
    printf("Enter n: ");
    scanf("%d", &n);
    print_charman(n); // 函数调用
       
    return 0;
}

image


文章已结束:)

posted @ 2026-04-15 11:49  yoro_Mizore  阅读(25)  评论(0)    收藏  举报