实验3
实验任务1
源代码task1.c
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 char score_to_grade(int score) { 13 char ans; 14 switch(score/10) { 15 case 10: 16 case 9: ans = 'A'; break; 17 case 8: ans = 'B'; break; 18 case 7: ans = 'C'; break; 19 case 6: ans = 'D'; break; 20 default: ans = 'E'; 21 } 22 return ans; 23 }
运行结果截图

问题1:
1.函数 score_to_grade 的功能是:根据输入的百分制分数,将其转换为对应的等级字符(A/B/C/D/E)。
2. 形参类型
形参:int score,类型为 int(整型),表示输入的百分制分数。
3. 返回值类型
返回值:char ans,类型为 char(字符型),表示转换后的等级字符。
问题2:
1.缺少break语句
2.赋值类型错误:用字符串常量 "A" 给字符变量赋值
实验任务2
源代码task2.c
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 int sum_digits(int n) { 13 int ans = 0; 14 while(n != 0) { 15 ans += n % 10; 16 n /= 10; 17 } 18 return ans; 19 }
运行结果截图

问题1:
sum_digits 函数的功能是:计算一个整数 n 的所有各位数字之和。
问题2:
能实现同样的输出。
迭代法:通过while循环重复执行“取个位、累加、去掉个位”三步,直到数字为0
递归法:把“求n的各位和”拆成“求n/10的各位和 + n的个位”,直到满足n<10的终止条件,再层层回溯相加
实验任务3
源代码task3.c
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:
power(x, n) 函数的功能是:计算整数 x 的 n 次幂
问题2:
是递归函数。运用了分治的递归模式,核心是按指数奇偶性分治。

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

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

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

实验任务6
源代码task6.c
1 #include <stdio.h> 2 int gcd(int a, int b, int c); 3 4 int main(){ 5 int a, b, c; 6 int ans; 7 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 int gcd(int a, int b, int c){ 15 int i = a; 16 if(b < i) 17 i = b; 18 if(c < i) 19 i = c; 20 for(i; i >= 1; --i){ 21 if(a % i == 0 && b % i == 0 && c % i == 0){ 22 return i; 23 } 24 } 25 return 1; 26 }
运行结果截图

实验任务7
源代码task7.c
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 scanf("%d", &n); 8 print_charman(n); 9 10 return 0; 11 } 12 void print_charman(int n){ 13 int i; 14 int j; 15 int t; 16 for (i = n - 1; i >= 0; i--) { 17 for(t = n; t > i ; t--) 18 printf("\t"); 19 for(j = 0; j < 2 * i + 1; j++) 20 printf(" O\t"); 21 printf("\n"); 22 for(t = n; t > i; t--) 23 printf("\t"); 24 for(j = 0; j < 2 * i + 1; j++) 25 printf("<H>\t"); 26 printf("\n"); 27 for(t = n; t > i; t--) 28 printf("\t"); 29 for(j = 0; j < 2 * i + 1;j ++) 30 printf("I I\t"); 31 printf("\n"); 32 33 } 34 }
运行结果截图

运行结果截图


浙公网安备 33010602011771号