UWSCのループについて教えて下さい

UWSCのループについて教えて下さい。ループの方法や、それぞれの制御文の違いが知りたいです。
ループ、いわゆる繰り返し処理ですが、UWSCにはいくつかの実現方法があります。
参考になる記事を下に記します。

【プログラミング不要】
プログラムを書くことなく、起動時の設定で、処理回数を選ぶ方法
繰り返し処理を行いたいけど制御文が難しい

【プログラミング必要】
FOR-NEXT・・・指定回数の処理を実行する
制御文:FOR-NEXTの解説

WHILE-WEND・・・指定した条件を満たす間、処理を実行する
制御文:WHILE-WENDの解説

REPEAT-UNTIL・・・指定した条件になったら、処理を終了する
制御文:REPEAT-UNTILの解説

繰り返し処理を途中で終了、継続するCONTINUE、BREAK
CONTINUE
BREAK

上記3つの繰り返し処理制御文の使い分けについて
UWSCでFORとかREPEATとか繰り返し処理は何を使うのがベストですか?

その他参考になる、掲示板の投稿
FOR~NEXTでカウント中のカウンター(a)は増やすことは出来ないのでしょうか?

タグ

2013年5月24日 | コメントは受け付けていません。 |

カテゴリー:Q&A

PRINT

PRINT

表示用のウィンドウに情報を出力します
PRINT 表示文

・表示文・・・表示する情報

結果出力やログに活用

変数に格納されている情報を確認する際に、PRINTは便利です。
MSGBOX関数だと処理が止まりますし、
ファイルに書き込みするのは複数のファイル関数を組合さなければならないので煩雑です。
PRINTで簡潔に出力できる点は重宝できます。
また、ログファイルに保存する設定も可能なので、大変役立ちます。

PRINT (100+101)

変数の値の遷移を見てみましょう

実際にPRINTを使い
FOR-NEXTのループの中でカウンタが、
どのように変化していくか、
次のスクリプトで確認してみましょう。

この投稿の続きを読む »

タグ

2012年8月8日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

CALL

CALL

他のUWSCファイル(スクリプト)を呼び出す
CALL UWSCファイル ([Param1, Param2 ......])

・UWSCファイル・・・呼び出すスクリプトを指定、絶対パス・相対パスどちらでも可
・Pram1….・・・引数を付けて呼び出すことも可能。呼び出し先ではPARAM_STR[]変数に格納し、使用可能。

他のUWSCファイルを呼び出す

called.uwsというファイルを用意し、中には
PRINT “呼び出されました”
とだけ記述しておきます。
それを下記のスクリプトで実行してみましょう。
なお、フォルダの配置は下記のようになります。 フォルダ
└call.uws (呼び出し元、今から実行するファイル)
└called.uws(呼び出されるファイル)

CALL called.uws

引数を渡して起動してみる

CALLでスクリプトを呼び出す際に
パラメーター(引数)を渡すことができます。
called.uwsを少し変更し
PRINT “呼び出されました。” + PARAM_STR[0] +”:”+ PARAM_STR[1] +”:”+ PARAM_STR[2]
として、次のスクリプトを実行してみましょう。

この投稿の続きを読む »

タグ

2012年8月6日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

SELECT-SELEND

SELECT-SELEND

値を複数の条件で比較して、それぞれに条件一致する場合の処理を実行させる
SELECT 値
CASE 条件1
処理1
CASE 条件2
処理2
CASE 条件3, 3′
処理3
・・・・・
[DEFAULT]
[DEFAULTの処理]
SELEND

・値・・・比較される値や式を指定
・条件・・・比較する値や式を指定、カンマで複数指定も可能
・処理・・・値が条件に一致した場合に行う処理を記述
・DEFAULT・・・いずれの条件にも合致しなかった場合の処理を記述

IFB-ELSEIFよりも簡単に記述する

例えば、ある変数に1~5の値が入っているとします。
続いての処理で、1の場合はある処理を、2の場合はこういう処理を
3の場合は、4の場合は、5の場合は、それ以外の場合は・・・。
という処理を実現したい場合、まず浮かぶのはIFBとELSEIFの組み合わせだと思います。
しかし、SELECT-SELENDを使うともっとスマートに以下のように記述することができます。

//1~5の値をランダムに代入
VALUE = RANDOM(5) + 1

