情報学部 菅沼ホーム 目次 索引

第4章 制御文

  以上見てきたプログラムは,すべて最初から順番に実行するタイプのものだけでした.しかし,プログラムによっては,必ずしも上から順に実行するだけでなく,その実行順序や内容を変化させたい場合があります.そのような目的のために使用される文を制御文と言います.
  1. 4.1 関係演算子,等値演算子,及び,論理演算子
  2. 4.2 分岐
    1. 4.2.1 if 文
      1. A. C++,Java,JavaScript,PHP,C#
      2. B. Ruby
      3. C. Python
      4. D. VB
    2. 4.2.2 switch 文
      1. A. C++,Java,JavaScript,PHP,C#
      2. B. Ruby
      3. C. VB
    3. 4.2.3 分岐に対するプログラム例
      1. A. C++
      2. B. Java
      3. C. JavaScript
      4. D. PHP
      5. E. Ruby
      6. F. Python
      7. G. C#
      8. H. VB
  3. 4.3 繰り返し
    1. 4.3.1 繰り返し文
      1. A. C++,Java,JavaScript,PHP,C#
      2. B. Ruby
      3. C. Python
      4. D. VB
    2. 4.3.2 繰り返しに対するプログラム例
      1. A. C++
      2. B. Java
      3. C. JavaScript
      4. D. PHP
      5. E. Ruby
      6. F. Python
      7. G. C#
      8. H. VB

4.1 関係演算子,等値演算子,及び,論理演算子

  関係演算子等値演算子は,2 つのデータを比較し,その結果に従い,真または偽を返す演算を行います.真,偽は,論理型ですが,その表現方法は言語によって多少異なります.プログラムの読みやすさや他言語との関係から,truefalse 以外の表現は避けた方が良いと思います.

  まず,関係演算子には,以下のようなものがあります.

記号 意味 例の意味
> より大きい a > b 式 a の値が式 b の値より大きいとき真
< より小さい a < b 式 a の値が式 b の値より小さいとき真
>= 以上 a >= b 式 a の値が式 b の値以上のとき真
<= 以下 a <= b 式 a の値が式 b の値以下のとき真

また,等値演算子には,以下のようなものがあります.

