- PR -

VisualBasic6.0 forとcaseを用いた数の和について

投稿者投稿内容
ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2008-07-02 16:02
はじめまして。
Visual Basic 6.0の研修をしているものです。

(例題)
  1〜153までの和
154〜333までの和
334〜500までの和

をfor と case を使って同時に解くものです。

(私の解答)-------------------------------------------------------------

Private Sub Command1_Click()
Dim a, b, c, i As Long
a = 0
b = 0
c = 0


For i = 1 To 500
Select Case i

Case Is <= 153
a = a + i
Case Is <= 333 And i >= 154
b = b + i
Case Is <= 500 And i >= 334
c = c + i
End Select

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

End Sub

---------------------------------------------------------------------------

上記のようにすると、正常な処理になりますが、

【正】
   
Case Is <= 333 And i >= 154
b = b + i
Case Is <= 500 And i >= 334
c = c + i


【誤】

Case Is >= 154 And i <= 333
b = b + i
Case Is >= 334 And i <= 500
c = c + i

【誤】と【正】の違いは、case文の判定条件時の最大と最小の場所を前と後ろで
いれかえて演算子も変更しただけです。

【誤】の場合は変数cの値が0になってしまいます。
それは、条件が本来変数cに入る場合でも、その行の処理が実行されずに、
ひとつ上の行の変数bの行で処理が実行されてしまいます。

よって【誤】だと本来、変数cに入る値が変数bに入ってしまい、変数aに
はいる条件以外はすべて変数bに入ってしまいます。


【正】のように少し直すだけで、正常に動くのですが、なぜそのような
 ミスになってしまうのかといった事が初心者の私ではわかりません。


どなたか、このような原因がわかる方よろしくお願い致します。






[ メッセージ編集済み 編集者: ビギナー 編集日時 2008-07-02 16:10 ]

[ メッセージ編集済み 編集者: ビギナー 編集日時 2008-07-02 16:10 ]

[ メッセージ編集済み 編集者: ビギナー 編集日時 2008-07-02 16:37 ]
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-07-02 16:12
これかな?
http://msdn.microsoft.com/ja-jp/library/cy37t14y(VS.80).aspx

引用:

複数の句が定義された Case ステートメントは、ショートサーキット と呼ばれる動作を起こすことがあります。Visual Basic は句を左から右の順に評価し、いずれか 1 つが testexpression と一致した場合、残りの句は評価されません。


ビギナー
常連さん
会議室デビュー日: 2004/10/14
投稿数: 40
投稿日時: 2008-07-02 16:36
こあら様

はじめまして。ビギナーです。

丁寧なご解答大変ありがとうございます。
本当に悩んでいたのでありがとうございました。





unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-02 17:22
主観も入りますが、率直な考えを書きますと、難しい構文を使いすぎだと思います。
私ですら 今まで Case Is という構文の存在を知りませんでした。If 〜 Then 〜 ElseIf 〜 Else 〜 End If を使うほうが見やすいと思います。
もちろん、言語仕様として存在している以上、使うのも一理あるし、使われているプログラムを読むときに知らないと困るということはあるとは思います。しかし、自分で積極的に使うか、となると悩むところです。

引用:

ビギナーさんの書き込み (2008-07-02 16:02) より:
【正】
   
Case Is <= 333 And i >= 154
b = b + i
Case Is <= 500 And i >= 334
c = c + i



を VB は、
コード:
Case Is <= (333 And i >= 154)
        b = b + i
Case Is <= (500 And i >= 334)
        c = c + i


と解釈しているのではないでしょうか?
自信はありませんが。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-07-02 17:30
引用:

ビギナーさんの書き込み (2008-07-02 16:02) より:
Dim a, b, c, i As Long



VB6ではこの書き方だとiだけがLong型で、a〜cはVariant型です。
コード:
Dim a As Long
Dim b As Long
Dim c As Long
Dim i As Long


のように分けて書くことをお勧めします。

引用:

Select Case i

Case Is <= 153
a = a + i
Case Is <= 333 And i >= 154
b = b + i
Case Is <= 500 And i >= 334
c = c + i
End Select



については、以下のように書けます。

コード:
   Select Case i     
     Case 1 To 153
          a = a + i
     Case 154 To 333
          b = b + i
     Case 334 To 500
          c = c + i
    End Select


unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-02 18:26
引用:

unibonさんの書き込み (2008-07-02 17:22) より:
を VB は、
コード:
Case Is <= (333 And i >= 154)
        b = b + i
Case Is <= (500 And i >= 334)
        c = c + i


と解釈しているのではないでしょうか?



その後、検証してみましたが、やはりそうみたいです。
たとえば、
コード:
Private Sub Command1_Click()
    Dim a As Long
    a = -1 ' や 0
    Select Case a
    Case Is = a Or a = a
        Call MsgBox("Case Is")
    Case Else
        Call MsgBox("Case Else")
    End Select
End Sub


を実行してみると a = -1 と a = 0 で結果が異なることから、それが言えます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-07-02 18:57
Case Is を使っておきながら、その後に i の評価が直接入るのは気持ち悪いですね。 せめて n To m を使うべきでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
RUN
常連さん
会議室デビュー日: 2007/10/05
投稿数: 32
お住まい・勤務地: 東京都
投稿日時: 2008-07-02 20:18
うろ覚えなんだけど、Case Is構文の場合って、論理演算子使えなかった気がする。
しかも、構文エラーとならずに、論理演算子以降を無視する挙動だった気がする。
なので

引用:

ビギナーさんの書き込み (2008-07-02 16:02) より:

【正】
   
Case Is <= 333 And i >= 154
b = b + i
Case Is <= 500 And i >= 334
c = c + i


【誤】

Case Is >= 154 And i <= 333
b = b + i
Case Is >= 334 And i <= 500
c = c + i




これは、
【正】
   
Case Is <= 333
b = b + i
Case Is <= 500
c = c + i


【誤】

Case Is >= 154
b = b + i
Case Is >= 334
c = c + i

と言う、解釈がされて、想定と違う挙動になっているんだと思う。

あと、Case制御が想定と違うのは
Select Case i
にて、Caseで評価される物と
And i <= 333
の i は別物であると言う事の認識も重要化と思います。
前者の値は
Select Case (評価式)
なので、評価式結果であり
後者の i は変数 i を差すので、同じに見えて違う物になっています。

_________________
質問する前に再確認
必要な情報はチャント揃っている?
出し忘れはしてないかい?

スキルアップ/キャリアアップ(JOB@IT)