流れの制御と配列


  1. 条件付き実行

     プログラムは通常最初の文から順に実行しますが、「条件」により実行したり、「繰り返し処理」を行うこともできます。

  2. if 文

     指定した「条件」を満たしているときだけ 文 を実行したい場合、次の if 文を利用します。
      if( <論理式> ) <文>;
     文は次のように{ と }で囲むことで、一つの 文として扱うことができます。
     if( <論理式> ) {<文1>;<文2>; <文n>;}
    例 sec(秒)が60以上になったら、min(分)を1増やし、secを0にします。
       if(sec >= 60) {
            min = min + 1;
            sec = 0;
         }
     次の文では if での条件が満たされたら A,そうでなければ B を実行します。
     if ( < 論理式 > )< A > 
      else < B >
     B の処理の中で if で条件付けすると、多段の if..else を組むこともできます。以下は、scoreの値が60より小なら D を、70より小なら C を、80より小ならBを、そうでなければ A を表示します。
        if (score<60) println(" D grade \n");
        else 
       if (score < 70) println ( "C grade \n");
         else 
        if ( score < 80) println ( "B grade \n");
           else  println ( "A grade \n");

  3. switch文

     switch 文は switch(変数)で指定した変数の値により、caseで選択する値に多重分岐をします。case で分岐後、berak; を指定しないと、続く case の文を続けて実行します。
    int num=1;
    switch(num){
      case 0:
       println(0);
       break;
     case 1:
       println(1);
       break;
     case 2:
       println(2);
       break;
    }
    ///実行・
    1

  4. while文

     プログラムの得意技は繰り返し処理です。この機能により、類似した繰り返し作業を一般化した処理の繰り返し処理で書くことができます。まずは、1から10までを数えるプログラムです。
    while(count < 10){ /* 繰り返し処理 */
       println(count);
       count = count + 1;//countを一つ増す
    }
     次は1から10までを加えるプログラムです。最初、sum の値を0とし、繰り返しの中で sum に count の値を足しこんでいきます。count の値も1づつ増やします。
      int count,sum;  //整数変数の宣言
      sum=0;   //sumの値を0にする
      count=0; //countの値を0にする
      while(count < 10){ //countが10迄繰り返す
         sum=sum+count;  //sumにcountを加える
         println(sum);  //結果の表示
         count=count+1;  //countを一つ増す
      }
    ///結果
    0
    1
    3
    ...
    28
    36
    45
     繰り返しの内部を記述することは少し慣れが必要ですが、この方法をマスターすれば、よく現れる繰り返し処理を効率よくプログラムに書き込むことができるようになります。

  5. for 文

    繰り返しは通常 
     初期設定:繰り返し条件を初期化する
     繰り返し判断:繰り返しの判断をする論理式
     繰り返し処理:繰り返しの条件となる値を更新する。
    の3部の処理から構成されます。for文は次のようにこれらをまとめて記述します。
    for(< 初期設定 >;< 繰り返し判断 >;< 繰り返し処理 >)
           { <繰り返し本体> }
     先の例を for 文で書くと次のようになります。
      int count,sum;  //変数の宣言
      sum=0;   //sumの値を0にする
      for(count=0; count < 10; count=count+1){ //countが10迄繰り返す
         sum=sum+count;  //sumにcountを加える
         println(sum);  //結果の表示
      }
     for は繰り返しの要素をまとめて記述するため、繰り返しの要素がわかりやすくなります。
    繰り返しの中で break; を実行すると、繰り返しを中断して現在実行しているブロック(ループ)の外に出ます。

  6. 配列と繰り返し

     繰り返しが利用できるようになると、繰り返しの中で次々と新しいデータを取り出す仕組みがほしくなります。データの配列はこの要望に応えてくれます。配列は次のように定義します。
      int[] data = { 12,7,24,24,12,53,66};
     型名の後の [] が配列を意味します。data[0] は最初のデータ 12、data[1] は 7、data[6]は66 になります。count 番目のデータは data[count] で指定でき、data 配列のデータ(要素)の個数は data.length で取得できますから、data[] のデータをすべて加算するには次のようにします。
     int sum,count;
      int[] data = { 12,7,24,24,12,53,66};
      sum=0; //sumの値を0にする
      for(count=0; count< data.length; count=count+1){ 
         sum=sum+data[count];  //sumにdata[count]を加える
         println(sum);  //結果の表示
      }
    ///結果
    12
    19
    ...
    132
    198
     配列に、データを書き込もうとして、以下のようなプログラムを実行すると、"The local variable data may not have been initialized" とのエラーになります。これは 「data[] の値が定まっていない」の意味ですが、この場合少し意味が異なります。int[] data; の配列宣言は data の入れ物を指定しただけで、値が詰まっていない空の箱です。
     空の箱に値を入れることはできません。そこで、new を用いてつぎのように整数10個分のデータを作成し、これを配列に収めます。new は 「モノ(オブジェクト)」を新しく生成する意味があります。先の
     int[] data = { 12,7,24,24,12,53,66};
    は、new の指定が省略した記法で、内部では new が実行されています。。
      int count;
      int[] data;
      for(count=0; count< 10; count=count+1){ //countが10迄繰り返す
         data[count]=count;  //
          println(data[count]);  //結果の表示
      }

    ここで、10個の要素をもつ配列に 11 個目の要素を無理に入れようとすると、以下の実行時エラーになります。
     "Exception in thread "Animation Thread" java.lang.ArrayIndexOutOfBoundsException: 10"
    "ArayIndexOutOfBoundsException" は「配列の限度を超えた」の意味で、最後の 10 が超えた時の値になります。processingでは配列の限度を超えて利用すると、このようなメッセージが出て実行が中断されてしまいます。
      int count;
      int[] data = new int[10];
      for(count=0; count< 11; count=count+1){ //countが10迄繰り返す
         data[count]=count;  //
         println(data[count]);  //結果の表示
      }
    次に配列の中の最大値を求める方法を紹介します。最大値を変数 max に記録します。すべてのデータを順に調べ、max より大きなデータが現れたら、max を更新します。
    int dmax,count;
      int[] data = { 12,7,24,24,88,53,66};
      dmax=data[0]; //最初の値を初期値にする
      for(count=1; count<data.length; count=count+1){ 
        //大きなデータに置き換える
         if(dmax<data[count]) dmax=data[count];  //
      }
     println(dmax);  //結果の表示
    ///結果
    88

  7. 2次元配列

    多次元の配列を利用することもできます。env[][] 配列は、温度と湿度の組の時間変化を記録しています。それぞれの平均を計算します。env.length は組の数になります。sum[]は各データの合計を記録する配列です。
    int[][] env={{24,60},{26,59},{30,58},{28,57}};
    float sum[] = {0.0,0.0};
    
    for(int i=0;i<2;i++){
      for(int j=0;j<env.length;j++){
        sum[i]=env[j][i]+sum[i];
      }
      println("平均 "+i+":"+sum[i]/env.length );
    }
    ///結果
    平均 0:27.0
    平均 1:58.5
     
  8. try catch 文

     try{ 文 } で文を実行しているとき、catch で指定したエラーが発生したとき、実行を中断してエラー処理を行い、その後、次の文の実行を続けます。以下は配列の処理を try の中で行い、配列の範囲外のエラー(ArrayIndexOutOfBoundsException)が起こった場合、catch の処理を行います。
     try-catch なしでエラーが発生した場合実行を中断されますが、catch でエラー処理を行った場合、実行を続けることができます。try catch は必要な時だけ記述すればよいのですが、ファイルや通信処理では必須になる場合があります。
    void setup(){
      int x[]={1,2,3,4,5};
      try{
        x[7]=3;
      }catch (ArrayIndexOutOfBoundsException e){
         e.printStackTrace();
        println("be");
      }
    }

  9. まとめ

     制御文はプログラムに特有の方言で、条件付きの実行と繰り返しがあります。この使い方に慣れることがプログラムを作ることへの早道です。まずは、典型的なパターンを頭に入れると良いでしょう。