news 2026/2/18 5:03:47

【同济】C++汉诺塔(90-b1)[2025-12-08]

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【同济】C++汉诺塔(90-b1)[2025-12-08]

【同济】C++汉诺塔(90-b1)[2025-12-08]

§.综合题 – I
【注意:】
1、 白名单同第5 章-Part3
2、 本次作业不允许使用尚未讲授过的任何后续课程的知识点,包括但不限于指针、引用、结构体、 类等概念!!!
3、 已学过的知识中,不允许使用goto,不允许使用全局变量,不允许使用C++的string 变量
4、 不允许使用scanf/printf 进行输入/输出
5、 要做到“0 errors, 0 warnings”

综合题1:汉诺塔综合演示
【要求:】
1、将之前做的所有汉诺塔的各小题集成在一个程序中,用菜单方式进行选择,并加入图形化演示的要求(cmd 窗口中简单的图形显示,后续均称为伪图形界面)

菜单选项:
1.基本解
2.基本解(步数记录)
3.内部数组显示(横向)
4.内部数组显示(纵向+横向)
5.图形解-预备-画三个圆柱
6.图形解-预备-在起始柱上画n个盘子
7.图形解-预备-第一次移动
8.图形解-自动移动版本
9.图形解-游戏版
0.退出
[请选择:]

2、提供90-b1-demo.exe 供参考(有正常版、胖版、瘦版共三个版本,差异见后)

3、伪图形界面中字符工具函数集的学习:附件中有2 个文件,说明如下
cmd_console_tools.cpp :伪图形界面下基本功能函数的具体实现
cmd_console_tools.h :伪图形界面下基本功能函数的函数声明
注:用于清屏及移动字符光标,5-b7 作业用过

4、伪图形界面中图形工具函数集的学习:附件中有3 个文件,说明如下
cmd_hdc_tools.cpp :伪图形界面下基本功能函数的具体实现
cmd_hdc_tools.h :伪图形界面下基本功能函数的函数声明
test-hdc.cpp :测试用例
说明:
① 在VS 中建立一个项目test-hdc,将这5 个文件放入,即可编译并运行测试用例,每个函数的具体功能及使用方法请阅读源程序及测试用例
项目结构参考:

注:要求五个文件放在同一项目中(左)并且在同一目录下(右)
② cmd_console_tools 中的cct_* /cmd_hdc_tools 中的hdc_*系列函数已经能满足本次作业的所有需求,不需要再学习并额外添加伪图形界面类的函数
③ 如果阅读时源代码与注释有不一致的地方,以可编译的源码为准

4、本次大作业的项目命名及提交要求: 附件中有9 个文件,说明如下
cmd_console_tools.cpp :同上
cmd_console_tools.h :同上
cmd_hdc_tools.cpp :同上
cmd_hdc_tools.h :同上
hanoi.h :本项目头文件
hanoi_const_value.h :本项目头文件(只读常量定义,具体见后)
hanoi_menu.cpp :菜单的显示与选择
hanoi_multiple_solutions.cpp :菜单中各项汉诺塔演示的实现
hanoi_main.cpp :main 函数
说明:
① 在VS 中建立一个项目90-b1,将这9 个文件放入(下发文档中的文件名要去掉前缀,文件名不要修改),要求编译生成的exe 文件名必须是90-b1.exe
项目结构参考:

② 要求9 个文件放在同一项目中(上图左)并且在同一目录下(上图右),否则可能会编译出错导致得分为0 !!!
③ 上图右红框中的五个文件不允许修改,也不需要提交,检查作业时,会将原始的.h/.cpp 放入后编译,出错则得分为0 !!!
④ 其余4 个文件的功能要求及限制请具体查看每个文件,这4 个文件需要提交,网页上只有一个文件有分数,该分数即本次作业的总分,本题得分按实现功能总体评价而不是按各文件分别给分(例:提交后编译时若hanoi.h 报error 错,则本题总得分为0 分,而不是仅hanoi.h 为0 分)
⑤ 四个文件必须全部提交,否则编译错误会导致得分为0 !!!

