| 目次| 1234567891011121314
| 資料| 予定| 課題| 宿題|

2 次元配列

Java 言語では「配列の配列」を作ることも可能である.これを2 次元配列と 呼ぶ.例えば,あるクラスの英語・数学・国語の点数を扱う場合には,各行が 科目別の点数データであるような matrix を考えれば良いわけで,これを 2 次元配列で表現することができる.学生 5 人の英語の各点を 63, 90, 75, 45, 81,数学の各点を 85, 100, 95, 80, 90,国語の各点を 100, 100, 100, 100, 100 とするとき,これを 2 次元配列 kamoku_tensu を用いて以下のよう に書くことができる.
  public class KamokuHeikin {
     public static void main(String[] args) {
        int[][] kamoku_tensu = { { 63, 90, 75, 45, 81 },
                                 { 85, 100, 95, 80, 90 },
                                 { 100, 100, 100, 100, 100 },
                               };

        for (int i = 0; i < kamoku_tensu.length; i++) {
           int goukei = 0;
           for (int j = 0; j < kamoku_tensu[i].length; j ++) {
              System.out.print("\t" + kamoku_tensu[i][j]);
              goukei = goukei + kamoku_tensu[i][j];
           }
           System.out.println("\t| " + (double)goukei / kamoku_tensu[i].length);
        }
     }
  }
  
上のプログラムでは 3 〜 6 行目で,2 次元配列 kamoku_tensu が初期化され ている.8 行目からの for 文の中で配列の長さが使われているが,2 次元配 列 kamoku_tensu は 3 つの要素からなる 1 次元配列 kamoku_tensu[ ] の各 要素がさらに,5 つの 要素からなる 1 次元配列(列成分)となっているよう な配列なので,kamoku_tensu の長さは 3,各 kamoku_tensu[i](0 ≦ i ≦ 2) の長さは 5 となる.従って,上のプログラムの外側の for 文では各 kamoku_tensu[i](列ベクトル)に対して処理を行い,内側の for 文では kamoku_tensu[i](列ベクトル)の各要素 kamoku_tensu[i][j] に対して処理 を行っていることになる.このように 2 次元配列の各要素の値は kamoku_tensu[i][j] で参照可能である.なお,上のプログラムの中の \t は, 桁そろえを行うためのタブ文字を表す.
また 2 次元配列において,各要 素となっている 1 次元配列の長さが一定でなくても良い.

Java 言語のジャンプ文[continue,break]

break 文

for や while の繰り返しを中断する仕組みとして,break 文がある.例えば 下記の例では,while 文の繰り返しを実行中に,if 文の条件式が true にな ると,while 文の繰り返しを中断して while 文を脱出する.for 文の場合も 同様に,break 文があると for 文の繰り返しを中断して for 文を脱出する.
while (…) {
   …
   if (条件式) {
      break;         −−
   }                    | while 文を中断し,
  …                  | 脱出する.
}                       |
                   ←−−
// 数字列を入力に与えて,正の間加算して表示する
public class SumInput{
  public static void main(String[] args){
    int sum=0,num;

    while(true) {
      // 入力
      num = KeyboardInput.askInt("?");

       // 入力が負の時は,break文によってwhile文から抜ける.
      if( num < 0) break;

      // sumにnumの値を足し込む
      sum=sum+num;
    }
     // 表示する
    System.out.println("合計は"+sum+"です");
  }
}

ラベル付き break 文

for や while が二重になっている場合,break 文で中断するのは,内側の for や while だけである.二重ループ(多重ループ)から一気に脱出したい場 合には,ラベル付き break 文を用いる.例えば下記の例では,break 文は outer というラベルを付けた外側の while 文から一気に脱出する.
  outer:
     while (…) {
        while (…) {   
           …
           if (条件式) {
              break outer;   −−
           }                    | 対応するラベルの付いた while 文
           …                     | の外側まで一気に脱出する.
        }                      |
     }                         |
                           ←−−
  
