演習4-6 K&R プログラミング言語C
2010年01月12日
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規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726