[更新日]1998.07.8


次の問7から問10までの4問については,この中から1問を選択し,
答案用紙の選択欄のをマークして 解答してください。
 なお,2問以上選択した場合には,はじめの1問について採点します。

 

問7 次の C プログラムの説明及びプログラムを読んで,設問に答えよ。

〔プログラムの説明〕

文字列のコード変換を行うプログラムである。

(1) 入力文字列中のそれぞれの文字のコードを,表 1 の変換規則に 従って出力文字のコードに変換する。

表1 文字コードの変換規則

タイプ

入力文字のバイト数

入力文字コードの範囲

変換方法

出力文字のバイト数

出力文字コー

ドの範囲

1

1 バイト

0x20〜0x7E

そのまま出力する

1 バイト

0x20〜0x7E

2

2 バイト

1 バイト目

0x8E

識別のための制御コード

なので,出力しない

1 バイト

0x21〜0x7E

2 バイト目

0xA1〜0xFE

最上位ビットを 0 にする

3

2 バイト

各バイト

0xA1〜0xFE

各バイトの最上位ビット
を 0 にする

2 バイト

各バイト

0x21〜0x7E

(2) 入力文字列の中では,表 2 に示す制御コードが使われる。

表2 入力制御コード

タイプ

種別

バイト数

コード

プログラム

中での呼称

2

識別

1 バイト

0x8E

KSS

 

(3) 入力は,表 1 の入力文字コードの範囲の文字だけで構成される。

(4) 入力文字列から出力文字列を作成するとき,タイプ 2 とタイプ 3 の 1 文字以上の連続する文字列の最初と最後には,表 3 に示す制御コード列を 付加する。

表3 出力制御コード

タイプ

種別

バイト数

コード列

プログラム

中での呼称

2

開始

1 バイト

0x0E

KAI

終了

1 バイト

0x0F

KAO

3

開始

3 バイト

0x1B 0x24 0x42

K2I

終了

3 バイト

0x1B 0x28 0x42

K2O

 

(5) 関数 CodeConv の実行例は,図のとおりである。

      図 文字列の変換例


〔プログラム〕
void CodeConv(char *instr, char *outstr)
{
    static char K2I[] = "\x1b\x24\x42", K2O[] = "\x1b\x28\x42",
                KAI = '\x0e', KAO = '\x0f', KSS = '\x8e';
    int cctype, i, pctype = 1 ;
 
    while (*instr != '\0') {
        if (*instr == KSS)
            cctype = 2;
        else if ()
            cctype = 3;
        else
            cctype = 1;
        if () {
            if (pctype == 3)
                for (i = 0; K2O[i] != '\0'; *outstr++ = K2O[i++]);
            else if (pctype == 2)
                *outstr++ = KAO;
            if (cctype == 3)
                for (i = 0; K2I[i] != '\0'; *outstr++ = K2I[i++]);
            else if (cctype == 2)
                *outstr++ = KAI;
            ;
        }
 
        if (cctype == 1)
            *outstr++ = *instr++;
        else if (cctype == 3) {
            *outstr++ = *instr++ & 0x7f;
            *outstr++ = *instr++ & 0x7f;
        } else {
            ;
            *outstr++ = *instr++ & 0x7f;
        }
    }
    if (pctype == 3)
        for (i = 0; K2O[i] != '\0'; *outstr++ = K2O[i++]);
    else if (pctype == 2)
        *outstr++ = KAO;
    *outstr = '\0';        
}

設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。

 

a に関する解答群

ア *instr & 0x7F    イ *instr | 0x7F
 
ウ *instr && 0x7F エ *instr || 0x7F
 
オ *instr & 0x80 カ *instr | 0x80
 
キ *instr && 0x80 ク *instr || 0x80

 

b に関する解答群

ア cctype    イ !cctype
 
ウ pctype エ !pctype
 
オ pctype == cctype カ pctype != cctype

 

c に関する解答群

ア cctype = 1    イ !cctype = 2
 
ウ cctype = 3 エ cctype = pctype
 
オ pctype = 1 カ pctype = 2
 
キ pctype = 3 ク pctype = cctype

 

d に関する解答群

ア instr++      イ outstr++
 
ウ *outstr++ = '\0' エ *outstr++ = KAI
 
オ *outstr++ = KAO カ *outstr++ = KSS
 
キ *outstr++ = *instr++

戻る 次頁:問08