【题目描述】

利用上次小班第五题的黑框绘制函数功能,绘制一张方布。方布上放着小明的正方形蛋糕,由不同的颜色和不同大小的方块组成。每次延时一秒后,绘制出分掉某块后的方布和蛋糕图形。最终在方布上显示一个数字,表示多少人分到了蛋糕。

【背景知识】

  1. <window.h>本题用到的头文件中一系列控制台操作函数

void setColor(unsigned short foreColor=15,unsigned short bgColor=0)
{   //设置输出文本的前景色和背景色 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hConsole,foreColor%16|bgColor%16*16);
}void gotoXY(short x, short y)
{   //设置光标位置,坐标x:0~79,y:0~299;只要有一个超限就回到(0,0)COORD position = {x, y};HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hConsole, position);
}

SetConsoleCursorPosition光标的位置控制 以及 控制台字体颜色控制

(20条消息) SetConsoleCursorPosition光标的位置控制 以及 控制台字体颜色控制_aaqian1的博客-CSDN博客

结构体 COORD

typedef struct _COORD {SHORT X; // horizontal coordinateSHORT Y; // vertical coordinate
} COORD;//一个保存横纵坐标的结构体,声明和赋值如下:
COORD pos;   //声明一个COORD结构 pos
pos.X = 1;   //把坐标(1,2)赋值给 pos
pos.Y = 2;   //可三行合并,写成一行: COORD pos = {1,2};HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsole, pos);

什么是HANDLE?

从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆东西,这难道不像是个"柄"吗?

然后,指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么?

Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:

1.暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的;
2.操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办?

所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。
————————————————
版权声明:本文为CSDN博主「Hann Yang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/boysoft2002/article/details/113457253

笔者对句柄的理解来自于某篇文章下评论的启发。

如果将整个系统看作一本书,每个部件当成一张纸,句柄就是每一页的页码,获取了句柄就可以对该对象进行操作。

引用来自 Hann Yang更多进阶操作请移步——>引用来自 Hann Yang

【代码设计】

1.setColor(unsigned short foreColor=15,unsigned short bgColor=0) 函数

2.利用SetConsoleTextAttribute()函数初始化平时颜色,同时将十六进制转化为十进制输入颜色

3.void gotoXY(unsigned short x, unsigned short y)函数 利用COORD 获取光标位置

4.利用SetConsoleCursorPosition()函数移动光标位置

5.void builtCake(int Cakewidth,int Cakecolor) 简单for循环buile cake(可以改进制造多层蛋糕)

6.void cutCake(int people,int Cakewidth)函数 光标重定位,使用空白空格消去蛋糕,达到切蛋糕的效果

【代码实现】

