当前位置: 首页 > news >正文

如何用 C++ 模拟一个点阵显示器

之前在外面看到的一个大一学生学习 C 语言,学到二维数组和多维数组那块的一个课后作业。

要求是利用控制台的等宽字体模拟一个5×75\times 75×7的点阵字体(其实就是单片机用的那种液晶屏)并按照这种方式输出系统时间。

(图片来源网络,侵删)


Solution

纯模拟,算法层面完全没什么难的,但是调试非常考验耐心 👇

  • 如何对齐字符,如何保证输出不错乱都需要仔细调整;
  • 控制台窗口宽度不够,同样会导致输出混乱;
  • 打表 - 最枯燥的过程,没有之一。

参考实现

#if_MSVC_LANG#pragmawarning(disable:4996)#endif#include<windows.h>#include<time.h>#include<stdio.h>#if!__cplusplus#defineconstexprconst#defineboolint#endif// 枚举10个数码constexprboolnum[10][7][5]={{{0,1,1,1,0},{1,0,0,0,1},{1,0,0,1,1},{1,0,1,0,1},{1,1,0,0,1},{1,0,0,0,1},{0,1,1,1,0}},{{0,0,1,0,0},{0,1,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,0,1,0,0},{0,1,1,1,0}},{{0,1,1,1,0},{1,0,0,0,1},{0,0,0,0,1},{0,0,0,1,0},{0,0,1,0,0},{0,1,0,0,0},{1,1,1,1,1}},{{0,1,1,1,0},{1,0,0,0,1},{0,0,0,0,1},{0,0,1,1,0},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}},{{0,0,0,1,0},{0,0,1,1,0},{0,1,0,1,0},{1,0,0,1,0},{1,1,1,1,1},{0,0,0,1,0},{0,0,0,1,0}},{{1,1,1,1,1},{1,0,0,0,0},{1,1,1,1,0},{0,0,0,0,1},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}},{{0,0,1,1,0},{0,1,0,0,0},{1,0,0,0,0},{1,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}},{{1,1,1,1,1},{0,0,0,0,1},{0,0,0,1,0},{0,0,1,0,0},{0,1,0,0,0},{0,1,0,0,0},{0,1,0,0,0}},{{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}},{{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,1},{0,0,0,0,1},{0,0,0,1,0},{0,1,1,0,0}}};// 用bool数组表示六个时间数码以及两个冒号, 每两个字符之间有一个像素宽度的间隔, 因此6个数字加上两个冒号共8个字符有7个间隔, 需要一个7行47列的数组booltime_display[7][48];booldate_display[7][64];// 每个数字的位置constexprinttime_position[6]={0,6,18,24,36,42},date_position[8]={0,6,12,18,30,36,48,54};// 用中括号填充数字, xstart表示起始列(只可为0,6,18,24,36,42), number表示要填充的数字(-1表示冒号)voidinsert_time(intxstart,intdigit){for(inti=0;i<=6;i+=1)for(intj=xstart;j<=xstart+4;j+=1)time_display[i][j]=num[digit][i][j-xstart];}voidinsert_date(intxstart,intdigit){for(inti=0;i<=6;i+=1)for(intj=xstart;j<=xstart+4;j+=1)date_display[i][j]=num[digit][i][j-xstart];}// 初始化操作voidinit(void){// 插入冒号time_display[1][14]=time_display[5][14]=time_display[1][32]=time_display[5][32]=1;date_display[6][26]=date_display[6][25]=date_display[5][26]=date_display[5][25]=date_display[6][43]=date_display[6][44]=date_display[5][43]=date_display[5][44]=1;// system("color ce");}// 获取时间填充数字voidinput_time(void){time_t tp;time(&tp);tm*p=localtime(&tp);intdigit[6]={p->tm_hour/10,p->tm_hour%10,p->tm_min/10,p->tm_min%10,p->tm_sec/10,p->tm_sec%10};intdate[8]={(p->tm_year+1900)/1000,((p->tm_year+1900)%1000)/100,((p->tm_year+1900)%100)/10,(p->tm_year+1900)%10,(p->tm_mon+1)/10,(p->tm_mon+1)%10,p->tm_mday/10,p->tm_mday%10};for(inti=0;i<=5;i+=1)insert_time(time_position[i],digit[i]);for(inti=0;i<=7;i+=1)insert_date(date_position[i],date[i]);}// 输出与清屏voidprint_time(void){system("cls");printf("\n");for(inti=0;i<=6;i+=1){printf(" ");for(intj=0;j<=59;j+=1)printf(date_display[i][j]?#if_WIN32_WINNT==_WIN32_WINNT_WIN10"\u2588\u2588"#elif_WIN32_WINNT==_WIN32_WINNT_WIN7"\u2588"#elif_WIN32_WINNT==_WIN32_WINNT_WINXP"[]"#endif:" ");putchar(10);}printf("\n\n");for(inti=0;i<=6;i+=1){printf(" ");for(intj=0;j<=46;j+=1)printf(time_display[i][j]?#if_WIN32_WINNT==_WIN32_WINNT_WIN10"\u2588\u2588"#elif_WIN32_WINNT==_WIN32_WINNT_WIN7"\u2588"#elif_WIN32_WINNT==_WIN32_WINNT_WINXP"[]"#endif:" ");putchar(10);}Sleep(950);}intmain(){init();while(1){input_time();print_time();}}

