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

 8. 命令の機能追加

(1) INPUT命令の機能追加

書式
    INPUT [文字定数 {,|;}] 変数

 文字定数を表示して、入力待ちになる。入力したデータは変数に格納される。[ ] 内は省略することができ、省略したときは ? を表示して入力待ちになる。
 文字定数と変数はカンマまたは、セミコロンで区切る。セミコロンで区切ったときは文字定数の後に ? が表示される。

 書式を構文図で表すと次のようになる。

 ○印は終端記号(末端記号)といい、他に種類のないものを表す。□印は非終端記号といい、その種類は別に定義される。
 例えば文字定数は、"で囲まれた文字の集まりであり、変数は英字26文字のいずれかである。

void mb_input(void)
{
    次のトークンを取得
    if トークンの先頭 = '"' 
        トークンを表示
        次のトークンを取得
        if トークンの先頭 = ','
            何もしない
        else if トークンの先頭 = ';'
            ? を表示
        else
            文法エラー
        次のトークンを取得
    else
        ? を表示
    if 変数名として正しくない
        変数名エラー
    キー入力
    文字列を実数に変換して変数に格納
}
[mb_cmds2.c]
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:

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>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "gettoken.h"
/* グローバル変数 */
extern double  hensuu[26];      /* 変数用(A〜Z) */

void mb_print(void)
{
<<省 略>>
}
void mb_input(void)
{
    char    val;            /* 変数名(番号) */
    char    buff[256];      /* キー入力用 */
    
    if(*get_token() == @    ){      /* 文字定数 */
        printf("%s", &token[1]);        /* メッセージ表示 */
        if(*get_token() == A    )       /* カンマ */
            ;                               /* 何もしない */
        else if(B                ')      /* セミコロン */
            printf("? ");                   /* ? 追加表示 */
        else{
            printf("Error : INPUT文法エラー\n");
            exit(1);
        }
        val = *get_token();     /* 変数名取得 */
    }else{
        val = *token;           /* 変数名取得 */
        printf("? ");           /* ? 表示 */
    }
    if(C                 ){      /* 変数名チェック */
        printf("変数名は英字のみです\n");
        exit(1);
    }
    D              );            /* キー入力 */
    hensuu[E           '] = atof(buff);   /* 入力データを変数へ */
}
[解答欄] (すべて半角文字で、空白文字もチェックされます。)
@    A    B
C    D    E
     
reidai04.mb
INPUT A
INPUT "Data(No ?) = ",B
INPUT "Data(Yes ?) = ";C
X = (A + B) * C
PRINT A
PRINT B
PRINT C
END
実行結果
D:\Data\src>make
lcc  -c -o mb_cmds2.obj mb_cmds2.c
lcc -o mbas.exe mbas07.obj mb_cmds2.obj gettoken.obj eval2.obj
lld @link.i
D:\Data\src>mbas reidai04.mb
? 12.345
Data(No ?) = 23.4567
Data(Yes ?) = ? 34.56
12.345000
23.456700
34.560000
終了します


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

 

 

inserted by FC2 system