スライド

計算機プログラミングI
第2回
2002年10月17日(木)
• 履習登録
• 複習
• ライブラリの利用 (2.6-7)
• 式・値・代入 (2.6-8)
• 返り値のあるメソッドとフィールド (2.7)
• クラス変数・クラスメソッド (3.3-4)
• 式と文 (3.1-2,7-8)
– プリミティブ値とオブジェクト値 (3.1-2)
– 演算子 (3.8)
• 練習問題
1
履習登録について
(実例参照)
2
概念の整理
• クラス:
/** 最初のプログラムの例 */
オブジェクトの性質を定義
public class T21 {
public static void main(String[] args){
(性質: 状態・振舞)
TurtleFrame f;
//変数 f の型宣言
• オブジェクト:
f = new TurtleFrame();
//TurtleFrameを作成しfに代入
Turtle m = new Turtle(); //Turtle を作成し,m の初期値として代入
「もの」を表わす値
Turtle m1 = new Turtle(); //もう1つ作成し,m1 の初期値として代入
f.add(m);
//f に m を追加
(クラスに所属)
f.add(m1);
//f に m1 を追加
m.fd(100);
//m よ前に 100
• 進め
変数: 値の入れ物
m.rt(90);
//m よ右に 90 度回れ
(型がある)
m.fd(150);
//m よ前に 150 進め
m1.rt(90);
//m1 よ右に 90 度回れ
• 型:
m1.fd(100);
//m1 よ前に 150
進め値の集合
}
(クラスも型)
}
3
文法の整理
• 型宣言
/** 最初のプログラムの例 */
• コンストラクタ呼出し
public class T21 {
public static void main(String[] args){
オブジェクトを作る
TurtleFrame f;
//変数 f の型宣言
• 代入
f = new TurtleFrame();
//TurtleFrameを作成しfに代入
Turtle m = new Turtle(); //Turtle を作成し,m の初期値として代入
変数に値を「しまう」
Turtle m1 = new Turtle(); //もう1つ作成し,m1 の初期値として代入
f.add(m);
//f に m を追加
• メソッド呼出し
f.add(m1);
//f に m1 を追加
m.fd(100);
//m よ前に 100 進め オブジェクトに
m.rt(90);
//m よ右に 90 度回れ 指示を出す
}
}
m.fd(150);
m1.rt(90);
m1.fd(100);
//m よ前に 150 進め
//m1 よ右に 90 度回れ
//m1 よ前に 150 進め
4
プログラム T22 (2.6)
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
Turtle m = new Turtle(x,y,180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(x+ d,y+ d,0);
java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成
m1.setColor(c);
//m1 の色を赤色に指定
f.add(m);
f.add(m1);
m.fd(d);
m1.fd(d);
m.lt(90);
m1.lt(90);
d = d / 2;
//d の値を d/2 に変更
m.fd(d);
m1.fd(d);
}
}
5
整数型の変数の宣言
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
}
Turtle m = new Turtle(x,y,180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(x+ d,y+ d,0);
java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成
m1.setColor(c);
//m1 の色を赤色に指定
int x = 200;
f.add(m);
int y = 200;
f.add(m1);
m.fd(d);
int d = 100;
m1.fd(d);
m.lt(90); と同じ
m1.lt(90);
int x;
//整数をしまう変数xを宣言
d = d / 2;
//d の値を d/2 に変更
x = 200; //xに200をしまう
m.fd(d);
m1.fd(d);
と同じ
}
6
引数つきのコンストラクタ
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
}
Turtle m = new Turtle(x,y,180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(x+ d,y+ d,0);
java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成
m1.setColor(c);
//m1 の色を赤色に指定
意味: Turtleオブジェクトを作る
f.add(m);
f.add(m1);
(コンストラクタ呼出し)
m.fd(d);
“x,y,180” ~ 引数: (この場合) 座標と向き
m1.fd(d);
m.lt(90);
• コンストラクタ・メソッドに
m1.lt(90);
どんなものがあるか?
d = d / 2;
//d の値を d/2 に変更
m.fd(d);
どんな意味か?
― API
m1.fd(d);
• new Turtle() と違う?
― オーバーロード
}
7
API
(Application Programming Interface)
ライブラリの使い方の情報
クラスの名前・定義されている
コンストラクタ・メソッド・フィー
ルド・・・
• Turtle ― 名前
() ― 引数なし
→ new Turtle()
• 引数が3つ全てint(整数)
だった場合
• メソッドの名前・型・働き
10
オーバーロード (多重定義)
• 複数のコンストラクタが
同じ名前で定義できる
– 引数の個数と型で
どれかが決まる
– メソッドも同様
• “new Turtle()”→引数0個
• “new
Turtle(100,50,30)” → 3
個のint(整数)型
11
パッケージ
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
Turtle m = new Turtle(x,y,180);
Turtle m1 = new Turtle(x+ d,y+ d,0);
“java.awtパッケージの中にある
Colorクラス”
//引数のあるコンストラクタ呼び出し
java.awt.Color c = new java.awt.Color(255,0,0);
}
m1.setColor(c);
f.add(m);
f.add(m1);
•
m.fd(d);
m1.fd(d);
•
m.lt(90);
m1.lt(90);
d = d / 2;
•
m.fd(d);
m1.fd(d);
}
//赤色オブジェクトを作成
//m1 の色を赤色に指定
パッケージ: いくつかのクラスをまとめたもの
java.awt: Java言語標準ライブラリの
abstract window toolkitパッケージ
名前が重ならない工夫//d の値を d/2 に変更
12
式
public class T22 {
public static void main(String[] args){
演算子:
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
数式だけが式ではない
+, -, *, /, %, &, |, ...
Turtle m = new Turtle(x,
y, 180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(x+d, y+d, 0);
java.awt.Color c = new java.awt.Color(255,0,0);
//赤色オブジェクトを作成
}
m1.setColor(c);
f.add(m);
f.add(m1);
m.fd(d);
m1.fd(d);
m.lt(90);
m1.lt(90);
d = d / 2;
m.fd(d);
m1.fd(d);
}
//m1 の色を赤色に指定
式: 値を表わす単位
• 数値は式
• 変数は式
• “new クラス名(式, //d
式, の値を
...)” は式
d/2 に変更
• “式 + 式” は式
• etc.
14
式の値
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
Turtle m = new Turtle(x,
y, 180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(x+d, y+d, 0);
java.awt.Color c = new java.awt.Color(255,0,0);
//赤色オブジェクトを作成
}
m1.setColor(c);
f.add(m);
f.add(m1);
m.fd(d);
m1.fd(d);
m.lt(90);
m1.lt(90);
d = d / 2;
m.fd(d);
m1.fd(d);
}
//m1 の色を赤色に指定
• 数値→ その値
• 変数→ そのときに入っている値
• “new クラス名(式, 式, ...)”
→ 作られたオブジェクト
//d の値を d/2 に変更
• “式 + 式”→
1. 各式の値を求める
2. 値の和
15
代入と変数の値
public class T22 {
public static void main(String[] args){
変数式: その時点で
TurtleFrame f = new TurtleFrame();
int x = 200, y = 200, d = 100;
変数に入っている値
Turtle m = new Turtle(x,y,180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(x+ d,y+ d,0);
java.awt.Color c = new java.awt.Color(255,0,0);
//赤色オブジェクトを作成
代入:
m1.setColor(c);
//m1 の色を赤色に指定
f.add(m);
1. 右辺の値を求め
f.add(m1);
2. 変数に値を入れ直す
m.fd(d);
m1.fd(d);
dは100
m.lt(90);
m1.lt(90);
d = d / 2;
//d の値を d/2 に変更
m.fd(d);
m1.fd(d);
dは50
}
}
16
変数と値の抽象化
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
}
何故変数を
使うのか?
public class T22 {
int x = 200, y = 200, d = 100; public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
Turtle m = new Turtle(x,y,180);
//引数のあるコンストラクタ呼び出し
Turtle m = new Turtle(200,200,180);
変数:
Turtle m1 = new Turtle(x+ d,y+ d,0);
java.awt.Color c = new java.awt.Color(255,0,0); Turtle
//赤色オブジェクトを作成
m1 = new Turtle(300,300,0);
•
同じ意図を持った値を
m1.setColor(c);
//m1 の色を赤色に指定
java.awt.Color
c = new java.awt.Color(255
f.add(m);
m1.setColor(c);
明示できる
f.add(m1);
f.add(m);
m.fd(d);
•f.add(m1);
値に名前を付ける
m1.fd(d);
これも
m.fd(100);
m.lt(90);
同じように
m1.fd(100);
m1.lt(90);
m.lt(90);
d = d / 2; • 全体を1.5倍の
//d の値を d/2 に変更
動く
m1.lt(90);
大きさにするには?
m.fd(d);
m.fd(50);
m1.fd(d);
• 左上を(50,50)に
}
m1.fd(50);
変更するには?
}
}
17
変数と値の抽象化
public class T22 {
public static void main(String[] args){
TurtleFrame f = new TurtleFrame();
int 左上隅x = 200, 左上隅y = 200, 辺長 = 100;
Turtle m = new Turtle(左上隅x,左上隅y,180);
//引数のあるコンストラクタ呼び出し
Turtle m1 = new Turtle(左上隅x+辺長,左上隅y+辺長,0);
java.awt.Color c = new java.awt.Color(255,0,0); //赤色オブジェクトを作成
m1.setColor(c);
//m1 の色を赤色に指定
f.add(m);
より良い
f.add(m1);
プログラム(?)
m.fd(辺長);
m1.fd(辺長);
m.lt(90);
m1.lt(90);
• /全体を1.5倍の
辺長 = 辺長
2;
//d の値を d/2 に変更
}
m.fd(辺長);
m1.fd(辺長); •
}
大きさにするには?
左上を(50,50)に
変更するには?
18
プログラム T23 (2.7)
import java.awt.Color;
public class T23 {
public static void main(String[] args){
int d = 100, x, y, a;
TurtleFrame f = new TurtleFrame();
Turtle m = new Turtle(200,300,0);
f.add(m);
m.fd(d);
x = m.getX()
y = m.getY();
a = m.getAngle() - 45;
Turtle m1 = new Turtle(x, y, a);
f.add(m1);
m.kameColor = new Color(0,255,255);
m.kameScale = m.kameScale * 2;
m.rt(45);
d = d / 2;
m.fd(d);
m1.fd(d);
}
}
// m のX 座標とり出し
// m のY 座標とり出し
// m の角度とり出し
//m1 の作成
// m の亀の色を水色変える
// m の亀を現在の 2 倍の大きさにする
19
パッケージ名の略記
import java.awt.Color;
public class T23 {
public static void main(String[] args){
public class T23 {
....
public static void main(String[] args){
f.add(m1);
int d = 100, x, y, a;
TurtleFrame f = new TurtleFrame();
m.kameColor = new java.awt.Color(0,255,255);
Turtle
m = new Turtle(200,300,0); m.kameScale = m.kameScale * 2;
// m の
“ファイル中で
f.add(m);
...
m.fd(d);
java.awt.Color
}
x = m.getX()
// m のX 座標とり出し
}
クラスを略記”
y = m.getY();
// m のY 座標とり出し
a = m.getAngle() - 45;
// m の角度とり出し同じ
Turtle m1 = new Turtle(x, y, a);
//m1 の作成
f.add(m1);
m.kameColor = new Color(0,255,255); // m の亀の色を水色変える
m.kameScale = m.kameScale * 2;
// m の亀を現在の 2 倍の大きさにする
m.rt(45);
d = d / 2;
m.fd(d); import java.awt.*;
m1.fd(d);
→java.awtパッケージ内の全てのクラスを略記
}
20
}
メソッドの返り値
• メソッド
– オブジェクトの動作
– 計算…値を返す
ことができる (cf. 計算式)
「返り値」という
• 返り値の型
– void: 値を返さない
• 返り値は
– 他の式と組み合せられる
– 無視してもよい
22
メソッドの返り値
import java.awt.Color;
public class T23 {
public static void main(String[] args){
int d = 100, x, y, a;
TurtleFrame f = new TurtleFrame();
Turtle m = new Turtle(200,300,0);
f.add(m);
m.fd(d);
x = m.getX();
y = m.getY();
}
a = m.getAngle() - 45;
Turtle m1 = new Turtle(x, y, a);
f.add(m1);
m.kameColor = new Color(0,255,255);
m.kameScale = m.kameScale * 2;
m.rt(45);
d Turtle
= d / 2; m1 = new Turtle(m.getX(),
m.fd(d);
と書いても同じ
m1.fd(d);
}
メソッドの返り値
を使っている
計算式の中で
使ってもよい
// m のX 座標とり出し
// m のY 座標とり出し
// m の角度とり出し
//m1 の作成
// m の亀の色を水色変える
// m の亀を現在の 2 倍の大きさにする
m.getY(), m.getAngle() - 45);
23
フィールド (インスタンス変数)
• 個々のオブジェクトの
中にある変数
オブジェクトの状態
(の一部)
• 変数と同様に
– 型がある
– 代入できる
– 式として書ける
24
フィールド (インスタンス変数)
import java.awt.Color;
public class T23 {
public static void main(String[] args){
int d = 100, x, y, a;
TurtleFrame f = new TurtleFrame();
Turtle m = new Turtle(200,300,0);
f.add(m);
m.fd(d);
x = m.getX();
y = m.getY();
a = m.getAngle() - 45;
Turtle m1 = new Turtle(x, y, a);
f.add(m1);
m.kameColor = new Color(0,255,255);
m.kameScale = m.kameScale * 2;
}
m.rt(45);
d = d / 2;
m.fd(d);
m1.fd(d);
}
代入して値を
変更できる
// m のX 座標とり出し
// m のY 座標とり出し
// m の角度とり出し
//m1 の作成
// m の亀の色を水色変える
// m の亀を現在の 2 倍の大きさにする
計算式の中で
使ってもよい
25
オブジェクトとは? (2.8)
• オブジェクト:
「もの」を表わす値
(クラスに所属)
– 内部に状態を持つ (インスタンス変数)
– メソッドが呼出されると
• 状態を変化させる
• 他のオブジェクトのメソッドを呼出す
• 値を返す
• クラス
– どんなインスタンス変数を持つか?
– どんなメソッドを持つか?
x座標=230
y座標=170
色=水色オブジェクト
26
練習問題
(教科書または講義webページ参照)
27