探索编程中的字母转换:如何将字母变为二进制矩阵?

简介: 二进制是学习计算机语言中一个非常重要的知识点,笔者将通过这篇文章帮助读者了解进制转换在程序中的运用,借助进制转化实现火柴形状的字母输出。

引言

二进制是学习计算机语言中一个非常重要的知识点,笔者将通过这篇文章帮助读者了解进制转换在程序中的运用,借助进制转化实现火柴形状的字母输出。

输入和输出示例见下图:

需求

在设计程序之前,需要先明确我们的需求——“用户输入大写字母,计算机输出火柴形状的字母,用C语言实现”。

主函数设计

在明确需求之后,我们就可以静下心来想想自己应该如何实现了。

“用户输入大写字母”这一步我们应该使用char类型来存储。(当然所有人不可能只在A——Z范围内输入,这里需要考虑非法输入时应如何处理,当然先忽略这种情况,最后再解决这个问题也可以)。

“计算机输出火柴形状的字母”这一步作为核心步骤,不妨给他设计一个函数用于实现,传递的参数有且只有用户输入的大写字母。

在简单的思考之后,主函数就完成了。

int main()
{
  char my_char;
  scanf_s("%c", &my_char);
  if (my_char <= 'Z' && my_char >= 'A')
  {
    banner(my_char);
    return 0;
  }
  else
    return -1;
}

核心功能实现

这个时候还是要思考一下,怎么通过二进制存储或打印火柴形状的字母。

我们不妨用9*9的方阵来存储信息,以A为例:

首先需要自己设计打印出来的字母形状,如图1就是A对应打印出来的形状,黑色方块对应的位置放1,白色方块对应的位置放0,一个二进制方阵就设计好了,如图2所示。不过因为计算机不能直接输入二进制的原因,所以还需要再变换一下,即人为的把二进制变成16进制(别的进制也可以,这里以16进制为例),变换之后,A对应的存储信息就变成了:0x010,0x000,0x028,0x000,0x054,0x000,0x082,0x000,0x101,

A——Z的设计方法同上文,下面是笔者设计好的方阵信息并将他们放在了数组里面存储,可供参考:

int arr[26][9] = {0x010,0x000,0x028,0x000,0x054,0x000,0x082,0x000,0x101,
      0x078,0x044,0x044,0x044,0x078,0x044,0x044,0x044,0x078,
        0x01c,0x020,0x040,0x000,0x040,0x000,0x040,0x020,0x01c,
    0x0a0,0x008,0x082,0x000,0x082,0x000,0x082,0x008,0x0a0,
    0x000,0x054,0x040,0x040,0x054,0x040,0x040,0x054,0x000,
        0x054,0x000,0x040,0x000,0x054,0x000,0x040,0x000,0x040,
    0x01c,0x020,0x040,0x000,0x040,0x01f,0x044,0x024,0x01c,
    0x000,0x044,0x044,0x044,0x054,0x044,0x044,0x044,0x000,
    0x000,0x054,0x000,0x010,0x000,0x010,0x000,0x054,0x000,
    0x000,0x054,0x000,0x010,0x000,0x010,0x000,0x050,0x000,
    0x020,0x004,0x028,0x010,0x020,0x010,0x028,0x004,0x020,
    0x040,0x040,0x040,0x040,0x040,0x040,0x040,0x07f,0x000,
    0x000,0x000,0x000,0x044,0x06c,0x0aa,0x0aa,0x111,0x000,
    0x000,0x011,0x019,0x019,0x015,0x015,0x013,0x011,0x000,
    0x000,0x00e,0x011,0x011,0x011,0x011,0x011,0x00e,0x000,
    0x000,0x01e,0x011,0x011,0x01e,0x010,0x010,0x010,0x000,
    0x000,0x00e,0x011,0x011,0x011,0x015,0x015,0x00f,0x000,
    0x000,0x00e,0x011,0x011,0x01e,0x014,0x012,0x011,0x000,
    0x000,0x00e,0x011,0x010,0x00e,0x001,0x011,0x00e,0x000,
    0x000,0x01f,0x006,0x006,0x006,0x006,0x006,0x006,0x000,
    0x101,0x101,0x101,0x101,0x082,0x082,0x044,0x038,0x000,
    0x000,0x101,0x082,0x082,0x044,0x044,0x044,0x028,0x010,
    0x000,0x111,0x0aa,0x0aa,0x06c,0x044,0x000,0x000,0x000,
    0x081,0x042,0x024,0x018,0x018,0x024,0x042,0x081,0x000,
    0x022,0x014,0x014,0x008,0x008,0x008,0x008,0x008,0x000,
    0x03f,0x002,0x002,0x004,0x008,0x010,0x020,0x020,0x03f
  };

