電卓を作ろう。
x1) キーボードから「整数 演算子 整数」を読み込んで、計算の結果を表示するプログラムを作りなさい。
exp? 12 + 3 ans= 15
x2) キーボードから「整数 演算子 整数 演算子 整数 … =」と入力すると、左から順番に計算した結果を表示するプログラムを作りなさい。普通の電卓と同じで、演算子の優先順位(足し算より掛け算が先)は考慮しなくてよい。整数と演算子を交互にscanfしながら計算してていって、「=」を読み込んだところで答えを表示すればよい。
exp? 12 + 3 * 2 - 3 = ans= 27 exp? 12 + 3 * 2 - 3 = ans= 27
x3) 前問の電卓を浮動小数点数(double型)を用いるようにして、いろいろな関数を付け加えてみよう。電卓と同じように数値を入力してから関数名を入力することになる。たとえば、√の計算をするsqrtなら…
exp? 36 sqrt ans= 6 exp? 45 + 19 sqrt ant= 8
x4) 逆ポーランド記法による電卓を作ってみよう。
逆ポーランド記法では、前から数値を読み込んでいって、演算子や関数が現れたら計算をする。たとえば、12 + 3 は、
12 3 +
と書く。日本語の「12と3を足す」という感じである。さらに、
12 3 + 2 *
は、「12と3を足したものに、2を掛ける」となり、(12 + 3) * 2 という意味である。
これに対して、普通の数式の 12 + 3 * 2 = 12 + (3 * 2) を実現したい場合には、
12 3 2 * +
と書けばよい(「12と、3と2を掛けたものを、足す」)。
実際のプログラムの作成にはスタックを用いる。数値を読み込んだらスタックに積んでいき、演算子を読み込んだところで計算をして、結果をスタックに積む。そして、最後に結果を表示する。以下に「12 3 + 2 *」の計算過程を示す。
入力 | 処理 | スタック |
最初はスタックは空 | ||
12 | 入力された数値をスタックに積む | 12 |
3 | 入力された数値をスタックに積む | 12 3 |
+ | スタックから2つ数値を取り出す | |
取り出した数値で使って、計算結果をスタックに積む | 15 | |
2 | 入力された数値をスタックに積む | 15 2 |
* | スタックから2つ数値を取り出す | |
取り出した数値を使って、計算結果をスタックに積む | 30 | |
最後にスタックから結果を取り出して表示 |
x5) x3)の問題でカッコが使えるようにしてみよう。カッコ「()」があればその内側の計算を優先して行う。関数の「再帰」を用いるとよい。
x6) さらに、演算子の優先順位(+より*が優先など)もきちんと考慮するようにしなさい。