• 締切済み

VBにおいて2次方程式で虚根が出た場合に、実根が計算で求められるまで繰り返したいのですが・・・

VBにおいて2次方程式で虚根が出た場合に、実根が計算で求められるまで繰り返し入力をすることができるようにしたいのですが・・・ どのようにすればいいのかわからず、途方に暮れている状況です。 コードは現状ではこのように書いています。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim a, b, c, r As Integer a = TextBox1.Text b = TextBox2.Text c = TextBox3.Text Try r = (b ^ 2 - (4 * a * c)) ^ (1 / 2) Catch Do While r <= 0 Label8.Text = "虚根です。" a = Val(InputBox("aの値を再入力", "エラー")) b = Val(InputBox("bの値を再入力", "エラー")) c = Val(InputBox("cの値を再入力", "エラー")) r = Math.Sqrt(b ^ 2 - (4 * a * c)) Loop Finally Label8.Text = "" Label5.Text = (-1 * b + r) / (2 * a) Label6.Text = (-1 * b - r) / (2 * a) End Try End Sub DO~LOOPのDOをTRYの上に持って来る事ができたらインプットボックスで入力した数値に関してもエラーの可能性のある物として計算することができるのですが、どんなにコネクリ回しても構文的にエラー状態にしかならないので、是非どなたかのお知恵を拝借できたらと思います。 宜しくお願い致します。

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

2次方程式の判別式が負の場合に虚数根2つになるが、正になるまで どの計数を変えて計算を繰り返すのか。 そんなことも書かないで、質問にならない。 計数を変えて、実数根になることを見つけるなんて、役立つケースが有るのかも良くわからない。 虚数解は実数解の時のB^2-4ACを4AC-B2で平方根をとりiをくっつける。というか、くっつけないものを虚数部とする、ではなかったですか。 http://econom01.cc.sophia.ac.jp/pil/L1/l1-3.htm 参照。 >実根が計算で求められるまで繰り返し・・ 3計数の入力が終わったら、判別式の正負0を判別し、負なら再度入力させればよいが、問題のための問題で、むやみに入力させられるほうがあほらしい。質問どおりやるとしても、エラー探知まで行く前の問題で済ませられるのでは?

  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.2

ロジックは既に出ている回答で良いと思うのですが、少し補足。 Do While r <= 0 で判定していますが、0 のときって虚根扱いにするんですか? r < 0 では? それから、入力チェックとかはしなくていいんでしょうか?数字以外のものを入れられたら例外が発生しますよ。また、a が 0 の場合もですね。まあ学習用のサンプルアプリケーションとかなら、無理にチェック入れる必要もないかも知れませんが。 あと、せっかく .NET の VB を使っているのですから、型を厳密に扱うコーディングスタイルをお勧めします。絶対にそうしなければいけない決まりもありませんが、暗黙的な型変換は余計なバグの原因になりやすいですし、パフォーマンスにも影響しますから、避けるべきと思います。 ソースの先頭に Option Strict On と書いてみてください。暗黙の型変換が無効になり、このソースはコンパイルエラーになると思います。そのエラーをご自分で解決してみると、良い経験になると思います。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

判別をルートBの2乗-4ACとするより B2乗-4ACが負になるかどうかで判別しましょう Try/Catchで捕らえられるのは例外が発生した場合ですが r = (b ^ 2 - (4 * a * c)) ^ (1 / 2) の数式だけでは例外が発生しません r = (b ^ 2 - (4 * a * c)) Do While r <= 0   Label8.Text = "虚根です。"   a = Val(InputBox("aの値を再入力", "エラー"))   b = Val(InputBox("bの値を再入力", "エラー"))   c = Val(InputBox("cの値を再入力", "エラー"))   r = b ^ 2 - (4 * a * c) Loop Label8.Text = "" Label5.Text = (-1 * b + Math.Sqrt(r)) / (2 * a) Label6.Text = (-1 * b - Math.Sqrt(r)) / (2 * a) といった具合にして見ましょう

関連するQ&A