参数用来传递用户提供的大写字母,这里笔者形参用camp表示,这时需要进行定位字母在数组里面的下标,以便使用数组里面的信息。

for (temp = 0; temp < 26; temp++)                      //字母比较
    if (camp == temp_camp + temp)break;

(注意:这里使用的变量均已提前在banner()函数中命名)

找到下标后就可以直接使用数组里面相应的信息了,因为我们在存储时候是把二进制转化为16进制,所以在使用信息的时候,需要再转化为二进制,(注意:虽然存储的时候是16进制,但是计算机其实已经自动转化为了十进制。所以实质上是十进制转化为二进制。)这里需要再用一个数组存储信息,因为我们已经提前知道了转化为二进制一定是9*9大小的,所以定义一个数组my_temp[9][9]并初始化。

这里使用的进制转化方法可以在网上搜到,见下图:

for循环中即为上文进制转化方法的代码实现:

int my_temp[9][9] = { 0 };
  for (i = 0; i < 9; i++)
    for(j=8;j>=0;j--)
      {
      my_temp[i][j] = arr[temp][i] % 2;
        arr[temp][i] /= 2;
        if (arr[temp][i] == 0)
                break;
      }

到这儿,就剩最后一步的输出了。在这里笔者使用for循环遍历,遇到1,打印‘X’遇到0,打印‘ ’(空格的意思)。

for (i = 0; i < 9; i++)
  {
    for (j = 0; j < 9; j++)
    {
      if (my_temp[i][j] == 1)
        printf("X");
      else
        printf(" ");
    }printf("\n");
  }return 0;
}

读者如有疑惑,欢迎留言。笔者专业能力有限,如有错误,欢迎指出!

目录
相关文章
|
JSON IDE 测试技术
Google I/O :Android Jetpack 最新变化(二) Performance
Google I/O :Android Jetpack 最新变化(二) Performance
408 0
|
消息中间件 存储 负载均衡
一文读懂RocketMQ的高可用机制——消息发送高可用
一文读懂RocketMQ的高可用机制——消息发送高可用
656 1
|
负载均衡 Nacos 数据安全/隐私保护
SpringCloud(Gateway 网关负载均衡) | 学习笔记
快速学习 SpringCloud(Gateway 网关负载均衡)
SpringCloud(Gateway 网关负载均衡) | 学习笔记
|
网络协议 物联网 芯片
三张图带你入门蓝牙规范
蓝牙自从2001年发布以来,从经典蓝牙发展到了BLE蓝牙,又于2017年引入了蓝牙mesh技术,核心规范版本就于2019年年底升级到了最新的5.2版本,很多同学对蓝牙很有兴趣,但也被会被蓝牙技术里繁多的概念搞迷糊,希望通过这篇文章带大家对蓝牙技术规范有一个基本的了解。本文的面向读者是对网络技术有一定了解但对蓝牙技术不熟悉的同学。
三张图带你入门蓝牙规范
|
网络协议 网络安全 开发工具
|
人工智能 机器人 测试技术
【windows批处理batch】.bat文件循环判断语句
【windows批处理batch】.bat文件循环判断语句
|
11月前
|
存储 算法 安全
虚拟内存
【10月更文挑战第25天】虚拟内存是计算机系统中一项非常重要的技术,它通过扩展内存空间、提供内存保护和支持多任务处理等功能,提高了计算机系统的性能和可用性。虽然虚拟内存存在一些缺点,但通过合理的优化和管理,可以有效地发挥其优势,为计算机系统的稳定运行提供有力保障。
294 8
|
数据采集 监控 大数据
大数据中的ETL过程详解
【8月更文挑战第25天】ETL过程在大数据中扮演着至关重要的角色。通过合理设计和优化ETL过程,企业可以高效地整合和利用海量数据资源,为数据分析和决策提供坚实的基础。同时,随着技术的不断进步和发展,ETL过程也将不断演进和创新,以更好地满足企业的数据需求。
|
应用服务中间件 Linux nginx
nginx + geoip2简明配置
有时候需要nginx结合IP地址库做一些事情,比如过滤掉某个国家的IP,该如何做呢?
|
运维 安全 网络安全
带你读《网络安全等级保护2.0定级测评实施与运维》精品文章合集
带你读《网络安全等级保护2.0定级测评实施与运维》精品文章合集