C语言是如何用16点阵方法输出汉字的?
到目前为止,我们编写的C 程序,其用于人机交互的提示或菜单都是英文
的,那么如何在没有汉化的Turbo C 集成开发环境下编制显示汉字的程序呢?
解决这一编程问题,我们首先必须了解有关汉字编码及字库的知识。根据对汉字使
用频率的研究,可把汉字分成高频字(约100 个),常用字(约3000 个),次常用字(约4000 个),
罕见字(约8000 个)和死字(约45000 个),即正常使用的汉字达15000 个。我国1981 年公布
了《通讯用汉字字符集(基本集)及其交换码标准》GB2312-80 方案,把高频字、常用字、和
次常用字集合成汉字基本字符集(共6763 个),在该集中按汉字使用的频度,又将其分为一
级汉字3755 个(按拼音排序)、二级汉字3008 个(按部首排序),再加上西文字母、数字、图
形符号等700 个。
汉字编码:
区位码
国家标准的汉字字符集(GB2312—80)在汉字操作系统中是以汉字库的形式提供的。汉
字库结构作了统一规定,即将字库分成94 个区,每个区有94 个汉字(以
位作区别)每一个汉字在汉字库中有确定的区和位编号(用两个字节),这就是所谓的区位码
(区位码的第一个字节表示区号,第二个字节表示位号,因而只要知道了区位码,就可知道
该汉字在字库中的地址,每个汉字在字库中是以点阵字模形式存储的,如一般采用16×16
点阵形式,每个点用一个二进位表示,存1 的点,当显示时,可以在屏上显示一个亮点,存
0 的点,则在屏上不显示,这样把存某字的16×16 点阵信息直接用来在显示器上按上述原
则显示,则将出现对应的汉字。
内码
汉字使用两字节表示,国家制定了统一标准,称为国标码。国标码规定,每个字节使用
后面7 位,第一位为0。为了区别于英文的ASCII 码,国标码在计算机上使用的时候,规定
汉字每个字节第一位设置为1,以表示该两字节为汉字,称为内码。以“大”字为例子:
国标码3473H: 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 1
内码B4F3H: 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1
国标码与内码有一定的转换公式,即16 进制的区位码,两个字节各加80H,就成为了
国标码。
汉字字模在字库中存放的位置根据汉字的区位码来确定,内码是汉字在机内的表示。由
于区位码和内码存在固定的转换关系,所以当在支持汉字输入的系统中,键盘输入的汉字内
码即在程序中存在,将其转换为区位码,再从字库中找到对应的汉字字模,然后再用有关的
位操作和循环语句,对每个字节的每一位进行判断,如同过滤一样,如果某位是1,则按设
置的颜色在屏幕的相应位置画点(用graphics.h 中的显示象素点的函数putpixel()),若某位
为0,则不画点,这样就可按预先设置的颜色在相应位置显示出该汉字来。
内码到区位码的转换
若汉字内码为十六进制数h2h1l2l1,则区号qh 相位号wh 分别为:
qh= h2h1-0xa0;
wh= l2l1-0xa0;
若用十进制表示内码为dld2,则
qh=dl-l60;
wh=d2-160;
即区位码qw 为:
qw=100*(d1-160)十(d2-160);
反过来,若已经知道了区位码qw。则也可求得区号和位号:
qh=qw/100;
wh=qw-100*qh;
因而该汉字在汉字库中离起点的偏移位置(以字节为单位),可计算为:
offset=(94*(qh-1)+(wh-1))* 32;
注意:字库中每1 区有94 个字符。
这样,就可以找寻到文件的偏移量,读出一个char bytes[32]数组。这样bytes 数组中则
存了要显示汉字的16×16 点阵字模,然后将字模按行扫描的办法,通过循环用putpixel()函
数在屏幕设定位置显示出象点,因而组合成一个显示的汉字。
求用C语言编写一个能把txt文档中的所有汉字采用点阵输出的程序
这基本是一个不可能看成的任务,按照变成的思路,你应该为每一个单独的汉子进行编写一个相应的函数,然后读入txt文档之后,进行每个字的对应比对。简单一点你可以按照五笔的想法把汉字进行分解,但是你读入的汉字就需要结构辨识,这也是很麻烦的。
怎样用c语言实现8*8点阵数字、字母的显示及移动
第一,没有硬件连接描述,单片机类型,晶振参数等;
第二,既然是点阵 ,显示的内容是需要自编字库的,即字模;
第三,没有说明所谓的移动是什么类型的,如整个字母移动,或单列移动;整屏移动又是什么情况。
C语言用点阵的形式在字符界面上显示数字,有图?
#include stdio.h
// 7*70的数组(包含数字后的空格)
char a[7][70]={
‘*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,
‘*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,
‘*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,
‘*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,
‘*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,
‘*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,
‘*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘,’*’,’*’,’*’,’*’,’*’,’ ‘,’ ‘
};
int main(){
int n;
scanf(“%d”,n);
int b[100];
for(int i = 0; i n; i++){
scanf(“%d”,b[i]);
}
for(int i = 0; i n; i++){
printf(“%d:\n”,b[i]);
int t = b[i];
int p;
// 将a[i]倒序放入x[5]中
int x[5],j=0;
do{
p = t%10;
x[j] = p;
j ++;
}while((t = t/10) != 0);
int l = j;
// 打印b[i]
// 每个数字占7行
for(int k = 0; k 7; k++){
// 逐行打印单个数字(共l个数字)
for(j–;j =0; j–){
// 每个数字占7列(包括空格)
for(int m = 0; m 7; m++){
printf(“%c”,a[k][x[j]*7 + m]);
}
}
j = l;
// 换行
printf(“\n”);
}
}
return 0;
}
附图:
运行结果:
C语言输出数字图案
这个有助于帮助你理解计算机显示字符的方法和原理。
首先要存储每个数字字符的点阵信息,每个点用1位二进制数表示1表示有点0表示无点。
分析一下,你的每个数字每行12字符,即12点,共18行,可以用16位二进制数组存放
那么我们就开设数组存储unsigned short int num1[18];
拿字符1来说,每行的点阵转化成16进制数据记录下来:
000000000000 0x00
000000000110 0x06
000000011110 0x1e
000000011110 0x1e
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000110 0x06
000000000000 0x00
这样存储下来是:unsigned short int num1[18]={0,6,0x1e,0x1e,6,6,6,6,6,6,6,6,6,6,6,6,0};
程序在显示这样的字符时,需要逐行取这些点阵,逐位判断是否是1,根据显示要求看1代表字符0还是空格;多个数字一行需要同时先把所有数字的第1行显示完后再去处理第2行,直到处理完18行为止。