当前位置: 首页 > 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.jsqmd.com/news/988407/

相关文章:

  • 2026怀化黄金回收哪家好?鹤城区五大正规门店权威排名(含上门回收报价鉴定参考)
  • 瓦楞纸板厂主要集中在哪些地区?
  • EchoBird安装教程并配置
  • 告别虚拟机!用一台旧笔记本+AX200网卡,在Ubuntu 20.04上搭建WiFi6抓包工作站
  • 别光看main.c了!一文拆解Telink TLSR8251 SDK3.4的8个核心文件夹,新手避坑指南
  • 浦东新区金杨新村厨房下水道堵塞疏通|居顺联家政疏通服务完整介绍 - 居顺联家政疏通
  • 从4G到5G:RRC连接重配置信令在跨代网络协同中扮演的关键角色
  • 置业指南|青云国樾售楼处怎么联系?看房、选房全流程答疑 - 资讯快报
  • LPC2917/19 VIC中断控制器与电气特性实战解析
  • Mac玩转51单片机:手把手教你用sdcc编译和stcgal烧录(附CH340驱动解决方案)
  • Scrutor:.NET 依赖注入自动化的优雅实现
  • 在STM32上跑通TinyML:从理论到实践的全栈指南
  • 南通购宠避坑指南!6 家正规实体猫犬舍深度测评,皇克莱综合实力领跑 - 同城宠物优选基地
  • ARC 如何工作 swift
  • PyTorch实战:用DBB结构重参数化无损提升ResNet精度(附完整代码)
  • CKKS同态加密中的旋转操作:在隐私计算与联邦学习里,它到底解决了什么实际问题?
  • 从心电图到手势识别:用UCR数据集实战5个跨领域时间序列分类项目(附完整代码)
  • 从DZ47到智能空开:手把手教你读懂断路器型号代码,选型不求人
  • git遇见的问题[2]
  • 从投稿到接收:如何用Elsevier LaTeX模板高效管理你的学术论文写作流程
  • 2026年 AI推广服务商推荐榜单:GEO内容/短视频/社媒全链路智能营销,赋能企业精准获客与品牌增长 - 品牌发掘
  • Redis分布式锁进阶第九十六篇
  • 浏览器CDP自动化检测技术-Error和Worker
  • 手机相机开发避坑实录:从Sensor数据流到HAL3的那些“坑”与解法
  • Excel定位条件全解析:从‘常量/公式’到‘差异单元格’,搞定数据核对与清理
  • 信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,用C++ STL的set和sort两种思路搞定‘不重复输出’
  • IDEA新手避坑指南:从Gitee拉取团队项目到成功运行Tomcat的完整流程
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • OSPF建立邻居的影响因素
  • Presto时间函数保姆级避坑指南:从日期计算到时区转换,一篇搞定