每个汉字的图形都由 16×16 的点阵组成,如汉字“福”的点阵图形如下:
每个像素用 1 个二进制位来表示:1 表示像素是亮的,0 表示像素是不亮的。每个汉字由 16×16 = 256 个二进制位,即 32 个字节组成。
HZK16.DAT 是汉字点阵图形文件,其中包括 GB2312-80 的全部汉字图形,按汉字的区位码顺序存储。
请点击链接 HZK16.DAT 下载该文件。
请编写函数,显示汉字的图形。
函数原型
// 显示点阵汉字图形
void ShowImage(unsigned char high, unsigned char low, FILE *f);
说明:参数 high
和 low
分别为汉字内码的高字节和低字节,f
是指示汉字图形库文件的指针。
该函数用“■”表示汉字点阵中点亮的像素,用“□”表示不亮的像素。
裁判程序
下面的程序输入汉字,输出该汉字的点阵图形。
#include <stdio.h>
// 显示点阵汉字图形
void ShowImage(unsigned char high, unsigned char low, FILE *f);
int main()
{
char high, low;
scanf(" %c%c", &high, &low);
FILE *f = fopen("HZK16.DAT", "rb");
if (f)
{
ShowImage(high, low, f);
fclose(f);
}
return 0;
}
......
/* 你提交的代码将被嵌在这里 */
输入样例
福
输出样例
void ShowImage(unsigned char high, unsigned char low, FILE *f)
{
int i,j;
unsigned char buffer[32]; //存储一个汉字所用的32个字节
long int offset;
offset = ((high - 0xa1) * 94 + low - 0xa1) * 32; //计算绝对偏移地址
fseek(f,offset,0); //根据偏移寻找到该字字模的第一个字节
for (i = 0; i < 32; ++i) { //连续读取32个字节
buffer[i] = fgetc(f);
}
for (i = 0; i < 32; ++i) { //将32个字节顺序打印
for (j = 0; j < 8; ++j) {
if (buffer[i] & 0x80) {
printf("■");
}else{
printf("□");
}
buffer[i] <<= 1;
}
if (i % 2) {
printf("\n"); //如果i%2==1说明该字节是靠后的那个字节,显示完后要换行
}
}
}