忙しい現代人の腰&肩のお悩み対策!

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の上に持って来る事ができたらインプットボックスで入力した数値に関してもエラーの可能性のある物として計算することができるのですが、どんなにコネクリ回しても構文的にエラー状態にしかならないので、是非どなたかのお知恵を拝借できたらと思います。
宜しくお願い致します。

A 回答 (3件)

2次方程式の判別式が負の場合に虚数根2つになるが、正になるまで


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

ロジックは既に出ている回答で良いと思うのですが、少し補足。



Do While r <= 0

で判定していますが、0 のときって虚根扱いにするんですか? r < 0 では?

それから、入力チェックとかはしなくていいんでしょうか?数字以外のものを入れられたら例外が発生しますよ。また、a が 0 の場合もですね。まあ学習用のサンプルアプリケーションとかなら、無理にチェック入れる必要もないかも知れませんが。

あと、せっかく .NET の VB を使っているのですから、型を厳密に扱うコーディングスタイルをお勧めします。絶対にそうしなければいけない決まりもありませんが、暗黙的な型変換は余計なバグの原因になりやすいですし、パフォーマンスにも影響しますから、避けるべきと思います。

ソースの先頭に Option Strict On と書いてみてください。暗黙の型変換が無効になり、このソースはコンパイルエラーになると思います。そのエラーをご自分で解決してみると、良い経験になると思います。
    • good
    • 0

判別をルート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)

といった具合にして見ましょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAの天才来てください

二次関数の解を求めるプログラムを作成するのが目的です。

平方根はsqr関数を使うのが条件です。

ax^2+bx +cが基本式になり

(A,3)がaに(B,3)がbに(C,3)がcになるようにして考えます。

でた2解を(A,6)(B,6)に表示します。

もし虚数解なら(A,6)に「解なし」と表示するようにして、重解の場合は(A,6)にだけ表示されるように

プログラミングを作成する。という内容です。

何時間考えてもできないので助けてください。

Aベストアンサー

No.2続き
goto分使うの止めよう

Sub WK()
Dim A As Variant
Dim B As Variant
Dim C As Variant
Dim D As Variant
Dim Sh1 As Worksheet
Set Sh1 = Worksheets("Sheet1")

A = Sh1.Range("A3").Value
B = Sh1.Range("B3").Value
C = Sh1.Range("C3").Value
D = B * B - 4 * A * C
If D < 0 Then
Sh1.Range("A6").Value = "解なし"
ElseIf D = 0 Then
Sh1.Range("A6").Value = (-1 * B + Sqr(D)) / (2 * A)
Else
Sh1.Range("A6").Value = (-1 * B - Sqr(D)) / (2 * A)
Sh1.Range("B6").Value = (-1 * B + Sqr(D)) / (2 * A)
End If

Application.StatusBar = False
End Sub

No.2続き
goto分使うの止めよう

Sub WK()
Dim A As Variant
Dim B As Variant
Dim C As Variant
Dim D As Variant
Dim Sh1 As Worksheet
Set Sh1 = Worksheets("Sheet1")

A = Sh1.Range("A3").Value
B = Sh1.Range("B3").Value
C = Sh1.Range("C3").Value
D = B * B - 4 * A * C
If D < 0 Then
Sh1.Range("A6").Value = "解なし"
ElseIf D = 0 Then
Sh1.Range("A6").Value = (-1 * B + Sqr(D)) / (2 * A)
Else
Sh1.Range("A6").Value = (-1 * B - Sqr(D)) / (2 * A)
Sh1.Range("B6").Value = (-1 * B + Sqr(D)) ...続きを読む


人気Q&Aランキング