小学生の皆さん。
算数ドリルめんどくさくないですか?
僕はめんどくさかった記憶があります。
九九覚えるのとか、めんどくさいですよね。
実は、
九九を覚えなくてもJavaScriptを覚えれば
算数ドリルを解くことができます!!
今日は小学生の皆さんに、”けいさんロボット”の作り方を教えます。
注意:
始める前に、注意です。
よく聞いてください。
- まだ、低学年の皆さんは、割り算を習っていないと思います。
- そのため、この”けいさんロボット”は割り算を行うことができません。
手順:
手順を説明するので、よく聞いてください。
わからないことがあったら先生に聞いてください。
- 中間記法から、逆ポーランドに変換する。
- 計算する。
準備:
持ち物を用意してください。
・Node.js 14.16.0 (ほかの言語でもできる)
・Windows10 (かそれ以外)
製作:
パース:
####先生のお話:
まず、手順①の中間記法から逆ポーランド記法へのパースをやりましょう。
中間記法というのは、
1 + 1 //(= 11)
のような、普通の書き方です。
逆ポーランド記法は、
1 1 + //(= 11)
のような書き方で、コンピュータが処理しやすい書き方です。
逆ポーランド記法へのパースはこのように行います。
よていひょう:
- 式をtokenで区切りexpに保存する。(配列)
- stack(配列)を用意する。
- result(配列)を用意する。
- 演算子の優先度を定義する。(関数)
- 11までを繰り返す。
- expの先頭をshiftする。
- 取り出されたものが数値だったらresultにプッシュ。11まで飛ばす。
- 取り出されたものが演算子だったら、
stackの一番後ろの演算子と優先度を比べる。9に行く。 - stackの一番後ろの演算子の優先度が高いか同じなら、
ポップしてresultにプッシュする。10に行く - 演算子をstackにプッシュする。
- expがもう無かったら、繰り返しを止め、12に行く。
- stackに演算子が残ってたら、
後ろからポップしてプッシュするのを演算子が無くなるまでやる。
これをそのままコードに表しましょう。
お手本
var exp = "式".split(" ")//1
var stack = []//2
var result = []//3
var priority = {"+":1,"-":1,"*":2};//4
function loop() {//5
var now = exp.shift();//6
if(!isNaN(+now)) {
result.push(+now);//7
} else {
if(priority[stack.slice(-1)[0]]>= priority[now]) {//8
result.push(stack.pop())//9
}
stack.push(now)//10
}
if(!exp.length)return;//11
loop()//5
}
if(stack.length) {//12
while(stack.length)result.push(stack.pop())//12
}
清書
では、小学生の皆さん。清書してみましょう。
題名は、関数名として書いてください。
コメントアウトはバックスペースで丁寧に消してください。
function PornConv(formula) {
var exp = formula.split(" ")
var stack = []
var result = []
var priority = {"+":1,"-":1,"*":2};
for (now of exp) {
if(priority[now]) {
if(priority[stack[0]]>= priority[now]) {
result.push(stack.shift())
}
stack.unshift(now)
} else {
result.push(+now);
}
}
result.push(...stack)
return result;
}
よくできました。
では計算しましょう。
計算:
先生のお話:
計算は簡単です。
演算子が来たら、その演算子通りに__計算するだけ__です。
例えば、[1, 1, "+"] というパース結果の答えは、
2です。
では計算してください。