#include <iostream>
#include <ctime>
#include <iomanip>
#include <windows.h>
using namespace std;
const int X1=25,Y1=10;
void setColor(unsigned short foreColor=15,unsigned short bgColor=0)
{   //设置输出文本的前景色和背景色 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);//句柄 SetConsoleTextAttribute(hConsole, (foreColor%16)|((bgColor%16)*16));
}void gotoXY(unsigned short x, unsigned short y)
{   //设置光标位置,坐标从左上角(0,0)起始 COORD position;position.X = x;position.Y = y;HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hConsole, position);
}
void builtCake(int Cakewidth,int Cakecolor){for(int i=0;i<Cakewidth;i++){gotoXY(X1,i+Y1);for(int j=0;j<Cakewidth;j++){setColor(15,Cakecolor); cout<<"  ";//Sleep(1);}cout<<endl;}    for(int i=0;i<Cakewidth/2;i++){gotoXY(X1+Cakewidth/2,i+Y1+Cakewidth/3);for(int j=0;j<Cakewidth/2;j++){setColor(15,Cakecolor+1); cout<<"  ";Sleep(1);}}}void cutCake(int people,int Cakewidth){for(int i=0;i<people/2;i++){for(int j=0;j<Cakewidth*2/people;j++){gotoXY(X1,Y1+i*2*Cakewidth/people+j);for(int k=0;k<Cakewidth/2;k++){cout<<"  ";}    }Sleep(1000);}for(int i=0;i<people/2;i++){for(int j=0;j<=Cakewidth*2/people;j++){gotoXY(X1+Cakewidth/2,Y1+i*2*Cakewidth/people+j);for(int k=0;k<=Cakewidth;k++){cout<<"  ";} }Sleep(1000);}
}
bool Modpeople(int people,int Cakewidth){for(int i=0;i<Cakewidth;i+=2){if(Cakewidth%people==0)return true;}return false;
}
int main()
{SetConsoleTitle("分蛋糕啦");  //相当于system("程序执行时控制台的标题"); int Cakewidth,Cakecolor;cout<<"请输入蛋糕的大小:";cin>>Cakewidth;cout<<endl<<"请输入蛋糕的颜色:";cin>>Cakecolor;builtCake(Cakewidth,Cakecolor);gotoXY(0,3);setColor();cout<<"要分给几个人(请输入蛋糕大小的公因数且为偶数):";int people;while(cin>>people){if(people%2==0&&Modpeople(people,Cakewidth))break;else cout<<"请重新输入\a"; }cutCake(people,Cakewidth);system("cls");cout<<"happy birthday!";setColor();gotoXY(X1,Y1);cout<<people;return 0;
}

【效果】

【问题与总结】

1.可以通过字符画的格式引入更加真实的蛋糕

2.可以利用递归的方式使蛋糕层数更多

3.切蛋糕只对蛋糕大小的公因数运行,对于非因子与奇数会出现错误

4.光标重定向代码复杂,代码简洁性不好

希望大佬批评指正

湖大程序设计作业 控制台动画-切蛋糕相关推荐

  1. python大数据作业六画一个蛋糕

    简答题(共1题,100分)1. (简答题)使用matplotlib绘制如下图 第一步先画一个坐标系出来 import matplotlib.pyplot as plt # 创建Figure画板对象 f ...

  2. 第八届“图灵杯”NEUQ-ACM程序设计竞赛个人赛——A题 切蛋糕

    题目描述 龙龙有一块蛋糕,现在他想将蛋糕平均切成k块,分给他的k名hxd.但是不幸的是,因为龙龙不擅长切蛋糕,他每一次只能将一块蛋糕平均分成两份.例如,将一块大小为1的蛋糕分割成两块大小为1/2的蛋糕 ...

  3. 19HTML5期末大作业:动画漫影视网站设计——动画漫展学习资料电影模板(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 课程设计网页规划与设计 计算机毕设网页设计源

    HTML5期末大作业:动画漫影视网站设计--动画漫展学习资料电影模板(6页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常 ...

  4. C++程序设计作业--坦克大战[分享]

    C++程序设计作业--坦克大战[分享] 1.设计目的 2.设计目标 1.基本目标 2.额外目标 3 程序设计思路 3.1 类的设计 3.1.1 CData 3.1.2 class Draw 3.1.3 ...

  5. 漫画:有趣的 “切蛋糕“ 问题

    -----  第二天  ----- 举个例子: 我们有5块蛋糕, 蛋糕的大小分别是 5,17,25,3,15 我们有7位顾客, 他们的饭量分别是 2,5,7,9,12,14,20 (每个蛋糕大小和顾客 ...

  6. AI在中国,还没到抢切蛋糕的时候

    李根 发自 凹非寺  量子位 报道 | 公众号 QbitAI 他们中的不少名字,之前并不广为人知. 刘全全.王宇杰.王昌宝.帅靖文.张顺丰.蒋尚达.余革年.闵可锐.宋洪伟.李晓普.张晓伟.王峰.董倩倩 ...

  7. 19湖大考研经验总结

    考研的一年多时间很快就过去了,现在也通过了学校的复试,成为了准研究生一枚,想记录一下这段时间的想法和经验. 关于联系导师的问题,可参考 如何选择研究生导师 . 初试 我大概是18年3月初开始准备的考研 ...

  8. c语言切蛋糕问题算法,从“切蛋糕问题”谈到欧拉#

    从"切蛋糕问题"谈到欧拉在图论上的贡献 这个作者敬业,不得不发... 从圣诞节到新年之间,我们有几天假期.我们几个老朋友就选择一个晚上,各自准备点吃的东西欢聚在一起.吃吃喝喝完后, ...

  9. 西北工业大学NOJ-Python程序设计作业81-90

    各位同学,创作不易,能否在文末打赏一瓶饮料呢?(^ _ ^)(文章末尾右下角处) 西北工业大学NOJ-Python程序设计作业题解集合: NOJ-Python程序设计:第1季:水题(Season 1- ...

最新文章

  1. 在长沙怎么挑选装饰公司
  2. kernel 自定义字符驱动 第一次实验
  3. (007) java后台开发之Scanner报错java.util.NoSuchElementException
  4. 从音乐分享平台到泛音乐视频社交平台,菠萝 BOLO完成过亿元 B 轮融资
  5. 如何判断 Linux 是否运行在虚拟机上
  6. django不修改数据库创外键_Django——model(建表,增删改查,外键,多对多)
  7. 北京冬奥会闭幕 冰墩墩概念股怎么样了?
  8. android 下拉框大全,Android 下拉列表Spinner
  9. flex +overflow在firefox与edge中不生效的问题
  10. Explaining Classifiers using Adversarial Perturbations on the Perceptual Ball论文解读
  11. php/html+css+js制作计算器
  12. 面向对象程序设计语言和面向过程程序设计
  13. 利用CNN进行面部表情识别
  14. 使用vld查看OPCode
  15. 如何用powershell安装2345推广软件
  16. springMvc ResultFul风格 url拼接问题
  17. JMS createSession(false, Session.AUTO_ACKNOWLEDGE); 两个参数不同组合下的区别
  18. H264视频高压心得——兼容华为U8800+(硬解720P)
  19. 吴恩达,确诊新冠阳性
  20. GaussDB数据库安装详解

热门文章

  1. 浏览器是什么? (类似socket客户端)
  2. Qt高级编程之MVC框架
  3. 联想小新潮7000matlab,联想小新潮7000——多程序运行也可以很流畅
  4. Android-框架-Dagger2-Dagger2从入门到放弃再到恍然大悟
  5. easypoi生成excel下拉框选项(支持大数量)
  6. iPhone8真的要来了,它还能打动国人吗?
  7. 【若泽大数据 元旦大礼包】
  8. 揭秘LOL背后的IT基础架构丨基础设施即代码
  9. 外贸邮件营销软件哪些好用?
  10. VScode自动保存编译