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

3.回答问题
(1).问题1:
功能:将分数(score)转化为对应的等级(grade)
形参类型:有符号整型
返回值类型:字符型
(2).问题2:
存在的问题:
(i).将第二到第五个case语句后的单引号改为双引号,使ans变量无法正常获取数值,运行时系统报错
(ii).第二到第五个case语句后均缺失break语句,执行一个case语句后会会继续执行后,会续所有case直到default,运行时会出现评分始终为E
二.任务二
1.源代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 4 int sum_digits(int n); // 函数声明 5 6 int main() { 7 int n; 8 int ans; 9 10 while (printf("Enter n: "), scanf("%d", &n) != EOF) { 11 ans = sum_digits(n); // 函数调用 12 printf("n = %d, ans = %d\n\n", n, ans); 13 } 14 15 return 0; 16 } 17 18 // 函数定义 19 int sum_digits(int n) { 20 int ans = 0; 21 22 while (n != 0) { 23 ans += n % 10; 24 n /= 10; 25 } 26 27 return ans; 28 }
2.运行结果截图

3.回答问题
(1).问题1:功能:计算一个整数的所有位数上的数字之和
(2).问题2:能。第一种是迭代方式,第二种是递归方式。
三.任务三
1.源代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 4 int power(int x, int n); // 函数声明 5 6 int main() { 7 int x, n; 8 int ans; 9 10 while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) { 11 ans = power(x, n); // 函数调用 12 printf("n = %d, ans = %d\n\n", n, ans); 13 } 14 15 return 0; 16 } 17 18 // 函数定义 19 int power(int x, int n) { 20 int t; 21 22 if (n == 0) 23 return 1; 24 else if (n % 2) //n为奇数 25 return x * power(x, n - 1); 26 else { //n为偶数 27 t = power(x, n / 2); 28 return t * t; 29 } 30 }
2.运行结果截图

3.回答问题
(1).问题1:功能:计算x的n次方
(2).问题2:是

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

五.任务五
(一).迭代法
1.源代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 4 int func(int n, int m); // 函数声明 5 int main() { 6 int n, m; 7 int ans; 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 //迭代法 17 int func(int n, int m) { 18 double ans; 19 if (n < m) 20 ans = 0; 21 else if (m == 0) 22 ans = 1; 23 else { 24 for (int i = 1; i <= n; ++i) { 25 ans = ans * n / m; 26 n--; 27 m--; 28 } 29 } 30 return ans; 31 }
2.运行结果截图

(二).递归函数
1.源代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 4 int func(int n, int m); // 函数声明 5 int main() { 6 int n, m; 7 int ans; 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 17 //递归法 18 int func(int n, int m) { 19 int ans; 20 if (n < m) 21 ans = 0; 22 else if (m == 0) 23 ans = 1; 24 else 25 ans = func((n - 1), m) + func((n - 1), (m - 1)); 26 27 return ans; 28 }
2.运行结果截图

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

七.任务七
1.源代码
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 4 // 函数声明 5 void print_charman(int); 6 7 int main() { 8 int n; 9 printf("Enter n: "); 10 scanf("%d", &n); 11 print_charman(n); // 函数调用 12 13 return 0; 14 } 15 16 // 函数print_charman定义 17 void print_charman(int n) { 18 int i, j, k = n; //k用于控制每行小人打印数量 19 //头 20 for (i = 0; i < n; ++i) { 21 for (j = 0; j < i; ++j) { 22 printf("\t"); 23 } 24 for (j = 0; j < 2 * k - 1; ++j) { 25 printf(" 0 \t"); 26 } 27 printf("\n"); 28 //身 29 for (j = 0; j < i; ++j) { 30 printf("\t"); 31 } 32 for (j = 0; j < 2 * k - 1; ++j) { 33 printf("<H>\t"); 34 } 35 printf("\n"); 36 //腿 37 for (j = 0; j < i; ++j) { 38 printf("\t"); 39 } 40 for (j = 0; j < 2 * k - 1; ++j) { 41 printf("I I\t"); 42 } 43 printf("\n"); 44 k--; 45 } 46 }
2.运行结果截图


八.实验总结
1.通过这次实验,我对递归函数的理解更进一步,对递归函数的编写能力得到提升。
2.对循环的使用有了新的认识,能更加熟练地使用循环语句。
浙公网安备 33010602011771号