C語言高級程序設計示例:[1]點陣漢字?

C語言是一種計算機程序設計語言,它既具有高級語言的特點,又具有彙編語言的特點。它由美國貝爾實驗室的Dennis M. Ritchie於1972年推出,1978年後,C語言已先後被移植到大、中、小及微型機上,它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬件的應用程序。它的應用範圍廣泛,具備很強的數據處理能力,不僅僅是在軟件開發上,而且各類科研都需要用到C語言,適於編寫系統軟件,三維,二維圖形和動畫,具體應用比如單片機以及嵌入式系統開發。

工具/原料

Devc++編譯器

方法/步驟

首先用到編譯器,在這裡用devc++開發,用vc6.0也可以,下載後安裝完成。打開如下圖:

C語言高級程序設計示例:[1]點陣漢字

而後在文件中 選擇新建 源代碼,如下圖:命名源代碼文件為hanzi.cpp

C語言高級程序設計示例:[1]點陣漢字

在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 請諒解

C語言高級程序設計示例:[1]點陣漢字

點運行裡面的編譯,出現下面第一個圖說明編譯成功,接著運行

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

運行出現上圖窗口內容如下

^^^^^^^^^^^歡迎使用曉博點陣漢字測試程序^^^^^^^^^^^

Designed by [email protected]

Henan University of Economics and Law

1. 輸入一個漢字

2. 切換斜體

3. 設置水平放大

4. 設置垂直放大

5. 設置填充字符

6. 輸出到文件xiaobo.txt

7. 退出

----------------

請選擇相應的數字

根據提示,選擇1,輸入漢字博

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

輸入2變為斜體,輸入3可以水平放大 提示放大倍率輸入2 5 可以字符填充 提示輸入用於填充的字符 輸入x

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

接著把這個博字存入xiaobo.txt文件,輸入6,查看文件,而後7可以退出程序

C語言高級程序設計示例:[1]點陣漢字

C語言高級程序設計示例:[1]點陣漢字

注意事項

xiaobo16.dat文件,由於無法上傳相關附件,所以作者上傳到了csdn資源中下載地址download.csdn.net/detail/yedeqixian/7258805 請諒解

語言, 漢字, 點陣, 程序設計, 示例,
相關問題答案