任务一
验证性实验
源码
| #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; |
| } |
结果

回答
- 功能是数值分数与等级转换,形参类型
int
,返回值类型char
。
- 有问题,此时输入一个成绩,会输出其下所有的等级。
任务二
源码
| #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; |
| } |
结果

回答
- 功能是将输入的数字每一位相加。
- 可以实现,运用了递归的算法思想,迭代自上而下,递归自下而上。
任务三
源码
| #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; |
| } |
| } |
结果

回答
- 实现了输入x的y次方操作。
- 是递归函数,有点像二分,先算偶数幂,(如果有)最后乘以落单的最后一个x。
or
关于MarkDownLaTeX语法
任务四
打印100以内的孪生素数
源码
| #include <stdio.h> |
| |
| int isprime(int n) |
| { |
| if (n < 2) |
| return 0; |
| for (int i = 2; i <= n / 2; i++) |
| { |
| if (n % i == 0) |
| return 0; |
| } |
| return 1; |
| } |
| |
| int main() |
| { |
| int cnt = 0; |
| for (int i = 1; i < 101; i += 2) |
| { |
| if (isprime(i)&&isprime(i + 2)) |
| { |
| printf("%d %d\n", i, i + 2); |
| cnt++; |
| } |
| } |
| printf("Total count: %d\n", cnt); |
| |
| return 0; |
| } |
结果

任务五
对教材「例4.9 Hanoi塔问题」稍做改写
源码
法一
| #include <stdio.h> |
| |
| int hanoi(int n, char from, char to, char via) |
| { |
| if (n == 1) |
| { |
| printf("1 : %c -> %c\n", from, to); |
| return 1; |
| } |
| |
| int cnt = hanoi(n - 1, from, via, to) + 1; |
| printf("%d : %c -> %c\n", n, from, to); |
| cnt += hanoi(n - 1, via, to, from); |
| |
| return cnt; |
| } |
| |
| int main() |
| { |
| int n; |
| char from, to, via; |
| while (scanf("%d", &n) != EOF) |
| { |
| getchar(); |
| scanf("%c %c %c", &from, &via, &to); |
| |
| int cnt = hanoi(n, from, to, via); |
| printf("Total moves: %d\n\n", cnt); |
| } |
| |
| return 0; |
| } |
法二
| |
| #include <stdio.h> |
| |
| void move(int from, int to) { |
| printf("将盘子从柱子 %d 移动到柱子 %d\n", from, to); |
| } |
| |
| void hanoi(int n, int a, int b, int c) { |
| |
| |
| |
| |
| |
| int totalMoves = (1 << n) - 1; |
| int i; |
| |
| |
| for (i = 1; i <= totalMoves; i++) { |
| if (i % 3 == 1) { |
| |
| move(a, c); |
| } else if (i % 3 == 2) { |
| |
| move(a, b); |
| } else if (i % 3 == 0) { |
| |
| move(b, c); |
| } |
| |
| |
| if (n % 2 == 0) { |
| if (i % 3 == 1) { |
| |
| |
| move(b, c); |
| } |
| } |
| } |
| } |
| |
| int main() { |
| int n; |
| printf("请输入盘子的数量: "); |
| scanf("%d", &n); |
| |
| |
| hanoi(n, 1, 2, 3); |
| |
| return 0; |
| } |
| |
三种非递归算法
结果

任务六
计算组合数
源码
| #include <stdio.h> |
| |
| int func(int n, int m); |
| |
| int main() |
| { |
| int n, m; |
| int ans; |
| |
| while (scanf("%d%d", &n, &m) != EOF) |
| { |
| if (n<m) |
| { |
| printf("n = %d, m = %d, ans = 0\n\n", n, m); |
| continue; |
| } |
| |
| ans = func(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 = 0; i < m; i++) |
| { |
| ans *= n--; |
| } |
| for (int i = 1; i <= m; i++) |
| { |
| ans /= i; |
| } |
| return ans; |
| } |
递归一
| |
| int factorial(int n) |
| { |
| if (n == 1) |
| return 1; |
| else |
| return n * factorial(n - 1); |
| } |
| |
| int func(int n, int m) |
| { |
| return factorial(n) / factorial(m) / factorial(n - m); |
| } |
递归二
| |
| int func(int n, int m) |
| { |
| if (m == n || m == 0) |
| return 1; |
| else |
| return func(n - 1, m) + func(n - 1, m - 1); |
| } |
结果

任务七
打印字符小人阵列
源码
| #include <stdio.h> |
| |
| void print_charman(int n); |
| |
| int main() |
| { |
| int n; |
| |
| printf("Enter n: "); |
| scanf("%d", &n); |
| print_charman(n); |
| |
| return 0; |
| } |
| |
| |
| void print_charman(int n) |
| { |
| int t = 0; |
| for (int i = n; i >= 1; i--) |
| { |
| for (int j = 0; j < t; j++) |
| printf("\t"); |
| for (int j = 0; j < 2 * i - 1; j++) |
| printf(" o\t"); |
| printf("\n"); |
| for (int j = 0; j < t; j++) |
| printf("\t"); |
| for (int j = 0; j < 2 * i - 1; j++) |
| printf("<H>\t"); |
| printf("\n"); |
| for (int j = 0; j < t; j++) |
| printf("\t"); |
| for (int j = 0; j < 2 * i - 1; j++) |
| printf("I I\t"); |
| printf("\n"); |
| |
| t++; |
| } |
| } |
结果

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!