// 数字を入力に与えて,合成数を1つ見つけたら表示して終わる
public class FindNoPrime{
  public static void main(String[] args){
    int num;
    int i,j;
    
     // 外側の while 文に toploop というラベルをつける
    toploop:

    while((num=KeyboardInput.askInt("?"))>=1){      
      for(j=2;j*j<=num;j++){
	if(num%j==0){
	  System.out.println("合成数"+num+"をみつけました");
	    // この break 文は外側の while 文を抜ける
	  break toploop;
	}
      }
    }
  }
}

continue 文

break 文がループを「中断」するために用いられたのに対して,continue 文 はループを「次に進める」ために用いる.break 文と同様に,ラベル付き continue 文も存在する.
  for (int i = 0; i < 100; i++) {   ←−−
     …                                      | for 文の残りを中断し,
     if (条件式) {                       | 繰り返しを次に進める.
        continue;   −−−−−−−−−−−−
     }
     …
  }
  
// 数字列を入力に与えて,>0の時は平方根を加算して表示する
public class SqrtSum{
  public static void main(String[] args){
    double sum=0;
    int num;
    
    while((num=KeyboardInput.askInt("?"))<=1000) {
       // 0以下の時は,以下の文は実行しない
      if(num<=0) continue;
       // sumにnumの平方根の値を足し込む
      sum=sum+Math.sqrt(num);
    }
    System.out.println("合計は"+sum+"です");
  }
}
break文やcontinue文にあたる制御文を用意していない昔のプログラミング言語では,
  • ループの途中で,変数に特定の値を入れて次の終了判定時にその変数の 値をチェックする
  • goto文という,自由な場所に制御を移すことのできる構文を用意する
などの解決策が取られた.いずれもプログラムが汚くなる(複雑に絡み あっているので,スパゲティプログラムと呼ばれることがある)ので,その反 省として1970年代に構造化プログラミングという考え方が生まれた.Cも含め て現在のプログラミング言語の多くは,この考え方に基づいている(あたりま えになったので,誰も構造化プログラミングなどと言わないが).

数学演算

数学で使われるような算術演算としては,以下のようなものがある( 詳しくは Mathクラスの解説).
Math.abs
絶対値を計算する.
Math.cos
指定された角度の余弦(cosine)値を返す.
Math.exp
自然対数 eの巾乗の計算
Math.log
自然対数値の計算
Math.sin
指定された角度の正弦(sine)値を返す.
Math.sqrt
平方根を計算する.
Math.tan
指定された角度の正接(tangent)を返す.
これらは,数学の関数と同じように以下のように使うことができる.
publc class FuncTest {
  public static void main(String[] args){
    System.out.print("sin(1)は");
    System.out.print(Math.sin(1));
    System.out.println("です");
    System.out.print("2の平方根は");
    System.out.print(Math.sqrt(2));
    System.out.println("です");
  }
}
実行結果は以下のようになる.
sin(1)は0.8414709848078965です
2の平方根は1.4142135623730951です

実習[成績処理]

public class Seiseki1 {
    public static void main(String[] args) {
	// 得点の配列
	int[] tokuten = { 93, 48, 73, 88, 34,
			  46, 62, 80, 37, 54,
			  45, 30, 55, 75, 76,
			  63, 88, 53, 94, 94,
			  76, 84, 64, 99, 30,
			  72, 45, 47, 91, 77 } ;
	
	// 名前
	String[] name = { "akira", "asuka", "atusi", "daisuke", "etumi",
			  "hideaki", "hirosi", "kazuki", "kazutaka", "keizi",
			  "kenichi", "kumio", "masashi", "mio", "momo",
			  "naoki", "naoko", "noriko", "rie", "sachiko",
			  "takasi", "terumasa", "tuyosi", "yasutaka",
			  "yosiaki", "yosiyuki", "youichi", "yukari", "yumi",
			  "yuusuke"};

	for(int i=0 ; i< tokuten.length ; i++) {
	    System.out.println(name[i]+" さんは "+tokuten[i]+"点です.");
	}	    
    }
}
上のプログラムを元にして次のような処理を行うプログラムを各々(8個)作りなさい.
| 目次| 1234567891011121314
| 資料| 予定| 課題| 宿題|