当前位置: 首页 > 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.cnnetsun.cn/news/2863344.html

相关文章:

  • 一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
  • Redis分布式锁进阶第九十六篇
  • 用数据分析破解彩票迷思:归因分析与理性决策框架
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱
  • 保姆级教程:在uni-app H5项目中集成WebRTC,实现双向音视频通话(含心跳保活与TURN服务器配置)
  • 告别卡顿:用tiffslide和OME-TIFF金字塔优化你的病理图像查看体验
  • 从一行RTL代码到最终芯片:手把手拆解Synopsys工具链在数字IC设计中的实战联动
  • 从LM741芯片内部看起:手把手拆解差动放大电路,搞懂运放输入级的秘密
  • 盲超分的‘内功心法’:拆解KernelGAN如何仅凭一张图,教会AI理解图像自身的模糊规律
  • 从‘adb devices‘离线到‘more than one device‘报错:一次搞定Android调试连接的常见疑难杂症
  • 别再手动装Python库了!用TLJH在Ubuntu 22.04上搭建一个团队共享的JupyterHub环境(附国内镜像源配置)
  • F28335 GPIO输入滤波(采样窗口)配置详解:告别按键抖动与噪声干扰
  • 大模型推理路径动态裁剪:语义确定性驱动的计算蒸发机制
  • 别再乱放文件了!RimWorld Mod汉化保姆级指南:DefInjected与Keyed文件夹到底怎么用?
  • 别再傻傻用真实邮箱了!手把手教你用Python脚本和Swaks工具安全测试邮件伪造(附避坑指南)
  • 目标检测MAP提升2%!在YOLOv5/YOLOv8中集成CBAM模块的保姆级教程
  • 从“Hello World”到“数字金字塔”:用C语言循环玩转图形打印的保姆级指南
  • TXS0108E电平转换芯片深度评测:开漏模式2Mbps够用吗?实测对比推挽60Mbps
  • 从X86到RISC-V:手把手带你理解C906这颗国产CPU的MMU设计差异
  • 告别卡顿!STM32 SPI DMA驱动ST7735刷图性能优化实战
  • ARM Cortex-M0+微控制器实战:从LPC82x看低成本嵌入式开发
  • 模板驱动文档自动化:工程化构建可复用、可审计的内容流水线
  • MuleSoft企业级AI编排:构建可审计、可降级、可治理的大模型集成架构
  • 别再手动开节点了!ROS Noetic下用launch文件一键启动机器人仿真的保姆级教程
  • 别再用Thread.sleep了!解决SocketException: Software caused connection abort的三种正确姿势
  • CISP-PTE文件上传题新思路:绕过随机命名,用PHP文件读写函数写Webshell
  • 用StandardScaler做机器学习数据预处理?小心这个‘隐藏’的数据泄露陷阱!
  • 图解离散数学:用Python代码理解‘格’与‘布尔代数’(附实战案例)
  • 告别模拟器!鸿蒙开发必备:5分钟搞定HAP包重构与文件清理的正确姿势
  • 告别重复劳动:用Power Automate桌面流,5分钟搞定Excel数据自动录入数据库