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

问题回答
问题1:作用是将输入的整数类型的分数转换为对应的等级字符;int;char。
问题2:1.ans是char类型变量,而"A"是字符串常量,无法直接赋值给字符变量。
2.缺少break来终止当前分支,会使得其会继续执行后续所有case和default代码,无法得到正确等级。
实验任务2
源代码
1 #include <stdio.h> 2 3 int sum_digits(int n); 4 5 int main() { 6 int n; 7 int ans; 8 9 while(printf("Enter n: "), scanf("%d", &n) != EOF) { 10 ans = sum_digits(n); 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 return 0; 14 15 } 16 17 int sum_digits(int n) { 18 int ans = 0; 19 20 while(n != 0) { 21 ans += n % 10; 22 n /= 10; 23 } 24 25 return ans; 26 }
运行结果截图

问题回答
问题1:功能是计算输入的整数n的各位数字之和。
问题2:能实现;
原代码是迭代思维,通过while循环,直到n变为0,逐步完成计算。
修改后是递归思维,通过函数自身调用,将问题逐步缩小,直到终止。
实验任务3
源代码
1 #include <stdio.h> 2 3 int power(int x, int n); 4 5 int main() { 6 int x, n; 7 int ans; 8 9 while(printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 10 ans = power(x, n); 11 printf("n = %d, ans = %d\n\n", n, ans); 12 } 13 14 return 0; 15 } 16 17 int power(int x, int n) { 18 int t; 19 20 if(n == 0) 21 return 1; 22 else if(n % 2) 23 return x * power(x, n-1); 24 else { 25 t = power(x, n/2); 26 return t*t; 27 } 28 }
运行结果截图

问题回答
问题1:功能是计算整数x的n次幂,n为非负整数。
问题2:

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

实验任务5
源代码1
1 #include <stdio.h> 2 3 int func(int n, int m); 4 5 int main() { 6 int n, m; 7 int ans; 8 9 while (scanf("%d%d", &n, &m) != EOF) { 10 ans = func(n, m); 11 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 12 } 13 return 0; 14 } 15 16 int func(int n, int m) { 17 if (m > n || m < 0) { 18 return 0; 19 } 20 21 if (m > n - m) { 22 m = n - m; 23 } 24 long long result = 1; 25 for (int i = 1; i <= m; i++) { 26 result = result * (n - m + i) / i; 27 } 28 return (int)result; 29 }
运行结果截图

源代码2
1 #include <stdio.h> 2 3 int func(int n, int m); 4 5 int main() { 6 int n, m; 7 int ans; 8 9 while (scanf("%d%d", &n, &m) != EOF) { 10 ans = func(n, m); 11 printf("n = %d, m = %d, ans = %d\n\n", n, m, ans); 12 } 13 return 0; 14 } 15 16 int func(int n, int m) { 17 if (m == 0 || m == n) { 18 return 1; 19 } 20 if (m > n || m < 0) { 21 return 0; 22 } 23 24 return func(n - 1, m) + func(n - 1, m - 1); 25 }
运行结果截图

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

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


浙公网安备 33010602011771号