C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

テキストボックス内で演算 /krh (18/11/05(Mon) 13:39) #89184
Re[1]: テキストボックス内で演算 /魔界の仮面弁士 (18/11/05(Mon) 14:36) #89187
Re[1]: テキストボックス内で演算 /774RR (18/11/05(Mon) 14:10) #89186
│└ Re[2]: テキストボックス内で演算 /PANG2 (18/11/05(Mon) 14:50) #89188
│  └ Re[3]: テキストボックス内で演算 /はまぐり (18/11/05(Mon) 15:42) #89189
Re[1]: テキストボックス内で演算 /shu (18/11/08(Thu) 17:07) #89220


親記事 / ▼[ 89187 ] ▼[ 89186 ] ▼[ 89220 ]
■89184 / 親階層)  テキストボックス内で演算
□投稿者/ krh (1回)-(2018/11/05(Mon) 13:39:59)

分類:[C#] 

文章がわかりづらくなってしまいましたが
電卓を作っています。
テキストボックス内で、数字のボタンを押してから 演算(+,-,*,/)のボタンを押してまた数字のボタンを押して
=で結果を出すという普通?の電卓なんですが
テキストボックスは数式と答えの二つです。

現状テキストボックス内での計算が出来ず、数式の方を間にコンボボックスを挟んで(数式のテキストボックス2つの状態)計算してますが、
見栄え的にも電卓らしさがないので
テキストボックス内での計算の仕方を教えてください。
[ □ Tree ] 返信 編集キー/

▲[ 89184 ] / 返信無し
■89187 / 1階層)  Re[1]: テキストボックス内で演算
□投稿者/ 魔界の仮面弁士 (1922回)-(2018/11/05(Mon) 14:36:18)
2018/11/05(Mon) 14:37:38 編集(投稿者)

No89184 (krh さん) に返信
> テキストボックスは数式と答えの二つです。
> テキストボックス内での計算の仕方を教えてください。

テキストボックスは、文字列の表示と入力を行うだけの代物です。

ComboBox であれ TextBox であれ、基本的には同じこと。
演算機能は自分自身で作りこむしか無いでしょう。


> 数式のテキストボックス2つの状態

1 つでも 2 つでも、3 つでも、そこは作り手の設計次第でしょう。

市販の電卓だって、たとえば C / CE / CA キーの動作だったり
定数計算の操作などでも、シャープ系とカシオ系では微妙に異なりますよね。
https://ja.wikipedia.org/wiki/%E9%9B%BB%E5%8D%93


10÷3 の計算結果を何桁まで表示するのか、とか、
その結果に ×3 したときに、10 に戻すべきか否か、とか、
0÷0 の計算結果をどう表現するのか(エラー、未定義、不定、NaN など)、などなど。



何にせよ、どういう操作が行われた時に、どういう振る舞いをしてほしいのか、
一つ一つ仕様として細かく事前設計するのが肝要です。
C# のコードを書くのは、設計が終わってからの話。



とまぁ、アプリケーションの振る舞いの話はさておき、
計算処理の実装については、PowerShell を利用すると簡単かと思います。

%PROGRAMFILES%\Reference Assemblies\Microsoft\WindowsPowerShell\
の下の、v1.0 とか v3.0 といったバージョン別フォルダにある
System.Management.Automation.dll
を参照設定したうえで:


public static dynamic Calculate(string expression)
{
 using (var invoker = new System.Management.Automation.RunspaceInvoke())
 {
  return invoker.Invoke(expression, new object[] { }).First().ImmediateBaseObject;
 }
}

とか。でもって使うときはこんな感じ。

textBox1.Text = "(12+34)/3";
var o = Calculate(textBox1.Text);
label1.Text = o.ToString(); // "15.3333333333333" になる
[ 親 89184 / □ Tree ] 返信 編集キー/

▲[ 89184 ] / ▼[ 89188 ]
■89186 / 1階層)  Re[1]: テキストボックス内で演算
□投稿者/ 774RR (644回)-(2018/11/05(Mon) 14:10:06)
状況が微妙にわからないけど Windows 10 のストアアプリ電卓のようなものを想定するとして。
どこまで真面目に数式的に計算するかで話は違ってくるだろう。

1 + 2 * 3 = 7 なのか
1 + 2 * 3 = 9 なのか、とか。

とりあえず「逆ポーランド記法」というヒントを出しておこう。
逆ポーランドに変換したらあとはスタックから取り出すだけ。


[ 親 89184 / □ Tree ] 返信 編集キー/

▲[ 89186 ] / ▼[ 89189 ]
■89188 / 2階層)  Re[2]: テキストボックス内で演算
□投稿者/ PANG2 (238回)-(2018/11/05(Mon) 14:50:16)
文字列の計算式の計算結果を取得する
https://dobon.net/vb/dotnet/programing/eval.html

DataTable.Computeメソッドが簡単
[ 親 89184 / □ Tree ] 返信 編集キー/

▲[ 89188 ] / 返信無し
■89189 / 3階層)  Re[3]: テキストボックス内で演算
□投稿者/ はまぐり (66回)-(2018/11/05(Mon) 15:42:11)
No89184 (krh さん) に返信

いろんなやり方が示されていますね

計算結果を得られればよいのか
計算の方法を理解したいのか
主目的をどこに置くかによって回答は違ってきそうですね

私は原始的な計算方法を示そうと思います

テキストボックスの文字列を取得して
字句解析を行ってこれは、被演算子ですね、これは演算子ですねって選別して
構文解析を行って演算子が"+"なので被演算子 + 被演算子の計算をしましょうみたいな感じです

文字列に含まれる文字は数字か記号かですので
字句解析は正規表現を使うでも一文字ずつ読むでもいいですね

構文解析は操車場アルゴリズムというやり方があります
操車場アルゴリズムは、1 + 2のような一般に利用される中置記法を
1 2 +こういう逆ポーランド記法に変換する方法です

逆ポーランド記法に変換してしまえばスタックを使ってさくっと計算できます
774RRさんも示されていますね

素朴に計算したいんだけど何をやればよいかわからないんだぜという
ことでしたらまずは字句解析に取り組んでみるのがいんじゃないでしょうか
数値と演算子をスペースで区切って入力すれば、文字列をスペースで分割して字句解析完了ですよ

[ 親 89184 / □ Tree ] 返信 編集キー/

▲[ 89184 ] / 返信無し
■89220 / 1階層)  Re[1]: テキストボックス内で演算
□投稿者/ shu (1152回)-(2018/11/08(Thu) 17:07:27)
No89184 (krh さん) に返信
> 文章がわかりづらくなってしまいましたが
> 電卓を作っています。
> テキストボックス内で、数字のボタンを押してから 演算(+,-,*,/)のボタンを押してまた数字のボタンを押して
> =で結果を出すという普通?の電卓なんですが

作りたいのが普通の電卓の動きをさせたいのなら
https://www.e-bridge.jp/eb/tcontents/yasasikunai-p/chapExC05.html
のサイトにどのような動きをするのか載ってますので
参考にするとよいと思います。
回答がついているような動きでよければそれを参考にするとよいと思いますが
リンク先のような動きをさせたいのならTextboxは表示用(Labelでもよい)にして
KeyDown,KeyUp,KeyPressなどを使用して押されたキーに対し
動作をさせる作りにするとよいと思います。
[ 親 89184 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -