C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: Do 〜 Loop while の構文について


(過去ログ 136 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■79881 / inTopicNo.1)  Do 〜 Loop while の構文について
  
□投稿者/ やんまー (8回)-(2016/05/26(Thu) 11:05:21)

分類:[.NET 全般] 

恐れいります。

処理をループさせる時に、
条件に合致した場合には、ある処理を実行させてから、ループさせたいことがあります。
(合致しない時は、その処理を実行したくない)

そこで、こんなテストをしてみました。
a の初期値を0や1に変えることによって思ったような処理になることがわかりました。

Dim a As Integer = 0
Do
  MsgBox(a)
Loop While a=0 AndAlso a = cntup(a)

Function cntup( hen As Integer) as Boolean
  hen +=1
  Return hen
End Function


何が気になっているかといいますと
a = cntup(a)
という式(代入)ですが、これは必ずTrueとなる、という認識であっていますでしょうか?

そうなることは確認したのですが、なんとなくスマートではないような気がしています。

---
条件に合致した場合には、ある処理を実行させてからループさせたい
---

を実現するスマートな書き方は他にありますでしょうか?
引用返信 編集キー/
■79882 / inTopicNo.2)  Re[1]: Do 〜 Loop while の構文について
□投稿者/ 魔界の仮面弁士 (725回)-(2016/05/26(Thu) 11:34:46)
No79881 (やんまー さん) に返信
> 条件に合致した場合には、ある処理を実行させてから、ループさせたいことがあります。
> (合致しない時は、その処理を実行したくない)

事前チェックする「条件」と、
ループの「継続条件(or 終了条件)」は別物ですか?

要件が曖昧で良く分からなかったのですが、下記の中に処理イメージの近いモノはありますか?



If 事前条件 Then
 ある処理()
End If
Do
 ループ処理()
Loop While 継続条件

-------------
If 事前条件 Then
 ある処理()
 Do
  ループ処理()
 Loop While 継続条件
End If

-------------
Do
 If 事前条件 Then
  ある処理()
 End If
 ループ処理()
Loop While 継続条件

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


> Dim a As Integer = 0
> a = cntup(a)
> Function cntup( hen As Integer) as Boolean
>   hen +=1
>   Return hen
> End Function

名前付けをもう少し工夫するべきというツッコミはさておき、
「暗黙の型変換」は避けるべきかと思いますよ。



> a の初期値を0や1に変えることによって思ったような処理になることがわかりました。
思ったような処理、とのことですが、その『ある処理』はどこに書かれるのでしょうか?

cntup メソッド内に記述されるということなのでしょうか。
それとも、MsgBox(a) がそれにあたるのでしょうか。

どちらにしても、
 「ある処理を実行させてから、ループさせたい」
という要件を満たしていないような気がするのですが。
たとえ、as Boolean が As Integer の誤記だったとしても。
引用返信 編集キー/
■79893 / inTopicNo.3)  Re[2]: Do 〜 Loop while の構文について
□投稿者/ やんまー (9回)-(2016/05/26(Thu) 19:52:47)
魔界の仮面弁士 様

すみません 汗汗 確かに戻り値はBoolean ではなく Integer の間違いでした。
いろいろ試している時にコピペしたり直したりしているうちに間違えて貼り付けたようです。すみません。


> 思ったような処理、とのことですが、その『ある処理』はどこに書かれるのでしょうか?

ある処理とは Function cntup です。

「ある処理(cntup)を実行させてから、ループさせたい」
です。

1回めは
a=0 が TRUE
a = cntup(a) がTRUE
となり、Doに戻ります。

この  a = cntup(a) という式がTrueになる、というのがちょっとわからなかったです。
代入が成功した、という意味でのTrueでしょうか?



イメージ的にあうのは3つ目です。
ただ、1回めは処理を実行したくないので、if文は「2回め移行のループだったら・・・」という感じになってスマートではないような気がしています。

とすれば、例に書いたように、繰り返し条件にandでつなげてしまえばどうか?と思ったところ、意外にも思ったように動いてしまったということでした。


今ふと思い出したのですが、C言語の初歩の間違いとして比較演算子==を=と書いてしまうというのがありますよね?

