实验3

实验任务1

test1.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:功能是将读到的分数转换成等级字母;int;char;
问题2:ans是char变量,应用单引号'A';case后没有break,例如score=85,会依次执行ans='B',ans='C',ans='D',ans='E',最后ans的结果一定是'E'

实验任务2

test2.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:将整数逐位相加
问题2:能,第一种是迭代,自下而上,每次取出末尾数字相加;第二种是递归,自上而下,把大问题n拆成小问题+末位数字

实验任务3

test3.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:计算x的n次幂
问题2:是3e5f6f94848c3f8deff8e20ed61e9a27

实验任务4

test4.c

#include <stdio.h>  
#include <math.h> 

int is_prime(int n);  // 函数声明

int main() 
{
    int n;
    int s=0;

    printf("100以内的孪生素数:\n");
    for(n=2;n+2<=100;++n)
    {
        if (is_prime(n) && is_prime(n + 2)) //函数调用
        {
            printf("%d %d\n", n, n + 2);
            ++s;
        }
    }
    printf("总数:%d\n", s);
    return 0;
}

// 函数定义
int is_prime(int n) 
{       
    for (int i = 2; i <=(int) sqrt(n); ++i)
        if (n % i == 0) 
        return 0; 
    return 1;                      
}

截图

image

实验任务5

test5_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 1;
    if (m > n)
        return 0;
    
    long long ans=1;

    for (int i = 1; i <= m; ++i) 
       ans = ans*(n-m+i)/i;

    return (int)ans;
}

截图

image

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

截图

image

实验任务6

test6.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=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;
}

截图

image

实验任务7c

test7.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,k;

    for (i = n; i >= 1; i--) {

        for (k = 1; k <= n - i; ++k)
            printf("\t");
        for (s = 1; s <= 2 * i - 1;++s)
            printf(" O \t");
        printf("\n");


        for (k = 1; k <= n - i; k++)
            printf("\t");
        for (s = 1; s <= 2 * i - 1; s++)
            printf("<H>\t");
        printf("\n");


        for (k = 1; k <= n - i; k++)
            printf("\t");
        for (s = 1; s <= 2 * i - 1; s++)
            printf("I I\t");
        printf("\n");
    }

}

截图

image
image
image

实验总结

收获:1.更深刻的理解了迭代和递归算法思维区别:迭代是自下而上,从初始值通过循环计算得到最终结果;递归是自上而下,将大问题拆成一个或多个子问题,直到子问题简单到可以直接求出结果
2.对函数的结构认识更加清晰
新发现:在实验任务4中,将n的初始值定义为2,使程序不必计算n<2的情况,代码变简洁了,且输出的结果依然正确

posted @ 2025-10-24 21:33  thirin  阅读(3)  评论(0)    收藏  举报