第6回:基本のアルゴリズム プログラミングII 2007年10月30日 本日の講義内容 Javaの配列 基本のアルゴリズム 合計、平均、最大、最小 単純な整列(ソート) 「選択法」、「交換法」 前回の復習 Javaのプログラムの構造 メソッドの定義とメソッドの呼び出し メソッドの引数と返り値 Java のプログラムの構造(1) Java のプログラム(1) public class Welcome { public static void main(String[] args){ System.out.println(“Hello”); } } Java のプログラムの構造(2) Java のプログラム(2) public class ForTest4 { public staitc void main(String[] args) { for( int j=1; j<=9; j++ ) { for( int i=1; i<=9; i++ ) { if( j*i < 10 ) { : } } } } } Java のプログラムの構造(3) Java のプログラム(3) public class MethodTest1 { public static void main(String[] args) { } public static void method1() { } public static void method2() { } } Java のメソッドの定義 public static void method1() { } public , static -- 修飾子 (メソッドの性質の説明) void -- メソッドの型 method1 – メソッド名 (自由に名前を付けることができる) { 処理の内容 } メソッドの呼び出し 処理の1つとして実行 「呼び出される」と処理はメソッドの定義へ method1(); // 呼び出し命令 public static void method1() { : : } メソッドの引数 メソッドを呼び出す時に与えるデータ draw( `@’ ); draw( ‘%’ ); public static void draw( char c ) { System.out.println( c ); } 引数と仮引数の関係 呼び出し側 draw( ‘#’ ); // 引数は ‘#’ char letter = ‘@’; draw( letter ); // 引数は letter 定義側 public staitc void draw( char c ) { // c が「仮引数」と呼ばれる // 呼び出し側の変数名とは独立な名前 メソッドの返り値 「計算結果」を報告できる 返す値の型がメソッドの型となる public int getX() { : return 100; } メソッドの返り値の受け取り 返り値は呼び出し側に報告 int x = getX(); メソッド自身を値として扱える System.out.println( getX() ); Javaの配列 配列とは? 複数のデータをまとめて取り扱う 番号(インデックス)で管理 a[0], a[1], a[2]….. Javaの配列のルール(1) 記号 [ ] 型が配列であることを示す int[] numbers; String[] names; インデックス番号を指定(データの「背番号」) names[0] = “Maruyama”; 生成時にサイズ(データの個数)の指定 int[] numbers = new int[1000]; Javaの配列のルール(2) 配列への値の代入(初期化) パターン1) 直接全部を初期化 String[] words = { “ABC”, “OPQ”, “XYZ”}; パターン2) サイズのみ先に指定する String[] words = new String[3]; words[0] = “ABC”; words[1] = “OPQ”; words[2] = “XYZ”; Javaの配列のルール(3) インデックス番号は 0 から開始 サイズは .length で利用 int[] data = { 1, 2, 3 }; System.out.println( data[0] ); // 1 を出力 System.out.println( data[1] ); // 2 を出力 System.out.println( data[data.length-1] ); // 3 を出力 × System.out.println( data[data.length] ); Javaの配列とループ 配列のデータをひととおり処理 int[] data = { 1, 2, 3, 4, 5, 6 }; for( int i=0; i<data.length; i++ ) { System.out.println( data[i] ); } 合計を求めるアルゴリズム 初期値 0 の変数を1個用意 その値に次々加算していく int[] data = { 10, 4, 5, 1 }; int s = 0; for( int i=0; i<data.length; i++ ) { s += data[i]; } 平均を求めるアルゴリズム まず合計を求める 合計値をデータの個数で割る int[] data = { 4, 6, 2, 9 }; int s = 0; : float a = ( (float)s )/ data.length; 型変換に注意 最大値を求めるアルゴリズム 「仮の」最大値を定める (例:先頭のデータ) 順に最大値と比較し、より大きい値が見つかっ たら新しい最大値とする int[] data = { 3, 6, 4, 7, 5 }; int m = data[0]; for( int i=1; i<data.length; i++ ) { if( data[i] > m ) m = data[i]; } 単純なソート(選択法) 最大値のアルゴリズムで最大値を探す (最大値は一番端のデータと交換) 残りの中から最大値のアルゴリズムで 2番目に大きいデータを探す (2番目に大きいデータは2番目に端に) さらにその残りから3番目を・・・・ 最後には一番小さいデータが残る(終了!) 選択法の処理の例 0 1 2 3 4 20 13 33 9 16 33 13 20 9 16 33 20 13 9 16 33 20 16 9 13 33 20 16 13 9 選択法のプログラムの例 与えられた配列のN番目を求めて移動 public static void maxN( int[] data, int n) { int m = data[n]; int mi = n; for( int i=n+1; i<data.length; i++ ){ if( data[i] > m ) { m=data[i]; mi=n } } data[mi] = data[n]; data[n] = m; } 単純なソート(交換法) 隣り合った値の順序をチェック 逆順ならば交換 一度実行すると一番小さなデータは端に 二度実行すると二番目に小さなデータが・・ 三度実行すると・・・ N-1回実行すれば確実に並び替わる (実際にはもっと早く並び替わる場合も) 交換法の処理の例 0 1 2 3 4 20 13 33 9 16 33 20 13 16 9 33 20 13 16 9 33 20 16 13 9 33 20 16 13 9 交換法のプログラムの例 並び替えの二重ループ for( int i=0; i<data.length-1; i++ ) { for( int j=0; j<data.lenth-i-1; j++ ) { if( data[j] < data[j+1] ) { tmp=data[j]; data[j]=data[j+1]; data[j+1]=tmp; } } } 交換の方法(失敗例) x y 100 50 x = y; x y 50 50 交換の時に変数が必要な理由 x y 100 x tmp y 100 x tmp 50 y 50 x 100 tmp 50 y 50 tmp = x; 50 100 tmp 100 x = y; 100 y = tmp;
© Copyright 2024 ExpyDoc