比較演算子を間違えて=で書いてしまうと、永遠にTrueとなってしまい無限ループになる、というものでしたね。

とするとやはり、代入の式はTrue、ということになりそうですね。
引用返信 編集キー/
■79900 / inTopicNo.4)  Re[3]: Do 〜 Loop while の構文について
□投稿者/ shu (873回)-(2016/05/27(Fri) 08:04:26)
No79893 (やんまー さん) に返信

記述された正しいソースは以下でよろしいでしょうか?
だとするとa=Cntup(a)は比較演算にしかならずaは0,cntupの結果は1なので1回だけメッセージを
表示して終わると思います。条件判定が正しくないと思うのですがどのような判定をしたいのでしょうか?

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim a As Integer = 0
        Do
            MsgBox(a)
        Loop While a = 0 AndAlso a = cntup(a)

    End Sub

    Function cntup(hen As Integer) As Integer
        hen += 1
        Return hen
    End Function



> ある処理を実行させてから、ループさせたいことがあります。
ある処理がcntupなら以下のように記述した方が分かりやすいです。


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim a As Integer = 0
    Dim LoopFlg  = True

        Do
            MsgBox(a)
            'ある処理
            Dim cntresult = cntup(a)
            'ループ条件判定
            if a = 0 AndAlso a = cntresult then
                LoopFlg = True
            else
                LoopFlg =False
            end if
        Loop While LoopFlg

    End Sub

    Function cntup(hen As Integer) As Integer
        hen += 1
        Return hen
    End Function

引用返信 編集キー/
■79902 / inTopicNo.5)  Re[3]: Do 〜 Loop while の構文について
□投稿者/ 魔界の仮面弁士 (730回)-(2016/05/27(Fri) 11:27:03)
2016/05/27(Fri) 12:18:48 編集(投稿者)

No79893 (やんまー さん) に返信
> a=0 が TRUE
変数 a や cntup() の『意図』が曖昧すぎて回答しにくいです。
利用状況を想像できるような、具体的な変数名や処理内容を提示できますか?


> この  a = cntup(a) という式がTrueになる、というのがちょっとわからなかったです。
> 代入が成功した、という意味でのTrueでしょうか?

『Loop While a=0 AndAlso a = cntup(a)』
の = は、代入演算子ではなく比較演算子ですよ念のため。

言い換えれば、上記は
『Loop While a.Equals(0) AndAlso a.Equals(cntup(a))』
に相当する処理であるということです。


> Function cntup(hen As Integer) As Integer
>   hen += 1
>   Return hen
> End Function
上記は 仮引数が ByVal なので、
 Function cntup(hen As Integer) As Integer
  Return hen + 1
 End Function
と同義ですね。実行させたい処理は本当にこれだけなのでしょうか?


> 「ある処理(cntup)を実行させてから、ループさせたい」
> です。

それはつまり、
 「ループの実行前に cntup を実行してから、ループを処理させたい」
ということですよね。


だとしたら、
>> Loop While a=0 AndAlso a = cntup(a)
これでは要件を満たせていないはずです。

cntup を実行してからループを処理するのではなく、
ループの後で cntup が実行されることになりますから。


そもそも、その継続条件だと、
 Loop While a = 0 AndAlso cntup(0) = 0
と同じ意味にしかならないので、結局は

>> Dim a As Integer = 0
>> Do
>>   MsgBox(a)
>> Loop While a=0 AndAlso a = cntup(a)

というのは、

 Dim a As Integer = 0
 MsgBox(a)
 If a = 0 Then
  Call cntup(0) ' a = cntup(0) ではない
 End If

の意味しかありません。


もしも cntup の役目が、
 「Dim a As Integer = 0 の値を +1 させること」
だけの目的のためだけに用意されたものであるのなら、一応、整数増値用に
System.Threading.Interlocked.Increment メソッドというものがあります。
(+2 させたいなら、Interlocked.Add メソッド)

本来のやりたい事とは乖離してしまうでしょうけれども。


