他にも活用できそう、、、、
作りたいWebサイトがあってプログラミングをしてるのですが、他にも活用できそうなので公開します。自分としては作れて達成感はありましたが革新的なものができた!!!!というものではないです。
また、質問の方でこのプログラムの可読性について質問してるので(こっちがメイン)答えていただけるとありがたいです。ソースコードは下のURLです。
https://github.com/ERIN-IARU/Qiita/blob/793b0e80753fdb27173dcb387e45b161eacfdf24/porandmake.py
ソースコードの解説
過去にある程度説明しましたが、ちょっと修正したので改めて説明します。私が作ったプログラムは私たちが普段見ているような計算式をプログラムで処理しやすい逆ポーランド記法という書き方に変換するプログラムです。
入力と出力の例はこんな感じです。
例)
<入力1>
45f+7k
<出力1>
[['45', 'f', '*'], ['7', 'k', '*'], '+']
<入力2>
(lk+jh)hg
<出力2>
[[['l','k','*'],['j','h','*'],'+'],['h','g','*'],'*']
逆ポーランド記法の仕組み
この記法にすると、簡単なアルゴリズムで計算処理ができるようになります。基本的には計算式を先頭から読み込み、次の順に処理をしていきます。
1,要素を一つ読み込む
2,文字か数字であれば値としてスタックに格納する。演算子であればスタックから
値を2つ取り出して演算し、結果を値としてスタックに格納する
この処理を一つの要素ごとに処理していきます。
最終的にストックに値が一つだけになり、それが計算結果になります。
今回公開するプログラムは計算部分を含んでいません。
アルゴリズム説明
このプログラムは再帰関数でできており、左部分、演算子、右部分に分ける処理を繰り返します。コマントに書かれている処理ごとに説明していくので、ソースコードと見比べながら見てもらえるとわかりやすかと思います。
不要な括弧の除去(処理1)
ここでは両端にある括弧を削除しています。先頭からの括弧がある場合のみ処理が進み、途中で途切れてしまうと何もしないまま処理が終わります。先頭の括弧に対応する括弧が末尾にあるときのみ括弧を消します。
例)(a+b) → a+b (h+j)-g → (h+j)-g
演算子の検出 +、ー(処理2)
加減算の検出です。演算子(+かー)を見つけて左部分、演算子、右部分に分ける処理です。括弧内は無視して処理をして、左部分と右部分をそれぞれ再帰関数で変換します。
例)変換前
1,(a+b) 2,(h+j)-g
変換後
左部分 → 1,a 2,(h+j)
演算子 → 1,+ 2,-
右部分 → 1,b 2,g
演算子の検出 *(処理3)
ここは処理2が実行されなかったときのみ通る処理で、乗算の検出です。連続している文字を検出して左部分、演算子、右部分に分けてそれぞれ再帰関数で変換します。演算子は*で固定です。
例)変換前
1,ab 2,(h+j)g
変換後
左部分 → 1,a 2,(h+j)
演算子 → *固定
右部分 → 1,b 2,g