输出结果(例子):

一些闲话

P.S. 2024~2025 年以前的 AI 做不到从零开始构建出无 bug 的程序,主要问题都出在不知道怎么把点阵数字输出在一行。

不知道现在的能否从头完成这个作业。

http://www.gsyq.cn/news/1500153.html

相关文章:

  • EchoBird安装教程并配置
  • 浦东新区金杨新村厨房下水道堵塞疏通|居顺联家政疏通服务完整介绍 - 居顺联家政疏通
  • 告别虚拟机!用一台旧笔记本+AX200网卡,在Ubuntu 20.04上搭建WiFi6抓包工作站
  • ARC 如何工作 swift
  • Mac玩转51单片机:手把手教你用sdcc编译和stcgal烧录(附CH340驱动解决方案)
  • 从心电图到手势识别:用UCR数据集实战5个跨领域时间序列分类项目(附完整代码)
  • PyTorch实战:用DBB结构重参数化无损提升ResNet精度(附完整代码)
  • Redis分布式锁进阶第九十六篇
  • 信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,用C++ STL的set和sort两种思路搞定‘不重复输出’
  • 从DZ47到智能空开:手把手教你读懂断路器型号代码,选型不求人
  • IDEA新手避坑指南:从Gitee拉取团队项目到成功运行Tomcat的完整流程
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • Presto时间函数保姆级避坑指南:从日期计算到时区转换,一篇搞定
  • 2026常州汽车音响改装哪家靠谱?同城实测测评首选音乐人生 - 音乐人生汽车音响
  • Jvm内存以及垃圾回收相关知识
  • 平时妈妈带娃偶尔老人帮忙,哪个成长椅两个人都能轻松调节?|居森皇冠椅多人带娃操作全指南 - 知行集录
  • 告别迷茫!手把手教你用ArcGIS+GTB搞定生态源地MSPA分析(附避坑指南)
  • 手机芯片里的‘交通警察’:一文搞懂SPMI总线如何管理电源与时钟(附时序图解析)
  • 别再只用SE模块了!手把手教你用PyTorch实现CBAM注意力,轻松涨点
  • OpenMV玩串口通信后‘变砖’?记一次因固化脚本导致的IDE连接失败与修复实录
  • 从逻辑分析仪抓包到代码调试:一步步教你逆向富斯IBUS协议并移植到STM32F103
  • MC13892电源管理芯片动态特性与引脚设计实战解析
  • 避坑指南:华为AC旁挂组网,Option 43配错导致AP不上线?手把手教你三层发现AC的正确姿势
  • 2026年广告创意公司/医药广告创意代理TOP5榜单:品牌策略与合规传播的破局之道 - 品牌发掘
  • 告别卡顿!从RRC重配置流程看手游/直播为何突然流畅——5G QoS的幕后功臣DRB建立详解
  • Altium Designer 19 自定义库管理实战:解决‘画了找不到’和工具栏消失问题
  • 2026年6月最新版苏州第三方CMACNAS甲醛检测治理机构口碑名单:万清CMA检测中心等5家公司深度测评万清CMA检测中心TOP1推荐 - 一休咨询
  • CloudCompare点云高程归一化保姆级教程:从CSF到泊松重建,四种方法实测对比与避坑指南
  • Python 爬虫项目 Cookie 池搭建与会话隔离实战
  • mysql应用层分表(Application-Level Sharding)知识笔记