实验三

任务一:

源代码:

#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:功能是根据输入的成绩评相应等级;形参类型是整数,返回值类型是字符

问题2:修改代码后运行结果为:

捕获

没有了break代码跳出判断,发生穿透,一直执行ans的赋值直到ans='E'结束,不论输入多少分,评级都为E

任务二:

源代码:

#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:函数功能是求一个数每个数位上数的和

问题2:可以实现同样的输出,去别是修改后的函数运用了递归的思维

任务三:

源代码:

#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:功能是计算X的n次方的值

问题2:是递归函数,IMG_20261115_152617

问题3:正确,因为t*t和power()*power()等价

     性能上修改后的函数有重复计算,而原写法没有;power(3,16)原写法调用5次,修改后调用31次,性能下降

任务四:

源代码:

#include<stdio.h>
int main(){
    int n,a,b,c;
    int classify_triangle(int a,int b,int c);
    
    while(scanf("%d %d %d",&a,&b,&c)!=EOF){    
    n = classify_triangle(a,b,c);
    if (n == 0)
        printf("不能构成三角形\n");
    else if (n==1)
        printf("普通三角形\n");
    else if (n==2)
        printf("等边三角形\n");
    else if (n==3)
        printf("等腰三角形\n");
    else
        printf("直角三角形\n");
}

    return 0;
    
}
int classify_triangle(int a,int b,int c){
    if (a+b<=c || b+c<=a || a+c<=b)
        return 0;
    if (a == b && b == c)
        return 2;
        
    else if (a*a + b*b == c*c ||b*b + c*c == a*a ||a*a + c*c == b*b)
        return 4;
    else if (a==b || a==c || b==c)
        return 3;
    else
        return 1;
}

 

测试截图:

4

 

任务五:

迭代

源代码:

#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){
    int N=1,M=1;
    int i,j;
    for (i=n;i>=(n-m+1);i--){
        N = N*i;
    }
    for (j = 1;j<=m;j++){
        M = M*j;
    }
    return N/M;
}

 

测试截图:

捕获

 

递归

源代码:

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

 

 

测试截图:

捕获

 

任务六:

源代码:

#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 i;
    if (a<=b && a<=c)
        i=a;
    else if (b<=a && b<=c)
        i=b;
    else
        i=c;

    for (i;;i--){
        if (a%i==0 && b%i==0 && c%i==0)
            return i;
        
    }
        
    
}

 

测试截图:

捕获

 

任务七:

源代码:

 

#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) {
    for (int k = 1;k <= n;k++) {
        int s = 2 * (n - k + 1) - 1;
        int t = k - 1;
        for (int m = 0;m < t;m++) {
            printf("\t");
        }
        for (int i = 0;i < s;i++) {
            printf(" o \t");
        }
        printf("\n");

        for (int m = 0;m < t;m++) {
            printf("\t");
        }
        for (int i = 0;i < s;i++) {
            printf("<H>\t");
        }
        printf("\n");
        for (int m = 0;m < t;m++) {
            printf("\t");
        }
        for (int i = 0;i < s;i++) {
            printf("I I\t");
        }
        printf("\n");
    }
} 

 

测试截图:

捕获捕获02

 

posted @ 2026-11-15 15:35  Amber_Q  阅读(3)  评论(0)    收藏  举报