はじめまして、Qunoと申します。早速ですが、質問をしたいと思います。
僕は、VisualBasicで、「ヘロンの公式」をする電卓を作っているのですが、計算をするときに、三角形の辺の長さが平方根の数(√2、√33など)であると、計算ができなくなってしまいます。どうすれば、きちんと計算できるでしょうか? もし、分かる方がいたら、よろしくお願いします。
※「ヘロンの公式」とは、三角形の三辺から、その三角形の面積を求めるものです。三角形の三辺をabcとおくと、式は、次のようになります
X=a+b+c/2
面積= √X(X-a)(X-b)(X-c) 根号は、三番目のカッコまでかかります。
うーん、そういうことはちょっと苦手なんですけど、
相手がコンピューターなだけに、計算による問題じゃないと思います。
まず、ステップ実行で(その行の上にカーソルを合わせてF9)、
そこがどういうエラーを起こしているか調べてみてください、
そのときに変数名の上にカーソルを合わせると、変数の中身が出るので。
あとはウォッチ式として追加してみて、調べてみるとか。
用意したデータ型が小さすぎておかしくなるとか、そういう理由がありそうです。
(小数点が入らないときはLong、小数点が入るときはDoubleがこの場合いいかと)
ところで、実際に手で計算すると、どういうふうになります?
0で割るようなことになってしまうと、エラーになってしまいます。
(エラー表示、わかりづらいですねぇー、しつこいのになると相当迷うので困り者です^^;)
とりあえず括弧を忘れずに書きましょう。
x = (a + b + c) / 2
(プログラムではたぶん書けてると思いますが気になるので)
ひとつ知りたいのですが、計算させる三角形の各辺の長さを
どうやって取得してますか?テキスト?コードに直?
まさかテキストに文字で√とか、VBの関数sqr()とか
書くなんて事してないでしょうね?
その辺の事をまず詳しく教えてください。できたらコードも貼り付けて。
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の間にあります。
もしそれで全部でしたらルートの計算はできません。
あなたはどうやってルートがつく数を入力しているんでしょうか?
演算子や関数はコンパイラ(or インタプリタ)を通して初めてその役割を
果たします。それまではただの文字コードです。
その数がルートであるという情報を付加してコードの中で判定
させてみては如何でしょう?
余談ですが、text4は右揃えにするとそんな三角形云々のコメントが
見きれしてしまいます。メッセージボックスにしたらどう?
トラキチさま>
それでは、「その数がルートであるという情報を付加して、コードの中で判定させる」と言うのは、どのようにすればいいのでしょうか?
周りの人で、「変数を〜」と言う人がいるのですが、その人は専門にやっているわけではないので…。
また、ルートがついている数を入力して計算する時、どのように入力していいかも、わかりません。(前に√2とか、sqr(7)とか、試してみましたが…。)
あまりスマートな方法ではないですが、例えばチェックボックスを
テキストと同じ数だけ用意してそれぞれに対応させ、
チェックがはいっているときはその数をルートとみなすとか・・
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年程前に買ってもらったばかりのド素人です。
文面からは、やりたいことが良くわからないので、想像で回答します。
テキストボックスにもろ、√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)
あまりにもあたりまえの回答ですみません。
>想像で回答します。
sourmashさん、あなたの「想像」の通りです。
私もその方法が良いと思ったんですが
面倒くさそうだったのでやめといたんですが
プログラムの勉強としてはそっちのが良いので
Qunoさん、できたらsourmashさんのコードを
参考にして下さい。
トラキチさん、sourmashさん、たかみちえさん、ありがとうございます。
トラキチさんと、sourmashさんが考えていただいた案の二つを参考にして見たいと思います。
皆さん、質問に答えていただいてありがとうございました。完全に分かった!というわけではありませんが、いちおう、ココで切らせてもらおうと思います。あんまり聞いてばかりだと、自分のためにならないので…。
かんたんな四則の計算機をつくってから、 応用すればできるかなぁ と甘い考えでした。もう少し、深く勉強します。
ツイート | ![]() |