实验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;
}

问题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;
}

问题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;
}
}

问题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;
}
实验任务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;
}

递归函数
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);
}
实验任务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;
}

实验任务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");
}
}


总行数为n,for循环取出i从n到1,观察可以得出第i行的小人个数为2i-1,前面的空挡数为2(n-i+1)个,嵌套三组for循环在每一行打印出头身腿,但要注意格式,中间大概相差一个小人的空挡。
posted on 2026-04-17 09:40 kobebrant24 阅读(8) 评论(0) 收藏 举报


浙公网安备 33010602011771号