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

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

引言

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

输入和输出示例见下图:

需求

在设计程序之前,需要先明确我们的需求——“用户输入大写字母,计算机输出火柴形状的字母,用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;
}

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

目录
相关文章
|
5月前
输出字母沙漏
输出字母沙漏
|
5月前
|
存储
【BigDecima】不可变的,任意精度的有符号十进制数。
【BigDecima】不可变的,任意精度的有符号十进制数。
51 0
给定一个正整数N,将其表示为数字1,3,7,15相加的形式输出。请编码找出使上述数字出现的总次数最少(每个数字可以重复使用)的组合。
给定一个正整数N,将其表示为数字1,3,7,15相加的形式输出。请编码找出使上述数字出现的总次数最少(每个数字可以重复使用)的组合。
|
5月前
|
C语言
【汇编语言实战】给定一个句子,将大写字母变为小写
【汇编语言实战】给定一个句子,将大写字母变为小写
62 1
|
5月前
53.从键盘输入任意一串字符串,程序输出同样的一串字符,要求输出字符串中大小写相互转化,其他符号不变。如输入“a123BxC”,则输出“A123bXc”
53.从键盘输入任意一串字符串,程序输出同样的一串字符,要求输出字符串中大小写相互转化,其他符号不变。如输入“a123BxC”,则输出“A123bXc”
43 0
|
存储 算法
算法之字符串问题(第415题字符串相加、第43题字符串相乘、第316题去除重复字母)
算法之字符串问题(第415题字符串相加、第43题字符串相乘、第316题去除重复字母)
70 0
|
算法 C语言
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
|
Java
输入两个字符,要求在它们之间随机产生一个字符
输入两个字符,要求在它们之间随机产生一个字符
98 0
【c】打印数字之间添加符号
【c】打印数字之间添加符号
115 0
【c】打印数字之间添加符号