一、实验结论
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我总感觉我写的有一点复杂,但是目前没有想到改进方法。