实验三蕉 C语言函数应用编程蕉
可恶,是原始博士!什么时候!?😖😫
额啊,我,我是,呃,香蕉?🤔
对,我是香蕉🍌😃
香🐵香🐵香🐵香🐵香🐵香🐵
🍌蕉🍌蕉🍌蕉🍌蕉🍌蕉🍌蕉
香🐵香🐵香🐵香🐵香🐵香🐵
🍌蕉🍌蕉🍌蕉🍌蕉🍌蕉🍌蕉
🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵
🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵🐵
🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌
🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌
🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌
🍌🍌🐒🐒🐒🐒🐒🐒🐒🐒🐒🍌🍌
🍌🐒🐒🐒🐒🐒🐒🐒🐒🐒🐒🐒🍌
🐒🐒🐒🐒🐒🐒🐒🐒🐒🐒🐒🐒🐒
🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌
🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌🍌
🍌🍌🍌🍌摆满香蕉的小岛🍌🍌🍌🍌
🍌🍌🍌🍌睡蕉小猴的爱巢🍌🍌🍌🍌
🍌🍌🍌🍌吃完香蕉就睡觉🍌🍌🍌🍌
🍌🍌🍌🍌快快乐乐没烦恼🍌🍌🍌🍌
🍌🍌🍌🍌睡蕉小猴真是好🍌🍌🍌🍌
🍌🍌🍌🍌幸福美满没烦恼🍌🍌🍌🍌
🍌摆🍌满🍌香🍌蕉🍌的🍌小🍌岛🍌
🙈睡🙉蕉🐵小🙊猴🙉的🐒爱🐵巢🙊
🍌吃🍌完🍌香🍌蕉🍌就🍌睡🍌觉🍌
🐒快🙉快🐵乐🐵乐🐵没🙉烦🙊恼🐒
🍌睡🍌蕉🍌小🍌猴🍌真🍌是🍌好🍌
🙊幸🐒福🐵美🐵满🐵没🙉烦🐵恼🐒
实验任务1——分数等级
#include <stdio.h>
char score_to_grade(int score); // 函数声明
int main() {int score;char grade;while (scanf("%d", &score) != EOF) {grade = score_to_grade(score); // 函数调用printf("分数: %d, 等级: %c\n\n", score, grade);}return 0;
}
// 函数定义
char score_to_grade(int score) {char ans;switch (score / 10) {case 10:case 9: ans = 'A'; break;case 8: ans = 'B'; break;case 7: ans = 'C'; break;case 6: ans = 'D'; break;default: ans = 'E';}return ans;
}
问题1 函数 score_to_grade 的功能是什么?形参类型、返回值类型是什么?
根据分数划定等级。90~100
分A级,80~90
分B级,70~80
分C级,60~70
分D级,60
分以下E级。
形式参数score
类型为int
。
返回值类型为char
。
问题2 如果line21-28以下形式,有问题吗?如果有,指出有哪些问题?
switch(score/10) {
case 10:
case 9: ans = "A";
case 8: ans = "B";
case 7: ans = "C";
case 6: ans = "D";
default: ans = 'E';
}
没有加入break
语句,执行case
语句后会继续往下执行。
实验任务2——各位数的和
#include <stdio.h>
int sum_digits(int n); // 函数声明
int main() {int n;int ans;while (printf("Enter n: "), scanf("%d", &n) != EOF) {ans = sum_digits(n); // 函数调用printf("n = %d, ans = %d\n\n", n, ans);}return 0;
}
// 函数定义
int sum_digits(int n) {int ans = 0;while (n != 0) {ans += n % 10;n /= 10;}return ans;
}
问题1 函数 sum_digits 的功能是什么?
计算各位数字的和。
问题2 如果保持 main 代码和函数 sum_digits 声明不变,把函数 sum_digits 定义成如下实现方式,能实现同等的效果吗?如果不能实现同等效果,分析原因。如果能实现同等效果,说明两种实现方式背后的算法思维区别。
int sum_digits(int n) {
if(n < 10)return n;
return sum_digits(n/10) + n%10;
}
能实现。原方法为迭代,一直循环直到n
为0
。每次取出n的最后一位加到ans
中。
替换方法为递归。若n
为个位数,则直接返回n
,若n
不为个位数,则将n
去除最后一位再次调用sum_digits
,并加上个位数。
实验任务3——指数运算
#include <stdio.h>
int power(int x, int n); // 函数声明
int main() {int x, n;int ans;while (printf("Enter x and n: "), scanf("%d%d", &x, &n) != EOF) {ans = power(x, n); // 函数调用printf("n = %d, ans = %d\n\n", n, ans);}return 0;
}
// 函数定义
int power(int x, int n) {int t;if (n == 0)return 1;else if (n % 2)return x * power(x, n - 1);else {t = power(x, n / 2);return t * t;}
}
问题1 函数 power 的功能是什么?
求x
的n
次方。
问题2 函数 power 是递归函数吗?如果是,找出递归模式。写出这个递归模式对应的数学公式模型。
是。
当n
为0
时,返回1
。
当n
为奇数时,调用power(x,n-1)
并乘上x
。
当n
为偶数时,调用power(x,n/2)
并乘方。
$power(x,n)=\begin{cases} x·power(x,n-1), & n \in {2k + 1 \mid k \in \mathbb{Z}} \power(x,n/2)^2, & n \in {2k \mid k \in \mathbb{Z}} \1, & n=0 \end{cases}$
实验任务4——打印100以内的孪生素数
#include <stdio.h>
#include <math.h>int is_prime(int n) {if (n == 1) {return 0;}if (n == 2 || n == 3) {return 1;}if (n % 2 == 0 || n % 3 == 0) {return 0;}for (int i = 5; i <= sqrt(n); i += 6) {if (n % i == 0 || (n % (i + 2) == 0)) {return 0;}}return 1;
}int main() {int sum=0;for (int i = 1; i <= 98; i++) {if (is_prime(i) && is_prime(i + 2)) {printf("%d %d\n", i, i + 2);sum ++;}}printf("100以内的孪生素数有%d个", sum);
}
实验任务5——汉诺塔
#include <stdio.h>t = 1;void hanoi(int n, char a, char b, char c) {if (n == 1) {printf("%d:将第%d个盘子从%c移动到%c\n", t, n, a, c);t++;return;}else if (n > 1) {hanoi(n - 1, a, c, b);printf("%d:将第%d个盘子从%c移动到%c\n", t, n, a, c);t++;hanoi(n - 1, b, a, c);}
}int main() {int n;while (scanf("%d", &n) != EOF) {hanoi(n, 'A', 'B', 'C');printf("\n一共移动了%d次\n\n", t - 1);t = 1;}
}
实验任务6——计算组合数
#include <stdio.h>
int func(int n, int m); // 函数声明
int func2(int n, int m);int main() {int n, m;int ans;while (scanf("%d%d", &n, &m) != EOF) {ans = func2(n, m); // 函数调用printf("n = %d, m = %d, ans = %d\n\n", n, m, ans);}return 0;
}
// 函数定义
// 待补足。。。(分别用迭代和递归实现)int func(int n, int m) {int ans = 1;for (int i = n; i >= (n - m + 1); i--) {ans *= i;}for (int i = m; i >= 1; i--) {ans /= i;}return ans;
}int func2(int n, int m) {if (n == 0 && m != 0) {return 0;}if (m == 0) {return 1;}else {return func2(n - 1, m) + func2(n - 1, m - 1);}}
实验任务7——打印小人
#include <stdio.h>
#include <stdlib.h>
// 函数声明
// 待补足
// xxxvoid print_charman(int n);int main() {int n;printf("Enter n: ");scanf("%d", &n);print_charman(n); // 函数调用return 0;
}
// 函数print_charman定义
// 待补足
// xxxvoid print_charman(int n) {for (int i = 1; i <= n; i++) {for (int i2 = 1; i2 <= i - 1; i2++) {printf("\t");}for (int i2 = 1; i2 <= ((2 * n - 1) - 2 * (i - 1)); i2++) {printf(" O \t");}for (int i2 = 1; i2 <= i - 1; i2++) {printf("\t");}printf("\n");for (int i2 = 1; i2 <= i - 1; i2++) {printf("\t");}for (int i2 = 1; i2 <= ((2 * n - 1) - 2 * (i - 1)); i2++) {printf("<H>\t");}for (int i2 = 1; i2 <= i - 1; i2++) {printf("\t");}printf("\n");for (int i2 = 1; i2 <= i - 1; i2++) {printf("\t");}for (int i2 = 1; i2 <= ((2 * n - 1) - 2 * (i - 1)); i2++) {printf("I I\t");}for (int i2 = 1; i2 <= i - 1; i2++) {printf("\t");}printf("\n");}
}