【a の初期値が 0 の場合 → ループ 2回 → ループ後の a は 1】

 'VB
 Loop While a = 0 AndAlso Interlocked.Increment(a) = a
 //C#
 // } while (a == 0 && ++a == a);
 // } while (a == 0 && a == a++);


【a の初期値が 0 の場合 → ループ 1回 → ループ後の a は 1】

 'VB
 Loop While a = 0 AndAlso a = Interlocked.Increment(a)
 //C#
 // } while (a == 0 && a++ == a);
 // } while (a == 0 && a == ++a);



> ただ、1回めは処理を実行したくないので、
今までの質問の中に、その前提条件は無かったような。(^_^;)

他にも隠している要件があったりはしないでしょうか。

繰り返しになりますが、本来やりたい処理がどのようなものなのか、
利用状況を想像できるような、“具体的”な情報を提示頂けると助かります。
引用返信 編集キー/
■79905 / inTopicNo.6)  Re[4]: Do 〜 Loop while の構文について
□投稿者/ やんまー (10回)-(2016/05/27(Fri) 15:23:46)
shu 様

恐れいります。

件のリストで間違いないです。戻り値はIntegerですね スミマセン。


サンプルありがとうございました。

しかし、
「合致しない時は、その処理を実行したくない」
ので、
これですと
1かいめにも cntup が実行されてしまうので駄目です。

遅くなりまして申し訳ありません。

引用返信 編集キー/
■79906 / inTopicNo.7)  Re[4]: Do 〜 Loop while の構文について
□投稿者/ やんまー (11回)-(2016/05/27(Fri) 15:35:02)
魔界の仮面弁士 様


ご回答有り難うございます。

本当にやりたいことは別に隠しているわけではないです・・・

一応書きますが、本当にやりたいこととは、
WEBアクセス

エラーだった場合はプロキシをセット

WEBアクセス(2回め)



ということになります。
しかし、このことは本筋とは外れますので、書きませんでした。単にカウントアップでも良いと思いました。



> 『Loop While a=0 AndAlso a = cntup(a)』
> の = は、代入演算子ではなく比較演算子ですよ念のため。

すいません。わたしの理解がないのかもしれませんが、aは2回めのループでちゃんとカウントアップされ、ループは終了します。なので、代入だと思ったのですが・・・。
VBは代入も比較も両方=なので、この辺り紛らわしいですね・・・。



> > ただ、1回めは処理を実行したくないので、
> 今までの質問の中に、その前提条件は無かったような。(^_^;)


質問文の(合致しない時は、その処理を実行したくない)がそうです。

わたしのやりたいこと、でいうと、
1回めは直接WEBアクセスで良いのですが、エラーが出た場合はプロキシを設定する、という2回めのループになります。
1回めでエラーが出なければ、プロキシの設定は必要ない、ということです。

引用返信 編集キー/
■79907 / inTopicNo.8)  Re[5]: Do 〜 Loop while の構文について
□投稿者/ とっちゃん (360回)-(2016/05/27(Fri) 16:06:38)
No79906 (やんまー さん) に返信
> 一応書きますが、本当にやりたいこととは、
> WEBアクセス
> ↓
> エラーだった場合はプロキシをセット
> ↓
> WEBアクセス(2回め)
> ・
> ・
> 
> ということになります。
> しかし、このことは本筋とは外れますので、書きませんでした。単にカウントアップでも良いと思いました。
> 

<<省略>>

> わたしのやりたいこと、でいうと、
> 1回めは直接WEBアクセスで良いのですが、エラーが出た場合はプロキシを設定する、という2回めのループになります。
> 1回めでエラーが出なければ、プロキシの設定は必要ない、ということです。
> 
これは、ループして処理しなくてもいい問題ではありませんか?

If Webアクセス() = 失敗 
  プロキシセット()
  Webアクセス()
End If
とすれば、いいように思います。
これを、2回目以降何度もプロキシを再設定する。Webアクセスを行う
とするのなら、

While Webアクセス() == 失敗
  プロキシセット()
End While
とすればいいと思います。

