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

2023年 8月 22日 63.5k 0

引言

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

输入和输出示例见下图:

需求

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

主函数设计

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

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

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

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

int main()
{
	char my_char;
	scanf_s("%c", &my_char);
	if (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 =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;
}

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

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论