演習4-6 K&R プログラミング言語C

4.3 の電卓プログラムを修正する。

演習4-6

A-Z の各文字を変数とする。R は最近に印字された値を保存する特別な読込専用変数とする。

main 関数に変数を扱う処理を追加する。

        /* 省略 */
        case 'w': /* write variable */
            push(type);
            break;
        case 'r': /* read variable */
            push(type);
            break;
        case '\n':
            recentPrintedValue = pop();
            assign_var(recentPrintedValue, 'R'); /* 最近に印字された値を保存する */
            printf("\t%.8g\n", recentPrintedValue);
            break;
        default:
            if (type >= 'A' && type <= 'Z') {
                op2 = pop();
                if ((int) op2 == 'w') {
                    if (type != 'R') {
                        op1 = pop();
                        assign_var(op1, type);
                        push(op1);
                    } else {
                        fprintf(stderr, "error: variable R is readonly.\n");
                    }
                } else if ((int) op2 == 'r') {
                    push(read_var(type));
                } else {
                    fprintf(stderr, "error: unknown operate for variable %s.\n", s);
                }
            } else {
                printf("error: unknown command %s\n", s);
            }
            break;
        /* 省略 */

変数の保存・読み出し関数を追加する。

#define MAXVAR 26   /* 変数の数 : 英大文字26*/
double var[MAXVAR]; /* 変数を保存する配列 */

/* assign_var : 変数の束縛をする */
void assign_var(double v, int index)
{
    if (index >= 'A' && index <= 'Z') {
        var[index - 'A'] = v;
    } else {
        fprintf(stderr, "Variable character is A to Z.\n");
    }
}

/* read_var : 変数を読み出す */
double read_var(int index)
{
    double v;
    if (index >= 'A' && index <= 'Z') {
        v = var[index - 'A'];
        if (v) {
            return v;
        } else {
            fprintf(stderr, "Variable is not assigned.\n");
        }
    } else {
        fprintf(stderr, "Variable character is A to Z.\n");
    }
    return 0.0;
}

実行結果

$ ./calc
10 w A
        10
r A
        10
r A 7 *
        70
r R
        70
r A r R /
        0.14285714
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»