設置 | 登錄 | 註冊

目前共有2篇帖子。

【試題】拼音字母

1樓 巨大八爪鱼 2016-5-23 21:21

【編程題】(滿分19分)

    在很多軟體中,輸入拼音的首寫字母就可以快速定位到某個詞條。比如,在鐵路售票軟體中,輸入: 「bj」就可以定位到「北京」。怎樣在自己的軟體中實現這個功能呢?問題的關鍵在於:對每個漢字必須能計算出它的拼音首字母。

    GB2312漢字編碼方式中,一級漢字的3755個是按照拼音順序排列的。我們可以利用這個特徵,對常用漢字求拼音首字母。

    GB2312編碼方案對每個漢字採用兩個字節表示。第一個字節為區號,第二個字節為區中的偏移號。為了能與已有的ASCII編碼兼容(中西文混排),區號和偏移編號都從0xA1開始。

    我們只要找到拼音a,b,c,...x,y,z 每個字母所對應的GB2312編碼的第一個漢字,就可以定位所有一級漢字的拼音首字母了(不考慮多音字的情況)。下面這個表給出了前述信息。請你利用該表編寫程序,求出常用漢字的拼音首字母。


a 啊 B0A1
b 芭 B0C5
c 擦 B2C1
d 搭 B4EE
e 蛾 B6EA
f 發 B7A2
g 噶 B8C1
h 哈 B9FE
j 擊 BBF7
k 喀 BFA6
l 垃 C0AC
m 媽 C2E8
n 拿 C4C3
o 哦 C5B6
p 啪 C5BE
q 期 C6DA
r 然 C8BB
s 撒 C8F6
t 塌 CBFA
w 挖 CDDA
x 昔 CEF4
y 壓 D1B9
z 匝 D4D1


【輸入、輸出格式要求】

    用戶先輸入一個整數n (n<100),表示接下來將有n行文本。接著輸入n行中文串(每個串不超過50個漢字)。

    程序則輸出n行,每行內容為用戶輸入的對應行的漢字的拼音首字母。

    字母間不留空格,全部使用大寫字母。

    例如:
    用戶輸入:
3
大家愛科學
北京天安門廣場
軟體大賽

    則程序輸出:
DJAKX
BJTAMGC
RJDS

【注意】

    請仔細調試!您的程序只有能運行出正確結果的時候才有機會得分!
    
    在評卷時使用的輸入數據與試卷中給出的實例數據可能是不同的。

    請把所有函數寫在同一個文件中,調試好後,拷貝到【考生文件夾】下對應題號的「解答.txt」中即可。
    
    相關的工程文件不要拷入。
    
    原始碼中不能使用諸如繪圖、Win32API、中斷調用、硬體操作或與作業系統相關的API。
    
    允許使用STL類庫,但不能使用MFC或ATL等非ANSI c++標準的類庫。

    例如,不能使用CString類型(屬於MFC類庫),不能使用randomize, random函數(不屬於ANSI C++標準)


2樓 巨大八爪鱼 2016-5-23 21:22
【代碼】
#include <stdio.h>

char *clist[] = {"啊", "芭", "擦", "搭", "蛾", "發", "噶", "哈", 0, "擊", "喀", "垃", "媽", "拿", "哦", "啪", "期", "然", "撒", "塌", 0, 0, "挖", "昔", "壓", "匝"};
int list[26];

#define CVT(p) (((*(p) & 0xff) << 8) + (*((p) + 1) & 0xff))

int main(void)
{
    int i, n;
    char buffer[110];
    char temp[110][60];
    char *p, *t;
    int value, pos;
    int last_pos;

    for (i = 0; i < 26; i++)
    {
        if (clist[i] == 0)
            list[i] = 0;
        else
            list[i] = CVT(clist[i]);
        //printf("[%c]%x\n", 'A' + i, list[i]);
    }

    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        fflush(stdin);
        gets(buffer);
        p = buffer;
        t = temp[i];
        while (*p)
        {
            value = CVT(p);
            last_pos = -1;
            for (pos = 0; pos < 26; pos++)
            {
                if (value < list[pos])
                    break;
                if (list[pos] != 0)
                    last_pos = pos;
            }
            *t++ = 'A' + last_pos;
            p += 2;
        }
        *t = 0;
    }
    for (i = 0; i < n; i++)
        puts(temp[i]);
    return 0;
}

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。