实验三蕉 C语言函数应用编程蕉
实验三蕉 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>
// 函数声明
// 待补足
// xxx
void print_charman(int n);
int main() {
int n;
printf("Enter n: ");
scanf("%d", &n);
print_charman(n); // 函数调用
return 0;
}
// 函数print_charman定义
// 待补足
// xxx
void 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");
}
}