5、下列内容允许使用全局变量记录,其余均不允许(全局const 变量/#define 宏定义的数量不受限制,任意使用)

  • 总移动步数:1 个全局简单变量/静态局部变量
  • 圆柱上现有圆盘的编号:3 个全局一维数组或1 个全局二维数组
  • 圆柱上现有圆盘的数量:3 个全局简单变量或1 个全局一维数组
  • 延时:1 个全局简单变量

6、为了降低难度,伪图形界面部分拆分为若干小题(菜单项5-9),完成每个小题能够取得相应的分数

  • 菜单项1-4:之前小作业的整合,会占一定的分数(具体待定,max=30%)
  • 菜单项5:在屏幕上画出三根圆柱,为方便观察实现过程,需要加延时
  • 菜单项6:假设三根圆柱的编号从左到右分别为ABC,要求输入起始圆柱的编号(A-C),圆盘的数量(限制在1-10 之间),在起始圆柱上从上到下/从小到大依次画出n 个圆盘,每个圆盘的颜色各不相同,为方便观察实现过程,需要加延时
  • 菜单项7:在菜单项6 的基础上,完成第一个圆盘的移动
    ● 第一次移动并不一定是从源柱->目标柱,也可能是源柱->中间柱
    ● 移动的时候,有些延时是必须加的,否则无法模拟出移动效果,具体的可以自行在实现过程中体会
    ● 不允许直接在两个圆柱间移动,必须先上移、再平移、再下移(具体参考demo)
  • 菜单项8:汉诺塔演示过程的完整实现,每次圆盘的移动方式也必须是上移、平移、下移
  • 菜单项9:汉诺塔游戏(人工操作移动步骤)
    ● 每次键盘输入两个字母(A-C)之间,大小写均可,表示本次移动的源柱和目标柱
    ● 移动时要检查合理性,若不符合移动规则(大盘压小盘、源柱为空等)要提示出错并重输,每次合理的移动都必须记录步数
    ● 每次圆盘的移动方式也必须是上移、平移、下移
    ● 待所有盘子按序移动到结束柱则提示“游戏结束”
    ● 本小题不需要调用递归函数

7、屏幕显示要求

  • 为方便观察实现过程,需要加延时,延时的系统函数为Sleep(单位:毫秒),需要包含头文件<Windows.h>,例如Sleep(100)表示延时0.1 秒(demo 的0 为不延时,1-200 表示延时1-200ms)
  • 输入完成后,用cct_cls()/hdc_cls()可以清除屏幕上现有的内容,但是该命令只能使用一次,不允许每次移动一个元素就清屏并全部重新输出(直观感受就是屏幕会闪烁),而是只能擦除原有位置,在新位置上输出(例:当前一步操作为3 从B 移动到C,则只能在B 位置擦除3,C 位置显示3,图形方式要求能呈现出动画效果,具体见后面的描述)

【函数的分解与使用限制:】
为了更好地掌握函数的分解与应用技巧,对hanoi_multiple_solutions.cpp 中的函数的定义和使用做出限制,具体要求见下:
菜单选项:
1.基本解
2.基本解(步数记录)
3.内部数组显示(横向)
4.内部数组显示(纵向+横向)
5.图形解-预备-画三个圆柱
6.图形解-预备-在起始柱上画n个盘子
7.图形解-预备-第一次移动
8.图形解-自动移动版本
9.图形解-游戏版
0.退出
[请选择:]

1、 整个程序只允许使用一个递归函数,即菜单项1/2/3/4/8 必须共用一个递归函数,用参数解决各菜单项不同要求之间的差异,递归函数按一句一行计算(包含独立成行的左右大括号),不得超过15 行
【提示:】横向、纵向数组打印、色块移动等可以通过在递归函数中调用其它函数来实现

2、 菜单项1/2/3/4/6/7/8 中的输入多个参数必须共用一个函数,用参数解决输入不同内容的问题(本函数允许使用第6 章的知识:函数形参为实参的指针,可以同时改变多个实参值),菜单项9 各人看具体情况决定是否共用(即建议共用,但如果分开处理也可以)

3、 菜单项3/4/8 中的横向输出必须共用一个函数,用参数解决输出位置等差异

4、 菜单项4/8 中的纵向输出必须共用一个函数,用参数解决输出位置等差异

5、 菜单项5/6/7/8/9 中画三个柱子的必须共用一个函数

6、 菜单项7/8/9 中盘子的移动必须共用一个函数

7、 以上的共用函数中,均允许调用其它函数,希望大家在作业过程中体会如何划分函数才能高效完成程序,减少冗余代码

8、 其中1-4 项需要的函数,不受之前作业的限制(即函数的参数个数、类型可以与之前不同)

9、 建议:尽量保证每个函数(包括main)不要超过50 行

【无强制要求的内容:】
1、 各种提示信息、状态栏的内容等无强制要求
2、 横向、纵向数组打印时的空格数量、冒号中英文等无强制要求(对齐即可)
3、 出错时的各种提示无强制要求,清晰明了即可
4、 本题是人工判题,不是自动判题(即:不必太在意细节处理)

【demo 程序的额外功能:】
为了方便大家更好的理解参数可变的概念,请认真阅读下面的附件文档
25261-900101-W1201.附件汉诺塔综合演示.exe的扩展使用.pdf

【通过const 参数的设置来达到可变参数的目的(强制要求):】
1、 为了能在显示位置、颜色、图形的粗细等方面做到灵活变化(不要在程序中写死!!!),附件自带三个hanoi_const_value.h,要求将任意一个改名为hanoi_const_value.h 后,均能编译通过,并且达到对应demo 的显示效果
hanoi_const_value_胖版.h
hanoi const_value_瘦版.h
hanoi_const_value_正常.h

2、 检查作业时,会以新的hanoi_const_value.h 代入后编译并评分

3、 以hanoi_const_value_正常.h 为例,说明每个参数的具体含义
/* 定义底座和盘子的颜色*/
const int HDC_COLOR[MAX_LAYER + 2] = {
RGB(12,12,12), //①背景底色
RGB(0,55,218), //②1#盘(最小的盘子)的颜色
RGB(19,161,14),
RGB(58,150,221),
RGB(197,15,31),
RGB(136,23,152),
RGB(193,156,0),
RGB(204,204,204),
RGB(118,118,118),
RGB(59,120,255),
RGB(22,198,12), //③10#盘(最大的盘子)的颜色
RGB(249,241,165) //④⑤基座颜色(底盘+立柱)
}; //0 是底色,1-10 是10 个盘子的颜色,11 是基座的颜色

const int HDC_Init_Delay = 1000;//菜单5/6/7/8 画底座和盘子之间的演示,具体看demo
const int HDC_Start_X = 100; //① A 柱左上角的X 坐标(单位:像素点)
const int HDC_Start_Y = 256; //① A 柱左上角的Y 坐标(单位:像素点)
const int HDC_Base_Width = 8;//② 立柱的宽度(单位:像素点),假设为w
// 1#10#盘的宽度分别是3w21w,底座宽度23w
const int HDC_Base_High = 16;//③ 盘/底座的高度(单位:像素点),假设为h,立柱高度为12h
const int HDC_Top_Y = 20; // ⑤ 盘子移动到最顶上时,上沿的y 坐标(单位:像素点)
const int HDC_Underpan_Distance = 100; //④ 立柱之间的距离(单位:像素点)
const int HDC_Step_X = 1; //某个盘左/右移动的步进距离(单位:像素点)
const int HDC_Step_Y = 1; //某个盘上/下移动的步进距离(单位:像素点)
//通过demo 的菜单8,选单步执行方式来观察

const int MenuItem4_Start_X = 0; //①菜单4 横向数组第一个字符的X 坐标
const int MenuItem4_Start_Y = 17;//①菜单4 横向数组第一个字符的Y 坐标
//单位:字符,一个汉字占两个字符
const int MenuItem8_Start_X = 0; //菜单8,同上
const int MenuItem9_Start_X = MenuItem8_Start_X; //菜单9,同上
const int MenuItem8_Start_Y = 34;//菜单8,同上
const int MenuItem9_Start_Y = MenuItem8_Start_Y; //菜单9,同上
const int Underpan_A_X_OFFSET = 11; //② 立柱字母A 相对于横向数组的X 偏移量(单位:字符)
const int Underpan_A_Y_OFFSET = -2; //② 立柱字母A 相对于横向数组的Y 偏移量(单位:字符)
const int Underpan_Distance = 15; //③ 立柱A/B/C 之间的距离(单位:字符,15 表示14 个空格)
// 例:11 表示在“第”的右边11 个字节打印A
// 例:-2 表示在“第”的上面两行打印A

【盘子移动的动画效果实现说明:】
以HDC_Base_Width=4、HDC_Base_High=4、HDC_Top_Y=20、HDC_Step_X=1、HDC_Step_Y=2 为例
1#盘:宽度为12(3w),高度为4(1h)

向上移动:
① 将下部2 行(HDC_Step_Y=2)像素点用底色重画(抹除)
② 将下部2 行(HDC_Step_Y=2)像素点的中间用基座底色重画(恢复立柱)
③ 将上部2 行(HDC_Step_Y=2)像素点用该色块的颜色重画(显示上移效果)
④ 加1ms 延时,使1-3 的重复呈现出动画效果
⑤ 持续上移到HDC_Top_Y 位置,上移结束
向右移动:
① 将左侧1 列(HDC_Step_X=1)像素点用底色重画(抹除)
② 将上部1 列(HDC_Step_X=1)像素点用该色块的颜色重画(显示右移效果)
③ 加1ms 延时,使1-2 的重复呈现出动画效果
④ 重复右移到本次移动的dst 对应的立柱中间,右移结束
向下/向左:不再重复

【编译器要求:】
仅VS2022 通过即可

【控制台要求:】
1、必须是Windows 控制台主机的新版控制台,字体为“新宋体16 点阵”,窗口大小“120*40”以上

2、如何将cmd 窗口由“powershell”改为“Windows 控制台主机”,参见之前的文档/视频

3、如何在“powershell”/“Windows 控制台主机”之间切换,参见之前的文档/视频

【分辨率要求:】
在1920*1080 的屏幕下(FHD)显示正常,如果你的笔记本是高分屏(超过FHD)但是使用了缩放倍率,完成后最好设成分辨率1920x1080/缩放100% 验证一下,否则可能影响得分

【实验报告:】
本次作业还需要完成对应的实验报告,具体要求另行下发

【作业要求:】
1、12 月21 日前网上提交本次作业(第14 周周日,两周半时间)
2、每题所占平时成绩的具体分值见网页
3、超过截止时间提交作业会自动扣除相应的分数,具体见网页上的说明
4、大作业期间,每周作业正常下发

源码联系UP主 -> https://space.bilibili.com/329101171

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/15 9:43:22

hot100 2.字母异位词分组

思路&#xff1a;哈希表分组。1.题目要求&#xff1a;如果两个字符串从小到大排序后相等&#xff0c;那么这两个字符串就互为字母异位词&#xff0c;否则不是。2.举例&#xff1a;以示例1为例。输入&#xff1a;strs [eat,tea,tan,ate,nat,bat]。&#xff08;1&#xff09;每个…

作者头像 李华
网站建设 2026/2/15 1:20:38

R语言Cox回归避坑指南(临床数据建模常见错误TOP5)

第一章&#xff1a;R语言Cox回归在临床研究中的核心价值在临床研究中&#xff0c;生存分析是评估患者预后、治疗效果和风险因素影响的核心方法。Cox比例风险模型&#xff08;Cox Proportional Hazards Model&#xff09;因其无需假设基础风险函数的分布&#xff0c;被广泛应用于…

作者头像 李华
网站建设 2026/2/11 8:10:40

是德 N9041B UXA 频谱分析仪在真空环境完成卫星信号分析

卫星通信系统在航天、军事、气象等领域发挥着重要作用。卫星在轨运行时&#xff0c;面临着极端环境&#xff0c;包括真空、高低温、辐射等。为了确保卫星通信系统的可靠性&#xff0c;必须在地面模拟这些环境进行测试。真空环境下的射频测试&#xff0c;尤其是卫星信号的分析&a…

作者头像 李华
网站建设 2026/2/16 10:17:33

用是德DSOX1204A示波器快速捕捉与调试信号的实用指南

在电子研发、通信测试和自动化调试中&#xff0c;示波器是工程师不可或缺的“眼睛”。是德DSOX1204A示波器凭借其高带宽、多通道及智能分析功能&#xff0c;能大幅提升信号捕获与调试效率。以下是快速掌握其核心操作的实用技巧。一、硬件连接与基础设置&#xff1a;快速上手的关…

作者头像 李华
网站建设 2026/2/13 16:51:13

连接器EMC测试不过关?5步定位干扰源头,快速通过认证

第一章&#xff1a;连接器EMC测试不过关&#xff1f;5步定位干扰源头&#xff0c;快速通过认证在电子设备开发过程中&#xff0c;连接器是信号传输的关键节点&#xff0c;但也常成为电磁兼容&#xff08;EMC&#xff09;问题的源头。当产品在辐射发射或传导发射测试中失败时&am…

作者头像 李华
网站建设 2026/2/16 7:05:07

为什么90%的物联网项目卡在部署阶段?真相令人震惊

第一章&#xff1a;物联网的部署 物联网的部署涉及从设备接入、通信协议选择到数据处理与安全管理的完整流程。成功的部署需要综合考虑硬件兼容性、网络拓扑结构以及后端平台的可扩展性。 设备选型与接入 在部署初期&#xff0c;需根据应用场景选择合适的传感器与控制器。常见…

作者头像 李华