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

 CASLアセンブラ程度の簡単な言語処理プログラムmc(myCASL)を作成する。

 1. メニュープログラムは言語処理プログラムの基本

 メニューを表示して、番号やアルファベットで処理を選択し、メニュー内容の処理をするプログラムをメニュープログラムということにする。このメニュープログラムがインタプリタ型言語処理プログラムの基本である。

 実行結果のようにメニューを表示し、四則演算をするプログラムを作成する。データはすべて整数とする。また、表示するメッセージ等は実行結果を参考にすること。(ADD:加算 SUB:減算 MUL:乗算 DIV:除算)

[mc01.c]  (プログラムリスト中の\は\と同じ)
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
#include <stdio.h>

void main(void)
{
    int     data1, data2, ans, num;

    while(1){
        printf("  1.ADD\n  2.SUB\n  3.MUL\n  4.DIV\n  0.END\n");
        printf("\n Number : ");
        scanf("%d", &num);
        if(num == @    ){           /* 加算(ADD)処理 */
            printf("Data1 : ");
            scanf("%d", &data1);
            printf("Data2 : ");
            scanf("%d", &data2);
            ans = A                 ;
        }else if(num == B    ){     /* 減算(SUB)処理 */
            printf("Data1 : ");
            scanf("%d", &data1);
            printf("Data2 : ");
            scanf("%d", &data2);
            ans = C                 ;
        }else if(num == D    ){     /* 乗算(MUL)処理 */
            printf("Data1 : ");
            scanf("%d", &data1);
            printf("Data2 : ");
            scanf("%d", &data2);
            ans = E                 ;
        }else if(num == F    ){     /* 除算(DIV)処理 */
            printf("Data1 : ");
            scanf("%d", &data1);
            printf("Data2 : ");
            scanf("%d", &data2);
            ans = G                 ;
        }else if(num == H    )      /* 終了(END)処理 */
            I         ;
        else{
            printf("Error : Number 0 - 4\n");
            continue;
        }
        printf("Answer = %d\n\n",J       );  /* 結果表示 */
    }
}
実行結果
  1.ADD
  2.SUB
  3.MUL
  4.DIV
  0.END

 Number : 1
Data1 : 100
Data2 : 200
Answer = 300

  1.ADD
  2.SUB
  3.MUL
  4.DIV
  0.END

 Number : 2
Data1 : 200
Data2 : 100
Answer = 100

  1.ADD
  2.SUB
  3.MUL
  4.DIV
  0.END

 Number : 0
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@   A   B   C
D   E   F   G
H   I   J
     

 8行目のメニュー表示では関数printfを4回使用しないで表示している。各項目の後、\nで改行している。
 12〜15、18〜21、24〜27、30〜33行目は各メニュー番号ごとデータの入力処理であるり、全く同じである。
 35,36行目はメニューの0が入力されたときの処理であるが、break文で永久ループを抜け出すことができる。

fig

 このプログラムではbreak文で永久ループを抜け出し、結果的にプログラムが終了するようにしたが、関数exit()で強制的に終了させることもできる。

 一般的に、このようなメニュープログラムでは、番号の入力ミスに対して37行目のようなエラー処理を用意する。

 この例題のプログラムを作成するのであれば、次に示すリストのように重複している処理を整理することで、コンパクトなプログラムが作成できる。コンパクト、すなわちリストの行数が減ればコンパイルした後の実行ファイルのサイズも小さくなる。実行ファイルのサイズが小さくなれば、それだけ処理速度も速くなる。
 しかし、ここではこの後、この例題プログラムを簡単な言語処理プログラムに改造していくので、効率が悪くても上のリストを採用する。


[参考]
[mycasl02.c]
   1: #include <stdio.h>
   2: 
   3: void main(void)
   4: {
   5:     int     data1, data2, ans, num;
   6: 
   7:     while(1){
   8:         printf("  1.ADD\n  2.SUB\n  3.MUL\n  4.DIV\n  0.END\n");
   9:         printf("\n Number : ");
  10:         scanf("%d", &num);
  11:         if(num == 0){       /* メニューの0 */
  12:             break;          /* 強制終了 */
  13:         }else if(num > 4){  /* 番号以外 */
  14:             printf("Error : Number 0 - 4\n");
  15:             continue;       /* while()に戻る */
  16:         }
  17:         printf("Data1 : ");
  18:         scanf("%d", &data1);
  19:         printf("Data2 : ");
  20:         scanf("%d", &data2);
  21:         if(num == 1){       /* 計算処理 */
  22:             ans = data1 + data2;
  23:         }else if(num == 2){
  24:             ans = data1 - data2;
  25:         }else if(num == 3){
  26:             ans = data1 * data2;
  27:         }else if(num == 4){
  28:             ans = data1 / data2;
  29:         }
  30:         printf("Answer = %d\n\n", ans);
  31:     }
  32: }
 先のリストにくらべると11行もサイズが小さくなっている。入力処理を整理して、計算前に共通の処理として実行している。0:endの処理も、入力ミスの処理もデータ入力の前に移動している。これは、0を選んだときにはデータ入力の必要がないからである。このように、今後メニューを追加したとき、データが不要、または1つしか必要でないとき、処理を1カ所にまとめることができない。そのため先のリストの方を採用する。


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

 

 

inserted by FC2 system