一般にプログラムの処理は逐次・選択・反復の3つに分けられます。今までの内容は逐次処理で、上から下にそのまま実行するものを逐次と呼びます。残りの選択・反復は処理の流れを変えることができ、状況に応じて柔軟に対応できます。
演算の結果などの条件によって、処理を分けたい場合があります。この条件によってどちらかの処理を選択することを選択と呼びます。ActionScriptで選択処理を行うには、 if を使います。下の例は、if文の基本的な書き方です。ifの括弧の中には、評価式を書きます。評価式の結果が真であった場合には、if のすぐ下の括弧内の処理を実行し、else内の処理は行わず、else以降の行へ進みます。偽であった場合は、else の行へ移動し、elseの括弧内の処理します。
if( 評価式 )
{
成り立つ(真)
}
else
{
成り立たない(偽)
}
評価式には、下の6種類を使います。a,bはオペランドで、<,>,<=,>=,==,!=は比較演算子と呼びます。
| a < b : | aがbよりも小さければ、真 |
| a > b : | aがbよりも大きければ、真 |
| a <= b : | aがbと同じまたはbより小さければ、真 |
| a >= b : | aがbと同じまたはbより大きければ、真 |
| a == b : | aがbと同じであれば、真 |
| a != b : | aがbと同じでなければ、真 |
a,bが数値の場合はわかいやすいですが、文字列の場合は若干異なり、文字コードでの比較になります。等価と不等価の比較では同じ文字列かどうかの比較なのでわかりやすいですが、大小の比較を使用する場合に注意して下さい。
真のときのみに処理を行いたい場合には、elseを省略することができます。Math.random()とは、0 〜0.99 の乱数を返す関数です。
| var a = Math.random() * 6; trace( a ); if( a > 3 ) { trace( "aは3より大きい" ); } |
また、判定後の処理で、1行しか実行しない場合には、括弧を省略することができます。
| var a = Math.random() * 6; trace( a ); if( a > 3 ) trace( "aは3より大きい" ); |
&&, || を使えば、評価式を組み合わせることができます。&&は双方の条件が成り立つとき、||はどちらかの条件が成り立ったときに真となります。評価式を組み合わせる場合には評価式を 括弧 "()" でくくった方がわかりやすくなります。
| a && b : | a と bが共に真であれば、真 |
| a || b : | a と b のどちらかが真であれば、真 |
| ( a && b ) || ( c ) : | a と b ともに真、または c が真であれば、真 |
上のようにいくらでも評価式を細かく設定できます。下の例は a が 2よりも大きく、5より小さければ、真となります。
|
var a = Math.random() * 6; if( ( a > 2 ) && ( a < 5 )
) |
下の例のように評価式で同じ値に対して、いくつかの値と等価したい場合があります。if文を重ねて呼び出していますが、このような場合にswitchを使うと見やすくできます。
|
// ifで書いた場合 if( a == 0 ) |
switch文は指定の値がいずれかの値と等価になるか調べる場合に便利な文です。switch文のかっこ内に条件となる値を設定し、switch文内のcase文で一致する値を列挙し、その下に条件と一致した場合の処理を記述します。case文で設定したいずれの値とも一致しない場合はdefaultの内容を実行します。例で使用しているbreak文は途中の処理を中断してswitch文の処理から離脱します。このbreak文がないと、そのまま下の条件の内容を実行するので注意して下さい。default文は省略することができます。
|
// switchに置き換えた場合 switch( a ) |
変数の使用例で下のようなものがありましたが、同じtrace処理繰り返して行ってます。このような場合に反復処理を使用すると記述する内容を短く、わかりやすくすることができます。反復処理とは処理の繰り返しで、条件を設定しその条件が成り立つ間処理を繰り返します。反復処理には、for文またはwhile文を使用します。
| trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); trace( "Hello"); |
まずはfor文を使って書き直します。下のようになります。かなりすっきりとした形になりました。
| var i; for( i = 0; i < 10; i++ ) { trace( "Hello"); } |
--実行結果
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
上の例では、i < 10 である限り、trace() を繰り返します。繰り返すたびに i++ で i の値を 1 ずつ増やして、10回繰り返せば終了します。i++というのは、 i = i + 1 を省略した書き方で、他に i-- があります。これは、i = i - 1 を省略したものです。
for文の書き方は下のようになります。実行する順番は、初期設定 -> 評価式 -> 繰り返し処理 -> 評価処理 - > 評価式 -> 繰り返し処理-> 評価処理 -> 評価式 -> 繰り返し処理 -> ... と繰り返し、評価式が真である限り繰り返すようになっていて、評価式が偽になった時点でfor文の処理は終了します。
for( 初期設定; 評価式 ; 評価処理 )
{
繰り返し処理
}
初期設定 : 繰り返す際に使用する変数の初期化を行います。上の例では、 i = 0 の部分です。
評価式 : 繰り返し処理を行うための条件を記述します。この評価式が真である限り繰り返します。
評価処理 : 繰り返し処理を終了するために、評価式を偽にするための処理を記述します。上の例では、i++ で徐々に i が 10になるようにして、評価式が偽へ近づくようになっています。
繰り返し処理 : 繰り返して行いたい処理の内容を記述します。上野例では、trace( "Hello" ) の部分です。
下の例は、1 〜 10 までを足した結果を表示する ActionScriptです。answer += i; とは、answer = answer + i; を省略した書き方で他に、 -=, *=, /= 等があります。
| var i; var answer = 0; for( i = 1; i <= 10; i++ ) { answer += i; } trace( answer ); |
--実行結果
55
これを一つ一つの式に分解すると下のようになります。for文がどのように繰り返されるかイメージしにくい場合はこのようにして、分解して書いてみるのもいいかもしれません。
| var i; var answer = 0; i = 1; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; answer += i; i++; trace( answer ); |
while文はforと比べると設定する部分は評価式のみで、繰り返し処理の中に評価式を終了するための処理を入れる必要があります。評価式が真である限り、while文の中の繰り返し処理を実行します。
while( 評価式 )
{
繰り返し処理
}
for文の例をwhile文で書き直すことができます。
例
|
var i = 0; i = 1; |
同じことができるなら、どちらかに統一すればいいという感じなのですが、使い分けるポイントがあります。for文は、順序付けできる場合に使用し、while文は繰り返す回数がわからない、順序付けができない場合に使用します。下の例は、1が出るまでの回数を調べるスクリプトです。for文でも書くことはできますが、繰り返す回数は決まっていないので、while文の方が向いています。Math.floor関数は、小数点以下を切り捨てる関数です。
|
var i = 1; while( a != 1 ) trace( "---" ); |
--実行結果
5
1
---
2
while文は繰り返し処理の前に評価式の判定を行っていましたが、繰り返し処理の後に評価式の判定を行うdo〜while文があります。このとき、while文を前判定の繰り返し、do〜while文を後判定の繰り返しと呼びます。
do〜while文の構文は以下の通りです。評価式の位置がかわり、最初にdo文を記述し、かっこ内に繰り返したい処理を記述します。
do
{
繰り返し処理
}while( 評価式 );
今までの例を書き直すと、下のようになります。
|
var i = 0;
trace( answer ); i = 1; do trace( "---" ); |
for( in )はオブジェクトのプロパティや配列内の要素に対して処理を繰り返したい場合に使用する文です。すべての要素を列挙するまで繰り返し処理を行い、変数には要素名の文字列を設定されるので、この変数を使ってオブジェクトから要素の値を操作することができます。要素の値を取得する場合は、[]に取得した様相名を設定して取得します。
for( 変数 in オブジェクト )
{
繰り返し処理
}
例
|
var i; |
--実行結果
17
13
11
7
5
3
2
1
---
60
例2
|
var i; for( i in person ) |
--実行結果
name : Tomohiro
age : 25
country : Japan
繰り返し処理をしている中で、途中で繰り返す処理を終了したい場合があります。止めるにはswitch文でも利用した break を使用します。break を使うと繰り返し処理の括弧内の処理を抜け出して、次の行に処理が移動します。
下の例は、文字列内で、"i"が見つかった位置を調べるスクリプトです。for は文字列の最初から最後までを調べる繰り返しを行い、if で "i" を探して見つかれば、break で forの処理を終了するようにしています。
|
var i; for( i = 0; i < str.length; i++ ) trace( i ); |
--実行結果
1
continue文は繰り返し処理を途中で飛ばして、評価式に戻って、終了判定を行いたい場合に使用します。評価式がtrueであれば再び繰り返し処理を行います。for文の場合は、評価式の前に評価処理を行います。
下の例は、空白文字列を読み飛ばすスクリプトです。文字列内に空白文字列が見つかった場合には、continue文で result += c; を処理せずに評価処理に行くようになっています。
|
var str = "This is a pen."; var i; for( i = 0; i < str.length; i++ ) |
--実行結果
Thisisapen.
上の例の場合、continue文を使わずに書くこともできます。空白以外だったら、 result += c; を実行するように書き替えました。
|
var str = "This is a pen."; var i; for( i = 0; i < str.length; i++ ) |
--実行結果
Thisisapen.