0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

小学校低学年のための算数ドリル回避プログラム

Posted at

小学生の皆さん。
算数ドリルめんどくさくないですか?
僕はめんどくさかった記憶があります。
九九覚えるのとか、めんどくさいですよね。


実は、
九九を覚えなくてもJavaScriptを覚えれば
算数ドリルを解くことができます!!
今日は小学生の皆さんに、”けいさんロボット”の作り方を教えます。

注意:

始める前に、注意です。
よく聞いてください。

  • まだ、低学年の皆さんは、割り算を習っていないと思います。
    • そのため、この”けいさんロボット”は割り算を行うことができません。

手順:

手順を説明するので、よく聞いてください。
わからないことがあったら先生に聞いてください。

  1. 中間記法から、逆ポーランドに変換する。
  2. 計算する。

準備:

持ち物を用意してください。

・Node.js 14.16.0 (ほかの言語でもできる)
・Windows10 (かそれ以外)

製作:

パース:

####先生のお話:
まず、手順①の中間記法から逆ポーランド記法へのパースをやりましょう。
中間記法というのは、

1 + 1 //(= 11)

のような、普通の書き方です。
逆ポーランド記法は、

1 1 + //(= 11)

のような書き方で、コンピュータが処理しやすい書き方です。
逆ポーランド記法へのパースはこのように行います。

よていひょう:

  1. 式をtokenで区切りexpに保存する。(配列)
  2. stack(配列)を用意する。
  3. result(配列)を用意する。
  4. 演算子の優先度を定義する。(関数)
  5. 11までを繰り返す。
  6. expの先頭をshiftする。
  7. 取り出されたものが数値だったらresultにプッシュ。11まで飛ばす。
  8. 取り出されたものが演算子だったら、
    stackの一番後ろの演算子と優先度を比べる。9に行く。
  9. stackの一番後ろの演算子の優先度が高いか同じなら、
    ポップしてresultにプッシュする。10に行く
  10. 演算子をstackにプッシュする。
  11. expがもう無かったら、繰り返しを止め、12に行く。
  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;
}

よくできました。:upside_down:
では計算しましょう。

計算:

先生のお話:

計算は簡単です。
演算子が来たら、その演算子通りに__計算するだけ__です。

例えば、[1, 1, "+"] というパース結果の答えは、
2です。
では計算してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?