实验3

一、实验结论

1.task1

  • 代码
#include <stdio.h>

char score_to_grade(int score); 

int main() {
    int score;
    char grade;

    while (scanf_s("%d", &score)) {
        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;
}
  • 运行结果截图
    xw_20260415103044
  • 回答问题
    问题1:函数score_to_grade的功能是什么?形参类型、返回值类型分别是什么?
    答:将分数划分等级。形参类型为int,返回值类型为char
    问题2:如果line21-28改成以下写法,代码存在哪些问题?请逐一指出。
    答:1.没有break;无论score等于多少都是E
    2.前面的等级都是双引号"A",加上break后输出不是A

2.task2

  • 代码
#include <stdio.h>

int sum_digits(int n);

int main() {
    int n;
    int ans;

    while (printf("Enter n: "), scanf_s("%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;
}
  • 运行结果截图
    2
  • 回答问题
    问题1:函数sum_digits的功能是什么?
    答:将一个数中的每一个数字相加
    问题2:如果把函数sum_digits定义成如下实现方式,能实现同样的输出吗?
    答:可以
    如果能,说明两种实现方式的算法思维区别;如果不能,分析原因。
    答:能;第一种是迭代的方式每次把n%10的数相加储存在ans变量,再把n/10,直到n=0;第二个采用递归调用的方法,递归出口是n<10

3.task3

  • 代码
#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;
    }
}
  • 运行结果截图
    3
  • 回答问题
    问题1: 函数power的功能是什么?
    答:算x的n次方
    问题2:函数power是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
    答:是
    微信图片_20260419165728_80_69

4.task4

  • 代码
#include<stdio.h>
int classify_triangle(int a,int b,int c);
int main() {
	int ans2, a, b, c;
	printf("请输入三角形三边:");
	while (scanf_s("%d %d %d", &a, &b, &c)!=EOF) {
		ans2 = classify_triangle(a,b,c);
		switch (ans2) {
			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;
			default:printf("wrong");
		}
	}
}

int classify_triangle(int a, int b, int c) {
	int ans;
	if (a + b <= c||a+c<b||b+c<a) {
		ans = 0;
	}
	else if (a == b && a == c) {
		ans = 2;
	}
	else if (a == b||a==c||b==c) {
		ans = 3;
	}
	else if (a * a + b * b == c * c||a*a+c*c==b*b||b*b+c*c==a*a) {
		ans = 4;
	}
	else {
		ans = 1;
	}
	return ans;
}
  • 运行结果截图
    5

5.task5

  • 迭代方式代码
#include <stdio.h>
int func(int n, int m);
int main() {
	int n, m;
	int ans;
	while (scanf_s("%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 ans=1;
	int i=m;
	if (n < m) {
		ans = 0;
	}
	else if(m==0) {
		ans = 1;
	}
	else {
		while (i>0) {
			ans = ans*n;
			n--;
			i--;
		}
		while (m > 0) {
			ans = ans / m;
			m--;
		}
	}
	return ans;

}
  • 运行结果截图
    55
  • 递归方法代码
#include <stdio.h>
int func(int n, int m);
int main() {
	int n, m;
	int ans;
	while (scanf_s("%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 ans=1;
	if (n < m) {
		return 0;
	}
	else if (n == m || m == 0) {
		return 1;
	}
	else if (m == 1) {
		return n;
	}
	else {
		return func(n - 1, m) + func(n - 1, m - 1);
		ans = n / m;
	}
	return ans;
}
  • 运行结果截图
    52

6.task6

  • 代码
#include<stdio.h>
int gcd(int a, int b, int c);
int main() {
	int a, b, c;
	int ans;
	while (scanf_s("%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 (min > b) {
		min = b;
	}
	else if(min>c){
		min = c;
	}
	while (min != 0) {
		if (a % min == 0 && b % min == 0 && c % min == 0) {
			return min;
		}
		min--;
	}
}
  • 运行结果截图
    6

7.task7

  • 代码
#include <stdio.h>
#include <stdlib.h>
void print_charman(int n);
int main() {
	int n;
	printf("Enter n: ");
	scanf_s("%d", &n);
	print_charman(n);

	return 0;
}
void print_charman(int n) {
	int i,j,k,b=n,a;
	while (n!=0) {
		i = 0;
		j = 0;
		k = 0;
		for (a = n;a< b;a++) {
			printf("%11s", " ");
		}
		while (i<2*n-1) {
			printf("%3s0 "," ");
			printf("%6s", " ");
			i++;
		}
		printf("\n");
		for (a = n;a < b;a++) {
			printf("%11s", " ");
		}
		while (j< 2 * n - 1) {
			printf(" < H > ");
			printf("%4s", " ");
			j++;
		}
		printf("\n");
		for (a = n;a < b;a++) {
			printf("%11s", " ");
		}
		while (k< 2 * n - 1) {
			printf("%1s I I "," ");
			printf("%5s", " ");
			k++;
		}
		printf("\n");
		n--;
	}
	
}
  • 运行结果截图
    72

二、实验总结

  • 1.用递归方法写代码时找到递归出口是必要的,如果公式不好看出来,就举例写一写。
  • 2.做task7这种实验,要先把任务拆分,一步一步完成。
    疑问:task7我总感觉我写的有一点复杂,但是目前没有想到改进方法。
posted @ 2026-04-21 13:19  __wy  阅读(7)  评论(0)    收藏  举报