記号 意味 例の意味
==(VB:=等しい a == b(VB:a = b) 式 a の値と式 b の値が等しいとき真
!=(VB:<>等しくない a != b(VB:a <> b) 式 a の値と式 b の値が等しくないとき真

  論理演算子は,論理演算(論理和論理積否定)を行うための演算子であり,以下のようなものがあります.

記号 意味 例の意味 言語による違い
|| 論理和 x || y 式 x が真か,または,式 y が真のとき真 C++,PHP,Ruby では or でも可.Python,VB では or 表現だけ
&& 論理積 x && y 式 x が真で,かつ,式 y が真のとき真 C++,PHP,Ruby では and でも可.Python,VB では and 表現だけ
! 否定 ! x 式 x が偽のとき真 C++,Ruby では not でも可.Python,VB では not 表現だけ

  数学の場合,x の値が 1 と 5 の間にあるような場合は,
1 < x < 5		
のような表現方法を使用します.そのため,変数 x の値が 1 と 5 の間にあるか否かを調べたいようなとき,上と同じ表現を使用しがちです.Python の場合だけは正しく判断してくれますが,それ以外の言語では問題が起こります.例えば,
1 < 0 < 5		
という式について考えてみます.明らかに,0 は 1 と 5 の間にありません.従って,上の式に対する結果は false になるはずです.しかし,C++,JavaScript,VB の場合は true になってしまいます.それは,「 1 < 0 」の結果が false,つまり 0 になり,それが 5 と比較されて true になるからです.Java,PHP,Ruby,C# の場合は,「 1 < 0 」の結果が false という論理値になり,論理値と整数との比較ができないため,エラーになってしまいます.ただし,PHP の場合は,「 1 < 0 」を,
intval(1 < 0) < 5		
のように整数に変換すれば,true という結果になります.いずれにしろ,Python 以外の場合は,目的とする判断を行うためには,
(1 < 0) && (0 < 5)   // Python,VB の場合は,(1 < 0) and (0 < 5)		
のような記述をする必要があります.

  論理和,論理積などにおける VB の特殊性について述べておきます.VB には( C# においても,一部,同様ですが),他の言語に比較して,記述方法や文の解釈に特殊なところが多すぎます.例えば,以下に示すプログラムの断片を見てください.
01	Dim x() As Integer = {1, 2, 3}
02	Dim min As Integer = -1
03	For i1 As Integer = 0 To 2
04		if min < 0 or x(i1) < x(min)
05	'	if min >= 0 and x(i1) < x(min)
06			min = i1
07		End If
08	Next		
  04 行目において,i1 の値が 0 のとき,変数 min の値が -1 ですので,後半の「 x(i1) < x(min) 」は評価されず(論理的に,評価する必要は無い),06 行目の文が実行されるのが,一般的な言語における解釈だと思います.しかし,VB においては評価され,実行時にエラーとなってしまいます.論理的にはあまり意味のない文ですが,and の場合( 05 行目)においても同様です.「 min >= 0 」が評価され偽になり,後半の「 x(i1) < x(min) 」を評価する必要が無いにもかかわらず,VB では評価し,実行時のエラーとなります.VB の開発者は,論理式の意味を理解しているのか疑問を感じざるを得ません.

  JavaScript, PHP, Ruby,Python には,上で述べた等値演算子と似た演算子として,===!== ( Python の場合は,isis not )という演算子があります.以下に示すように,言語によってその意味するところが異なります.プログラムの読みやすさや他言語との関係から,上で述べた演算子によって記述可能であるならば,これらの演算子の使用は避けた方が良いと思います.

4.2 分岐

  この節では,条件によって実行内容を変更するための文について説明します.そのような文には,大きく分けて 2 種類あります.一つは,if 文であり,条件によってプログラムの実行箇所を変更するための文です.他の一つは,switch 文であり,与えられた式の値によって実行する箇所を選択するための文です.switch 文は,Ruby における case 文にほぼ対応し,また,VB における Select Case 文と似ていますが,Python には直接対応する文は存在しません.しかし,いずれの言語においても,if 文によって switch 文と同等の処理を行うことが可能です.

4.2.1 if 文

  1. C++,Java,JavaScript,PHP,C#

      if 文は,条件によりプログラムの実行箇所を変更させるための文であり,その一般的形式は以下の通りです.なお,文i が 1 文だけの時は,対応する { と } を省略可能です.しかし,省略することによって,意図と異なった処理が行われる場合がありますので注意してください.
    if (論理式1) {
    	文1(複数の文も可)
    }
    else if (論理式2) {
    	文2(複数の文も可)
    }
    	・
    	・
    else {
    	文n(複数の文も可)
    }
      この文の実行は以下のようにして行われます.論理式iが順番に評価され,その結果が真であれば,文iが実行され,次に,「・・・・・」以降に書かれた文が実行されます.このとき,文i以外は実行されないことになります.また,いずれの論理式も偽である場合は,文nが実行された後,文iが実行された場合と同様,「・・・・・」以降に書かれた文が実行されます.なお,if 文において,真に対応する部分(文1)は必ず必要ですが,それ以降は,必ずしも必要ありません.

      また,次の例のように,文iの中にも if 文を書くことができます( if 文のネストと呼びます).同様に,その内部に書かれた if 文の中にも,さらに,if 文を書くことも可能です.
    if (論理式1) {
    	・・・・・・
    	if (論理式2) {
    		・・・・・・
    	}
    	else {
    		・・・・・・
    	}
    	・・・・・・
    }
    else {
    	・・・・・・
    }			
      また,プログラムを読み易くするため,if 文内に含まれる文は,次に示す C++ のプログラム例(論理的な意味は無い)のように,何列か段を下げて(字下げを行って)書くようにして下さい.字下げは,プログラムの詳細を見なくても,その構造がわかるようにするためのものです.if 文の場合,条件が満足された場合どこからどこまでが実行されるのかが,一目でわかるように行います.例えば,下の例の場合,a と b が等しい場合,2 行目から 7 行目が実行され,また,等しくない場合,10 行目と 11 行目が実行されることが一目でわかります.また,13 行目と 14 行目は,if 文に関係なく常に実行されることも明確になります.
    01	if (a == b) {
    02		max = y;
    03		min = z;
    04		if (min < 0.0) {
    05			min = 0.0;
    06			a   = b;
    07		}
    08	}
    09	else {
    10		max = s;
    11		min = g;
    12	}
    13	x = 9;
    14	y = 10;
    			

  2. Ruby

      if 文は,条件によりプログラムの実行箇所を変更させるための文であり,その一般的形式は以下の通りです.なお,then に関しては,省略しても構いません.しかし,なぜ,「 else if 」を「 elsif 」に変更しなければならないのでしょうか.
    if 論理式1 then
    	文1(複数の文も可)
    elsif 論理式2 then
    	文2(複数の文も可)
    	・
    	・
    else
    	文n(複数の文も可)
    end
      この文の実行は以下のようにして行われます.論理式iが順番に評価され,その結果が真であれば,文iが実行され,次に,「・・・・・」以降に書かれた文が実行されます.このとき,文i以外は実行されないことになります.また,いずれの論理式も偽である場合は,文nが実行された後,文iが実行された場合と同様,「・・・・・」以降に書かれた文が実行されます.なお,if 文において,真に対応する部分(文1)は必ず必要ですが,それ以降は,必ずしも必要ありません( end は必要).

      また,次の例のように,文iの中にも if 文を書くことができます( if 文のネストと呼びます).同様に,その内部に書かれた if 文の中にも,さらに,if 文を書くことも可能です.
    if 論理式1 then
    	・・・・・・
    	if 論理式2 then
    		・・・・・・
    	else
    		・・・・・・
    	end
    	・・・・・・
    else
    	・・・・・・
    end
    			
      また,プログラムを読み易くするため,if 文内に含まれる文は,次の例(論理的な意味は無い)のように,何列か段を下げて(字下げを行って)書くようにして下さい.字下げは,プログラムの詳細を見なくても,その構造がわかるようにするためのものです.if 文の場合,条件が満足された場合どこからどこまでが実行されるのかが,一目でわかるように行います.例えば,下の例の場合,a と b が等しい場合,2 行目から 7 行目が実行され,また,等しくない場合,09 行目と 10 行目が実行されることが一目でわかります.また,12 行目と 13 行目は,if 文に関係なく常に実行されることも明確になります.
    01	if a == b then
    02		max = y;
    03		min = z;
    04		if min < 0.0 then
    05			min = 0.0;
    06			a   = b;
    07		end
    08	else
    09		max = s;
    10		min = g;
    11	end
    12	x = 9;
    13	y = 10;
    			

  3. Python

      if 文は,条件によりプログラムの実行箇所を変更させるための文であり,その一般的形式は以下の通りです.しかし,なぜ,「 else if 」を「 elif 」に変更しなければならないのでしょうか.
    if 論理式1 :
    	文1(複数の文も可)
    elif 論理式2 :
    	文2(複数の文も可)
    	・
    	・
    else :
    	文n(複数の文も可)
      この文の実行は以下のようにして行われます.論理式iが順番に評価され,その結果が真であれば,文iが実行され,次に,「・・・・・」以降に書かれた文が実行されます.このとき,文i以外は実行されないことになります.また,いずれの論理式も偽である場合は,文nが実行された後,文iが実行された場合と同様,「・・・・・」以降に書かれた文が実行されます.なお,if 文において,真に対応する部分(文1)は必ず必要ですが,それ以降は,必ずしも必要ありません.

      また,次の例のように,文iの中にも if 文を書くことができます( if 文のネストと呼びます).同様に,その内部に書かれた if 文の中にも,さらに,if 文を書くことも可能です.
    if 論理式1 :
    	・・・・・・
    	if 論理式2 :
    		・・・・・・
    	else :
    		・・・・・・
    	・・・・・・
    else :
    	・・・・・・
    			
      また,プログラムを読み易くするため,if 文内に含まれる文は,次の例(論理的な意味は無い)のように,何列か段を下げて(字下げを行って)書くようにして下さい.字下げは,プログラムの詳細を見なくても,その構造がわかるようにするためのものであり,Python においては,構造を明確にするための文法となっています.従って,字下げレベルを間違えると,エラーになったり,誤った処理を行ってしまいます.if 文の場合,条件が満足された場合どこからどこまでが実行されるのかが,一目でわかるように行います.例えば,下の例の場合,a と b が等しい場合,2 行目から 6 行目が実行され,また,等しくない場合,08 行目と 09 行目が実行されることが一目でわかります.また,10 行目と 11 行目は,if 文に関係なく常に実行されることも明確になります.
    01	if a == b :
    02		max = y
    03		min = z
    04		if min < 0.0 :
    05			min = 0.0
    06			a   = b
    07	else :
    08		max = s
    09		min = g
    10	x = 9
    11	y = 10
    			

  4. VB

      If 文は,条件によりプログラムの実行箇所を変更させるための文であり,その一般的形式は以下の通りです.しかし,なぜ,「 else if 」を「 Elseif 」に変更しなければならないのでしょうか.
    If 論理式1 Then
    	文1(複数の文も可)
    ElseIf 論理式2
    	文2(複数の文も可)
    	・
    	・
    Else
    	文n(複数の文も可)
    End If
      この文の実行は以下のようにして行われます.論理式iが順番に評価され,その結果が真であれば,文iが実行され,次に,「・・・・・」以降に書かれた文が実行されます.このとき,文i以外は実行されないことになります.また,いずれの論理式も偽である場合は,文nが実行された後,文iが実行された場合と同様,「・・・・・」以降に書かれた文が実行されます.なお,If 文において,真に対応する部分(文1)は必ず必要ですが,それ以降は,必ずしも必要ありません( End If は必要).

      また,次の例のように,文iの中にも If 文を書くことができます( If 文のネストと呼びます).同様に,その内部に書かれた If 文の中にも,さらに,If 文を書くことも可能です.
    If 論理式1 Then
    	・・・・・・
    	If 論理式2 Then
    		・・・・・・
    	Else
    		・・・・・・
    	End If
    	・・・・・・
    Else
    	・・・・・・
    End If
    			
      また,プログラムを読み易くするため,If 文内に含まれる文は,次の例(論理的な意味は無い)のように,何列か段を下げて(字下げを行って)書くようにして下さい.字下げは,プログラムの詳細を見なくても,その構造がわかるようにするためのものです.If 文の場合,条件が満足された場合どこからどこまでが実行されるのかが,一目でわかるように行います.例えば,下の例の場合,a と b が等しい場合,02 行目から 07 行目が実行され,また,等しくない場合,09 行目と 10 行目が実行されることが一目でわかります.また,12 行目と 13 行目は,If 文に関係なく常に実行されることも明確になります.
    01	If a == b Then
    02		max = y
    03		min = z
    04		If min < 0.0 Then
    05			min = 0.0
    06			a   = b
    07		End If
    08	Else
    09		max = s
    10		min = g
    11	End If
    12	x = 9
    13	y = 10
    			

4.2.2 switch 文

  1. C++,Java,JavaScript,PHP,C#

      switch 文の一般形式は以下の通りです.
    switch (式)  {
    	case 定数式1  : 
    		文1
    	case 定数式2  : 
    		文2
    	 ・・・・・
    	default  : 
    		文n
    }			
      まず,式が評価されます.その値が定数式の値のいずれかに等しければ,それ以降の文が実行されます.もちろん,文iは,複数の文でも構いません.いずれの定数式の値にも一致しない場合,もし,default キーワードの項があればそれ以降が実行され,そうでなければ,何も実行されず switch 文以降の文が実行されます.

      「それ以降の文が実行」という点に注意してください.次に示す C++ によるプログラムの断片を見てください.
    01	int x;
    02	printf("整数データを入力して下さい ");
    03	scanf("%d", &x);
    04	switch (x) {
    05		case -1 :
    06			printf("-1 です\n");
    07		case 0 :
    08			printf("0 です\n");
    09			break;
    10		case 1 :
    11			printf("1 です\n");
    12			break;
    13		default :
    14			printf("-1,0,1 以外です\n");
    15	}
    			
      上のプログラムに対して 0 を入力すると,
    0 です			
    というメッセージが出力されるはずです.しかし,-1 を入力すると,
    -1 です
    0 です			
    というメッセージが出力されるはずです.-1 を入力すると,5 行目の値に一致しますので,06 行目以降が実行されます.そのため,06 行目,08 行目の出力文が実行されることになります.しかし,09 行目に break 文が存在します.break 文を実行すると,switch 文から抜け出し,switch 文以降の文の実行に移ります.そのため,10 行目以降の switch 文内の文は実行されないことになります.break 文は,後に述べる繰り返し文から抜け出すためにも利用されます.

  2. Ruby

      case 文は,他言語の switch 文にほぼ相当し,その一般形式は以下の通りです.なお,then は省略可能です.
    casewhen 式11, 式12, ・・・ , *式1m then
    		文1
    	when 式21, 式22, ・・・ , *式2n then
    		文2
    	・・・
    	else
    		文n
    end			
      式を評価した結果と,when 節で指定された各式を評価した結果とを,演算子 === を用いて比較し,一致する場合には when 節内の文iを評価します.=== は,右辺のデータが左辺に記述されたクラス又はそのサブクラスのインスタンス,範囲式内に含まれる,などをチェックするために使用される演算子です.この場合は,式ij が左辺,式が右辺になります.when 節の最後の式に * を前置すれば,その式は配列展開されます.なお,どの when 節も実行されないとき,else 節があれば,文nが実行されます.詳細については,次節のプログラム例を参照してください

  3. VB

      Select Case 文は,他言語の switch 文に似た働きをします.その一般形式は以下の通りです.
    Select Case 変数
    	Case 条件1
    		文1
    	Case 条件2
    		文2
    	・・・
    	Case Else
    		文n
    End Select			
      変数に対して,条件iが真となる文iを実行します.真となる条件iが存在せず,かつ,Case Else 文が記述されているときは,文nを実行します.条件iとして,複数の式を記述できますが,詳細については,次節のプログラム例を参照してください.

4.2.3 分岐に対するプログラム例

  この節で示すのは,-3,-2,-1,0,1,2,3 のいずれかの数値を入力し,入力された値によって,「正です」,「0 です」,「負です」のいずれかを出力するプログラムです.ただし,指定された数値以外が入力された場合は,「範囲外です」という出力をするものとします.できる限り,様々な方法で記述してみます.

  1. C++

    01	/******************************/
    02	/* 分岐を使用したプログラム例 */
    03	/*      coded by Y.Suganuma   */
    04	/******************************/
    05	#include <stdio.h>
    06	
    07	int main()
    08	{
    09				// データの入力
    10		int x;
    11		printf("整数値を一つ入力してください ");
    12		scanf("%d", &x);
    13				// if,else を使用した場合
    14		if (x >= -3 && x < 0)
    15			printf("負です\n");
    16		else {
    17			if (x == 0)
    18				printf("0 です\n");
    19			else {
    20				if (x > 0 && x <= 3)
    21					printf("正です\n");
    22				else
    23					printf("範囲外です\n");
    24			}
    25		}
    26				// if,else if,else を使用した場合
    27		if (x >= -3 && x < 0)
    28			printf("負です\n");
    29		else if (x == 0)
    30			printf("0 です\n");
    31		else if (x > 0 && x <= 3)
    32			printf("正です\n");
    33		else
    34			printf("範囲外です\n");
    35				// switch を使用した場合
    36		switch (x) {
    37			case -3 :
    38			case -2 :
    39			case -1 :
    40				printf("負です\n");
    41				break;
    42			case 0 :
    43				printf("0 です\n");
    44				break;
    45			case 1 :
    46			case 2 :
    47			case 3 :
    48				printf("正です\n");
    49				break;
    50			default :
    51				printf("範囲外です\n");
    52		}
    53	
    54		return 0;
    55	}
    			
    14 行目~ 25 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    27 行目~ 34 行目

      if,else に加え,else if も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    36 行目~ 52 行目

      switch 文を使用した場合です.37 行目,38 行目では実行すべき文を何も記述していませんが,変数 x の値が case の後ろに記述されたデータに一致したとき,それ以降の文が実行される性質を利用し,40 行目の文を実行させるためです.40 行目を実行した後は,それ以降の文を実行すべきではありませんので,41 行目で break 文を使用し,switch 文を出ています( 53 行目以降の文の実行に移る).

  2. Java

    01	/******************************/
    02	/* 分岐を使用したプログラム例 */
    03	/*      coded by Y.Suganuma   */
    04	/******************************/
    05	import java.io.*;
    06	
    07	public class Test {
    08		public static void main(String args[]) throws IOException
    09		{
    10					// データの入力
    11			System.out.print("整数値を一つ入力してください ");
    12			BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
    13			int x = Integer.parseInt(inp.readLine());
    14					// if,else を使用した場合
    15			if (x >= -3 && x < 0)
    16				System.out.println("負です");
    17			else {
    18				if (x == 0)
    19					System.out.println("0 です");
    20				else {
    21					if (x > 0 && x <= 3)
    22						System.out.println("正です");
    23					else
    24						System.out.println("範囲外です");
    25				}
    26			}
    27					// if,else if,else を使用した場合
    28			if (x >= -3 && x < 0)
    29				System.out.println("負です");
    30			else if (x == 0)
    31				System.out.println("0 です");
    32			else if (x > 0 && x <= 3)
    33				System.out.println("正です");
    34			else
    35				System.out.println("範囲外です");
    36					// switch を使用した場合
    37			switch (x) {
    38				case -3 :
    39				case -2 :
    40				case -1 :
    41					System.out.println("負です");
    42					break;
    43				case 0 :
    44					System.out.println("0 です");
    45					break;
    46				case 1 :
    47				case 2 :
    48				case 3 :
    49					System.out.println("正です");
    50					break;
    51				default :
    52					System.out.println("範囲外です");
    53			}
    54		}
    55	}
    			
    15 行目~ 26 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    28 行目~ 35 行目

      if,else に加え,else if も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    37 行目~ 53 行目

      switch 文を使用した場合です.38 行目,39 行目では実行すべき文を何も記述していませんが,変数 x の値が case の後ろに記述されたデータに一致したとき,それ以降の文が実行される性質を利用し,41 行目の文を実行させるためです.41 行目を実行した後は,それ以降の文を実行すべきではありませんので,42 行目で break 文を使用し,switch 文を出ています( 54 行目以降の文の実行に移る).

  3. JavaScript

      ここをクリックすれば,ブラウザ上で実行することができます.また,ページのソースを表示すれば,下に示した JavaScript のソースプログラムも表示可能です.「整数データ」の右側の空白部分に数値を入力し,「 OK 」ボタンをクリックすると,その下のテキストエリアに実行結果が表示されます.

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>分岐</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    06		<SCRIPT TYPE="text/javascript">
    07			/******************************/
    08			/* 分岐を使用したプログラム例 */
    09			/*      coded by Y.Suganuma   */
    10			/******************************/
    11			function run() {
    12					// データの取得
    13				let x = parseInt(document.getElementById("x").value);
    14					// if,else を使用した場合
    15				let str = "";
    16				if (x >= -3 && x < 0)
    17					str += "負です\n";
    18				else {
    19					if (x == 0)
    20						str += "0 です\n";
    21					else {
    22						if (x > 0 && x <= 3)
    23							str += "正です\n";
    24						else
    25							str += "範囲外です\n";
    26					}
    27				}
    28					// if,else if,else を使用した場合
    29				if (x >= -3 && x < 0)
    30					str += "負です\n";
    31				else if (x == 0)
    32					str += "0 です\n";
    33				else if (x > 0 && x <= 3)
    34					str += "正です\n";
    35				else
    36					str += "範囲外です\n";
    37					// switch を使用した場合
    38				switch (x) {
    39					case -3 :
    40					case -2 :
    41					case -1 :
    42						str += "負です\n";
    43						break;
    44					case 0 :
    45						str += "0 です\n";
    46						break;
    47					case 1 :
    48					case 2 :
    49					case 3 :
    50						str += "正です\n";
    51						break;
    52					default :
    53						str += "範囲外です\n";
    54				}
    55					// 結果の設定
    56				document.getElementById("tx").value = str;
    57			}
    58		</SCRIPT>
    59	</HEAD>
    60	<BODY  STYLE="font-size:130%">
    61		<P STYLE="text-align:center">
    62			整数データ : <INPUT TYPE="text" ID="x" SIZE="5" STYLE="font-size:120%"> 
    63			<INPUT TYPE="button" VALUE="OK" onClick="run()" STYLE="font-size:90%"><BR><BR>
    64			<TEXTAREA TYPE="text" ID="tx" COLS="15" ROWS="3" STYLE="font-size: 120%"></TEXTAREA>
    65		</P>
    66	</BODY>
    67	</HTML>
    			
    16 行目~ 27 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    29 行目~ 36 行目

      if,else に加え,else if も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    38 行目~ 54 行目

      switch 文を使用した場合です.39 行目,40 行目では実行すべき文を何も記述していませんが,変数 x の値が case の後ろに記述されたデータに一致したとき,それ以降の文が実行される性質を利用し,42 行目の文を実行させるためです.42 行目を実行した後は,それ以降の文を実行すべきではありませんので,43 行目で break 文を使用し,switch 文を出ています( 55 行目以降の文の実行に移る).

  4. PHP

    01	<?php
    02		/******************************/
    03		/* 分岐を使用したプログラム例 */
    04		/*      coded by Y.Suganuma   */
    05		/******************************/
    06				// データの入力
    07		print "整数値を一つ入力してください ";
    08		$x = intval(fgets(STDIN));
    09				// if,else を使用した場合
    10		if ($x >= -3 && $x < 0)
    11			print "負です\n";
    12		else {
    13			if ($x == 0)
    14				print "0 です\n";
    15			else {
    16				if ($x > 0 && $x <= 3)
    17					print "正です\n";
    18				else
    19					print "範囲外です\n";
    20			}
    21		}
    22				// if,else if,else を使用した場合
    23		if ($x >= -3 && $x < 0)
    24			print "負です\n";
    25		else if ($x == 0)
    26			print "0 です\n";
    27		else if ($x > 0 && $x <= 3)
    28			print "正です\n";
    29		else
    30			print "範囲外です\n";
    31				// switch を使用した場合
    32		switch ($x) {
    33			case -3 :
    34			case -2 :
    35			case -1 :
    36				print "負です\n";
    37				break;
    38			case 0 :
    39				print "0 です\n";
    40				break;
    41			case 1 :
    42			case 2 :
    43			case 3 :
    44				print "正です\n";
    45				break;
    46			default :
    47				print "範囲外です\n";
    48		}
    49	?>
    			
    10 行目~ 21 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    23 行目~ 30 行目

      if,else に加え,else if も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    32 行目~ 48 行目

      switch 文を使用した場合です.33 行目,34 行目では実行すべき文を何も記述していませんが,変数 $x の値が case の後ろに記述されたデータに一致したとき,それ以降の文が実行される性質を利用し,36 行目の文を実行させるためです.36 行目を実行した後は,それ以降の文を実行すべきではありませんので,37 行目で break 文を使用し,switch 文を出ています( 49 行目以降の文の実行に移る).

  5. Ruby

    01	##############################
    02	# 分岐を使用したプログラム例 #
    03	#      coded by Y.Suganuma   #
    04	##############################
    05	print "整数値を一つ入力してください ";
    06	x = Integer(gets());
    07				# if,else を使用した場合
    08	if (x >= -3 && x < 0)
    09		print "負です\n";
    10	else
    11		if (x == 0)
    12			print "0 です\n";
    13		else
    14			if (x > 0 && x <= 3)
    15				print "正です\n";
    16			else
    17				print "範囲外です\n";
    18			end
    19		end
    20	end
    21				# if,elsif,else を使用した場合
    22	if (x >= -3 && x < 0)
    23		print "負です\n";
    24	elsif (x == 0)
    25		print "0 です\n";
    26	elsif (x > 0 && x <= 3)
    27		print "正です\n";
    28	else
    29		print "範囲外です\n";
    30	end
    31				# case を使用した場合
    32	a = (1 .. 3);
    33	b = [-2, -1];
    34	case x
    35		when -3, *b   # when -3, -2, -1 と同じ
    36			print "負です\n";
    37		when 0
    38			print "0 です\n";
    39		when *a   # when 1, 2, 3 と同じ
    40			print "正です\n";
    41		else
    42			print "範囲外です\n";
    43	end
    			
    08 行目~ 20 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    22 行目~ 30 行目

      if,else に加え,elsif も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    32 行目~ 43 行目

      case 文を使用した場合です.case 文は,switch 文と似た機能を持っていますが,より高度な処理が可能です.x と when 節で指定された各式を評価した結果とを,演算子 === を用いて比較し,一致する場合には when 節内の文を評価します.=== は,右辺のデータが左辺に記述されたクラス又はそのサブクラスのインスタンス,範囲式内に含まれる,などをチェックするために使用される演算子です.確かに,Ruby の仕様を使えば,問題によっては,さらに簡潔に,かつ,簡単に記述できるかもしれません.しかし,「読みやすく,理解しやすい」という基本からは離れていきます.また,使用されている記号「 .. 」,「 ... 」,「 -3, *b 」なども,そのような点から問題です.case 文を使用するにしても,37 行目のような表現方法に止めておいた方が良いと思います.

      35 行目,39 行目のように,when 節の最後の式に * を前置すれば,その式は配列展開されます.この例の場合は,各行のコメントに記述した場合と同じになります.もちろん,35 行目は,33 行目の配列
    	b = [-3, -2, -1];				
    のように記述すれば,
    	when *b				
    の記述で十分です.

  6. Python

    01	# -*- coding: UTF-8 -*-
    02	############################
    03	# 2つのデータの乗算と除算 #
    04	#      coded by Y.Suganuma #
    05	############################
    06				# データの入力
    07	x = int(input("整数値を一つ入力してください "))
    08				# if,else を使用した場合
    09	if -3 <= x < 0 :   # if x >= -3 and x < 0 : でも可
    10		print("負です")
    11	else :
    12		if x == 0 :
    13			print("0 です")
    14		else :
    15			if 0 < x <= 3 :
    16				print("正です")
    17			else :
    18				print("範囲外です")
    19				# if,elif,else を使用した場合
    20	if -3 <= x < 0 :
    21		print("負です")
    22	elif x == 0 :
    23		print("0 です")
    24	elif 0 < x <= 3 :
    25		print("正です")
    26	else :
    27		print("範囲外です")
    			
    09 行目~ 18 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例で使用している
    	-3 <= x < 0				
    という表現方法は,このコンテンツで取り上げた言語では,Python だけが使用可能です.コメントに記述したように,論理積 and を使用しても記述できます.これらの表現方法を使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    20 行目~ 27 行目

      if,else に加え,elif も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

  7. C#

    01	/******************************/
    02	/* 分岐を使用したプログラム例 */
    03	/*      coded by Y.Suganuma   */
    04	/******************************/
    05	using System;
    06	
    07	class Program
    08	{
    09		static void Main()
    10		{
    11			Console.Write("整数値を一つ入力してください ");
    12			int x = int.Parse(Console.ReadLine());
    13					// if,else を使用した場合
    14			if (x >= -3 && x < 0)
    15				Console.WriteLine("負です");
    16			else {
    17				if (x == 0)
    18					Console.WriteLine("0 です");
    19				else {
    20					if (x > 0 && x <= 3)
    21						Console.WriteLine("正です");
    22					else
    23						Console.WriteLine("範囲外です");
    24				}
    25			}
    26					// if,else if,else を使用した場合
    27			if (x >= -3 && x < 0)
    28				Console.WriteLine("負です");
    29			else if (x == 0)
    30				Console.WriteLine("0 です");
    31			else if (x > 0 && x <= 3)
    32				Console.WriteLine("正です");
    33			else
    34				Console.WriteLine("範囲外です");
    35					// switch を使用した場合
    36			switch (x) {
    37				case -3 :
    38				case -2 :
    39				case -1 :
    40					Console.WriteLine("負です");
    41					break;
    42				case 0 :
    43					Console.WriteLine("0 です");
    44					break;
    45				case 1 :
    46				case 2 :
    47				case 3 :
    48					Console.WriteLine("正です");
    49					break;
    50				default :
    51					Console.WriteLine("範囲外です");
    52					break;   // C# では,必ず必要
    53			}
    54		}
    55	}
    			
    14 行目~ 25 行目

      if と else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    27 行目~ 34 行目

      if,else に加え,else if も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    36 行目~ 53 行目

      switch 文を使用した場合です.37 行目,38 行目では実行すべき文を何も記述していませんが,変数 x の値が case の後ろに記述されたデータに一致したとき,それ以降の文が実行される性質を利用し,40 行目の文を実行させるためです.40 行目を実行した後は,それ以降の文を実行すべきではありませんので,41 行目で break 文を使用し,switch 文を出ています( 53 行目以降の文の実行に移る).52 行目の break 文は,他の言語では必要ありませんが,C# では必ず記述する必要があります意味が無い?).

  8. VB

    01	''''''''''''''''''''''''''''''
    02	' 分岐を使用したプログラム例 '
    03	'      coded by Y.Suganuma   '
    04	''''''''''''''''''''''''''''''
    05	Module Test
    06		Sub Main()
    07			Dim x As Integer
    08			Console.Write("整数値を一つ入力してください ")
    09			x = Integer.Parse(Console.ReadLine())
    10					' If,Else を使用した場合
    11			If x >= -3 And x < 0 Then
    12				Console.WriteLine("負です")
    13			Else
    14				If x = 0 Then
    15					Console.WriteLine("0 です")
    16				Else
    17					If x > 0 And x <= 3 Then
    18						Console.WriteLine("正です")
    19					Else
    20						Console.WriteLine("範囲外です")
    21					End If
    22				End If
    23			End If
    24					' If,ElseIf,Else を使用した場合
    25			if x >= -3 And x < 0 Then
    26				Console.WriteLine("負です")
    27			ElseIf x = 0
    28				Console.WriteLine("0 です")
    29			ElseIf x > 0 And x <= 3
    30				Console.WriteLine("正です")
    31			Else
    32				Console.WriteLine("範囲外です")
    33			End If
    34					' Select Case を使用した場合
    35			Select Case x
    36				Case -3, -2, -1   ' Is >= -3 And Is <= -1 は不可
    37					Console.WriteLine("負です")
    38				Case Is = 0   ' 0
    39					Console.WriteLine("0 です")
    40				Case 1 To 3   ' Is = 1, Is = 2, Is = 3
    41					Console.WriteLine("正です")
    42				Case Else
    43					Console.WriteLine("範囲外です")
    44			End Select
    45		End Sub
    46	End Module
    			
    11 行目~ 23 行目

      If と Else だけを使用して記述した場合です.一般に,ネストが深くなり,多くの字下げを要する文が出てくる可能性があります.この例では,論理積 && を使用していますが,使用せずに記述すると,さらに深いネスト構造になり,字下げレベルも深くなります.字下げは,読みやすさを目的としていますが,字下げレベルがあまり深いと,かえって読みにくくなる場合がありますので注意してください.

    25 行目~ 33 行目

      If,Else に加え,ElseIf も使用した場合です.先の例に比べ,読みやすく,理解しやすいのではないでしょうか.

    35 行目~ 44 行目

      Select Case は,switch 文と似ていますが,より高度な機能を持っています.36 行目では,変数 x が取るべき値を並べていますが,40 行目のような範囲指定も可能です.40 行目のコメントように,条件式をカンマで区切って並べることは可能ですが,36 行目のコメントのように,論理演算子で結合することはできません.なお,Is は,変数 x を指します.36 行目の仕様に統一した方が分かり易いのではないでしょうか.なぜ,「 Is 」などという記号を導入する必要があるのでしょうか.

4.3 繰り返し

  例えば,複数のデータを入力して,その和を求めることを考えてみてください.和を計算するための変数 sum をクリア( 0 で初期設定)した後,
1 番目のデータを入力
入力したデータを sum に加える
2 番目のデータを入力
入力したデータを sum に加える
   ・・・・・		
といった処理をデータの数だけ繰り返す必要があります.今までに述べた方法だけを使用すれば,データの数だけ同じような文を記述する必要があります.データの数があらかじめ分かっており,その数が少ない場合は記述可能ですが,分かっていない場合やデータ数が多い場合は事実上不可能です.

  この問題を解決するのがこの節で扱う繰り返し文です.繰り返し文には,大きく分けて 2 種類あります.一つは,繰り返しを開始する前にあらかじめ繰り返し回数が分かっているよな場合に使用される for 文です.他の一つは,繰り返し回数があじめ分かっておらず,条件が満たされる限り繰り返しを継続するような場合に使用される while 文です.ただし,これら 2 つの文は,言語によって多少異なりますが,ほぼ同等であり,同じ内容のプログラムをいずれの文によっても記述することが可能です.また,言語によっては,より多くの繰り返し文を提供しています.

4.3.1 繰り返し文

  1. C++,Java,JavaScript,PHP,C#

      for 文の一般的形式は以下の通りです.
    for (式1; 式2; 式3) {
    	文(複数の文も可)
    }			
      for 文に入ると,まず,式1が実行されます.式1は,通常,for 文の繰り返し回数を制御するため等の初期設定を行う式であり,for 文の最初に 1 回だけ実行されます.次に,式2(論理式)の値が評価され,もし真であれば文が実行されます.そして,式3が実行されます.再び,式2が評価され,その値が真である限り,文と式3の実行が繰り返されます.式2の値が偽になると,文と式3は実行されず,「・・・」以下の文が実行されることになります( for 文の外に出る).

      for 文において,式1と式3を省略することは可能(「;」は省略できない)ですが,通常,式2を省略することはできません(省略すると,無限ループになってしまう).

      for 文と同様な機能を持つ文として,while 文do while 文があります.while 文,及び,do while 文の一般形式は以下の通りです.
    	// while 文
    while (論理式) {
    	文(複数の文も可)
    }			
    	// do while 文
    do {
    	文(複数の文も可)
    } while (論理式) ;			
      while 文では,論理式の値が真である限り,文の実行が繰り返されることになります.while 文と do while 文の違いは,論理式の評価が,文を実行する最初に行われるか,または,後で行われるかの違いです.do while 文では,論理式の評価が後で行われるため,do while 文の開始時に論理式が偽であっても,文が少なくとも 1 回は実行されることになります.

      先に述べた for 文は,while 文を使用して,次のように書くこともできます.どちらの表現方法を使用するかは趣味の問題ですが,問題に応じて,理解しやすいプログラムになると思われる方を使用して下さい.
    式1;
    while (式2) {
    	文(複数の文も可)
    	式3;
    }			
      このように,for 文,while 文,及び,do while 文はほぼ等価ですので,以下の説明において,for 文だけを使用して説明を行う場合も多いと思いますが,特に明記しない限り while 文や do while 文に対しても同様の議論が成立します.

      if 文と同様,for 文の中が 1 文だけの場合は,{ } を省略可能です.また,次の例のように,for 文の中に別の for 文(他の繰り返し文でも良い)を書くこともできます( for 文のネスト).
    for (式1; 式2; 式3) {
    	・・・・・
    	for (式4; 式5; 式6) {
    		・・・・・
    	}
    	・・・・・
    }			
      また,if 文と同じように,プログラムを読み易くするため,for 文内の文は,次の C++ によるプログラム例(論理的な意味は無い)のように,何列か段を下げて(字下げをして)書くようにして下さい.
    for (i1 = 0; i1 < 10; i1 = i1+1) {
    	a = b + c;
    	for (i2 = 0; i2 < 5; i2 = i2+1) {
    		bcd = a / y;
    		aa  = b;
    		・・・・・・・・
    	}
    	sum = c + d;
    }			
      なお,配列等に対する反復処理を行うために,C++ には範囲 for 文,JavaScript には,for in 文,PHP,C# には,foreach 文が存在しますが,詳細については,次節のプログラム例を参照してください.

  2. Ruby

      for 文の一般的形式は以下の通りです.なお,do は省略可能です.
    for 変数 indo
    	文(複数の文も可)
    end			
      式を評価し,その結果得られた各要素が順に変数に代入され,その変数に基づき文が実行されます.式としては,配列範囲式がよく利用されます.形式としては,C++ における範囲 for 文に似ています.

      for 文と同様な機能を持つ文として,while 文があります.while 文の一般形式は以下の通りです.なお,do は省略可能です.
    while (論理式) do
    	文(複数の文も可)
    end			
      while 文では,論理式の値が真である限り,文の実行が繰り返されることになります.また,次の例のように,for 文や while 文の中に,別の for 文や while 文を書くこともできます( for 文や while 文のネスト).
    for 変数1 in 式1
    	・・・・・
    	for 変数2 in 式2
    		・・・・・
    	end
    	・・・・・
    end			
      また,if 文と同じように,プログラムを読み易くするため,for 文や while 文内の文は,プログラム例(論理的な意味は無い)のように,何列か段を下げて(字下げをして)書くようにして下さい.また,次の例において,外側のループでは範囲式,内側のループでは配列を使用していますが,これも特に意味はありません.
    for i1 in (0..10)
    	a = b + c
    	for i2 in [0, 1, 2, 3, 4]
    		bcd = a / y
    		aa  = b
    		・・・・・・・・
    	end
    	sum = c + d
    end			

  3. Python

      for 文の一般的形式は以下の通りです.イテラブルオブジェクト内の要素が順に変数に代入され,要素が空になるまで,文1が繰り返し実行されます.要素が空になり,else 以下が記述されていた場合は 文2を実行し,また,記述されていなかった場合は何も行わず,繰り返しを終了します.いずれの文も複数の文から構成されていても構いませんが,スペースまたはタブを使用して,同じレベルの字下げを行う必要があります.ただし,文が一つの文である場合は,コロンの後ろに記述しても構いません.なお,iterableイテラブル)とは,リスト( list )タプル( tuple )range など,構成要素を一度に一つずつ返すことができるオブジェクトです.形式としては,C++ における範囲 for 文に似ています.
    for 変数 in イテラブルオブジェクト :
    	文1(複数の文も可)
    else :
    	文2(複数の文も可)			
      for 文と同様な機能を持つ文として,while 文があります.while 文の一般形式は以下の通りです.
    while 論理式 :
    	文1(複数の文も可)
    else :
    	文2(複数の文も可)			
      while 文では,論理式の値が真である限り,文1の実行が繰り返されることになります.論理式が False になり,else 以下が記述されていた場合は文2を実行し,また,記述されていなかった場合は何も行わず,繰り返しを終了します.いずれの文も複数の文から構成されていても構いませんが,スペースまたはタブを使用して,同じレベルの字下げを行う必要があります.ただし,文が一つの文である場合は,コロンの後ろに記述しても構いません.さらに,if 文などと同様,次の例のように,for 文や while 文の中に,別の for 文や while 文を書くこともできます( for 文や while 文のネスト).
    for 変数1 in イテラブルオブジェクト1 :
    	・・・・・
    	for 変数2 in イテラブルオブジェクト2 :
    		・・・・・
    	・・・・・			

  4. VB

      For 文の一般的形式は以下の通りです.なお,step 以下を省略すると,刻み幅は 1 とみなされます.
    For 変数 As Integer = 初期値 To 終了値 Step 刻み幅
    	文(複数の文も可)
    Next			
      For 文に入ると,まず,変数に初期値が設定されます.その後,1 回のループが終わる毎に変数に刻み幅が加えられ,変数の値が終了値を超えたら繰り返しを終了します.繰り返しの途中で,何らかの条件によって繰り返しを中断したい場合は,Exit For 文を使用します.また,以下に示すように,C++ における範囲 for 文と似た For Each 文も存在します.
    For Each 変数1 As Integer in 変数2
    	文(複数の文も可)
    Next			
      変数2(配列など)の要素が,順番に変数1に代入され,文が繰り返し実行されます.「 As Integer 」の部分は,変数1の型によって異なります.繰り返しの途中で,何らかの条件によって繰り返しを中断したい場合は,Exit For 文を使用します.

      For 文と同様な機能を持つ文として,Do While Loop 文Do Loop While 文があります.Do While Loop 文,及び,Do Loop While 文の一般形式は以下の通りです.
    	' Do While Loop 文
    Do While 論理式
    	文(複数の文も可)
    Loop			
    	' Do Loop While 文
    Do
    	文(複数の文も可)
    Loop While 論理式			
      Do While Loop 文では,論理式の値が真である限り,文の実行が繰り返されることになります.Do While Loop 文と Do Loop While 文の違いは,論理式の評価が,文を実行する最初に行われるか,または,後で行われるかの違いです.Do Loop While 文では,論理式の評価が後で行われるため,Do Loop While 文の開始時に論理式が偽であっても,文が少なくとも 1 回は実行されることになります.なお,繰り返しの途中で,何らかの条件によって繰り返しを中断したい場合は,Exit Do 文を使用します.

      先に述べた For 文は,Do While Loop 文を使用して,次のように書くこともできます.
    変数の初期設定
    Do While 変数 <= 終了値
    	文(複数の文も可)
    	変数 += 刻み幅
    Loop			
      以下,For 文に対して行う説明は,Do While Loop 文や Do Loop While 文に対しても有効です.まず,If 文と同様,次の例に示すように,For 文の中に別の For 文(他の繰り返し文でも良い)を書くこともできます(繰り返し文のネスト).
    For 変数1 As Integer = 初期値1 To 終了値1 Step 刻み幅1
    	・・・・・
    	For 変数2 As Integer = 初期値2 To 終了値2 Step 刻み幅2
    		・・・・・
    	Next
    	・・・・・
    Next			
      また,If 文と同じように,プログラムを読み易くするため,For 文内の文は,次のプログラム例(論理的な意味は無い)のように,何列か段を下げて(字下げをして)書くようにして下さい.
    For i1 As Integer = 1 To 10 Step 1
    	a = b + c
    	For i2 As Integer = 1 To 5 Step 1
    		bcd = a / y
    		aa  = b
    		・・・・・・・・
    	Next
    	sum = c + d
    Next			
      Do While Loop 文や Do Loop While 文は,論理式を満たしている間繰り返しを実行するための文ですが,VB には,以下に示すように,論理式が満たされる状態になるまで繰り返しを実行する文が存在します.プログラムが分かり難くなるだけです.Do While Loop 文や Do Loop While 文よって十分記述可能であり,使用すべきでは無いと思います.
    	' Do Until Loop 文
    Do Until 論理式
    	文(複数の文も可)
    Loop			
    	' Do Loop Until 文
    Do
    	文(複数の文も可)
    Loop Until 論理式			

4.3.2 繰り返しに対するプログラム例

  この節では,1 から 5 までの和を求めるプログラム,及び,入力されたデータの最大値を求めるプログラムを,繰り返し文を使用して,できる限り様々な方法で記述してみます.

  1. C++

    01	/****************************/
    02	/* 繰り返しのプログラム例   */
    03	/*      coded by Y.Suganuma */
    04	/****************************/
    05	#include <stdio.h>
    06	#include <vector>
    07	#include <algorithm>
    08	
    09	using namespace std;
    10	
    11	int main()
    12	{
    13				// 1 から 5 までの和( for )
    14		int sum1 = 0;
    15		for (int i1 = 1; i1 <= 5; i1++)
    16			sum1 += i1;
    17		printf("for による和 %d\n", sum1);
    18				// 1 から 5 までの和( while )
    19		int sum2 = 0;
    20		int i1   = 1;
    21		while (i1 <= 5) {
    22			sum2 += i1;
    23			i1++;
    24		}
    25		printf("while による和 %d\n", sum2);
    26				// 1 から 5 までの和(範囲 for 文 )
    27		int sum4 = 0;
    28		int a[] {1, 2, 3, 4, 5};
    29		for (auto x : a)
    30			sum4 += x;
    31		printf("範囲 for 文による和(配列) %d\n", sum4);
    32		int sum5 = 0;
    33		vector<int> v {1, 2, 3, 4, 5};
    34		for (auto x : v)
    35			sum5 += x;
    36		printf("範囲 for 文による和(vector) %d\n", sum5);
    37				// 1 から 5 までの和( for_each )
    38		sum4 = 0;
    39		for_each(a, a+5, [&sum4](int x){ return sum4 += x; });
    40		printf("for_each による和(配列) %d\n", sum4);
    41		sum5 = 0;
    42		for_each(v.begin(), v.end(), [&sum5](int x){ return sum5 += x; });
    43		printf("for_each による和(vector) %d\n", sum5);
    44				// 最大値の計算1( while )
    45		int x;
    46		printf("整数データ?( 0 によって終了) ");
    47		scanf("%d", &x);
    48		int max1 = x;
    49		while (x != 0) {
    50			if (x > max1)
    51				max1 = x;
    52			printf("整数データ?( 0 によって終了) ");
    53			scanf("%d", &x);
    54		}
    55		printf("   最大値1(while) %d\n", max1);
    56				// 最大値の計算2( while )
    57		int max2 = 0, y = 1;
    58		while (y != 0) {
    59			printf("整数データ?( 0 によって終了) ");
    60			scanf("%d", &y);
    61			if (y == 0)
    62				break;
    63			else {
    64				if (max2 == 0 || y > max2)
    65					max2 = y;
    66			}
    67		}
    68		printf("   最大値2(while) %d\n", max2);
    69				// 最大値の計算( for による多重ループ )
    70		int n, max3;
    71		printf("クラスの数? ");
    72		scanf("%d", &n);
    73		for (int i1 = 0; i1 < n; i1++) {
    74			int m, sum3 = 0;
    75			printf("   クラス %d の人数? ", i1+1);
    76			scanf("%d", &m);
    77			for (int i2 = 0; i2 < m; i2++) {
    78				int z;
    79				printf("      %d 番目の人の点数? ", i2+1);
    80				scanf("%d", &z);
    81				sum3 += z;
    82			}
    83			sum3 /= m;
    84			if (i1 == 0 || sum3 > max3)
    85				max3 = sum3;
    86		}
    87		printf("   最大値3(for による多重ループ) %d\n", max3);
    88	
    89		return 0;
    90	}
    			
    14 行目~ 17 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.変数を型宣言しただけでは,その変数に何が記憶されているかは未定です.このプログラムでは,変数 sum1 に和を記憶していますが,14 行目のように,その変数の型宣言を行うと共に 0 で初期設定することを忘れないでください.15 行目において,for 文の中で変数 i1 に対する型宣言を行っています.このように,for 文,while 文,if 文,else if 文,else 文の中などで宣言された変数は,そのブロック( {} で囲まれた部分)内の,宣言された以降だけで有効になります.この例では,15 行目で型宣言された変数は,15 行目~ 16 行目だけで有効になります.

    19 行目~ 25 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.ここでは,21 行目の論理式を記述するため,20 行目において変数 i1 の型宣言を行っています.この変数 i1 は,15 行目で型宣言された i1 とは異なり,main ブロック( 13 行目~ 89 行目)内の,この位置から最後まで間( 20 行目~ 89 行目),有効になります.従って,この行以降,同じ変数名で型宣言は行えません.しかし,73 行目では,変数 i1 に対する型宣言が行われています.C++ においては,型宣言された変数と同じ名前で,その内側のブロックにおいて型宣言を行うことは許されます.その場合,内側のブロックでは,そこで宣言された変数が優先されます.つまり,73 行目~ 86 行目では,73 行目で宣言された変数 i1 が有効になります.

    27 行目~ 36 行目

      配列や vector クラスなどの複合型データに対しては,範囲 for 文を使用することが可能です.範囲 for 文では,: の右側に記述された複合型データの各要素が,順番に : の左側に記述された変数に代入され処理が行われていきます.この例からも見るように,範囲 for 文は,理解しやすいと共に,簡単に記述可能です.適切に使用することによって,「分かりやすく,読みやすいプログラム」になると思います.なお,auto は,その変数に代入されたデータによって,その変数の型を推論します.

    38 行目~ 43 行目

      この問題の場合,C++ アルゴリズム内の for_each を使用することが可能です.for_each は,指定した範囲に,指定した関数による処理を適用するための関数です.この例においては,関数の代わりにラムダ式を利用しています.この使用例からも明らかなように,あまり分かりやすい記述とは言えません.特別な理由が無い限り,使用は避けた方が良いのではないでしょうか.

    45 行目~ 55 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 46 行目~ 48 行目).

    57 行目~ 68 行目

      上のプログラムにおいては,46 行目~ 47 行目と全く同じ文が 52 行目~ 53 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,y の値が 0 か否かの判定を 2 回( 58 行目,61 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      57 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),64 行目の if 文によって,max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      62 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,68 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,61 行目~ 66 行目は,以下に示すように記述する方が自然だと思います.
    	if (y != 0) {
    		if (max2 == 0 || y > max2)
    			max2 = y;
    	}				
    70 行目~ 87 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      73 行目の for 文によって,クラスの数だけ,74 行目~ 85 行目を繰り返しています.74 行目において,クラスの人数を記憶する変数 m,及び,平均点を計算するための変数 sum3 に対する型宣言を行っています.これらの変数の有効範囲は,74 行目~ 85 行目になります.同様に,78 行目で型宣言を行っている変数 z の有効範囲は,78 行目~ 81 行目になる点に注意してください.

      変数 sum3 は,77 行目~ 82 行目においてクラスの点数の和を求め,83 行目で平均点を計算するために利用しています.変数 sum3 はクラス毎の平均点を求めるための変数ですので,その型宣言を 73 行目より前に行っても構いませんが,初期設定は必ずこの位置( 73 行目の後で,かつ,77 行目の前)で行う必要があります.

      このプログラムをコンパイルすると,「 70 行目の変数 max3 の初期設定が行われていない可能性がある」という警告メッセージが出力されます.しかし,84 行目~ 85 行目において,最初のクラスの平均点が必ず max3 に設定されます.コンパイラは,論理的な正誤を判断できないためこのような警告メッセージを出力します.無視しても構いませんが,警告メッセージを出力したくなければ,70 行目において max3 を適当な値(何でも構わない)で初期設定しておいてください.ただし,この例の場合,試験の点数を 0 点以上であるとすれば,70 行目において max3 に 0 を設定し,84 行目を,
    	if (sum3 > max3)				
    のように変更しても正しく動作します.

  2. Java

    01	/****************************/
    02	/* 繰り返しのプログラム例   */
    03	/*      coded by Y.Suganuma */
    04	/****************************/
    05	import java.io.*;
    06	
    07	public class Test {
    08		public static void main(String args[]) throws IOException
    09		{
    10				// 1 から 5 までの和( for )
    11			int sum1 = 0;
    12			for (int i1 = 1; i1 <= 5; i1++)
    13				sum1 += i1;
    14			System.out.printf("for による和 %d\n", sum1);
    15				// 1 から 5 までの和( while )
    16			int sum2 = 0;
    17			int i1   = 1;
    18			while (i1 <= 5) {
    19				sum2 += i1;
    20				i1++;
    21			}
    22			System.out.printf("while による和 %d\n", sum2);
    23				// 最大値の計算1( while )
    24			BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
    25			System.out.printf("整数データ?( 0 によって終了) ");
    26			int x    = Integer.parseInt(inp.readLine());
    27			int max1 = x;
    28			while (x != 0) {
    29				if (x > max1)
    30					max1 = x;
    31				System.out.printf("整数データ?( 0 によって終了) ");
    32				x = Integer.parseInt(inp.readLine());
    33			}
    34			System.out.printf("   最大値1(while) %d\n", max1);
    35				// 最大値の計算2( while )
    36			int max2 = 0, y = 1;
    37			while (y != 0) {
    38				System.out.printf("整数データ?( 0 によって終了) ");
    39				y = Integer.parseInt(inp.readLine());
    40				if (y == 0)
    41					break;
    42				else {
    43					if (max2 == 0 || y > max2)
    44						max2 = y;
    45				}
    46			}
    47			System.out.printf("   最大値2(while) %d\n", max2);
    48				// 最大値の計算( for による多重ループ )
    49			System.out.printf("クラスの数? ");
    50			int n    = Integer.parseInt(inp.readLine());
    51			int max3 = 0;   // 初期設定が必要
    52			for (i1 = 0; i1 < n; i1++) {   // i1 を定義できない
    53				System.out.printf("   クラス %d の人数? ", i1+1);
    54				int m    = Integer.parseInt(inp.readLine());
    55				int sum3 = 0;
    56				for (int i2 = 0; i2 < m; i2++) {
    57					System.out.printf("      %d 番目の人の点数? ", i2+1);
    58					int z = Integer.parseInt(inp.readLine());
    59					sum3 += z;
    60				}
    61				sum3 /= m;
    62				if (i1 == 0 || sum3 > max3)
    63					max3 = sum3;
    64			}
    65			System.out.printf("   最大値3(for による多重ループ) %d\n", max3);
    66		}
    67	}
    			
    11 行目~ 14 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.変数を型宣言しただけでは,その変数に何が記憶されているかは未定です.このプログラムでは,変数 sum1 に和を記憶していますが,11 行目のように,その変数の型宣言を行うと共に 0 で初期設定することを忘れないでください.12 行目において,for 文の中で変数 i1 に対する型宣言を行っています.このように,for 文,while 文,if 文,else if 文,else 文の中などで宣言された変数は,そのブロック( {} で囲まれた部分)内の,宣言された以降だけで有効になります.この例では,12 行目で型宣言された変数は,12 行目~ 13 行目だけで有効になります.

    16 行目~ 22 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.ここでは,18 行目の論理式を記述するため,17 行目において変数 i1 の型宣言を行っています.この変数 i1 は,12 行目で型宣言された i1 とは異なり,main ブロック( 09 行目~ 68 行目)内の,この位置から最後まで間( 17 行目~ 67 行目),有効になります.従って,この行以降,同じ変数名で型宣言は行えません.52 行目の i1 は,17 行目で宣言された i1 と同じ変数です.C++ においては,型宣言された変数と同じ名前で,その内側のブロックにおいて型宣言を行うことは許されます.その場合,内側のブロックでは,そこで宣言された変数が優先されます.しかし,Java においては,許されません.

    24 行目~ 34 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 24 行目~ 27 行目).

    36 行目~ 47 行目

      上のプログラムにおいては,25 行目~ 26 行目と全く同じ文が 31 行目~ 32 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,y の値が 0 か否かの判定を 2 回( 37 行目,40 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      36 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),43 行目の if 文によって,max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      41 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,47 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,40 行目~ 45 行目は,以下に示すように記述する方が自然だと思います.
    	if (y != 0) {
    		if (max2 == 0 || y > max2)
    			max2 = y;
    	}				
    49 行目~ 65 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      52 行目の for 文によって,クラスの数だけ,53 行目~ 63 行目を繰り返しています.54 行目において,クラスの人数を記憶する変数 m,及び,55 行目において,平均点を計算するための変数 sum3 に対する型宣言を行っています.これらの変数の有効範囲は,型宣言を行った行から 63 行目までになります.同様に,変数 z の有効範囲は,58 行目~ 59 行目になる点に注意してください.

      変数 sum3 は,56 行目~ 60 行目においてクラスの点数の和を求め,61 行目で平均点を計算するために利用しています.変数 sum3 はクラス毎の平均点を求めるための変数ですので,その型宣言を 52 行目より前に行っても構いませんが,初期設定は必ずこの位置( 52 行目の後で,かつ,56 行目の前)で行う必要があります.

      51 行目において max3 に対する初期設定を行わずに,このプログラムをコンパイルすると,コンパイルエラーとなってしまいます.しかし,62 行目~ 63 行目において,最初のクラスの平均点が必ず max3 に設定されます.コンパイラは,論理的な正誤を判断できないにも関わらず,コンパイルエラーとしてしまいます.このような処置を行いながら,未使用の変数がある場合には何のメッセージも出しません.このエラーをなくすためには,不合理ですが,51 行目において max3 を適当な値(何でも構わない)で初期設定しておく必要があります.ただし,この例の場合,試験の点数は 0 点以上であるとすれば,51 行目において max3 に 0 を設定し,62 行目を,
    	if (sum3 > max3)				
    のように変更しても正しく動作します.

  3. JavaScript

      ここをクリックすれば,ブラウザ上で実行することができます.表示された画面のテキストエリアに,
    -1 3 -5 0   // 最大値1(while)
    -3 -2 -4 -5 0   // 最大値2(while)
    2   // クラスの数
    3   // クラス1の人数
    70 80 50   // クラス1の成績
    2   // クラス2の人数
    100 90   // クラス2の成績			
    のようなデータを設定し(デフォルトとして設定済み,コメントの部分は必ずしも必要ない),「 OK 」ボタンをクリックすると,上で設定したテキストエリアのデータの下に,以下に示すような実行結果が表示されます.また,ページのソースを表示すれば,下に示した JavaScript のソースプログラムも表示可能です.
    for による和 15
    while による和 15
    最大値1(while) 3
    最大値2(while) -2
    最大値3(for による多重ループ) 95			
    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>繰り返し</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    06		<SCRIPT TYPE="text/javascript">
    07			/****************************/
    08			/* 繰り返しのプログラム例   */
    09			/*      coded by Y.Suganuma */
    10			/****************************/
    11			function run() {
    12					// データの取得
    13				let str  = document.getElementById("tx").value;
    14				let data = str.split("\n");
    15					// 1 から 5 までの和( for )
    16				let sum1 = 0;
    17				for (let i1 = 1; i1 <= 5; i1++)
    18					sum1 += i1;
    19				str += ("\nfor による和 " + sum1 + "\n");
    20					// 1 から 5 までの和( while )
    21				let sum2 = 0;
    22				let i1 = 1;
    23				while (i1 <= 5) {
    24					sum2 += i1;
    25					i1++;
    26				}
    27				str += ("while による和 " + sum2 + "\n");
    28					// 最大値の計算1( while )
    29				i1       = 0;
    30				let x_st = data[0].split(" ");   // 1 行目のデータ
    31				let x    = parseInt(x_st[i1]);
    32				let max1 = x;
    33				while (x != 0) {
    34					if (x > max1)
    35						max1 = x;
    36					i1++;
    37					x = parseInt(x_st[i1]);
    38				}
    39				str += ("最大値1(while) " + max1 + "\n");
    40					// 最大値の計算2( while )
    41				i1       = 0;
    42				let y_st = data[1].split(" ");   // 2 行目のデータ
    43				let max2 = 0, y = 1;
    44				while (y != 0) {
    45					let y = parseInt(y_st[i1]);
    46					if (y == 0)
    47						break;
    48					else {
    49						if (max2 == 0 || y > max2)
    50							max2 = y;
    51						i1++;
    52					}
    53				}
    54				str += ("最大値2(while) " + max2 + "\n");
    55					// 最大値の計算( for による多重ループ )
    56				let st = data[2].split(" ");   // 3 行目のデータ
    57				let n  = parseInt(st[0]);
    58				let max3;
    59				for (let i1 = 0; i1 < n; i1++) {
    60					st       = data[3+2*i1].split(" ");   // 4,6 行目のデータ
    61					let m    = parseInt(st[0]);
    62					let sum3 = 0;
    63					st       = data[3+2*i1+1].split(" ");   // 5,7 行目のデータ
    64					for (let i2 = 0; i2 < m; i2++) {
    65						let z = parseInt(st[i2]);
    66						sum3 += z;
    67					}
    68					sum3 /= m;
    69					if (i1 == 0 || sum3 > max3)
    70						max3 = sum3;
    71				}
    72				str += "最大値3(for による多重ループ) " + max3 + "\n";
    73					// 結果の設定
    74				document.getElementById("tx").value = str;
    75			}
    76		</SCRIPT>
    77	</HEAD>
    78	<BODY  STYLE="font-size:130%">
    79		<P STYLE="text-align:center">
    80			<INPUT TYPE="button" VALUE="OK" onClick="run()" STYLE="font-size:90%"><BR><BR>
    81			<TEXTAREA TYPE="text" ID="tx" COLS="50" ROWS="10" STYLE="font-size: 100%">
    82	-1 3 -5 0   // 最大値1(while)
    83	-3 -2 -4 -5 0   // 最大値2(while)
    84	2   // クラスの数
    85	3   // クラス1の人数
    86	70 80 50   // クラス1の成績
    87	2   // クラス2の人数
    88	100 90   // クラス2の成績
    89				</TEXTAREA>
    90		</P>
    91	</BODY>
    92	</HTML>
    			
    13 行目~ 14 行目

      テキストエリアに設定されたデータを文字列 str に取り込み,その文字列を split 関数によって改行で分離し,分離した各行を配列 data に記憶しています.

    16 行目~ 19 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.このプログラムでは,変数 sum1 に和を記憶していますので,0 で初期設定することを忘れないでください.17 行目において,変数 i1 に let を付加して代入が行われています(変数 i1 の型宣言に相当).let を付加して宣言された変数は,その位置から,その変数が入っているブロックの最後までが有効範囲になります.従って,変数 i1 は,この for ブロック内( 17 行目~ 18 行目)だけで有効になります.

    21 行目~ 27 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.23 行目の論理式を記述するため,22 行目において変数 i1 の値を 1 に設定しています( let を付加した変数の型宣言).17 行目で宣言された i1 の有効範囲は for ブロック内だけですので,ここで let を付加して変数 i1 に代入を行わないと,変数 i1 はグローバル変数とみなされてしまいます.このプログラムの範囲内であれば問題ありませんが,グローバル変数の場合は,他の関数からこの変数 i1 の値を修正することができますので,非常に危険です.22 行目の形で代入を行った場合,その有効範囲は,この位置から関数の最後までになります.

    29 行目~ 39 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).最大値を求める対象となるデータは,テキストエリアに設定された 1 行目のデータ,つまり,14 行目で記憶した data[0] に入っています.30 行目では,それを split 関数を利用して半角スペースで分離し,配列 x_st に記憶しています.

      ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 31 行目~ 32 行目).

      29 行目は,22 行目で宣言された変数 i1 の有効範囲内ですので,変数 i1 は,22 行目で宣言された変数 i1 と同じものです.この位置で,変数 i1 に let を付加すると,変数の再定義としてエラーになります.

    41 行目~ 54 行目

      上のプログラムにおいては,31 行目と全く同じ文が 37 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが変化する毎に,y の値が 0 か否かの判定を 2 回( 44 行目,46 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      43 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),49 行目の if 文によって,max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      47 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,54 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,46 行目~ 52 行目は,以下に示すように記述する方が自然だと思います.
    	if (y != 0) {
    		if (max2 == 0 || y > max2)
    			max2 = y;
    		i1++;
    	}				
    56 行目~ 72 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      59 行目の for 文によって,クラスの数だけ,60 行目~ 70 行目を繰り返しています.また,変数 sum3 は,64 行目~ 67 行目においてクラスの点数の和を求め,68 行目で平均点を計算するために利用しています.従って,初期設定は必ずこの位置( 59 行目の後で,かつ,64 行目の前)で行う必要があります.

      59 行目において,再び let を付加して変数 i1 の型宣言を行っています.この位置は,22 行目で型宣言が行われた変数 i1 の有効範囲ですが,JavaScript においては,外側のブロックで型宣言された変数と同じ名前の変数を,その内側のブロックで宣言することが可能です.その場合,その有効範囲は宣言された位置からブロックの終わりまでとなります.この例の場合は,59 行目~ 71 行目となります.

      一見,変数 max3 に対する初期設定が行われていないように見えますが,69 行目~ 70 行目において,最初のクラスの平均点が必ず max3 に設定されますので,問題ありません.ただし,この例の場合,試験の点数は 0 点以上であるとすれば,58 行目において max3 を 0 で初期設定し,69 行目を,
    	if (sum3 > max3)				
    のように変更しても正しく動作します.

  4. PHP

    01	<?php
    02		/****************************/
    03		/* 繰り返しのプログラム例   */
    04		/*      coded by Y.Suganuma */
    05		/****************************/
    06				// 1 から 5 までの和( for )
    07		$sum1 = 0;
    08		for ($i1 = 1; $i1 <= 5; $i1++)
    09			$sum1 += $i1;
    10		printf("for による和 %d\n", $sum1);
    11				// 1 から 5 までの和( while )
    12		$sum21 = 0;
    13		$i1    = 1;
    14		while ($i1 <= 5) {
    15			$sum21 += $i1;
    16			$i1++;
    17		}
    18		printf("while による和 %d\n", $sum21);
    19				// 1 から 5 までの和( foreach )
    20		$a     = array(1, 2, 3, 4, 5);
    21		$sum22 = 0;
    22		foreach ($a as $w)
    23			$sum22 += $w;
    24		printf("foreach による和 %d\n", $sum22);
    25				// 最大値の計算1( while )
    26		printf("整数データ?( 0 によって終了) ");
    27		$x    = intval(trim(fgets(STDIN)));
    28		$max1 = $x;
    29		while ($x != 0) {
    30			if ($x > $max1)
    31				$max1 = $x;
    32			printf("整数データ?( 0 によって終了) ");
    33			$x = intval(trim(fgets(STDIN)));
    34		}
    35		printf("   最大値1(while) %d\n", $max1);
    36				// 最大値の計算2( while )
    37		$max2 = 0;
    38		$y    = 1;
    39		while ($y != 0) {
    40			printf("整数データ?( 0 によって終了) ");
    41			$y = intval(trim(fgets(STDIN)));
    42			if ($y == 0)
    43				break;
    44			else {
    45				if ($max2 == 0 || $y > $max2)
    46					$max2 = $y;
    47			}
    48		}
    49		printf("   最大値2(while) %d\n", $max2);
    50				// 最大値の計算( for による多重ループ )
    51		printf("クラスの数? ");
    52		$n = intval(trim(fgets(STDIN)));
    53		for ($i1 = 0; $i1 < $n; $i1++) {
    54			printf("   クラス %d の人数? ", $i1+1);
    55			$m    = intval(trim(fgets(STDIN)));
    56			$sum3 = 0;
    57			for ($i2 = 0; $i2 < $m; $i2++) {
    58				printf("      %d 番目の人の点数? ", $i2+1);
    59				$z     = intval(trim(fgets(STDIN)));
    60				$sum3 += $z;
    61			}
    62			$sum3 /= $m;
    63			if ($i1 == 0 || $sum3 > $max3)
    64				$max3 = $sum3;
    65		}
    66		printf("   最大値3(for による多重ループ) %d\n", $max3);
    67	?>
    			
    07 行目~ 10 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.このプログラムでは,変数 $sum1 に和を記憶していますので,0 で初期設定することを忘れないでください.08 行目において,変数 $i1 が使用されています.C++ や Java においては,変数 $i1 は,この for ブロック内( 08 行目~ 09 行目)だけで有効になりますが,PHP においては,この行以降に現れる変数 $i1 は,すべて同じ変数とみなされます.

    12 行目~ 18 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.14 行目の論理式を記述するため,13 行目において変数 $i1 の値を 1 に設定しています.

    20 行目~ 24 行目

      1 から 5 までの和を求めるプログラムを,foreach 文を利用して記述しています.22 行目~ 23 行目では,20 行目で定義された配列 $a の各要素を順に変数 $w に代入して,各要素の和を計算しています.

    26 行目~ 35 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 $max1 と比較し,データが $max1 より大きかった場合,$max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,$max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 27 行目~ 28 行目).

    37 行目~ 49 行目

      上のプログラムにおいては,26 行目~ 27 行目と全く同じ文が 32 行目~ 33 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,$y の値が 0 か否かの判定を 2 回( 39 行目,42 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      37 行目において,$max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),45 行目の if 文によって,$max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      43 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,49 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,42 行目~ 47 行目は,以下に示すように記述する方が自然だと思います.
    	if ($y != 0) {
    		if ($max2 == 0 || $y > $max2)
    			$max2 = $y;
    	}				
    51 行目~ 66 行目

      $n クラスあり,各クラスの人数は $m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      53 行目の for 文によって,クラスの数だけ,54 行目~ 64 行目を繰り返しています.また,変数 $sum3 は,57 行目~ 61 行目においてクラスの点数の和を求め,62 行目で平均点を計算するために利用しています.従って,初期設定は必ずこの位置( 53 行目の後で,かつ,57 行目の前)で行う必要があります.

      一見,変数 $max3 に対する初期設定が行われていないように見えますが,63 行目~ 64 行目において,最初のクラスの平均点が必ず $max3 に設定されますので,問題ありません.ただし,この例の場合,試験の点数は 0 点以上であるとすれば,53 行目の前に,「 $max3 = 0; 」を挿入し,63 行目を,
    	if ($sum3 > $max3)				
    のように変更しても正しく動作します.

  5. Ruby

    01	############################
    02	# 繰り返しのプログラム例   #
    03	#      coded by Y.Suganuma #
    04	############################
    05			# 1 から 5 までの和( for )
    06	sum1 = 0;
    07	for i1 in (1..5) do   # for i1 in [1, 2, 3, 4, 5] do でも可
    08		sum1 += i1;
    09	end
    10	printf("for による和 %d\n", sum1);
    11			# 1 から 5 までの和( while )
    12	sum2 = 0;
    13	i1   = 1;
    14	while (i1 <= 5) do
    15		sum2 += i1;
    16		i1   += 1;
    17	end
    18	printf("while による和 %d\n", sum2);
    19			# 最大値の計算1( while )
    20	printf("整数データ?( 0 によって終了) ");
    21	x    = Integer(gets());
    22	max1 = x;
    23	while (x != 0) do
    24		if (x > max1)
    25			max1 = x;
    26		end
    27		printf("整数データ?( 0 によって終了) ");
    28		x = Integer(gets());
    29	end
    30	printf("   最大値1(while) %d\n", max1);
    31			# 最大値の計算2( while )
    32	max2 = 0;
    33	y    = 1;
    34	while (y != 0) do
    35		printf("整数データ?( 0 によって終了) ");
    36		y = Integer(gets());
    37		if (y == 0)
    38			break;
    39		else
    40			if (max2 == 0 || y > max2)
    41				max2 = y;
    42			end
    43		end
    44	end
    45	printf("   最大値2(while) %d\n", max2);
    46			# 最大値の計算( for による多重ループ )
    47	printf("クラスの数? ");
    48	n    = Integer(gets());
    49	max3 = 0;   # ここで定義しておく必要あり
    50	for i1 in (1..n)
    51		printf("   クラス %d の人数? ", i1);
    52		m    = Integer(gets());
    53		sum3 = 0;
    54		for i2 in (1..m)
    55			printf("      %d 番目の人の点数? ", i2);
    56			z = Integer(gets());
    57			sum3 += z;
    58		end
    59		sum3 /= m;
    60		if (i1 == 1 || sum3 > max3)
    61			max3 = sum3;
    62		end
    63	end
    64	printf("   最大値3(for による多重ループ) %d\n", max3);
    			
    06 行目~ 10 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.このプログラムでは,変数 sum1 に和を記憶していますので,0 で初期設定することを忘れないでください.07 行目において,変数 i1 が使用されています.C++ や Java においては,変数 i1 は,この for ブロック内( 07 行目~ 09 行目)だけで有効になりますが,Ruby においては,この行以降に現れる変数 i1 は,すべて同じ変数とみなされます.なお,ここでは範囲式を利用していますが,コメントに記載したように,配列でも可能です.なぜ,「 .. 」や「 ... 」のような意味の無い記号に,この様な意味を与えているのか理解に苦しみます.例えば,「 range(1, 5) 」のような記述であれば,ある程度意味を予測できます.記述の簡略化に重点を置き,「読みやすく,理解しやすい」ことを無視しているとしか思えません.

    12 行目~ 18 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.14 行目の論理式を記述するため,13 行目において変数 i1 の値を 1 に設定しています.

    20 行目~ 30 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 20 行目~ 22 行目).

    32 行目~ 45 行目

      上のプログラムにおいては,21 行目~ 22 行目と全く同じ文が 27 行目~ 28 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,y の値が 0 か否かの判定を 2 回( 34 行目,37 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      32 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),40 行目の if 文によって,$max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      38 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,45 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,37 行目~ 43 行目は,以下に示すように記述する方が自然だと思います.
    	if (y != 0)
    		if (max2 == 0 || y > max2)
    			max2 = y;
    		end
    	end				
    47 行目~ 64 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      50 行目の for 文によって,クラスの数だけ,51 行目~ 62 行目を繰り返しています.また,変数 sum3 は,54 行目~ 58 行目においてクラスの点数の和を求め,59 行目で平均点を計算するために利用しています.従って,初期設定は必ずこの位置( 50 行目の後で,かつ,54 行目の前)で行う必要があります.

      PHP,Python の場合は 49 行目がなくても,また,JavaScript の場合は初期設定を行わなくても問題ありません.少なくとも初期設定の問題に関しては,60 行目~ 61 行目において,最初のクラスの平均点が必ず max3 に設定されるからです.しかし,Ruby においてはエラーになってしまいます.変数 max3 に任意の値を設定しておいてください.ただし,この例の場合,試験の点数は 0 点以上であるとすれば,49 行目において max3 に 0 を設定し,60 行目を,
    	if (sum3 > max3)				
    のように変更しても正しく動作します.

  6. Python

    01	# -*- coding: UTF-8 -*-
    02	############################
    03	# 繰り返しのプログラム例   #
    04	#      coded by Y.Suganuma #
    05	############################
    06			# 1 から 5 までの和( for )
    07	sum1 = 0
    08	for i1 in range(1, 6) :
    09		sum1 += i1
    10	print("for による和", sum1)
    11			# 1 から 5 までの和( while )
    12	sum2 = 0
    13	i1   = 1
    14	while (i1 <= 5) :
    15		sum2 += i1
    16		i1   += 1
    17	print("while による和", sum2)
    18			# 最大値の計算1( while )
    19	x    = int(input("整数データ?( 0 によって終了) "))
    20	max1 = x
    21	while (x != 0) :
    22		if (x > max1) :
    23			max1 = x
    24		x = int(input("整数データ?( 0 によって終了) "))
    25	print("   最大値1(while)", max1)
    26			# 最大値の計算2( while )
    27	max2 = 0
    28	y    = 1
    29	while (y != 0) :
    30		y = int(input("整数データ?( 0 によって終了) "))
    31		if (y == 0) :
    32			break
    33		else :
    34			if (max2 == 0 or y > max2) :
    35				max2 = y
    36	print("   最大値2(while)", max2)
    37			# 最大値の計算( for による多重ループ )
    38	n = int(input("クラスの数? "))
    39	for i1 in range(1, n+1) :
    40		print("   クラス", i1, sep=' ', end='')
    41		m    = int(input(" の人数? "))
    42		sum3 = 0
    43		for i2 in range(1, m+1) :
    44			print("      ", i2, sep=' ', end='')
    45			z     = int(input(" 番目の人の点数? "))
    46			sum3 += z
    47		sum3 /= m
    48		if (i1 == 1 or sum3 > max3) :
    49			max3 = sum3
    50	print("   最大値3(for による多重ループ)", max3)
    			
    07 行目~ 10 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.このプログラムでは,変数 sum1 に和を記憶していますので,0 で初期設定することを忘れないでください.08 行目において,変数 i1 が使用されています.C++ や Java においては,変数 i1 は,この for ブロック内( 08 行目~ 09 行目)だけで有効になりますが,Python においては,この行以降に現れる変数 i1 は,すべて同じ変数とみなされます.なお,この例においては range を使用していますが,リスト( list )タプル( tuple )でも構いません.

    12 行目~ 17 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.14 行目の論理式を記述するため,13 行目において変数 i1 の値を 1 に設定しています.

    19 行目~ 25 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 19 行目~ 20 行目).

    27 行目~ 36 行目

      上のプログラムにおいては,19 行目と全く同じ文が 24 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,y の値が 0 か否かの判定を 2 回( 29 行目,31 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      27 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),34 行目の if 文によって,$max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      32 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,36 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,31 行目~ 35 行目は,以下に示すように記述する方が自然だと思います.
    	if (y != 0) :
    		if (max2 == 0 or y > max2) :
    			max2 = y				
    38 行目~ 50 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      39 行目の for 文によって,クラスの数だけ,40 行目~ 49 行目を繰り返しています.また,変数 sum3 は,43 行目~ 46 行目においてクラスの点数の和を求め,47 行目で平均点を計算するために利用しています.従って,初期設定は必ずこの位置( 39 行目の後で,かつ,43 行目の前)で行う必要があります.

      一見,変数 max3 に対する初期設定が行われていないように見えますが,48 行目~ 49 行目において,最初のクラスの平均点が必ず max3 に設定されますので,問題ありません.ただし,この例の場合,試験の点数は 0 点以上であるとすれば,39 行目の前に,「 max3 = 0 」を挿入し,48 行目を,
    	if (sum3 > max3) :				
    のように変更しても正しく動作します.

  7. C#

    01	/******************************/
    02	/* 分岐を使用したプログラム例 */
    03	/*      coded by Y.Suganuma   */
    04	/******************************/
    05	using System;
    06	
    07	class Program
    08	{
    09		static void Main()
    10		{
    11			int i1;
    12				// 1 から 5 までの和( for )
    13			int sum1 = 0;
    14			for (i1 = 1; i1 <= 5; i1++)
    15				sum1 += i1;
    16			Console.WriteLine("for による和 " + sum1);
    17				// 1 から 5 までの和( while )
    18			int sum2 = 0;
    19			i1       = 1;
    20			while (i1 <= 5) {
    21				sum2 += i1;
    22				i1++;
    23			}
    24			Console.WriteLine("while による和 " + sum2);
    25				// 1 から 5 までの和( foreach )
    26			int sum4 = 0;
    27			int[] xx = {1, 2, 3, 4, 5};
    28			foreach (int xi in xx)
    29				sum4 += xi;
    30			Console.WriteLine("foreach による和 " + sum4);
    31				// 最大値の計算1( while )
    32			Console.Write("整数データ(最大値1)?( 0 によって終了) ");
    33			int x    = int.Parse(Console.ReadLine());
    34			int max1 = x;
    35			while (x != 0) {
    36				if (x > max1)
    37					max1 = x;
    38				Console.Write("整数データ(最大値1)?( 0 によって終了) ");
    39				x = int.Parse(Console.ReadLine());
    40			}
    41			Console.WriteLine("   最大値1(while) " + max1);
    42				// 最大値の計算2( while )
    43			int max2 = 0, y = 1;
    44			while (y != 0) {
    45				Console.Write("整数データ(最大値2)?( 0 によって終了) ");
    46				y = int.Parse(Console.ReadLine());
    47				if (y == 0)
    48					break;
    49				else {
    50					if (max2 == 0 || y > max2)
    51						max2 = y;
    52				}
    53			}
    54			Console.WriteLine("   最大値2(while) " + max2);
    55				// 最大値の計算( for による多重ループ )
    56			Console.Write("クラスの数? ");
    57			int n    = int.Parse(Console.ReadLine());
    58			int max3 = 0;   // 初期設定が必要
    59			for (i1 = 0; i1 < n; i1++) {   // i1 を定義できない
    60				Console.Write("   クラス %d の人数? ", i1+1);
    61				int m    = int.Parse(Console.ReadLine());
    62				int sum3 = 0;
    63				for (int i2 = 0; i2 < m; i2++) {
    64					Console.Write("      %d 番目の人の点数? ", i2+1);
    65					int z = int.Parse(Console.ReadLine());
    66					sum3 += z;
    67				}
    68				sum3 /= m;
    69				if (i1 == 0 || sum3 > max3)
    70					max3 = sum3;
    71			}
    72			Console.WriteLine("   最大値3(for による多重ループ) " + max3);
    73		}
    74	}
    			
    11 行目

      ここで型宣言された変数 i1 は,この関数の最後,72 行まで有効になります.最初に,C# における型宣言について考えてみます.次のプログラムの断片を見てください.02 行目で型宣言された変数 i1 の有効範囲は,for ブロック内( 02,03 行目)ですので,05 行目の i1 は未定義になります.
    	01	int sum1 = 0;
    	02	for (int i1 = 1; i1 <= 5; i1++)
    	03		sum1 += i1;
    	04	int sum2 = 0;
    	05	i1       = 1;
    	06	while (i1 <= 5) {
    	07		sum2 += i1;
    	08		i1++;
    	09	}				
      そこで,05 行目を以下のように変更してみます.02 行目で型宣言された変数 i1 の有効範囲は,for ブロック内( 02,03 行目)ですので,これで問題は解決するはずです.実際,C++ や Java においては,問題なく動作します.しかし,C# においては,02 行目に対してエラーメッセ-が出てしまいます.この結果を見る限り,C# においては,型宣言された変数は,宣言された位置以降からブロックの終わりまでではなく,ブロック内全体で有効になっているため,外側のブロックで型宣言された変数と同じ名前の変数を,その内側のブロック( 02,03 行目)で宣言したためエラーになったと思われます.変数の有効範囲に対する仕様を検討すべきだと思います.
    	01	int sum1 = 0;
    	02	for (int i1 = 1; i1 <= 5; i1++)
    	03		sum1 += i1;
    	04	int sum2 = 0;
    	05	int i1   = 1;
    	06	while (i1 <= 5) {
    	07		sum2 += i1;
    	08		i1++;
    	09	}				
    13 行目~ 16 行目

      1 から 5 までの和を求めるプログラムを,for 文を利用して記述しています.変数を型宣言しただけでは,その変数に何が記憶されているかは未定です.このプログラムでは,変数 sum1 に和を記憶していますが,13 行目のように,その変数の型宣言を行うと共に 0 で初期設定することを忘れないでください.

    18 行目~ 24 行目

      1 から 5 までの和を求めるプログラムを,while 文を利用して記述しています.

    26 行目~ 30 行目

      1 から 5 までの和を求めるプログラムを,foreach 文を利用して記述しています.

    32 行目~ 41 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 33 行目~ 34 行目).

    43 行目~ 54 行目

      上のプログラムにおいては,32 行目~ 33 行目と全く同じ文が 38 行目~ 39 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,y の値が 0 か否かの判定を 2 回( 44 行目,47 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      43 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),50 行目の if 文によって,max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      48 行目の break 文は,繰り返しから抜け出すための文であり,break 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,54 行目の実行に移ります.また,break 文によって抜け出すことができるのは,break 文が入っている最も内側の繰り返しだけです.この例では,説明のために break 文を使用していますが,47 行目~ 52 行目は,以下に示すように記述する方が自然だと思います.
    	if (y != 0) {
    		if (max2 == 0 || y > max2)
    			max2 = y;
    	}				
    56 行目~ 72 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      59 行目の for 文によって,クラスの数だけ,60 行目~ 70 行目を繰り返しています.61 行目において,クラスの人数を記憶する変数 m,及び,62 行目において,平均点を計算するための変数 sum3 に対する型宣言を行っています.これらの変数の有効範囲は,59 行目の for ブロック内になります.同様に,変数 z の有効範囲は,63 行目の for ブロック内になる点に注意してください.

      変数 sum3 は,63 行目~ 67 行目においてクラスの点数の和を求め,68 行目で平均点を計算するために利用しています.変数 sum3 はクラス毎の平均点を求めるための変数ですので,その型宣言を 59 行目より前に行っても構いませんが,初期設定は必ずこの位置( 59 行目の後で,かつ,63 行目の前)で行う必要があります.

      58 行目において max3 に対する初期設定を行わずに,このプログラムをコンパイルすると,コンパイルエラーとなってしまいます.しかし,69 行目~ 70 行目において,最初のクラスの平均点が必ず max3 に設定されます.コンパイラは,論理的な正誤を判断できないにも関わらず,コンパイルエラーとしてしまいます.警告メッセージ程度で止めるべきではないでしょうか.このエラーをなくすためには,不合理ですが,58 行目において max3 を適当な値(何でも構わない)で初期設定しておく必要があります.ただし,この例の場合,試験の点数は 0 点以上であるとすれば,58 行目において max3 に 0 を設定し,69 行目を,
    	if (sum3 > max3)				
    のように変更しても正しく動作します.

  8. VB

    01	''''''''''''''''''''''''''''
    02	' 繰り返しのプログラム例   '
    03	'      coded by Y.Suganuma '
    04	''''''''''''''''''''''''''''
    05	Module Test
    06		Sub Main()
    07			Dim i1 As Integer
    08				' 1 から 5 までの和( For )
    09			Dim sum1 As Integer = 0
    10			For i1 = 1 To 5 Step 1
    11				sum1 += i1
    12			Next
    13			Console.WriteLine("For による和 " & sum1)
    14				' 1 から 5 までの和( For Each )
    15			Dim sum As Integer = 0
    16			Dim kk() As Integer = {1, 2, 3, 4, 5}
    17			For Each k As Integer in kk
    18				sum += k
    19			Next
    20			Console.WriteLine("For Each による和 " & sum)
    21				' 1 から 5 までの和( While )
    22			Dim sum2 As Integer = 0
    23			i1 = 1
    24			Do While i1 <= 5
    25				sum2 += i1
    26				i1   += 1
    27			Loop
    28			Console.WriteLine("While による和 " & sum2)
    29				' 最大値の計算1( While )
    30			Console.Write("整数データ(最大値1)?( 0 によって終了) ")
    31			Dim x As Integer    = Integer.Parse(Console.ReadLine())
    32			Dim max1 As Integer = x
    33			Do While x <> 0
    34				If x > max1 Then
    35					max1 = x
    36				End If
    37				Console.Write("整数データ(最大値1)?( 0 によって終了) ")
    38				x = Integer.Parse(Console.ReadLine())
    39			Loop
    40			Console.WriteLine("   最大値1(While) " & max1)
    41				' 最大値の計算2( While )
    42			Dim max2 As Integer = 0
    43			Dim y As Integer    = 1
    44			Do While y <> 0
    45				Console.Write("整数データ(最大値2)?( 0 によって終了) ")
    46				y = Integer.Parse(Console.ReadLine())
    47				If y = 0 Then
    48					Exit Do
    49				Else
    50					If max2 = 0 or y > max2
    51						max2 = y
    52					End If
    53				End If
    54			Loop
    55			Console.WriteLine("   最大値2(While) " & max2)
    56				' 最大値の計算( For による多重ループ )
    57			Console.Write("クラスの数? ")
    58			Dim n As Integer = Integer.Parse(Console.ReadLine())
    59			Dim max3 As Double
    60			For i1 = 1 To n
    61				Console.Write("   クラス " & i1 & " の人数? ")
    62				Dim m As Integer    = Integer.Parse(Console.ReadLine())
    63				Dim sum3 As Double = 0
    64				For i2 As Integer = 1 To m
    65					Console.Write("      " & i2 & " 番目の人の点数? ")
    66					Dim z As Integer = Integer.Parse(Console.ReadLine())
    67					sum3 += z
    68				Next
    69				sum3 /= m
    70				If i1 = 0 or sum3 > max3 Then
    71					max3 = sum3
    72				End If
    73			Next
    74			Console.WriteLine("   最大値3(For による多重ループ) " & max3)
    75		End Sub
    76	End Module
    			
    07 行目

      ここで型宣言された変数 i1 は,この関数の最後,67 行まで有効になります.最初に,VB における型宣言について考えてみます.次のプログラムの断片を見てください.02 行目で型宣言された変数 i1 の有効範囲は,for ブロック内( 02 行目~ 04 行目)ですので,06 行目の i1 は未定義になります.
    	01	Dim sum1 As Integer = 0
    	02	For i1 As Integer = 1 To 5 Step 1
    	03		sum1 += i1
    	04	Next
    	05	Dim sum2 As Integer = 0
    	06	i1 = 1
    	07	Do While i1 <= 5
    	08		sum2 += i1
    	09		i1   += 1
    	10	Loop				
      そこで,06 行目を以下のように変更してみます.02 行目で型宣言された変数 i1 の有効範囲は,for ブロック内( 02 行目~ 04 行目)ですので,これで問題は解決するはずです.実際,C++ や Java においては,問題なく動作します.しかし,VB においては,02 行目に対してエラーメッセ-が出てしまいます.この結果を見る限り,VB においては,型宣言された変数は,宣言された位置以降からブロックの終わりまでではなく,ブロック内全体で有効になっているため,外側のブロックで型宣言された変数と同じ名前の変数を,その内側のブロック( 02 行目~ 04 行目)で宣言したためエラーになったと思われます.変数の有効範囲に対する仕様を検討すべきだと思います.
    	01	Dim sum1 As Integer = 0
    	02	For i1 As Integer = 1 To 5 Step 1
    	03		sum1 += i1
    	04	Next
    	05	Dim sum2 As Integer = 0
    	06	Dim i1 As Integer = 1
    	07	Do While i1 <= 5
    	08		sum2 += i1
    	09		i1   += 1
    	10	Loop				
    09 行目~ 13 行目

      1 から 5 までの和を求めるプログラムを,For 文を利用して記述しています.変数を型宣言しただけでは,その変数に何が記憶されているかは未定です.このプログラムでは,変数 sum1 に和を記憶していますが,09 行目のように,その変数の型宣言を行うと共に 0 で初期設定することを忘れないでください.

    15 行目~ 20 行目

      1 から 5 までの和を求めるプログラムを,For Each 文を利用して記述しています.

    22 行目~ 28 行目

      1 から 5 までの和を求めるプログラムを,Do While Loop 文を利用して記述しています.

    30 行目~ 40 行目

      入力されたデータの最大値を求めています.データの入力は,0 を入力することによって終了します( 0 はデータに含めない).ここで示すように,最大値は,入力されたデータを,最大値を記憶するための変数 max1 と比較し,データが max1 より大きかった場合,max1 をそのデータと置き換えるという操作を繰り返すことによって求めることができます.そのため,max1 は必ず初期設定しておく必要があります.少なくとも,入力されると予想されるデータより小さな値で初期設定する必要があります.整数で表現することができる最小の値で初期設定するという方法もありますが,言語によってその値は異なり,あまり良い方法とは言えません.ここでは,最初に入力されたデータによって初期設定を行っています( 31 行目~ 32 行目).

    42 行目~ 55 行目

      上のプログラムにおいては,30 行目~ 31 行目と全く同じ文が 37 行目~ 38 行目に記述されており,冗長に見えるかもしれません.ここでは,while 文の中だけで入力を行うように修正しています.しかし,このプログラムにおいては,データが入力される毎に,y の値が 0 か否かの判定を 2 回( 44 行目,47 行目)行わなければならず,余分な計算が必要になる点から,あまり良いプログラムとは言えません.

      42 行目において,max2 を 0 で初期設定することは不適切であると感じるかもしれませんが(負の値だけを入力しても最大値が 0 になってしまう),50 行目の if 文によって,max2 が 0 の場合は,最初に入力されたデータで初期設定されますので問題ありません.0 がデータとして扱われることがないために使用できる方法であり,0 もデータに含まれる場合は,初期設定されていないことを示すための変数が必要です.

      48 行目の Exit Do 文は,繰り返しから抜け出すための文であり,Exit Do 文が実行されると,以後の文を実行せずに繰り返しの外に出ます.この例の場合は,55 行目の実行に移ります.また,Exit Do 文によって抜け出すことができるのは,Exit Do 文が入っている最も内側の繰り返しだけです.この例では,説明のために Exit Do 文を使用していますが,47 行目~ 53 行目は,以下に示すように記述する方が自然だと思います.
    	If y <> 0 Then
    		If max2 = 0 or y > max2
    			max2 = y
    		End If
    	End If				
    57 行目~ 74 行目

      n クラスあり,各クラスの人数は m 人(クラス毎に異なる)だったとします.このとき,あるテストを行い,クラス毎の平均点を計算し,その最大値を求めています.

      60 行目の for 文によって,クラスの数だけ,61 行目~ 72 行目を繰り返しています.62 行目において,クラスの人数を記憶する変数 m,及び,63 行目において,平均点を計算するための変数 sum3 に対する型宣言を行っています.これらの変数の有効範囲は,60 行目の for ブロック内になります.同様に,変数 z の有効範囲は,64 行目の for ブロック内になる点に注意してください.

      変数 sum3 は,64 行目~ 68 行目においてクラスの点数の和を求め,69 行目で平均点を計算するために利用しています.変数 sum3 はクラス毎の平均点を求めるための変数ですので,その型宣言を 60 行目より前に行っても構いませんが,初期設定は必ずこの位置( 60 行目の後で,かつ,64 行目の前)で行う必要があります.

      59 行目において,max3 に対して型宣言だけを行って,初期設定は行っていません.C++ のように,「初期設定されていないかもしれない」というような警告メッセージは出した方が良いのではないでしょうか.少し奇妙に見えるかもしれませんが,70 行目~ 71 行目において,最初のクラスの平均点が必ず max3 に設定されますので問題ありません.この例の場合,試験の点数は 0 点以上であるとすれば,59 行目において max3 に 0 を設定し,70 行目を,
    	if (sum3 > max3)				
    のように変更しても正しく動作します.

情報学部 菅沼ホーム 目次 索引