实验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 14 return 0; 15 } 16 17 // 函数定义 18 char score_to_grade(int score) { 19 char ans; 20 21 switch(score/10) { 22 case 10: 23 case 9: ans = 'A'; break; 24 case 8: ans = 'B'; break; 25 case 7: ans = 'C'; break; 26 case 6: ans = 'D'; break; 27 default: ans = 'E'; 28 } 29 30 return ans; 31 }

问题1:根据传入的百分制分数,判断其所在的分数段,并返回对应的等级字符;int;char。
问题2:1.ans应该用单引号赋值。2.缺少break语句,导致所有输出结果全为E。
任务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 14 return 0; 15 } 16 17 // 函数定义 18 int sum_digits(int n) { 19 int ans = 0; 20 21 while(n != 0) { 22 ans += n % 10; 23 n /= 10; 24 } 25 26 return ans; 27 }

问题1:计算并返回一个非负整数n的各位数字之和
问题2:能。原代码使用循环解决问题,代码运行效率高,新代码使用递归法,代码结构更加简洁。
任务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 // 函数定义 18 int power(int x, int n) { 19 int t; 20 21 if(n == 0) 22 return 1; 23 else if(n % 2) 24 return x * power(x, n-1); 25 else { 26 t = power(x, n/2); 27 return t*t; 28 } 29 }

问题1:高效地计算x的n次方
问题2:
问题3:1.正确,结果均为x的n次方 2.因为产生大量子问题重复计算,因此性能会大幅下降,原写法调用6次,修改后调用47次
任务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; 7 int ans; 8 9 while (scanf("%d%d%d", &a, &b, &c) != EOF) { 10 ans = classify_triangle(a, b, c); 11 12 switch (ans) { 13 case 0: 14 printf("不能构成三角形\n"); 15 break; 16 case 1: 17 printf("普通三角形\n"); 18 break; 19 case 2: 20 printf("等边三角形\n"); 21 break; 22 case 3: 23 printf("等腰三角形\n"); 24 break; 25 case 4: 26 printf("直角三角形\n"); 27 break; 28 } 29 } 30 31 return 0; 32 } 33 34 int classify_triangle(int a, int b, int c) { 35 long long x, y, z; 36 37 if (a <= 0 || b <= 0 || c <= 0) return 0; 38 if (a + b <= c || a + c <= b || b + c <= a) return 0; 39 40 if (a == b && b == c) return 2; 41 42 if (a == b || a == c || b == c) return 3; 43 44 x = a; y = b; z = c; 45 if (x * x + y * y == z * z || 46 x * x + z * z == y * y || 47 y * y + z * z == x * x) { 48 return 4; 49 } 50 51 return 1; 52 }

任务5
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, m, ans); 12 } 13 14 return 0; 15 } 16 17 int func(int n, int m) { 18 if (m < 0 || m > n) { 19 return 0; 20 } 21 22 if (m == 0 || m == n) { 23 return 1; 24 } 25 26 return func(n - 1, m) + func(n - 1, m - 1); 27 }

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, m, ans); 12 } 13 14 return 0; 15 } 16 17 int func(int n, int m) { 18 long long ans = 1; 19 int i; 20 21 if (m < 0 || m > n) { 22 return 0; 23 } 24 if (m == 0 || m == n) { 25 return 1; 26 } 27 28 if (m > n - m) { 29 m = n - m; 30 } 31 32 for (i = 1; i <= m; i++) { 33 ans = ans * (n - m + i) / i; 34 } 35 36 return (int)ans; 37 }

任务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 9 while (scanf("%d%d%d", &a, &b, &c) != EOF) { 10 ans = gcd(a, b, c); 11 printf("最大公约数: %d\n\n", ans); 12 } 13 14 return 0; 15 } 16 17 int gcd(int a, int b, int c) { 18 int min = a; 19 int i; 20 21 if (b < min) { 22 min = b; 23 } 24 if (c < min) { 25 min = c; 26 } 27 28 for (i = min; i >= 1; i--) { 29 if (a % i == 0 && b % i == 0 && c % i == 0) { 30 return i; 31 } 32 } 33 34 return 1; 35 }
任务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("Enter n: "); 9 scanf("%d", &n); 10 print_charman(n); 11 12 return 0; 13 } 14 15 void print_charman(int n) { 16 int i, j, k; 17 int count; 18 19 for (i = 1; i <= n; i++) { 20 count = 2 * (n - i + 1) - 1; 21 22 for (k = 1; k < i; k++) { 23 printf("\t"); 24 } 25 for (j = 1; j <= count; j++) { 26 if (j > 1) printf("\t"); 27 printf(" 0 "); 28 } 29 printf("\n"); 30 31 for (k = 1; k < i; k++) { 32 printf("\t"); 33 } 34 for (j = 1; j <= count; j++) { 35 if (j > 1) printf("\t"); 36 printf("<H>"); 37 } 38 printf("\n"); 39 40 for (k = 1; k < i; k++) { 41 printf("\t"); 42 } 43 for (j = 1; j <= count; j++) { 44 if (j > 1) printf("\t"); 45 printf("I I"); 46 } 47 printf("\n"); 48 49 if (i < n) { 50 printf("\n"); 51 } 52 } 53 }



浙公网安备 33010602011771号