引言
二进制是学习计算机语言中一个非常重要的知识点,笔者将通过这篇文章帮助读者了解进制转换在程序中的运用,借助进制转化实现火柴形状的字母输出。
输入和输出示例见下图:
需求
在设计程序之前,需要先明确我们的需求——“用户输入大写字母,计算机输出火柴形状的字母,用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; }
读者如有疑惑,欢迎留言。笔者专业能力有限,如有错误,欢迎指出!