平方根の計算をするには?

解決


Quno  2002-05-11 03:53:44  No: 104243

はじめまして、Qunoと申します。早速ですが、質問をしたいと思います。

僕は、VisualBasicで、「ヘロンの公式」をする電卓を作っているのですが、計算をするときに、三角形の辺の長さが平方根の数(√2、√33など)であると、計算ができなくなってしまいます。どうすれば、きちんと計算できるでしょうか?  もし、分かる方がいたら、よろしくお願いします。

※「ヘロンの公式」とは、三角形の三辺から、その三角形の面積を求めるものです。三角形の三辺をabcとおくと、式は、次のようになります
X=a+b+c/2
面積= √X(X-a)(X-b)(X-c)   根号は、三番目のカッコまでかかります。


たかみちえ  URL  2002-05-11 06:28:11  No: 104244

うーん、そういうことはちょっと苦手なんですけど、
相手がコンピューターなだけに、計算による問題じゃないと思います。

  まず、ステップ実行で(その行の上にカーソルを合わせてF9)、
そこがどういうエラーを起こしているか調べてみてください、
そのときに変数名の上にカーソルを合わせると、変数の中身が出るので。
あとはウォッチ式として追加してみて、調べてみるとか。
用意したデータ型が小さすぎておかしくなるとか、そういう理由がありそうです。
(小数点が入らないときはLong、小数点が入るときはDoubleがこの場合いいかと)

  ところで、実際に手で計算すると、どういうふうになります?
0で割るようなことになってしまうと、エラーになってしまいます。
(エラー表示、わかりづらいですねぇー、しつこいのになると相当迷うので困り者です^^;)


トラキチ  2002-05-11 09:04:34  No: 104245

とりあえず括弧を忘れずに書きましょう。
x = (a + b + c) / 2
(プログラムではたぶん書けてると思いますが気になるので)

ひとつ知りたいのですが、計算させる三角形の各辺の長さを
どうやって取得してますか?テキスト?コードに直?

まさかテキストに文字で√とか、VBの関数sqr()とか
書くなんて事してないでしょうね?

その辺の事をまず詳しく教えてください。できたらコードも貼り付けて。


Quno  2002-05-11 13:47:37  No: 104246

VBはじめたばかりでして、見落としなど多いと思いますが、見てみてください。最近、四則の計算をする簡単な電卓を作ったばかりで…。

Private Sub Command1_Click()

If Val(Text1.Text) <= 0 Then
 Text4.Text = "そんな三角形はありません"
 ElseIf Val(Text2.Text) <= 0 Then
Text4.Text = "そんな三角形はありません"
 ElseIf Val(Text3.Text) <= 0 Then
 Text4.Text = "そんな三角形はありません"
 ElseIf Text1.Text > Val(Text2.Text) + Val(Text3.Text) Then
 Text4.Text = "そんな三角形はありません"
 ElseIf Text2.Text > Val(Text1.Text) + Val(Text3.Text) Then
 Text4.Text = "そんな三角形はありません"
 ElseIf Text3.Text > Val(Text1.Text) + Val(Text2.Text) Then
 Text4.Text = "そんな三角形はありません"
 
 Else
 A = Val((Val(Text1.Text) + Val(Text2.Text) + Val(Text3.Text)) / 2)
 
 Text4.Text = Str(Sqr(Val(A) * (Val(A) - Val(Text1.Text)) * (Val(A) - Val(Text2.Text)) * (Val(A) - Val(Text3.Text))))
 
 End If
 
 
End Sub

三角形であるための条件がif〜elseの間にあります。


トラキチ  2002-05-11 20:47:32  No: 104247

もしそれで全部でしたらルートの計算はできません。
あなたはどうやってルートがつく数を入力しているんでしょうか?

演算子や関数はコンパイラ(or インタプリタ)を通して初めてその役割を
果たします。それまではただの文字コードです。

その数がルートであるという情報を付加してコードの中で判定
させてみては如何でしょう?

余談ですが、text4は右揃えにするとそんな三角形云々のコメントが
見きれしてしまいます。メッセージボックスにしたらどう?


Quno  2002-05-12 08:24:26  No: 104248

トラキチさま>  
それでは、「その数がルートであるという情報を付加して、コードの中で判定させる」と言うのは、どのようにすればいいのでしょうか?
周りの人で、「変数を〜」と言う人がいるのですが、その人は専門にやっているわけではないので…。

また、ルートがついている数を入力して計算する時、どのように入力していいかも、わかりません。(前に√2とか、sqr(7)とか、試してみましたが…。)


トラキチ  2002-05-13 06:35:43  No: 104249

あまりスマートな方法ではないですが、例えばチェックボックスを
テキストと同じ数だけ用意してそれぞれに対応させ、
チェックがはいっているときはその数をルートとみなすとか・・

Option Explicit

Dim a As Double
Dim b As Double
Dim c As Double
Dim x1 As Double
Dim x2 As Double
Dim answer As Double

Private Sub Command1_Click()

a = Text1.Text
b = Text2.Text
c = Text3.Text

If Check1.Value = 1 Then
  a = Sqr(a)
End If
If Check2.Value = 1 Then
  b = Sqr(b)
End If
If Check3.Value = 1 Then
  c = Sqr(c)
End If

x1 = (a + b + c) / 2
x2 = x1 * (x1 - a) * (x1 - b) * (x1 - c)
answer = Sqr(x2)

Text4.Text = answer

End Sub

> その人は専門にやっているわけではないので…。

私もパソコンを2年程前に買ってもらったばかりのド素人です。


sourmash  URL  2002-05-14 18:17:56  No: 104250

文面からは、やりたいことが良くわからないので、想像で回答します。
テキストボックスにもろ、√33などと入力したいのなら、以下のように
したらいかがでしょうか。
    Dim a(2) as double,x(2) as double
    a(0) = Text1.Text
    a(1) = Text2.Text
    a(2) = Text3.Text
    x1=0
    For i=0 To 2
      s = a(i)
      If Left(s, 1) = "√" Then
        s = Right(s, Len(s) - 1)
        x(i) = Sqr(Val(s))
      Else
        x(i) = Val(s)
      End If
      x1=x1+x(i)
     Next
     x1=x1/2
     x2 = x1 * (x1 - x(0)) * (x1 - x(1)) * (x1 - x(2))
     answer = Sqr(x2)
あまりにもあたりまえの回答ですみません。


とら  2002-05-15 00:13:26  No: 104251

>想像で回答します。

sourmashさん、あなたの「想像」の通りです。
私もその方法が良いと思ったんですが
面倒くさそうだったのでやめといたんですが
プログラムの勉強としてはそっちのが良いので
Qunoさん、できたらsourmashさんのコードを
参考にして下さい。


Quno  2002-05-15 05:18:35  No: 104252

トラキチさん、sourmashさん、たかみちえさん、ありがとうございます。

トラキチさんと、sourmashさんが考えていただいた案の二つを参考にして見たいと思います。

皆さん、質問に答えていただいてありがとうございました。完全に分かった!というわけではありませんが、いちおう、ココで切らせてもらおうと思います。あんまり聞いてばかりだと、自分のためにならないので…。
かんたんな四則の計算機をつくってから、  応用すればできるかなぁ  と甘い考えでした。もう少し、深く勉強します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加