实验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 char score_to_grade(int score){ 18 char ans; 19 20 switch(score/10){ 21 case 10: 22 case 9: ans = 'A'; break; 23 case 8: ans = 'B'; break; 24 case 7: ans = 'C'; break; 25 case 6: ans = 'D'; break; 26 default: ans = 'E'; 27 } 28 29 return ans; 30 }
运行截图

问题1:函数的功能是判断输入分数所在等级;形参类型是整形,返回值是单个字符
问题2:会导致执行正确的case语句后继续向下执行后面所有的case语句
实验任务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 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:计算输入数值各个位数上的数字之和
问题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 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次方
问题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, x; 7 8 while(scanf("%d%d%d", &a, &b, &c) != EOF){ 9 x = classify_triangle(a, b, c); 10 switch(x){ 11 case 0: 12 printf("不能构成三角形\n\n"); 13 break; 14 case 1: 15 printf("普通三角形\n\n"); 16 break; 17 case 2: 18 printf("等边三角形\n\n"); 19 break; 20 case 3: 21 printf("等腰三角形\n\n"); 22 break; 23 case 4: 24 printf("直角三角形\n\n"); 25 break; 26 } 27 } 28 29 return 0; 30 } 31 32 int classify_triangle(int a, int b, int c){ 33 if(a >= b + c || b >= a + c || c >= a + b) 34 return 0; 35 36 if(a == b && b == c) 37 return 2; 38 39 if(a == b || a == c || c == b) 40 return 3; 41 42 if(a*a == b*b + c*c || b*b == a*a +c*c || c*c == a*a + b*b) 43 return 4; 44 45 else 46 return 1; 47 }
运行截图

实验任务5
源代码(迭代方式)
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 13 return 0; 14 } 15 16 int func(int n, int m){ 17 long long a = 1; 18 int i; 19 20 if(m > n) 21 return 0; 22 23 if(m == n || m == 0) 24 return 1; 25 26 if(m > n - m) 27 m = n - m; 28 29 if(m < n){ 30 for(i = 1; i <= m; i++){ 31 a = a*(n - m + i)/i; 32 } 33 } 34 35 return a; 36 }
运行截图(迭代方式)

源代码(递归方式)
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 13 return 0; 14 } 15 16 int func(int n, int m){ 17 int x; 18 if(m > n) 19 return 0; 20 if(m == n || m == 0) 21 return 1; 22 if(m > n - m) 23 m = n - m; 24 if(m < n){ 25 return func((n - 1), m) + func((n - 1), (m - 1)); 26 } 27 }
运行截图(递归方式)

实验任务6
源代码
1 #include <stdio.h> 2 3 int gcd(int a, int b, int c); 4 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\n", ans); 13 } 14 15 return 0; 16 } 17 18 int gcd(int a, int b, int c){ 19 int i = a; 20 21 if(b < a){ 22 if(b <= c) 23 i = b; 24 if(c < b) 25 i = c; 26 } 27 28 for(i; i >= 1; --i){ 29 if(a % i == 0 && b % i == 0 && c % i == 0) 30 return i; 31 32 } 33 return i; 34 }
运行截图

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


浙公网安备 33010602011771号