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件)
- 最新から表示
- 回答順に表示
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)
といった具合にして見ましょう
No.2
- 回答日時:
ロジックは既に出ている回答で良いと思うのですが、少し補足。
Do While r <= 0
で判定していますが、0 のときって虚根扱いにするんですか? r < 0 では?
それから、入力チェックとかはしなくていいんでしょうか?数字以外のものを入れられたら例外が発生しますよ。また、a が 0 の場合もですね。まあ学習用のサンプルアプリケーションとかなら、無理にチェック入れる必要もないかも知れませんが。
あと、せっかく .NET の VB を使っているのですから、型を厳密に扱うコーディングスタイルをお勧めします。絶対にそうしなければいけない決まりもありませんが、暗黙的な型変換は余計なバグの原因になりやすいですし、パフォーマンスにも影響しますから、避けるべきと思います。
ソースの先頭に Option Strict On と書いてみてください。暗黙の型変換が無効になり、このソースはコンパイルエラーになると思います。そのエラーをご自分で解決してみると、良い経験になると思います。
No.3
- 回答日時:
2次方程式の判別式が負の場合に虚数根2つになるが、正になるまで
どの計数を変えて計算を繰り返すのか。
そんなことも書かないで、質問にならない。
計数を変えて、実数根になることを見つけるなんて、役立つケースが有るのかも良くわからない。
虚数解は実数解の時のB^2-4ACを4AC-B2で平方根をとりiをくっつける。というか、くっつけないものを虚数部とする、ではなかったですか。
http://econom01.cc.sophia.ac.jp/pil/L1/l1-3.htm
参照。
>実根が計算で求められるまで繰り返し・・
3計数の入力が終わったら、判別式の正負0を判別し、負なら再度入力させればよいが、問題のための問題で、むやみに入力させられるほうがあほらしい。質問どおりやるとしても、エラー探知まで行く前の問題で済ませられるのでは?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) VBA 重複チェック後に値をワークシートに転記する方法を教えてください。 1 2023/03/19 12:43
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Excel(エクセル) このコードに追記事項の仕方を教えて下さい。 以下のコード内容に出てくる。セルH3が空白の場合、エラー 4 2023/08/03 00:22
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
エクセル関数を教えてください
-
String""から型'Double'への変...
-
ApplicationとWorksheetFunctio...
-
エクセルVBAでApplication.Sum...
-
VBでSQL文のUPDATE構文を使った...
-
マクロの「SaveAs」でエラーが...
-
Filter関数を用いた結果、何も...
-
実行時エラー 438 の解決策をお...
-
VBA データ(特定値)のある最...
-
数式は残し値をクリアするマク...
-
エクセルVBAで#N/Aのようなエ...
-
マクロで"#N/A"のエラー行を削...
-
ACCESS VBAのSplit()関数の使用...
-
ACCESS2007 VBA 「INSERT INTO...
-
文字列内で括弧を使うには
-
【VBA】ワークブックを開く時に...
-
C言語のエラーについて。
-
オブジェクト型の変数にフォー...
-
Excel vbaについての質問
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
VBAでfunctionを利用しようとし...
-
お助けください!VBAのファイル...
-
文字列内で括弧を使うには
-
実行時エラー 438 の解決策をお...
-
マクロで"#N/A"のエラー行を削...
-
On ErrorでエラーNoが0
-
エクセルVBA 「On Error GoTo...
-
VBA データ(特定値)のある最...
-
実行時エラー'-2147467259(8000...
-
【VBA】ワークブックを開く時に...
-
VBでSQL文のUPDATE構文を使った...
-
ACCESSで値を代入できないとは?
-
マクロの「SaveAs」でエラーが...
-
Excel vbaについての質問
-
インポート時のエラー「データ...
-
Filter関数を用いた結果、何も...
-
「実行時エラー '3167' レコー...
-
バッチファイルで、あるスクリ...
おすすめ情報