kobe824

导航

实验3

实验任务1

#include <stdlib.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);
    }
	system("pause");
    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: 1."A"是字符串,与输出的char类型不匹配。2.语法上每一个case后应该加上break,逻辑更完整。3.格式上代码中的switch与case之间应该加上缩进。


实验任务2

#include<stdlib.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);
    }
	system("pause");
    return 0;
}

int sum_digits(int n) {
    int ans = 0;
    while(n != 0) {
        ans += n % 10;
        n /= 10;
    }
    return ans;
}

{BF3A5B33-0DFF-4153-ABA2-419BA13F9629}
问题1: 功能是计算输入数字的每个分位的数字之和。
问题2: 能,原代码运用迭代思维,修改后的代码用了递归调用的算法思维。


实验任务3

#include <stdlib.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);
    }
	system("pause");
    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;
    }
}

{7A81FE72-FB01-4333-8304-59040D331AC5}
问题1: 功能是计算x的n次方
问题2: 是,公式如下

\[x^n= \begin{cases} 1, & n=0 \\ \left(x^{\frac{n}{2}}\right)^2, & n\text{为偶数} \\ x^{n-1}\cdot x, & n\text{为奇数} \end{cases} \]


实验任务4

#include <stdlib.h>

int classify_triangle(int a, int b, int c) {

    if (a + b <= c || a + c <= b || b + c <= a)  
		return 0;
	if (a == b && b == c) 
		return 2;
	if (a * a + b * b == c * c || a * a + c * c == b * b ||b * b + c * c == a * a)
		return 4;
	if (a == b || a == c || b == c)
		return 3;

    return 1;

}

int main() {
	int a, b, c;

    while (scanf("%d %d %d", &a, &b, &c) != EOF) {

        int type = classify_triangle(a,b,c);
		switch(type){
		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;

        }

    }

	system("pause");

    return 0;

}

{8B0C3C20-BE54-4698-825E-D93C7C5BCF1C}

实验任务5

迭代方式

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 i;
	int result = 1;

    if (m == 0 || m == n)
		return 1;

    for ( i=1;i<=m;++i)
		result = result * (n - m + i) / i;
	
    return result;
}

{31E45055-F361-4C89-B7BB-9C7C28F2BB19}

递归函数

int func(int n, int m);

int main() {
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF) {
        int 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;
    if (m == 0 || m == n) return 1;
    return func(n - 1, m) + func(n - 1, m - 1);
}

{73F0FFB0-0760-4DCC-A534-55ED7F4FF83C}

实验任务6

#include <stdlib.h>

int gcd(int a, int b, int c){
    int min = a;
	int i;
    if(b < min) min = b;
    if(c < min) min = c;

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

int main(){
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF){
        printf("最大公约数: %d\n", gcd(a,b,c));
    }
	system("pause");
    return 0;
}

{F4035484-3CE7-4174-AFF7-C6CE58423B00}


实验任务7

#include <stdio.h>
void print_charman(int n);

int main() {
    int n;
    printf("Enter n: ");
    scanf("%d", &n);
    print_charman(n);
	system("pause");
    return 0;
}

void print_charman(int n) {
	int i,j,k;
    for ( i = n; i >= 1 ; i--) {
        for ( k = 0; k < 2*(n-i+1); k++) 
			printf("   ");
        for ( j = 0; j < 2*i-1; j++) 
			printf(" O    ");
        printf("\n");

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

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

{03A7500C-D781-4340-8139-005B8D58AF7A}

{8ADE91DF-A8B8-4A57-824F-4126B5B99117}

总行数为n,for循环取出i从n到1,观察可以得出第i行的小人个数为2i-1,前面的空挡数为2(n-i+1)个,嵌套三组for循环在每一行打印出头身腿,但要注意格式,中间大概相差一个小人的空挡。

posted on 2026-04-17 09:40  kobebrant24  阅读(8)  评论(0)    收藏  举报