制御構造
はじめに…制御構造とは
ときに,条件によって処理の内容を変えたり、同じ処理を繰り返したりする必要が出てきます。これを記述するのが制御構造です。次のような制御構造があります。
- 条件によって処理を分岐する文......if-else文、switch文
- 同じ処理を繰り返す文......for文、while文、do-while文
- 関数の実行を終了し、制御を戻す文......return文
- その他の制御文......break文、continue文
if-else文
if-else文は、条件に従って処理を選択的に実行する場合に使います。
◆if文 ◆if else文 ◆else if文
if (条件式){ if (条件式){ if (条件式1){
文; 文1; 文1;
} }else{ }else if (条件式2){
文2; 文2;
} }else if (条件式3){
文3;
} .....
.
.
else{
文n;
}
ifに続く( )の中の条件式の値が真ならば、後ろのブロック内の文を実行し
ます。条件式の値が僞の場合は、if文の次の処理に移ります。条件式には、関係演算子を使った式や、boolean値を返すメソッド呼び出し式など、その値がboolean(trueまたはfalse)である式を書きます。
ifの条件式の値が偽の場合の処理を記述するには、else文を使います。処理を3つ以上に分岐する時は、else if文を組み合わせます。条件式1が真の場合文1を実行し、僞の場合条件式2の判定をします。条件式2が真なら文2を実行し、僞の場合は条件式3の判定に移ります。このように指定された条件式を次々と判定していき、そのどれも真ではない場合elseで指定された文nを実行します。
例えば、下は変数aの値が偶数か奇数かを判定します。
if(a%2 ==0){
document.write("偶数");
}
else {
document.write("奇数");
}
switch文
式の値によって処理の流れをいくつかに分ける場合には、switch文を使います。
◆switch文
switch(式){
case 値1 : 文1
break;
case 値2 : 文2
break;
.
.
default : 文
break;
}
switchに続く( )中には、整数の値を返す式を書き、caseの後ろには値(定数式)を書きます。caseには変数は使えませんし、同じ値も指定できません。
式の値が、caseの後ろに書いた値と一致するなら、その部分の文を実行しま
す。文の部分には複数の文を書くことができます。
caseの後ろの値を順に調べていき、どれとも一致しない場合は、defaultに記述された文を実行します。defaultは必要なければ記述する必要はありません。break文はswitch文を抜ける(終了する)指示で、caseごとにbreak文を書くのは、値が一致して文を実行した後、直ちにswitch文を終了するためです。break文がないと、その下に続くcaseの判定を続け、defaultがあればそこに指定された文も実行します。
switch文での分岐は、else if文を組み合わせても同じことが書けますが、ある式の値が整数値(または文字)と一致しているかどうかで、処理を分岐する場合によく使われます。
例えば、下は変数bの値を3で割った余りを調べて、それに応じた表示します。この例では、defaultが実行されることはないので、実は不要です。
switch(b%3){
case 0: document.write("3の倍数");
break;
case 1: document.write("3の倍数に1加えた数");
break;
case 2: document.write("3の倍数に2加えた数");
break;
default: document.write("あり得ない数");
}
return文
処理を終了して、制御を呼び出し元へ戻します。戻り値をもつ場合、return文の後に戻り値を示す式を書きます。戻り値がない場合、return文は必須ではありません。return文を書かないと、指定された処理を最後まで実行してから、呼び出し元へ戻ります。
◆return文
return; //戻り値がない
return 式;
次は,フォームに入力された値が数値でないときだけ,{ }の中が実行され,trueを返す関数です。
function check(n){
if(isNaN(document.forms[0].elements[n].value)==true){
window.alert("数値を入力してください");
document.forms[0].elements[n].focus();
document.forms[0].elements[n].select();
return true;
}
}
次は引数の値が偶数か奇数かで、0か1を返す関数の例です。
function gusuTest(a){
if(a%2 ==0){
return 0;
}
else {
return 1;
}
}
while文
条件が満たされている間、ある処理を繰返し実行します。
◆while文
while (条件式){
文
}
whileに続く( )の中の式は繰返しを続ける条件で、while文ではまずこの式を判定します。式の値がtrueならブロックの中の文を実行し、また条件式を判定します。これを繰り返し、条件式の値がfalseになった時繰返しをやめます。
条件の式の部分には、boolean定数(trueまたはfalse)、またはその値がbooleanである式を記述します。
例えば、1から10までの合計を変数aに計算する処理は下のように書きます。iの値が11になった時、i<=10の式の値がfalseになり、繰返しを終えます。
a = 0;
i = 1;
while(i<=10){
a = a + i;
i++;
}
繰返しの条件式にtrueを指定すると、無条件に繰り返すことを意味します(これを無限ループと言います)。無限ループを使う場合は、ブロックの中で、break文やreturn文を使ってループから抜けるように記述します。
for文
while文と同じように、条件が満たされている間、ある処理を繰返し実行します。
◆for文
for (式1; 式2; 式3){
文
}
式1は初期設定で、繰返しを始める前に1回実行されます。式2は繰返しを続ける条件で、式2の値がtrueであれば、ブロックの中の処理を実行し、終ると式3を実行します。次に再び式2の値を調べ、その値がtrueならブロック内を実行し、、と繰返し、式2の値がfalseになった時、繰返しをやめます。
式2の部分には、boolean定数(trueまたはfalse)、またはその値がboolean(trueまたはfalse)である式を記述します。
forの後ろの( )内の3つの式は、不要なら省略できます。式を省略する場合もセミコロンは書きます。繰返し条件である式2を省略すると、永久に真と見なされ、無限ループになります。
for(;;){
......
}
前節のwhile文と同様に「1から10までの合計を求める」処理をfor文を使って書くと、下のようになります。iの値が11になった時、i<=10の式の値がfalseになり、繰返しを終えます。
a = 0;
for(i=1; i<=10; i++){
a = a + i;
}
ループの入れ子
ループは入れ子にすることもできます。例えば次は、#印を縦横10個ずつ画面に表示するスクリプトです。
function loopTest(){
for(i=1; i<=10; i++){
for(j=1; j<=10; j++){
document.write("#");
}
document.write("<br>");
}
}
break文
break文は、while文、for文、switch文からただちに抜け出すために使います。
◆break文
break;
または
break ラベル;
ある条件に達した時に、ループから抜ける処理を書くのに、break文を使います。例えば、1から10までの合計を求める処理は、無限ループとbreak文を使って下のようにも書けます。
a = 0;
i = 1;
while(true){
a = a + i;
if(i >= 10)
break;
i++;
}
ラベルを指定しないbreak文は、break文が書かれた(実行中の)ループあるいはswitch文から抜けます。これらの文が入れ子になっていて、特定のループあるいはswitch文まで抜けたい場合には、制御を移す場所にラベルを付けておき、breakにそのラベル名を指定します。ラベル名にコロン(:)を付けると、ラベルになります。
continue文
continue文はループの中で使われ、繰返し処理をそこで中止し、次の繰返しに入ります。continue文にラベルを付けると、そのラベルの位置に移ります。break文はループを終了するのに対し、continue文はその回の繰返し処理を中断し、次の回に入るためループの先頭部に制御を移します。while文とdo文中でcontinue文を使うと、ブロック内の処理を中断して条件文の判定に移り、またfor文では繰返し毎(式3)の処理に移ります。
◆continue文
continue;
または
continue ラベル;
ループが入れ子になっている時、continue文がある実行中のループ文の先頭
に移ります。外側のループの先頭に移る場合は、制御を移す場所にラベルを付
けておき、continue文にそのラベル名を指定します。
#を四角形に表示するスクリプト、jが偶数の時だけ、#を横に表示するには、continueを使って次のように書けます(つまり,#は横に5個表示されます)。
for(i=1; i<=10; i++){
for(j=1; j<=10; j++){
if (j%2 ==1) continue;
document.write("#");
}
document.write("<br>");
}
また、ラベル付きのcontinue文を使うと、2重ループの外側のループの先頭に戻ることもできます。下の例は,内側のループから直接外のループの先頭に飛ぶので,brタグは出力されません。
modoru:
for(i=1; i<=10; i++){
for(j=1; ; j++){
document.write("#");
if(j>10) continue modoru;
}
document.write("<br>");
}
arigat アットマーク acm.org
Last modified: Oct. 2014