--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/09/02

逆ポーランド式の計算[リベンジ bash編]

さっきのリベンジ。基本的な文法があってないせいで、スタックに詰められる値がおかしくなっていた。

しかし改めて見直すとその部分は必要なく、最終的には結構シンプルな形になった。

 1 #!/bin/bash
 2 #逆ポーランド方式の数式を解くプログラム
 3 #2007年  9月  2日 日曜日 00:39:56 JST
 4 
 5 #解く関数
 6 #どうしても引数に * を文字列として渡す方法が
 7 #わからなかったので、掛け算は @ 記号とすることにした。
 8 #誰か教えてくり。
 9 function solve () {
10     stack=""
11     for token in $@; do
12         case $token in
13             "+" ) pop_args; add $arg1 $arg2;;
14             "-" ) pop_args; sub $arg1 $arg2;;
15             "@" ) pop_args; mul $arg1 $arg2;;
16             "/" ) pop_args; div $arg1 $arg2;;
17             *   ) push $token
18         esac
19     done
20     echo ${stack%% *}
21 }
22 
23 #スタックに詰める
24 function push () {
25     stack="$1 $stack"
26 }
27 
28 #スタックから2回ポップし、最初にポップしたものを
29 #計算の2番目の引数へ、後にポップしたものを計算の
30 #1番目の引数へ設定する。
31 function pop_args () {
32     arg2=${stack%% *}
33     stack=${stack#* }
34     arg1=${stack%% *}
35     stack=${stack#* }
36 }
37 
38 function add () {
39     push $(($1+$2))
40 }
41 
42 function sub () {
43     push $(($1-$2))
44 }
45 
46 function mul () {
47     push $(($1*$2))
48 }
49 
50 function div() {
51     push $(($1/$2))
52 }
53 
54 function test () {
55     echo test:solve 3 2 +
56     solve 3 2 +
57     echo test:solve 3 2 4 + +
58     solve 3 2 4 + +
59     echo test:solve 3 2 + 4 5 + -
60     solve 3 2 + 4 5 + -
61     echo test:solve 3 2 + 5 '*'
62     solve 3 2 + 5 @
63 }
64 
65 test

文字列演算子がかなり面白い。けど if 文とかのスペースにやかましいのがちょっと鬱陶しい。まぁ全てを文字列的に扱う以上しょうがないんだろうけど。

  • if 文で文字列比較するときは = の両端にスペースを入れる。
スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。