实验3
实验任务1
源代码:
1 #include <stdio.h> 2 char score_to_grade(int score); 3 int main() { 4 int score; 5 char grade; 6 while(scanf("%d", &score) != EOF) { 7 grade = score_to_grade(score); 8 printf("分数: %d, 等级: %c\n\n", score, grade); 9 } 10 return 0; 11 } 12 // 函数定义 13 char score_to_grade(int score) { 14 char ans; 15 switch(score/10) { 16 case 10: 17 case 9:ans = 'A'; break; 18 case 8:ans = 'B'; break; 19 case 7:ans = 'C'; break; 20 case 6:ans = 'D'; break; 21 default:ans = 'E'; 22 } 23 return ans; 24 }
运行结果:

问题回答:
问题1:函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
功能:显示输入的数字分数对应的字母等级。
形参类型:int;
返回值类型:字符型char。
问题2:如果line21-28以下形式,代码存在哪些问题,请逐一指出。

如果将代码改为赋值为"A"——"D",会存在数据类型不匹配的问题。"A"代表字符串字面量,而变量ans为char类型。将字符串的地址赋值给char类型变量会导致编译警告或错误。
实验任务2
源代码:
1 #include <stdio.h> 2 int sum_digits(int n); // 函数声明 3 int main() { 4 int n; 5 int ans; 6 while (printf("Enter n: "), scanf("%d", &n) != EOF) { 7 ans = sum_digits(n); // 函数调用 8 printf("n = %d, ans = %d\n\n", n, ans); 9 } 10 return 0; 11 } 12 // 函数定义 13 int sum_digits(int n) { 14 int ans = 0; 15 while (n != 0) { 16 ans += n % 10; 17 n /= 10; 18 } 19 return ans; 20 }
运行结果:

问题回答:
问题1:函数 sum_digits 的功能是什么?
计算并返回一个整数n的各位数字之和。
问题2:如果把函数 sum_digits 定义成如下实现方式,能实现同样的输出吗?如果能,说明两种实现方式的算法思维区别;如果不能,分析原因。

能实现同样的输出结果。
区别:原代码采用的是迭代算法,通过while循环不断对数字取余和整除,累加求和。新代码采用的是递归算法,它将原问题分解为求最后一位数字加上剩余位数字之和的子问题,通过函数调用自身来解决,直到当数字小于10时直接返回数字本身。
实验任务3
源代码:
1 #include <stdio.h> 2 int power(int x, int n); // 函数声明 3 int main() { 4 int x, n; 5 int ans; 6 while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 7 ans = power(x, n); // 函数调用 8 printf("n = %d, ans = %d\n\n", n, ans); 9 } 10 11 return 0; 12 } 13 // 函数定义 14 int power(int x, int n) { 15 int t; 16 if (n == 0) 17 return 1; 18 else if (n % 2) 19 return x * power(x, n - 1); 20 else { 21 t = power(x, n / 2); 22 return t * t; 23 } 24 }
运行结果:

问题回答:
问题1: 函数 power 的功能是什么?
计算x的n次幂。
问题2:函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。(在纸上写出这个递归模式对应的数学公式,拍照后以图片方式放到这里;也可使用公式编辑器(如果会使用))

实验任务4
源代码:
1 #include <stdio.h> 2 int classify_triangle(int a, int b, int c); 3 4 int main() { 5 int a, b, c, type; 6 while (scanf("%d %d %d", &a, &b, &c) != EOF) { 7 type = classify_triangle(a, b, c); 8 switch (type) { 9 case 0: printf("不能构成三角形\n\n"); break; 10 case 1: printf("普通三角形\n\n"); break; 11 case 2: printf("等边三角形\n\n"); break; 12 case 3: printf("等腰三角形\n\n"); break; 13 case 4: printf("直角三角形\n\n"); break; 14 } 15 } 16 return 0; 17 } 18 19 int classify_triangle(int a, int b, int c) { 20 if (a + b <= c || a + c <= b || b + c <= a) { 21 return 0; 22 } 23 if (a == b && b == c) { 24 return 2; 25 } 26 if (a == b || b == c || a == c) { 27 return 3; 28 } 29 if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) { 30 return 4; 31 } 32 return 1; 33 }
运行结果:

实验任务5
源代码:
迭代:
View Code递归:
1 #include <stdio.h> 2 3 int func2(int n, int m); 4 int main() { 5 int n, m; 6 int ans; 7 while (scanf("%d%d", &n, &m) != EOF) { 8 ans = func2(n, m); 9 printf("n=%d, m=%d, ans=%d\n\n", n, m, ans); 10 } 11 return 0; 12 } 13 14 int func2(int n, int m) { 15 if (m == 0 || n == m) { 16 return 1; 17 } 18 if (m > n) { 19 return 0; 20 } 21 return func2(n - 1, m) + func2(n - 1, m - 1); 22 }
运行结果:
用迭代方式实现计算组合数 func() 的完整源代码task5_1.c,及,运行测试截图

用递归函数实现计算组合数 func() 的完整源代码task5_2.c,及,运行测试截图

实验任务6
源代码:
1 #include <stdio.h> 2 3 int gcd(int a, int b, int c); 4 5 int main() { 6 int a, b, c; 7 int ans; 8 while (scanf("%d%d%d", &a, &b, &c) != EOF) { 9 ans = gcd(a, b, c); 10 printf("最大公约数: %d\n\n", ans); 11 } 12 return 0; 13 } 14 15 int gcd(int a, int b, int c) { 16 int min = a; 17 if (b < min) min = b; 18 if (c < min) min = c; 19 20 for (int i = min; i >= 1; i--) { 21 if (a % i == 0 && b % i == 0 && c % i == 0) { 22 return i; 23 } 24 } 25 return 1; 26 }
运行结果:

实验任务7
源代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 void print_charman(int n); 4 int main() { 5 int n; 6 printf("Enter n: "); 7 while (scanf("%d", &n) != EOF) { 8 printf("input n: %d\n", n); 9 print_charman(n); 10 printf("\nEnter n: "); 11 } 12 return 0; 13 } 14 15 void print_charman(int n) { 16 for (int i = 1; i <= n; i++) { 17 for (int j = 1; j < i; j++) { 18 printf("\t"); 19 } 20 for (int j = 1; j <= 2 * (n - i) + 1; j++) { 21 printf(" O \t"); 22 } 23 printf("\n"); 24 25 for (int j = 1; j < i; j++) { 26 printf("\t"); 27 } 28 for (int j = 1; j <= 2 * (n - i) + 1; j++) { 29 printf(" <H> \t"); 30 } 31 printf("\n"); 32 33 for (int j = 1; j < i; j++) { 34 printf("\t"); 35 } 36 for (int j = 1; j <= 2 * (n - i) + 1; j++) { 37 printf(" I I \t"); 38 } 39 printf("\n"); 40 } 41 }
运行结果:


浙公网安备 33010602011771号