/* cpp2 w07w */
/* rpcalcShow.c*/
/* tiny reverse Polish calculator */
/* two extended commands added. */
/* p: for printing stack top */
/* .: for resetting the calculator*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACKSIZE 100
int stack[STACKSIZE];//operand stack
int sp;//stack pointer; next stacking position
/*関数 void readEval(void);*/
/*標準入力から指定の書式の拡張逆ポーランド記法の式を*/
/*読み込んで、その値を計算して表示する。 */
/*拡張逆ポーランド記法とは、通常の逆ポーランド記法の*/
/*式に使用できる演算子に加えて、表示を指示するコマン*/
/*ド pを特殊な演算子として追加している。 */
/*電卓は pに出会うとそれまでの部分的な計算結果を保持*/
/*している stack topの値を表示して popする。 */
/*もう一つの追加コマンドとして、「 .」(ピリオド)が*/
/*ある。電卓はこのコマンドに出会うと、それまでの計算*/
/*をすべて破棄して、calculator(電卓)を初期状態にもど*/
/*す。これは、誤入力をして stackの状態が正常でなくな*/
/*った場合などに利用する。 */
void readEval(void);//逆ポーランド記法の式を1つ読み式に従って演算する。
void push(int num);//stackにデータを積む。stackポインタは1増える。
int pop(void);//stack topの値を関数値とし、stack pointerを1つ下げる。
int isEmpty(void);//stackが空なら 1、さもなくば 0
void add_on_stack(void);
void sub_on_stack(void);
void mul_on_stack(void);
void print_stack_top(void);//stack topを表示; pコマンド
void reset(void);//reset calculator; .コマンド
/****************************************************/
/* Utility functions for maintenance */
void pstack(void);
/****************************************************/
int main(void) {//メイン関数
//initialise stack
reset();//*initialise stack by setting sp=0;
//read and eval expression loop
readEval();
return 0;
}
//関数 void readEval(void);
void readEval(void) {
char tkn[24];//64bit以内の10進整数の文字列が収容可能な桁数
//先行する連続空白類は読み飛ばし、その後最初の空白類
//までの文字列を読み込む; next_token()に相当
while (1) {//repeat for ever; type ctrl-C to quit
//数値はひたすらスタックにプッシュ
//数値以外が来た、つまり演算子が来たら
//演算子の解析と必要なstack上の処理を行う
//次のtokenを読む
}
return;
}
void push(int num) {
/*関数の処理を実装せよ*/
}
int isEmpty(void) {
/*関数の処理を実装せよ*/
}
int pop(void) {
/*関数の処理を実装せよ*/
}
void add_on_stack(void) {
/*関数の処理を実装せよ*/
}
void sub_on_stack(void) {
/*関数の処理を実装せよ*/
}
void mul_on_stack(void) {
/*関数の処理を実装せよ*/
}
void print_stack_top(void) {//stack topを表示してpopする
/*関数の処理を実装せよ*/
return;
}
void reset(void) {
/*関数の処理を実装せよ*/
}
void pstack(void) {//show stack contents for debugging
int i;
printf("stack=[");
for (i=sp-1; i>=0; i--) {
printf("%3d", stack[i]);
if (i != 0) {putchar(',');}
}
printf("]\n");
}
・stackを実装しそれを使用すること。
すなわち、stackに関する基本操作 reset, push, pop, isEmpty の最低4つの関数を実装し、それらを呼び出して使うこと。stackポインタはこれらの関数以外では直接操作してはならない。各関数の仕様はつぎのとおり。
基本的には各自stackについて調査した知識を活用すること。
reset: stackの初期化
push: stackにデータを積む。
pop: stack トップの値を取り出す(関数値とし、stack pointerを1つ下げる)
isEmpty: stackが空の場合 1(真)を返す。さもなくば、0(偽)を返す。
・stack上のその他の演算(加算、減算、乗算)についても同様で、必ず関数を作成してそれらを使用すること。それらの関数以外ではst授業資料記載の逆ポーランド記法の数式を処理する際の stackの状態遷移をスライド12, 13に倣って作成せよ。
対象とする数式は、ex01の①~④、およびex02の④,⑦,⑧を逆ポーランド記法に変換した数式、の全部で7つの数式とする。ただし、pコマンド、. コマンドの入力はしないものとする。(stackの最終状態は空にはならない)
・rpcalcShow.cを参考に作成すると良い。(すべて自力で作成しても勿論かまわない。)ただし、提出の際には、/*debug*/の行はコメントアウトしておくこと。
① 1 * 2 + 3 * 4
② 1 - 2 * 3 + 4
③ 4 * 3 - 2 + 1
④ 4 - 3 - (2 - 1)④ 4 - 3 - (2 - 1)
④ 4 - 3 - (2 - 1)
⑦ 4 - (3 - (2 - 1))
⑧ 4 + (3 - 2 * 1)ソフトウェア電卓の仕様]
ターミナルウィンドウ上で数値の加減乗算が実行できる電卓を設計し実装する.
この電卓の仕様はつぎの通りとする.
①扱う数値は整数(int型)のみ
②演算子は binary operatorである + (加算)と - (減算)および *(乗算)に加え,
③ p(表示)と .(計算のリセット≒新しい計算式の入力)の2コマンド
これらはそれぞれ,単項演算(unary operator),零項演算(nullary operator)である.
. コマンドは実装上では、stackの初期化,すなわちstack pointerを初期値に戻す.
④計算式はreverse Polish notationで入力
④演算式は終わりがないが、一応 . が新しい計算を始めることを示す
電卓として使うために以下の要請を置く.
⑤プログラムを簡単にするために、入力する式の構成要素である、演算子(+, -, *, p, .)や整数値の間には必ず空白を 1個置く
⑥入力できる数値は非負の整数のみ
※単項のマイナス演算子 (unary minus operator : -5 などの「-」)を用いないため
⑦電卓そのものを終えるには、(C-c で)プログラムを強制終了させる。