引用返信 編集キー/
■79908 / inTopicNo.9)  Re[6]: Do 〜 Loop while の構文について
□投稿者/ とっちゃん (361回)-(2016/05/27(Fri) 16:07:35)
No79907 (とっちゃん さん) に返信
> While Webアクセス() == 失敗
> プロキシセット()
> End While
> とすればいいと思います。
>
あ、== は、C#の文法だ。
引用返信 編集キー/
■79909 / inTopicNo.10)  Re[5]: Do 〜 Loop while の構文について
□投稿者/ shu (874回)-(2016/05/27(Fri) 16:45:23)
No79906 (やんまー さん) に返信

> ご回答有り難うございます。
> 
> 本当にやりたいことは別に隠しているわけではないです・・・
> 
> 一応書きますが、本当にやりたいこととは、
> WEBアクセス
> ↓
> エラーだった場合はプロキシをセット
> ↓
> WEBアクセス(2回め)
> ・
> ・
> 

これなら
For cnt = 1 to 2
    Webアクセス
    if IsError Then
        プロキシセット
    else
    Exit For
    end if
Next
でよいのではないでしょうか?

引用返信 編集キー/
■79911 / inTopicNo.11)  Re[6]: Do 〜 Loop while の構文について
□投稿者/ やんまー (12回)-(2016/05/27(Fri) 17:48:25)
とっちゃん 様


ありがとうございます。

WEBアクセスの処理がWhileの中に書いてあったので、思いつきませんでした。

そもそも、中の処理をメソッドにしてしまえばよかったですね。

ありがとうございました。
引用返信 編集キー/
■79912 / inTopicNo.12)  Re[6]: Do 〜 Loop while の構文について
□投稿者/ やんまー (13回)-(2016/05/27(Fri) 17:51:26)
shu 様

> For cnt = 1 to 2
> Webアクセス
> if IsError Then
> プロキシセット
> else
>     Exit For
> end if
> Next
> でよいのではないでしょうか?

そうですね。中でif文で処理するのが普通かと思いましたが、なにかスマートな書き方がないかな・・・と思って聞いてみました。


ありがとうございました。
引用返信 編集キー/
■79915 / inTopicNo.13)  Re[5]: Do 〜 Loop while の構文について
□投稿者/ 魔界の仮面弁士 (731回)-(2016/05/27(Fri) 18:16:14)
No79906 (やんまー さん) に返信
> なので、代入だと思ったのですが・・・。

そこに誤解があったようですね。

VB の代入ステートメントは、値を返さないため、
If や While や Until といった、条件判定処理には使えません。


>> a の初期値を0や1に変えることによって思ったような処理になることがわかりました。
> aは2回めのループでちゃんとカウントアップされ、ループは終了します。

改めて確認しますが、検証に用いたコードは下記であっていますか?


'Dim a As Integer = 1
Dim a As Integer = 0
Do
  MsgBox(a)
Loop While a = 0 AndAlso a = cntup(a)

Function cntup(hen As Integer) As Integer
  hen += 1
  Return hen
End Function


だとすれば、動作としては

  【a の初期値が 0 の場合】
  MsgBox("0") → cntup 呼び出し → a は 0 のまま

  【a の初期値が 1 の場合】
  MsgBox("1") → a は 1 のまま ※ cntup は呼ばれない

にしかならないはずです。


>> 思ったような処理になることがわかりました。

望んでいる動作は

   MsgBox("0") → cntup 呼び出し → MsgBox("1") → a は 1 になっている

ではないのですか?
引用返信 編集キー/
■79918 / inTopicNo.14)  Re[6]: Do 〜 Loop while の構文について
□投稿者/ やんまー (15回)-(2016/05/27(Fri) 20:49:45)
魔界の仮面弁士 さん

すみませんでした。

仰るとおり、代入にはなっていませんでした。

思ったような動作にはなっていませんでした 汗
引用返信 編集キー/
■80208 / inTopicNo.15)  Re[7]: Do 〜 Loop while の構文について
□投稿者/ やんまー (18回)-(2016/06/23(Thu) 00:50:56)
No79918 (やんまー さん) に返信
> 魔界の仮面弁士 さん
>
> すみませんでした。
>
> 仰るとおり、代入にはなっていませんでした。
>
> 思ったような動作にはなっていませんでした 汗
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -