Top Banner
アアアアアアアアアアアアアア (Algorithms and Programming) アア アアアアアアアア アア 7:、 •アアアアアアア •アアアアアアアアアアアア •アア アアアアアhttp://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
21

アルゴリズムとプログラミング (Algorithms and Programming)

Jan 07, 2016

Download

Documents

Miroslav Emling

アルゴリズムとプログラミング (Algorithms and Programming). コンストラクタ メソッドのオーバーロード 配列. 第7回:コンストラクタ、配列. 講義資料等:. http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html. コンストラクタとは. オブジェクトが生成される時に 自動的に呼び出される 特別なメソッド メソッド名は必ず クラス名と一致 する 戻り値の型を指定することはできない だからといって void を指定してはならない. 記法:. - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: アルゴリズムとプログラミング (Algorithms and Programming)

アルゴリズムとプログラミング

(Algorithms and Programming)第7回:コンストラクタ、配列

•コンストラクタ•メソッドのオーバーロード•配列

•コンストラクタ•メソッドのオーバーロード•配列

講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html

Page 2: アルゴリズムとプログラミング (Algorithms and Programming)

コンストラクタとは• オブジェクトが生成される時に自動的に

呼び出される特別なメソッド• メソッド名は必ずクラス名と一致する• 戻り値の型を指定することはできない• だからといって void を指定してはならな

修飾子 クラス名 ( 仮引数の並び ) { 処理の記述 ;}

記法:

Page 3: アルゴリズムとプログラミング (Algorithms and Programming)

class Point { // 点クラス double x;   // x 座標 double y; // y 座標 public Point(double xx, double yy ){

x = xx; y = yy;

}

}

class SamplePoint {

public static void main(String[] args) {

Point p = new Point( 1.0, 2.0 );

System.out.println("x 座標は "+ p.x +

" y 座標は "+ p.y );

}

}

class Point { // 点クラス double x;   // x 座標 double y; // y 座標 public Point(double xx, double yy ){

x = xx; y = yy;

}

}

class SamplePoint {

public static void main(String[] args) {

Point p = new Point( 1.0, 2.0 );

System.out.println("x 座標は "+ p.x +

" y 座標は "+ p.y );

}

}

コンストラクタの定義と呼び出し

定義

呼び出し

Page 4: アルゴリズムとプログラミング (Algorithms and Programming)

コンストラクタの定義が無かったら

• 自動的にデフォルトコンストラクタが用意され、オブジェクトの生成時に呼び出される

Point( ) {}

修飾子も引数も処理内容も無いコンストラクタ

Cat p = new Cat();インスタンス生成時の記法:

実はコンストラクタだった!

Page 5: アルゴリズムとプログラミング (Algorithms and Programming)

フィールドの初期化

• 初期値の与え方(どの方法でも良い)

コンストラクタを利用

setValue() の様な通常のメソッドを定義

フィールド宣言で初期値を代入

Page 6: アルゴリズムとプログラミング (Algorithms and Programming)

class Point { // 点クラス double x = 0.0;   // x 座標 (0.0 で初期化 )

double y = 0.0 ; // y 座標 (0.0 で初期化 )

}

class SamplePoint {

public static void main(String[] args) {

Point p = new Point();

System.out.println("x 座標は " + p.x +

" y 座標は " + p.y );

}

}

class Point { // 点クラス double x = 0.0;   // x 座標 (0.0 で初期化 )

double y = 0.0 ; // y 座標 (0.0 で初期化 )

}

class SamplePoint {

public static void main(String[] args) {

Point p = new Point();

System.out.println("x 座標は " + p.x +

" y 座標は " + p.y );

}

}

インスタンスが生成される際にこの値が代入される

フィールド宣言による初期化

Page 7: アルゴリズムとプログラミング (Algorithms and Programming)

メソッドのオーバーロード一つのクラスの中に、同じ名前のメソッドを複数定義することができる

ただし...引数の数が異なっているか、

引数の型が異なっていること

戻り値の有無とは無関係引数を比べてお互いに区別が付けば、名前が同じでも異なるメソッドとして認識される

要するに..

Page 8: アルゴリズムとプログラミング (Algorithms and Programming)

メソッドのオーバーロードの例class Sample2601 { void printValue(int i) { System.out.println("i = " + i ); } void printValue(double d) { System.out.println("d = " + d ); } void printValue(int i, double d) { System.out.println("i = " + i ); System.out.println("d = " + d ); }

public static void main(String[] args) { Sample2601 o = new Sample2601(); o.printValue(100); o.printValue(0.25); o.printValue(100,0.25); }}

class Sample2601 { void printValue(int i) { System.out.println("i = " + i ); } void printValue(double d) { System.out.println("d = " + d ); } void printValue(int i, double d) { System.out.println("i = " + i ); System.out.println("d = " + d ); }

public static void main(String[] args) { Sample2601 o = new Sample2601(); o.printValue(100); o.printValue(0.25); o.printValue(100,0.25); }}

Sample2601.java

引数に応じて、それぞれ対応するメソッドが自動的に呼び出される

Page 9: アルゴリズムとプログラミング (Algorithms and Programming)

オーバーロード:間違いの例

class Sample2602 { void printValue(int i) { System.out.println("i = " + i ); } int printValue(int i) { System.out.println("i = " + i ); return i; }

public static void main(String[] args) { Sample2601 o = new Sample2601(); o.printValue(100); int a = o.printValue(200); }}

class Sample2602 { void printValue(int i) { System.out.println("i = " + i ); } int printValue(int i) { System.out.println("i = " + i ); return i; }

public static void main(String[] args) { Sample2601 o = new Sample2601(); o.printValue(100); int a = o.printValue(200); }}

Sample2602.java

戻り値は異なるが、引数で区別が付かないのでコンパイルエラー

Page 10: アルゴリズムとプログラミング (Algorithms and Programming)

コンストラクタのオーバーロード

class Point { // 点クラス double x;   // x 座標 double y; // y 座標

public Point(){ x = 0; y = 0; } public Point(double xx, double yy ){ x = xx; y = yy; }} class SamplePoint { public static void main(String[] args) { Point p0 = new Point(); Point p1 = new Point( 1.0, 2.0 ); }}

class Point { // 点クラス double x;   // x 座標 double y; // y 座標

public Point(){ x = 0; y = 0; } public Point(double xx, double yy ){ x = xx; y = yy; }} class SamplePoint { public static void main(String[] args) { Point p0 = new Point(); Point p1 = new Point( 1.0, 2.0 ); }}

複数のコンストラクタを定義可能

Page 11: アルゴリズムとプログラミング (Algorithms and Programming)

class Point { // 点クラス double x;   // x 座標 double y; // y 座標

public Point(){ this(0.0,0.0); } public Point(double xx, double yy ){ x = xx; y = yy; }} class SamplePoint2 { public static void main(String[] args) { Point p0 = new Point(); Point p1 = new Point( 1.0, 2.0 ); }}

class Point { // 点クラス double x;   // x 座標 double y; // y 座標

public Point(){ this(0.0,0.0); } public Point(double xx, double yy ){ x = xx; y = yy; }} class SamplePoint2 { public static void main(String[] args) { Point p0 = new Point(); Point p1 = new Point( 1.0, 2.0 ); }}

コンストラクタから別のコンストラクタを呼び出すことも可

this により、別に定義されたコンストラクタを呼び出せる。コンストラクタの最初の行でのみ使用可

Page 12: アルゴリズムとプログラミング (Algorithms and Programming)

配列一つの変数に添え字を付けることにより複数の値を格納するしくみ

int 型の値を格納するメモリ領域を複数個 (N 個 ) 準備する

a[0]

例)

a[1]a[2]

a[N-1]

配列要素の書式)

a[0]添え字識別子

配列要

配列要素の型は全部同じint 型なら int,double なら double

配列要素の型は全部同じint 型なら int,double なら double

0 から始まる

Page 13: アルゴリズムとプログラミング (Algorithms and Programming)

配列の宣言と利用法

int a[ ] = new int[10] ;

クラスからインスタンスを生成するときと類似

1行で宣言する書式例)

2行に分割する書式例)int a[ ] ;a = new int[10] ;

•int などの型名がクラス名に相当

•配列要素の数を [ ] で指定•配列添え字が0から始まることに注意せよ

•int などの型名がクラス名に相当

•配列要素の数を [ ] で指定•配列添え字が0から始まることに注意せよ

[] は不要[] は不要

new キーワードを使う

a[0]a[1]

a[10]a[9]

10 個分

10 個分しか宣言してなければエラー配列要素 10 個

分を宣言配列要素 10 個分を宣言

Page 14: アルゴリズムとプログラミング (Algorithms and Programming)

配列要素への値の代入a[0] = 1 ;a[1] = 100 ;a[2] = - 77 ;

•配列要素の数が足りなくなっても後で追加できない!!最初の指定が大事。

•配列添え字のオーバーフローに注意!!

•配列要素の数が足りなくなっても後で追加できない!!最初の指定が大事。

•配列添え字のオーバーフローに注意!!

Page 15: アルゴリズムとプログラミング (Algorithms and Programming)

new キーワードを使わない配列の宣言

int a[ ] = {20, 100, -40} ;

int a[ ] = new int[3] ;a[0] = 20;a[1] = 100;a[2] = - 40;

int a[ ] = new int[3] ;a[0] = 20;a[1] = 100;a[2] = - 40;

