logo
0
0
Login
Forkfromopencamp/learning-qemu/qemu-training-basic-c, ahead:main28 commits

QEMU 训练营基础阶段 C 语言实验

欢迎来到 QEMU 训练营基础阶段 C 语言实验

本实验将帮助你学习链表、二叉树、哈希表等数据结构,以及汇编与 C 的关系、链接详解、预处理等相关内容。

📚 练习题列表

  1. 01_singly_linked_list_josephus - 单链表实现约瑟夫环问题
  2. 02_doubly_circular_queue - 双向循环链表实现队列
  3. 03_circular_linked_list_josephus - 环形链表实现约瑟夫环问题
  4. 04_prev_binary_tree - 二叉树的前序遍历
  5. 05_counter_letter - 排序二叉树统计字母频率
  6. 06_hash_counter - Hash 表统计单词频率并排序
  7. 07_asm_gcd - 内联汇编求解最大公约数(GCD)
  8. 08_operator_overflow - 检测整数无符号运算溢出
  9. 09_swap_endian - 32 位无符号整数字节序转换
  10. 10_debug_print - 调试宏 DEBUG_PRINT
  11. 11_event_handler - 简单事件处理器(回调机制)
  12. 12_container_of_macro - container_of 宏实现
  13. 13_garray_dynamic_array - 可扩展动态数组(类似 QEMU GArray)
  14. 14_protocol_header_parser - 紧凑网络协议头解析器(位域)
  15. 15_elf_info_parser - 简易 ELF 信息查看工具
  16. 16_lru_cache - LRU 缓存淘汰算法
  17. 17_bitmap_operations - 位图操作
  18. 18_thread_safe_ring_buffer - 线程安全环形缓冲区
  19. 19_strtok_r_thread_safe - 字符串分割器(类似 strtok_r)
  20. 20_bloom_filter_bitmap - 位图实现 Bloom 过滤器

前置条件

操作流程

  • Fork 本仓库,解锁作业副本。
  • 在您 Fork 的仓库中点击 云原生开发 按钮进入开发环境。
  • 根据文档完成 20 个 exercise 中的题目,并移除// I AM NOT DONE 注释。
  • 完成后提交代码到 main 分支,并创建合并请求。

  • 最后可以在 pr 页面来查看评分过程(可多次提交代码,每次提交都会触发评分,以最高分为准)

  • 如果通过,则可以在 opencamp 的晋级榜单上看到自己的成绩,如没有,请查看上一步的流水线日志。

云原生开发/本地测试

🛠️ 系统要求

  • Linux 或 macOS 系统
  • GCC 编译器
  • Python 3.6+
  • (可选)inotify-tools(用于文件监控功能)
# Ubuntu/Debian 安装依赖 sudo apt-get update sudo apt-get install gcc python3 inotify-tools # macOS 安装依赖(使用 Homebrew) brew install gcc

🚀 快速开始

1. 编译检查器

# 使用 Makefile make c-checker # 或者手动编译 gcc -Wall -Wextra -std=c11 -o c-checker checker.c

2. 查看所有练习题

./c-checker list # 或者 make list

3. 查看练习题提示

./c-checker hint 01_singly_linked_list_josephus # 或者 ./c-checker hint 01 # 或者 make hint 01_singly_linked_list_josephus # 或者 make hint 01

4. 编辑练习题

编辑 exercises/* 目录下的 .c 文件,移除 // I AM NOT DONE 注释并实现代码。

5. 检查单个练习题

./c-checker check 01_singly_linked_list_josephus # 或者 ./c-checker check 01 # 或者 make check 01_singly_linked_list_josephus # 或者 make check 01

6. 检查所有练习题

./c-checker check-all # 或者 make check-all

7. 监控模式(类似 rustlings watch)

./watch.sh # 或者 make watch

8. 运行单个练习题

make -C exercises/01_singly_linked_list_josephus run

9. 查看 JSON 测试报告

当运行所有测试时(check-all),系统会在项目根目录下生成一个总体的 JSON 格式测试报告:

# 运行所有测试并生成 JSON 报告 ./c-checker check-all # 查看总体 JSON 报告 cat test_results_summary.json # 使用 jq 格式化显示 JSON cat test_results_summary.json | jq

JSON 报告包含:

  • 总分数(每道题目 5 分,总分 20 道题 100 分)
  • 通过/失败/未完成的题目数量
  • 成功率统计
  • 每道题目的详细状态和得分

📁 项目结构

C-test/ ├── exercises/ # 练习题源码目录 │ ├── 01_insert_sort | | |—— 01_insert_sort.c │ ├── 02_merge_sort | | |—— 02_merge_sort.c │ └── ... ├── tests/ # C语言测试用例目录 │ ├── test_01_insert_sort.c │ ├── test_02_merge_sort.c │ └── ... ├── checker/ # C语言测试框架 │ ├── test_framework.h │ └── test_framework.c ├── checker.c # C语言检查器主程序 ├── c-checker # 编译后的检查器 ├── exercises.toml # 练习题配置文件 ├── Makefile # 构建配置 ├── watch.sh # 监控脚本 ├── run.sh # 运行脚本 ├── clean.sh # 清理脚本 └── README.md # 项目说明

🎮 使用方法

完成练习题的步骤

  1. 查看练习题列表: ./c-checker listmake list
  2. 查看提示: ./c-checker hint [exercise_name]make hint [exercise_name]
  3. 编辑代码: 在 exercises/ 目录下编辑对应的 .c 文件
  4. 移除标记: 删除或注释掉 // I AM NOT DONE
  5. 实现功能: 根据注释和提示实现所需功能
  6. 测试验证: ./c-checker check [exercise_name]make check [exercise_name]
  7. 重复直到通过: 根据错误信息修改代码直到测试通过

示例:完成第一个练习题

# 1. 编译检查器 make c-checker # 2. 查看练习题列表 ./c-checker list # 3. 查看第一题提示 ./c-checker hint 01_insert_sort # 4. 编辑文件 vim exercises/01_insert_sort.c # 5. 在编辑器中: # - 移除 "// I AM NOT DONE" 行 # - 添加 printf("hello, world.\\n"); # 6. 检查练习题 ./c-checker check 01_insert_sort # 7. 如果通过,继续下一题;如果不通过,根据提示修改

🔧 故障排除

常见问题

  1. 编译错误

    • 检查语法错误
    • 确保包含了必要的头文件
    • 对于涉及数学函数的程序,确保链接了数学库 (-lm)
  2. 测试失败

    • 检查输出格式是否与预期完全一致
    • 确保移除了 // I AM NOT DONE 标记
    • 查看错误信息,根据提示修改
  3. 权限问题

    • 确保脚本有执行权限:chmod +x *.sh

调试技巧

  • 查看测试源码了解具体的验证逻辑
  • 使用 gcc -Wall 启用更多警告信息

🤝 贡献

欢迎提交问题和改进建议!

📄 许可证

本项目采用 MIT 许可证。

🎉 致谢

  • 灵感来源于 Rustlings
  • 本实验复用与 C 语言训练营专业阶段实验 C 语言训练营
  • 感谢所有贡献者和使用者

Happy Coding! 🚀

About

C 语言训练营专业阶段实验

Language
C86.6%
Makefile8.6%
Shell4.6%
Dockerfile0.3%