文字列操作を使っての全角入力で計算をするには?


c言語1号  2005-11-01 10:49:23  No: 59412  IP: 192.*.*.*

文字列操作を使っての全角での入力計算ですけど、例えば1たす1はの計算式はできるのですが、1たす1たす1はの計算式ができないんです。どうすればいいですか?

編集 削除
επιστημη  2005-11-01 11:39:16  No: 59413  IP: 192.*.*.*

「どうすればいいか」の前に「なぜできないか」を考えてはいかがか?

編集 削除
c言語1号  2005-11-01 14:53:30  No: 59414  IP: 192.*.*.*

考えれば考えるほど混乱してきて、演算の作業をループさせて計算すればいいのかと思ってるんですが

編集 削除
επιστημη  2005-11-01 15:24:04  No: 59415  IP: 192.*.*.*

きちんと実装するのはかなり厄介です。
入力: 1たす2かける3たす4 に正しい答 21 を出力するには
演算の優先順位を考慮しなくてはなりません。
字句解析と構文解析が必要になります。
「演算の作業をループさせて計算すればいい」
なんて生易しいもんじゃありません。

編集 削除
PATIO  2005-11-01 15:48:26  No: 59416  IP: 192.*.*.*

多分、インタプリタの実装と同じくらいのボリュームがあるんじゃないですかねぇ。
επιστημηさんが言われている通り、演算の優先順位というのがあります
から計算結果をスタックしておいて後で計算とか出来ないといけないはずです。
構文解釈に始まって内部での各データの保持方法等々考えることは山ほどあると思います。

編集 削除
επιστημη  2005-11-01 15:51:29  No: 59417  IP: 192.*.*.*

> 入力: 1たす2かける3たす4 に正しい答 21 を出力するには

おっと… これは和が積に優先する'へんてこ計算'の場合。
通常なら 1 + 2x3 + 4 だから 11 となります。

編集 削除
PATIO  2005-11-01 15:54:13  No: 59418  IP: 192.*.*.*

蛇足。
入力: 1たす2かける3たす4 は、11になりませんか。
「かける」の方が優先順位が高いので。

21になるためには、
入力:(1たす2)かける(3たす4)
になると思うんですけれど。

編集 削除
PATIO  2005-11-01 15:54:47  No: 59419  IP: 192.*.*.*

にあみすでしたー
失礼。

編集 削除
gari  2005-11-02 11:54:08  No: 59420  IP: 192.*.*.*

ぱっと思い浮かんだものだけど、こんなやり方はどうでしょう。

例として
1たすかっこ1たす2かける3かっことじるかける2たす6
だったとしましょう。(かっことかっこ閉じるをどう表現するのかわからないけど)

まずこれを
1+(1+2*3)*2+6
という文字列に置き換える。

演算の優先順位は()、乗除、和差なのでまず
()が含まれる部分を取り出す。つまり。
1+2*3
をとりだす。
この中では乗算が優先なので
2*3を計算し6を得ると
1+2*3は1+6と表現できますね。

さらに、1+6を計算して7を得ます。
すると最初の式を
1+7*2+6
と置き換えられますね。
同様に演算していって、演算子(+-*/)がなくなった時点で
求める結果が得られると思います。

ただ、かっこのなかにかっことか入れ子になると恐ろしいことになりますが、基本的にはこの考えでいけそうな気がします…

って、実際にプログラム化するのはかなり難しいでしょうね…

編集 削除
gari  2005-11-02 12:01:38  No: 59421  IP: 192.*.*.*

もうすこしいうなら、
最初の2*3を計算した時点で、
1+(1+6)*2+6
に置き換えられますね。

んで、かっこがあるんでさらにという感じで、

1 かっこを潰す
2 乗除を潰す
3 和差を計算する

というやり方でどうでしょうか。
しかし、小数点を考えたりするとなるとかなり恐ろしいですね…

編集 削除
επιστημη  2005-11-02 13:31:14  No: 59422  IP: 192.*.*.*

> かっこのなかにかっことか入れ子になると恐ろしいことになりますが、

途中結果をスタックに積み、かっこの中身の評価が終わればスタックから降ろせばよさげ。

> 基本的にはこの考えでいけそうな気がします…

御意。

編集 削除
c言語1号  2005-11-02 14:09:31  No: 59423  IP: 192.*.*.*

2つの演算子を使っての計算はなんとかできるようになりました。
まだ演算の優先順位とカッコはまだですが…
後正しく入力されないときの入力エラーの条件と0割計算も対応しないといけないですが…
完成までまだまだですが、1つは解決しました。
ありがとうございました。

編集 削除