SELECT VALUE
 CASE 1
    PRINT "1が出たぞ"
 CASE 2
    PRINT "2出た"
 CASE 3
    PRINT "3出たぞ"
 CASE 4
    PRINT "4だぞ"
 CASE 5
    PRINT "5みたいだ"
 DEFAULT
    PRINT "違う数だな"
SELEND

SLCTBOXとの組み合わせが吉

選択ダイアログボックスを出すSLCTBOX関数があります。
この関数の戻り値は、選択したボタン(SLCT_1~)です。
これをSELECT-SELENDと組み合わせれば、
以下のようなスクリプトが完成します。
セレクトボックスを表示し、押下したボタンによって
表示メッセージを変えるスクリプトです。

この投稿の続きを読む »

タグ

2012年8月5日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

EXITEXIT

EXITEXIT

スクリプトを終了する
EXITEXIT [終了コード]

スクリプトを終了させる

BREAKcontinueEXITなど、処理をとめたり、最初に戻したり、終わらせたりする制御文を説明しました。
このEXITEXITはスクリプト自体を終了させてしまいます。

//たとえループ中でも終了
FOR A = 0 TO 10
 PRINT A
 IF A = 2 THEN EXITEXIT
NEXT
//スクリプト終了のため、ここまでは到達しない
MSGBOX("HELLO")

タグ

2012年7月31日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

EXIT

EXIT

関数を終了する
EXIT

自作関数を途中で終了する場合

ループを途中で終了するにはBREAKを使いますが
自作関数を途中で終了する場合はEXITを使います。

//自作関数HELLOはあいさつ文を返す
PRINT HELLO("CN")
//但し、存在しないパラメーターを渡した場合は終了する
FUNCTION HELLO(LANG="EN")
 HELLO = "UNKNOWN"
 SELECT LANG
   CASE "EN"
     HELLO = "Hello"
   CASE "JP"
     HELLO = "こんにちは"
   CASE "FR"
     HELLO = "Bonjour"
   DEFAULT
    EXIT
 SELEND
 //もしEXITがなければ最初に設定されたUNKNOWNが出る。けどもEXITで終了しているため出ない。
 RESULT = HELLO
FEND

再帰的な処理を表現してみよう

例えばある自作関数を宣言し、
その中で、その自作関数を再度呼び出します。
特に条件が無ければ、無限ループのように
ずっと再帰的に処理がされます。
ここで、終了条件とEXITを組み合わせて使い、
自作関数を完成させましょう。
スクリプトは以下のようになります。

この投稿の続きを読む »

タグ

2012年7月30日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

CONTINUE

CONTINUE

REPEAT-UNTIL,WHILE-WEND,FOR-NEXTループの先頭に戻る
CONTINUE [ループ数]

・ループ数・・・多重ループの場合に指定数だけのループの先頭に戻る。省略時は1

ループ中、一部の処理を飛ばしたいときは・・・

BREAKの場合REPEAT-UNTIL,WHILE-WEND,FOR-NEXTのループを途中で抜けてしまいます。
そうではなく、一部の処理だけ飛ばし
またループの先頭に戻りたい場合はどうすればよいのでしょうか。
そんなときにCONTINUEを使います。
簡単な例を見てみましょう。

//通常"A=変数"は10まで出力されますが・・・
FOR A = 1 TO 10
 //6の場合だけ、PRINTによる出力はしたくない、だけどループは続けたい
 IF A = 6 THEN CONTINUE
 PRINT "A=" + A
NEXT

多重ループで、指定ループをCONTINUEさせたい場合は

CONTINUEの書き方で
CONTINUE [ループ数]と言う表現を記載しています。
例えば多重ループというループ文の中にループ文が入れ子にされた状態の場合
CONTINUEだけしか記載していない場合は、
記載してあるループ文で先頭に戻るだけです。
全ループの先頭に戻りたい、2つ上のループに戻りたい場合は
‘CONTINUE ループ数’という表現にしましょう。
2つの多重ループでサンプルをお見せします。

この投稿の続きを読む »

タグ

2012年7月29日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

BREAK

BREAK

REPEAT-UNTIL,WHILE-WEND,FOR-NEXTのループを中断する
BREAK [ループ数]

