实验三
实验三
task1
源代码
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 }
运行结果截图

问题讨论
Q1:分数评级,形参为整形,返回值为字符型。
Q2:1.A、B、C、D后无break,导致评级带有后几项的值,如输入100,输出ABCDE
2.字符形应用单引号' '
task2
源代码
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 }
运行结果截图

问题讨论
Q1:各位上的数之和
Q2:可以,运用了递归的思维。
task3
源代码
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 }
运行结果截图

问题讨论
Q1:求x的n次方
Q2:是递归,递归公式如下:
task4
源代码
1 #include <stdio.h> 2 int classify_triangle(int a, int b, int c); 3 int main() { 4 int a, b, c; 5 while (scanf("%d%d%d", &a ,& b ,& c) != EOF) { 6 switch (classify_triangle(a, b, c)) { 7 case 0:printf("不能构成三角形\n"); break; 8 case 1:printf("普通三角形\n"); break; 9 case 2:printf("等边三角形\n"); break; 10 case 3:printf("等腰三角形\n"); break; 11 case 4:printf("直角三角形\n"); 12 } 13 } 14 return 0; 15 } 16 int classify_triangle(int a, int b, int c) { 17 if (a + b <= c || a + c <= b || b + c <= a) 18 return 0; 19 else if (a == b && b == c) 20 return 2; 21 else if ((a == b && b != c) || (a == c && c != b) || (b == c && b != a)) 22 return 3; 23 else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) 24 return 4; 25 else 26 return 1; 27 }
运行结果截图

task5
源代码
(迭代法)
1 #include<stdio.h> 2 int func(int n, int m); 3 int main() { 4 int n, m; 5 int ans; 6 while (scanf("%d%d", &n, &m) != EOF) { 7 ans = func(n, m); 8 printf("n=%d,m=%d,ans=%d\n\n", n, m, ans); 9 } 10 return 0; 11 } 12 int func(int n, int m) { 13 int a=1, b=1; 14 int i, j; 15 for (i = n-m+1; i <= n; i++) 16 a *= i; 17 for (j = 1; j <= m; j++) 18 b *= j; 19 return a / b; 20 }
(递归法)
1 #include<stdio.h> 2 int func(int n, int m); 3 int main() { 4 int n, m; 5 int ans; 6 while (scanf("%d%d", &n, &m) != EOF) { 7 ans = func(n, m); 8 printf("n=%d,m=%d,ans=%d\n\n", n, m, ans); 9 } 10 return 0; 11 } 12 int func(int n, int m) { 13 if (m==0 ) 14 return 1; 15 if (n < m) 16 return 0; 17 if (n == m) 18 return 1; 19 return func(n - 1, m) + func(n - 1, m - 1); 20 }
运行结果截图
迭代法

递归法

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

task7
源代码
1 #include<stdio.h> 2 void printf_charman(int n); 3 int main() { 4 int n; 5 printf("Enter n: "); 6 scanf("%d", &n); 7 printf_charman(n); 8 return 0; 9 } 10 void printf_charman(int n) { 11 int i,j,t; 12 t = 0; 13 for(i=1;i<=3*n;i++){ 14 for (j = 1.0; j <=2 * n - 1; j++) { 15 if (j > (t/3) && j < 2 * n - (t/3)) { 16 switch (i % 3) { 17 case 1:printf(" O \t"); break; 18 case 2:printf("<H>\t"); break; 19 case 0:printf("I I\t"); 20 } 21 } 22 else 23 printf(" \t"); 24 } 25 t += 1; 26 printf("\n"); 27 } 28 }
运行结果截图



浙公网安备 33010602011771号