在许多c程序设计中,要用到汉字进行提示或人机交互,而现行的turbo c集成开发环境不是汉化的,如何编制能显示汉字的c程序呢?
下面的方法可以帮你在西文环境下显示汉字。这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。
由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。
内码转换成区位码方法如下:
qh=c1-0xa0 wh=c2-0xa0
其区位码就是:
qw=qh*0xff+wh
该汉字在字库中离起点的位置是:
offset=(94*(qh-1)+(wh-1))*32l
程序例:
#include 〈graphicsh〉
#include 〈stdioh〉
#include 〈fcntlh〉
#include 〈ioh〉
#include 〈stdlibh〉
#include 〈conioh〉
#define row 1 //纵坐标放大倍数
#define col 2 //横坐标放大倍数
void main()
{
int x,y;
char *s=″汉字显示程序″;
file *fp;
char buffer[32]; //buffer用来存储一个汉字
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
int gd=detect,gm; //图形屏幕初始化
initgraph(&gd,&gm,″ ″);
if ((fp=fopen(″hzk16″,″rb″))==null)
//打开汉字库,该字库可以在ucdos中找到
{ printf(″can't open haz16,please add it″);
getch(); closegraph(); exit(0);
}
x=20; y=100; //显示位置设置
while(*s)
{ qh=*(s)-0xa0; //汉字区位码
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32l; //计算该汉字在字库中偏移量
fseek(fp,offset,seek_set);
fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)
for (i=0;i〈16;i++) //将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字
for(n=0;n〈row;n++)
for(j=0;j〈2;j++)
for(k=0;k〈8;k++)
for(m=0;m〈col;m++)
if (((buffer[i*2+j]〉〉(7-k))&0x1)!=null)
putpixel(x+8*j*col+k*col+m,y+i*row+n,green);
s+=2; //因为一个汉字内码占用两个字节,所以s必须加2
x+=30;
}
getch();
closegraph();
}
上述程序在turbo c 20编译系统下运行成功,它可以将汉字放大显示,读者可以将它改成函数用在您的程序中显示汉字。
参考gugu99的博客
可以将这个功能封装为一个函数。
传入数组首地址,以及数组长度。
以循环方式,对数组逆序遍历即可。
代码:
void revers_print(int a, int l)
{
int i;
for( i = l-1; i >=0; i -- )
printf("%d,",a[i]);
return 0;
}
第一,没有硬件连接描述,单片机类型,晶振参数等;
第二,既然是点阵 ,显示的内容是需要自编字库的,即字模;
第三,没有说明所谓的移动是什么类型的,如整个字母移动,或单列移动;整屏移动又是什么情况。
char wo16S[]={
/ 以下是 '我' 的 16点阵宋体 字模,32 byte /
0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,
0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48,
0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,
0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02,
};
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 2; j++)
{
char ch = wo16S[i 2 + j];
for (int k = 0; k < 8; k++)
{
int x = j 8 + k; //X坐标
int y = i; //Y坐标
if (ch & (1 << (7 - k)))
{
DrawPixel(x, y); //把这里DrawPixel换成C语言中的画点 *** 作函数
}
}
}
}
你这程序写的什么乱七八糟的……跨文件调用乱成一锅粥。
图一里面应当声明成数组,DzkCode[]。
图二里面你是要调用,不是要再声明一个,应该加上extern并且确保与原始声明一致。
或者你别把字库存成C文件了,按头文件来做、让mainc包含它就好了。
int s[2][2];
for(e=0;e<2;e++)
for(f=0;f<2;f++)
{
s[e][f]=a[i][j]+b[m][n];
printf("s[%d][%d]=%d\t",e,f,s[e][f]);
}
你这个运算很明显有问题的,i和j 和m和n都没有变呢,所以这个程序段有问题的。你改下
for(e=0;e<2;e++)
for(f=0;f<2;f++)
{
s[e][f]=a[e][f]+b[e][f];
printf("s[%d][%d]=%d\t",e,f,s[e][f]);
}这样应该得的
不过不懂你是真样的设计来加的。
以上就是关于如何在C程序中显示12或16点的点阵汉字全部的内容,包括:如何在C程序中显示12或16点的点阵汉字、c语言数组输出点阵的问题,具体问题如图、怎样用c语言实现8*8点阵数字、字母的显示及移动等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)