・ループ数・・・多重ループの場合に指定数だけのループを抜ける。省略時は1

ループを途中で中断しよう

REPEAT-UNTIL,WHILE-WEND,FOR-NEXTは、条件を満たすまでは処理が繰り返されます。
しかし間にBREAKを入れることで、ループ終了条件前でもループを抜けることができるようになります。
簡単な例を見てみましょう。

//通常"A=変数"は100まで出力されますが・・・
FOR A = 1 TO 100
 PRINT "A=" + A
 //50の場合はBREAKの一文により、途中でループは終了
 IF A = 50 THEN BREAK
NEXT

多重ループを全部抜けるには

BREAKの書き方で
BREAK [ループ数]と言う表現を記載しています。
例えば多重ループというループ文の中にループ文が入れ子にされた状態の場合
BREAKだけしか記載していない場合は、
記載してあるループ文が中断されるだけです。
全部のループを抜けたい、あるいは複数のループを抜けたい場合は
‘BREAK ループ数’という表現にしましょう。
3つの多重ループでサンプルをお見せします。

この投稿の続きを読む »

タグ

2012年7月26日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

REPEAT-UNTIL

REPEAT-UNTIL

REPEAT-UNTILによるループ処理を行う
REPEAT
処理
UNTIL 条件

・条件・・・判定結果がFalseの場合ループが続き、Trueで終了

最低1回は実施されるループ

REPEAT-UNTILは条件がFalseの結果を返す限り処理を続けるループ文です。
なのでUNTIL FALSEとした場合は、BREAKを入れない限り、無限ループとなります。
FOR-NEXTループと異なり、カウンタは無いため、
自分で用意する必要があります。

//カウンタは自分で用意
CNT = 1
REPEAT
 PRINT "CNT:" + CNT
 CNT = CNT + 1
UNTIL CNT > 100

WHILE同様、状態が変わるまで処理を続ける場合にはREPEAT-UNTIL、但し・・・

REPEAT-UNTILは先に処理が記述され
その後でUNTILの所で、条件判定が行われています。 大事なポイントは、REPEAT-UNTILはループ終了条件だったとしても
最低1回は処理が実行されると言うことです。
WHILE-WENDは条件がTrueの限りループ
REPEAT-UNTILは条件がFalseの限りループ(Trueになったら終了)
という点もご留意下さい。

マウスが移動したら処理を止める

マウスの起動時の位置を記憶しておき、
吹き出し表示という処理を行い続けます。
もし、マウスの位置が移動したら、
処理を終了するというスクリプトを書いてみましょう。
以下のようになります。

この投稿の続きを読む »

タグ

2012年7月19日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

WHILE-WEND

WHILE-WEND

WHILE-WENDによるループ処理を行う
WHILE 条件
処理
WEND

・条件・・・判定結果がTrueの場合ループが続き、Falseで終了

基本のループ

WHILE-WENDは条件がTrueの結果を返す限り処理を続けるループ文です。
なのでWHILE TRUEとした場合は、BREAKを入れない限り、無限ループとなります。
FOR-NEXTループと異なり、カウンタは無いため、
自分で用意する必要があります。

//カウンタは自分で用意
CNT = 1
WHILE CNT < 100
 PRINT "CNT:" + CNT
 CNT = CNT + 1
WEND

状態が変わるまで処理を続ける場合にはWHILE-WEND

他にもFOR-NEXTやREPEAT-UNTILといったループがあるため
最初はその使い分けが分からないかもしれません。
FOR-NEXTは回数や個数が分かる場合にループに使うケースが多いのに比べ
WHILE-WENDやREPEAT-UNTILは
状態の変化を判別するループに使われることが多いです。
なお、WHILE-WENDは条件判定が処理の前にくるため
判定結果によっては、1度も処理が実施されない場合もあります。

スクリプト起動から5秒経過するまで処理を続ける

スクリプトを起動してから5秒を判定するといっても、いつ起動されるかわからないので
5秒後の時間を指定することもできません。
ここでWHILE-WENDの出番です。
スクリプト起動時の時間を取得し、5秒以上経過するまでを条件に
スクリプトを書いてみましょう。以下のようになります。

この投稿の続きを読む »

タグ

2012年7月18日 | コメントは受け付けていません。 |

カテゴリー:構文・制御文

このページの先頭へ