实验3

任务1

截图

屏幕截图 2026-11-13 220458

源代码

#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:根据分数打等第,形参是int,返回值是char;

  问题2:首先应该用‘A‘ 而不是“A”,其次缺少break不会主动跳出程序,导致ans被其他值覆盖;

 

任务2

截图

屏幕截图 2026-11-13 221839

代码

#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:计算n所有位数的和

  问题2:可以,原本的是迭代,修改的是递归

 

任务3

截图

屏幕截图 2026-11-13 222319

代码

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

  问题一:计算x的N次方;

  问题2:是

14D642008091ED0652DA748189A45BEF

  问题三,算法逻辑仍然正常,因为只是将t等于X的N/2次方带进去

   原写法性能更好,原写法调用6次,改后调用63次

 

任务4

截图

屏幕截图 2026-11-13 225020

代码

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

 

任务5

迭代法

截图

屏幕截图 2026-11-13 230236

代码

#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(n<m)
    {
        return 0;
    }
    else if(n == m || m == 0)
    {
        return 1;
    }
    else
    {
        int i,sum1=1,sum2=1;
        for(i=n;i>=m;i--)
        {
            sum1 =sum1 * i;
        }
        for ( i = 1; i <= m; i++)
        {
            sum2 = sum2 * i;
        }
        int ans = sum1 / sum2;
        return ans;
    }
}

  递归法

截图

屏幕截图 2026-11-13 230534

代码

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

  

任务6

截图

屏幕截图 2026-11-13 231206

代码

#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,i;
    min = a;
    if (min>b)
    {
        min = b;
    }
    if (min > c)
    {
        min = c;
    }
    for(i = min; i>0; i--)
    {
        if(a%i==0 && b%i==0 && c%i==0)
        {
            return i;
        }
    }
    return 1;
}

  

 

任务7

截图

屏幕截图 2026-11-13 231206

代码

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

void print_charman(int n);

int main(void)
{
    int n;

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

    print_charman(n);

    return 0;
}

void print_charman(int n)
{
    for (int r = 0; r < n; r++)
    {
        int count = 2 * (n - r) - 1;

       
        for (int s = 0; s < r; s++)
        {
            putchar('\t');
        }

        
        for (int k = 0; k < count; k++)
        {
            printf(" O");

            if (k < count - 1)
            {
                putchar('\t');
            }
        }
        putchar('\n');

        
        for (int s = 0; s < r; s++)
        {
            putchar('\t');
        }

        for (int k = 0; k < count; k++)
        {
            printf("<H>");

            if (k < count - 1)
            {
                putchar('\t');
            }
        }
        putchar('\n');

    
        for (int s = 0; s < r; s++)
        {
            putchar('\t');
        }

        for (int k = 0; k < count; k++)
        {
            printf("I I");

            if (k < count - 1)
            {
                putchar('\t');
            }
        }
        putchar('\n');

        
        if (r < n - 1)
        {
            putchar('\n');
        }
    }
}

  

 

posted @ 2026-11-13 23:59  沧海月明12138  阅读(3)  评论(0)    收藏  举报