メソッドとメソッドの呼び出し

第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;