实验三
实验三
test1
源代码
#define _CRT_SECURE_NO_WARNINGS
#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.本函数char score_to_grade,作用是将分数转换为等地,参数类型是int score,返回值类型是char
2.ans后的引用应用单引号,case后要有break。
test2
源代码
#define _CRT_SECURE_NO_WARNINGS
#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.sum_digits的功能是计算一个整数n的各位数字之和。
2.能同样输出,思维不同一个是循环一个是递归,使用while循环,每次取出最低位累加,然后除以10去掉最低位,直到n变为0。用递归,当n<10时直接返回n否则返回sum_digits(n/10)+n%10。
test3
源代码
#define _CRT_SECURE_NO_WARNINGS
#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.power的功能是计算x的n次幂。
2.当n==0时,返回1。当n为奇数时xn=x*x(n-1)。当n为偶数时,xn=(x(n/2))^2。

test4
源代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int classify_triangle(int a, int b, int c);
int main() {
int a, b, c;
int ret;
while (scanf("%d%d%d", &a, &b, &c) != EOF) {
ret = classify_triangle(a, b, c);
switch (ret) {
case 0: printf("不能构成三角形\n\n"); break;
case 1: printf("普通三角形\n\n"); break;
case 2: printf("等腰三角形\n\n"); break;
case 3: printf("等边三角形\n\n"); break;
case 4: printf("直角三角形\n\n"); break;
default: printf("未知\n\n");
}
}
return 0;
}
int classify_triangle(int a, int b, int c) {
int t;
if (a > b) { t = a; a = b; b = t; }
if (a > c) { t = a; a = c; c = t; }
if (b > c) { t = b; b = c; c = t; }
if (a + b <= c)
return 0;
if (a == b && b == c)
return 3;
if (a == b || b == c || a == c)
return 2;
if (a * a + b * b == c * c)
return 4;
return 1;
}
运行截图

test5
源代码(循环)
#define _CRT_SECURE_NO_WARNINGS
#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 0;
if (m == 0 || m == n) return 1;
if (m > n - m) m = n - m;
int res = 1;
for (int i = 1; i <= m; i++) {
res = res * (n - m + i) / i;
}
return res;
}
源代码(递归)
#define _CRT_SECURE_NO_WARNINGS
#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 0;
if (m == 0 || m == n) return 1;
return func(n - 1, m) + func(n - 1, m - 1);
}
运行截图

test6
源代码
#define _CRT_SECURE_NO_WARNINGS
#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;
}
return 1;
}
运行截图

test7
源代码
#include <stdio.h>
#include <stdlib.h>
void print_charman(int n);
int main() {
int n;
printf("Enter n: ");
while(scanf("%d", &n) != EOF){
printf("input n: %d\n", n);
print_charman(n);
printf("\nEnter n: ");
}
return 0;
}
void print_charman(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
printf("\t");
}
for (int j = 1; j <= 2 * (n - i) + 1; j++) {
printf(" O \t");
}
printf("\n");
for (int j = 1; j < i; j++) {
printf("\t");
}
for (int j = 1; j <= 2 * (n - i) + 1; j++) {
printf(" <H> \t");
}
printf("\n");
for (int j = 1; j < i; j++) {
printf("\t");
}
for (int j = 1; j <= 2 * (n - i) + 1; j++) {
printf(" I I \t");
}
printf("\n");
}
}
运行截图

实验总结
收获:
函数声明告诉编译器函数的返回类型、函数名和参数类型及个数。
函数调用时,实参传递给形参,参数传递是值传递。
形参与实参的区别
形参:函数定义时括号内的变量,只在函数内部有效。
实参:调用函数时传递给函数的具体值或变量。
实参的值被复制给形参,函数内部对形参的修改不会影响实参本身。
递归函数必须有一个明确的递归基(终止条件),否则会导致无限递归。
递归函数将大问题分解为规模更小的同类子问题,通过函数自身调用来求解。
使用循环结构(while、for),效率高,但可能代码冗长。
递归代码简洁、逻辑清晰,但可能因函数调用开销较大、栈深度受限而性能较差。
穷举法,在实验6(求最大公约数)中,从最小数开始向下试探,直到找到最大公约数。
穷举法简单直观,适用于问题规模较小的情况。
理解 scanf 的返回值(成功读取的元素个数),利用 EOF 实现多组输入循环。
问题:在图形输出中,如何更灵活地控制每个小人的宽度,以适应不同字符宽度的字体?

浙公网安备 33010602011771号