C言語-インタプリタminiCASL
前へ 目次へ 次へ 

 3. 命令を文字列にする

 このままでは、命令が数字なのでわかりにくい。そこで、命令を簡単な英単語にする。

例 加算:add  減算:sub  乗算:mul  除算:div  終了:end

 文字はコンピュータ内部では、コード(整数)として扱われる。例えば、'a'のコードは0x61のように各文字にコードが1バイトで決められている。これをキャラクターコード(アスキーコード)という。
 日本では、漢字を扱う必要があるが、それぞれの漢字にもコードが決められている。ただし、漢字は種類が多く、1バイトでは足りないのでコードは2バイトで決められている。この2バイトの文字を全角文字といい、それに対して1バイトの文字を半角文字という(単に、半角、全角ということもある)。
 次に、主な漢字(日本語)コードを示す。UNIXの多くは、EUCコードである。

第1バイト 第2バイト
JISコード 0x21 - 0x98 0x21 - 0x7E
シフトJISコード(S-JIS) 0x81 - 0x9F, 0xE0 - 0xFC 0x40 - 0x7E, 0x80 - 0xFC
EUCコード 0xA1 - 0xFE 0xA1 - 0xFE

 char型変数は1バイト分の領域しかないので、文字列や漢字コードを扱う場合には、配列を使用しなければならない。
 文字列を処理する関数は、string.hで定義されているので、#include <string.h>が必要になる。関数名の多くは、strで始まっている。

 次に、データファイルindataの命令に相当する部分を英単語の命令語に換えて、これが処理できるようにプログラムを変更する。ファイル名は、reidai01.mcとして作成しておく。

1   add
12.34 12.34
11.11   11.11
0   end
reidai01.mc
add
12.34
11.11
end


 命令語は文字列であり、文字列どうしが同じかどうかを判定するには、関数strcmpを使用する。

[mc04.c]
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

23:
24:

29:
30:

35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
    double  data1, data2, ans;
    char    buff[80];
    
    while(1){
        gets(buff);
        if(!strcmp(buff, @    )){  /* 命令判定 */
            gets(buff);              /* 文字列入力 */
            data1 = atof(buff);     /* 実数値に変換 */
            gets(buff);              /* 文字列入力 */
            data2 = atof(buff);     /* 実数値に変換 */
            ans = data1 + data2;
        }else if(!strcmp(buff, A    )){
            <<赤色の部分(13〜16行)と同じ>>
            ans = data1 - data2;
        }else if(!strcmp(buff, B    )){
            <<赤色の部分(13〜16行)と同じ>>
            ans = data1 * data2;
        }else if(!strcmp(buff, C    )){
            <<赤色の部分(13〜16行)と同じ>>
            ans = data1 / data2;
        }else if(!strcmp(buff, D    )){
            break;
        }else{
            printf("Error : Number 0 - 4\n");
            continue;
        }
        printf("%f\n", ans);        /* 結果表示 */
    }
}
実行結果
D:Data\src>cc mc04.c
D:Data\src>mc04 < reidai01.mc
23.450000
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B
C   D
     

 命令判定の部分で関数strcmpの前に“”が付けてある。これは、2つの文字列が同じとき、関数strcmpの結果が0(0は偽)になり、これを!で真に変えている。したがって、ていねいに書けば次のようになる。

    if(strcmp(buf,     ) == 0){

 “”は否定演算子で、真と偽を入れ換える演算を行う。


前へ 目次へ 次へ 
Copyright © 2001 Hiroshi Masuda 

 

 

inserted by FC2 system