C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有彙編語言的特點。它由美國貝爾實驗室的Dennis M. Ritchie於1972年推出,1978年後,C語言已先後被移植到大、中、小及微型機上,它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。它的應用範圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,適於編寫系統軟件,三維,二維圖形和動畫,具體應用比如單片機以及嵌入式系統開發。
工具/原料
Devc++編譯器
方法/步驟
首先用到編譯器,在這裡用devc++開發,用vc6.0也可以,下載後安裝完成。打開如下圖:
而後在文件中 選擇新建 源代碼,如下圖:命名源代碼文件為hanzi.cpp
在hanzi.cpp中加入程序代碼
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
/*
從鍵盤獲得漢字的編碼
在中文windows下,默認編碼方式為GB2312, 每個漢字由兩個字節組成。
函數的目的是:把這個漢字的高字節寫入 pc1指向的位置,低字節寫入 pc2指向的位置
*/
int get_han_zi(unsigned char* pc1, unsigned char* pc2)
{
char buf[100];
printf("\n請輸入一個漢字:");
gets(buf);
if(strlen(buf) != 2) return -1;
*pc1 = buf[0];
*pc2 = buf[1];
if(*pc1 < 0xa1) return -2;
if(*pc2 < 0xa1) return -2;
return 0;
}
void load_han_zi(unsigned char* buf, unsigned char c1, unsigned char c2)
{
int n = (c1 - 0xa1) * 94 + (c2 - 0xa1); // 計算在文件中的位置
FILE* fp = fopen("xiaobo16.DAT", "rb");
if(fp==NULL){
printf("漢字庫打開錯!");
exit(1);
}
fseek(fp, n * 32L, SEEK_SET);
for(int i=0; i<32; i++){
buf[i] = (unsigned char)fgetc(fp);
}
fclose(fp);
}
/*
顯示漢字
buf: 從文件中讀出的漢字字模信息,32字節,說明同上
italic: =1,如果要求斜體, =0 正常
kx: 水平放大率
ky: 垂直放大率
fill: 用於填充的字符
*/
void show_han_zi(unsigned char* buf, int italic, int kx, int ky, char fill)
{
for(int i=0; i<16; i++){
for(int k1=0; k1
printf("\n");
if(italic){
for(int k3=0; k3<15-i; k3++)
printf(" ");
}
for(int j=0; j<16; j++){
if(buf[i*2 + (j/8)] & (0x80 >> (j%8)))
for(int k2=0; k2
printf("%c", fill);
else
for(int k2=0; k2
printf(" ");
}
}
}
}
void write_to_file(unsigned char* buf, int italic, int kx, int ky, char fill)
{
FILE* fp = fopen("xiaobo.txt", "w");
for(int i=0; i<16; i++){
for(int k1=0; k1
fputc('\n', fp);
if(italic){
for(int k3=0; k3<15-i; k3++)
fputc(' ', fp);
}
for(int j=0; j<16; j++){
if(buf[i*2 + (j/8)] & (0x80 >> (j%8)))
for(int k2=0; k2
fputc(fill, fp);
else
for(int k2=0; k2
fputc(' ', fp);
}
}
}
fclose(fp);
}
int set_zoom_k(int* pk)
{
printf("請輸入放大率(1-4):");
char buf[100];
gets(buf);
int n = atoi(buf);
if(n<1 n>4) return -1;
*pk = n;
return 0;
}
char get_fill_char()
{
for(;;){
printf("請輸入用於填充的字符");
char c = getch();
if(c>32 && c<125) return c;
}
}
int main(int argc, char* argv[])
{system("title 曉博點陣漢字測試程序");
unsigned char han_zi_buf[32]; // 存儲16點陣漢字的字模
int font_italic = 0;
int font_kx = 1; // 水平放大率
int font_ky = 1; // 垂直放大率
char fill_char = '@'; // 填充字符
for(;;){
printf("\n ^^^^^^^^^^^歡迎使用曉博點陣漢字測試程序^^^^^^^^^^^\nDesigned by [email protected]\nHenan University of Economics and Law\n");
printf("1. 輸入一個漢字\n");
printf("2. 切換斜體\n");
printf("3. 設置水平放大\n");
printf("4. 設置垂直放大\n");
printf("5. 設置填充字符\n");
printf("6. 輸出到文件xiaobo.txt\n");
printf("7. 退出\n");
printf("----------------\n");
printf("請選擇相應的數字\n");
char c = (char)getch();
switch(c){
case '1':
{
unsigned char c1;
unsigned char c2;
if(get_han_zi(&c1, &c2) != 0)
printf("\n輸入無效!\n");
else{
load_han_zi(han_zi_buf, c1, c2);
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
}
}
break;
case '2':
font_italic = (font_italic + 1) % 2;
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '3':
if(set_zoom_k(&font_kx) !=0)
printf("\n輸入無效!\n");
else
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '4':
if(set_zoom_k(&font_ky) !=0)
printf("\n輸入無效!\n");
else
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '5':
fill_char = get_fill_char();
show_han_zi(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '6':
write_to_file(han_zi_buf, font_italic, font_kx, font_ky, fill_char);
break;
case '7':
exit(0);
break;
default:
printf("\n您的選擇無效!\n");
}
}
return 0;
}
PS:
從文件(字形文件xiaobo16)把字形裝入到一個32字節的緩衝區 buf 中。
c1 是該漢字GB2312編碼的高字節,c2是低字節。
每個bit代表1個像素點,16點陣的字模需要256個像素點信息,故需32字節
字節的排列與16點陣像素的對應關係如下圖:
第0字節 第1字節
第2字節 第3字節
.......
第14字節 第15字節
也就是說:每1行的16個點由2個字節提供。順序是:從上到下,從左到右。
GB2312的編碼規則是:前一個字節表示區號,後一個表示區中的偏移序號。
每個區有94個漢字。區號和序號的編碼都是從 0xA1開始(為了避免和西文衝突)
因此,已知某個漢字的編碼,就可以計算出文件中所在的絕對位置。
xiaobo16.dat文件,由於無法上傳相關附件,所以作者上傳到了csdn資源中下載地址download.csdn.net/detail/yedeqixian/7258805 請諒解
點運行裡面的編譯,出現下面第一個圖說明編譯成功,接著運行
運行出現上圖窗口內容如下
^^^^^^^^^^^歡迎使用曉博點陣漢字測試程序^^^^^^^^^^^
Designed by [email protected]
Henan University of Economics and Law
1. 輸入一個漢字
2. 切換斜體
3. 設置水平放大
4. 設置垂直放大
5. 設置填充字符
6. 輸出到文件xiaobo.txt
7. 退出
----------------
請選擇相應的數字
根據提示,選擇1,輸入漢字博
輸入2變為斜體,輸入3可以水平放大 提示放大倍率輸入2 5 可以字符填充 提示輸入用於填充的字符 輸入x
接著把這個博字存入xiaobo.txt文件,輸入6,查看文件,而後7可以退出程序
注意事項
xiaobo16.dat文件,由於無法上傳相關附件,所以作者上傳到了csdn資源中下載地址download.csdn.net/detail/yedeqixian/7258805 請諒解