- - PR -
VisualBasic6.0 forとcaseを用いた数の和について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||||||
|
投稿日時: 2008-07-02 16:12
これかな?
http://msdn.microsoft.com/ja-jp/library/cy37t14y(VS.80).aspx
| ||||||||||||||||
|
投稿日時: 2008-07-02 16:36
こあら様
はじめまして。ビギナーです。 丁寧なご解答大変ありがとうございます。 本当に悩んでいたのでありがとうございました。 | ||||||||||||||||
|
投稿日時: 2008-07-02 17:22
主観も入りますが、率直な考えを書きますと、難しい構文を使いすぎだと思います。
私ですら 今まで Case Is という構文の存在を知りませんでした。If 〜 Then 〜 ElseIf 〜 Else 〜 End If を使うほうが見やすいと思います。 もちろん、言語仕様として存在している以上、使うのも一理あるし、使われているプログラムを読むときに知らないと困るということはあるとは思います。しかし、自分で積極的に使うか、となると悩むところです。
を VB は、
と解釈しているのではないでしょうか? 自信はありませんが。 | ||||||||||||||||
|
投稿日時: 2008-07-02 17:30
VB6ではこの書き方だとiだけがLong型で、a〜cはVariant型です。
のように分けて書くことをお勧めします。
については、以下のように書けます。
| ||||||||||||||||
|
投稿日時: 2008-07-02 18:26
その後、検証してみましたが、やはりそうみたいです。 たとえば、
を実行してみると a = -1 と a = 0 で結果が異なることから、それが言えます。 | ||||||||||||||||
|
投稿日時: 2008-07-02 18:57
Case Is を使っておきながら、その後に i の評価が直接入るのは気持ち悪いですね。 せめて n To m を使うべきでしょう。
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2008-07-02 20:18
うろ覚えなんだけど、Case Is構文の場合って、論理演算子使えなかった気がする。
しかも、構文エラーとならずに、論理演算子以降を無視する挙動だった気がする。 なので
これは、 【正】 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 を差すので、同じに見えて違う物になっています。 _________________ 質問する前に再確認 必要な情報はチャント揃っている? 出し忘れはしてないかい? |