全ての配列要素を明示的に記述

Page 16: アルゴリズムとプログラミング (Algorithms and Programming)

配列の識別子は参照型変数である

int a[ ] ;a = new int[10] ;

int b[];b = a;

a[0]

a[1]

a[2]

a[9]

a a は配列の先頭番地を格納している

別の配列識別子 b を定義してa の内容を b に代入すると..

b a

b

b も a と同じ配列の先頭番地を格納することになるので...たとえばb[0] は a[0] と同じ値b[3] は a[3] と同じ値

a は参照型変数 ( 番地を格納 )

a[0] 等で中身にアクセスa は参照型変数 ( 番地を格納 )

a[0] 等で中身にアクセス一つのメモリ領域を指している参照型変数は一つとは限らない

Page 17: アルゴリズムとプログラミング (Algorithms and Programming)

配列のサイズを知る

class Sample2301 { public static void main(String[] args) { int array[] = {20,100,-40,500,70}; for(int i = 0; i < array.length; i++ ){ System.out.println( "array[" + i + "]= " + array[i] ); } }}

class Sample2301 { public static void main(String[] args) { int array[] = {20,100,-40,500,70}; for(int i = 0; i < array.length; i++ ){ System.out.println( "array[" + i + "]= " + array[i] ); } }}

array[0]= 20array[1]= 100array[2]= -40array[3]= 500array[4]= 70

array[0]= 20array[1]= 100array[2]= -40array[3]= 500array[4]= 70

実行結果

Sample2301.java

Page 18: アルゴリズムとプログラミング (Algorithms and Programming)

配列の応用問題:

与えられた配列の要素を、大きい順に並べ替えなさい与えられた配列の要素を、大きい順に並べ替えなさい

方針 ( 例 ) : 配列の先頭から、一つ一つ順番に値を比べて、大きい値と出会ったら入れ替える

a[0]a[1]a[2]

配列添え字 i

配列添え字 jwork 入れ替え用

一時記憶変数

a[3]a[4]

Page 19: アルゴリズムとプログラミング (Algorithms and Programming)

class SampleAPP0701 { public static void main(String[] args) { int array[] = {20,100,-40,500,70};// 与えられた配列 int work; // 入れ替え用の一時メモリ for(int i = 0; i < array.length - 1; i++ ){ for(int j = ; j < ; j++ ){ if( array[i] < array[j] ) { // 大きな数字と出会った

ら work = array[ ]; // 入れ替える array[ ] = array[ ]; array[ ] = work; } } } // 以下は結果の表示 for(int i=0; i < array.length; i++ ){ System.out.println( "array[" + i + "]= " + array[i] ); } }}

class SampleAPP0701 { public static void main(String[] args) { int array[] = {20,100,-40,500,70};// 与えられた配列 int work; // 入れ替え用の一時メモリ for(int i = 0; i < array.length - 1; i++ ){ for(int j = ; j < ; j++ ){ if( array[i] < array[j] ) { // 大きな数字と出会った

ら work = array[ ]; // 入れ替える array[ ] = array[ ]; array[ ] = work; } } } // 以下は結果の表示 for(int i=0; i < array.length; i++ ){ System.out.println( "array[" + i + "]= " + array[i] ); } }}

SampleAPP0701.java

Page 20: アルゴリズムとプログラミング (Algorithms and Programming)

class SampleAPP0701 { public static void main(String[] args) { int array[] = {20,100,-40,500,70};// 与えられた配列 int work; // 入れ替え用の一時メモリ for(int i = 0; i < array.length - 1; i++ ){ for(int j = i+1; j < array.length; j++ ){ if( array[i] < array[j] ) { // 大きな数字と出会った

ら work = array[i]; // 入れ替える array[i] = array[j]; array[j] = work; } } } // 以下は結果の表示 for(int i=0; i < array.length; i++ ){ System.out.println( "array[" + i + "]= " + array[i] ); } }}

class SampleAPP0701 { public static void main(String[] args) { int array[] = {20,100,-40,500,70};// 与えられた配列 int work; // 入れ替え用の一時メモリ for(int i = 0; i < array.length - 1; i++ ){ for(int j = i+1; j < array.length; j++ ){ if( array[i] < array[j] ) { // 大きな数字と出会った

ら work = array[i]; // 入れ替える array[i] = array[j]; array[j] = work; } } } // 以下は結果の表示 for(int i=0; i < array.length; i++ ){ System.out.println( "array[" + i + "]= " + array[i] ); } }}

SampleAPP0701.java

Page 21: アルゴリズムとプログラミング (Algorithms and Programming)

まとめ

•コンストラクタ•メソッドのオーバーロード•配列の宣言と使用例

•コンストラクタ•メソッドのオーバーロード•配列の宣言と使用例