プログラミング入門1
|
|
|
- もえり ますはら
- 7 years ago
- Views:
Transcription
1 プログラミング入門 2 第 4 回クラスとインスタンス (2) クラスとインスタンスの詳細
2 テーマ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
3 本日の主な題材 2 つの MyCircle 変数にインスタンスを代入して インスタンスフィールドを変更してみよ ( 例題 11, 例題 12) 3
4 テーマ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
5 プログラミング入門 1 第 10 回スライド インスタンスの実体と参照 new という命令でインスタンスを生成すると コンピューター上のどこかに実体を生成 変数が記憶するのはインスタンスの実体への参照だけ 配列と同様の仕組み 5
6 プログラミング入門 1 第 10 回スライド 副作用 ( インスタンス ) modify メソッドを起動する際に インスタンスの参照だけをコピーして仮引数に渡す 起動先で実体を変更すると 起動元にも影響 整数や実数と 配列やインスタンスの違い 6
7 プログラミング入門 1 第 10 回スライド new による実体の生成 new でコンピューター上に実体を1つ生成 複数の実体が必要なら複数回の new を処理 どの参照がどの実体を指すかを正しく理解することが大切 7
8 インスタンスとその利用 ( 詳細 ) 次のクラスを考える public clsas MyCircle { int x=100; int y=100; int diameter=100; } クラスMyCircle x: 100 y: 100 diameter:100 このクラスのインスタンスを作成するためには 次のような命令を用いた MyCircle c0 = new MyCircle(); x: 100 y: 100 diameter: 100 これは 次の 2 行の作業をまとめて記述している MyCircle c0; c0 = new MyCircle(); 1 行目 :MyCircle 型の変数 c0 を宣言 2 行目 :MyCircle クラスのインスタンスを生成し c0 に代入
9 実体と参照 MyCircle c0; c0 = new MyCircle(); 1 行目 :MyCircle 型の変数 c0 を宣言 2 行目 :MyCircle クラスのインスタンスを生成し c0 に代入 上記は より正確には 1 行目 :MyCircle 型の変数 c0 を宣言 2 行目 :(1) MyCircle クラスのインスタンス ( 実体 ) を生成し (2) その 参照 を c0 に保持させる c0 ca0b6 c0 実体の番号 = ca0b6 x: 100 y: 100 diameter: 100
10 実体と参照 参照 は プログラミング入門 1 の第 10 回で説明したものと同じである 先の例の c0 は インスタンスそのもの ( 実体 ) を保持するのではなく インスタンスへの参照 (= インスタンスの住所 id 番号 ) を保持する ca0b6 c0 実体の番号 = ca0b6 x: 100 y: 100 diameter: 100 例 : 下記の場合 作成されたインスタンスは id 番号 ca0b6 を持つ 変数 c0 には この id 番号が格納されている MyCircle c0 = new MyCircle(); System.out.println(c0); j2.lesson04.mycircle@ca0b6 このように 参照 を保持する変数は 参照型 (Reference type) 変数と呼ばれる なお int 型変数などは基本型 (Primitive type) の変数と呼ばれる
11 インスタンスへのアクセス インスタンスへのアクセス (= 書き込みと読み込み ) は 実際には参照を用いて間接的に行う MyCircle c0; c0 = new MyCircle(); System.out.println(c0.x) 3 行目は インスタンスc0のインスタンス変数 x の内容を表示する 命令であるが より正確な表現では 変数 c0が保持する 参照 が示す実体 ( すなわちインスタンス ) のインスタンス変数 x の内容を表示する命令となる ca0b6 実体の番号 = ca0b6 c0 x: 100 y: 100 diameter: 100
12 まとめ 参照型変数への代入は 変数をインスタンスと 結びつける と理解しておくのがよい ( 左図 ) リンクの役割を果たすのが 参照 である x: 100 ca0b6 実体の番号 = ca0b6 c0 y: 100 diameter: 100 c0 x: 100 y: 100 diameter: 100 MyCircle c0 = new MyCircle(); なお 参照 か 実体 の違いを意識していなくても 不都合は起きない場合も多い ただし 本日のテーマで扱う 参照型変数を用いた代入やメソッド呼び出しでは 基本型の時とは微妙な違いが生じることがあるので ( 特にインスタンスへの書き込みの際に ) 意識する必要がある
13 補足 : 定数 null ( ナル ヌル ) MyCircle c0 = null; System.out.println(c0); System.out.println(c0.x); c0 参照型の変数は null という定数値を持つことができる 基本的には 変数がどのインスタンスも結びついていないことを表す この状態で 値 null を保持する変数で インスタンスにアクセスしようとすると エラーがおこる Exception in thread "main" java.lang.nullpointerexception at j2.lesson04.sample1.main(sample1.java: )
14 テーマ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
15 インスタンス ( 実体 ) と参照 前項で述べたように クラスから生成したインスタンスを利用する方法は 実際には インスタンスへの 参照 を用いるので 数値型などの基本型のデータの扱いとは少し異なる場合がある ( なお 配列データも 参照を通して間接的に利用するため 下記で説明する考え方は 配列の 実体 と 参照 の関係と同じである プログラミング入門 1 第 10 回の説明も参考にせよ ) (1) int c0 = 100; int c1 = 100; 基本型変数への代入の例 c0 c1 (2) int c0 = 100; int c1 = c0; 100 c0 c1 = c0; c0 が保持する 100 というデータがコピーされ c1 のデータとなる 結果的に (1)(2) は同じ 100 c1
16 (3) MyCircle c0 = new MyCircle(); MyCircle c1 = new MyCircle(); 参照型変数への代入の例 ca0b6 実体の番号 = ca0b6 ca0c6 実体の番号 = ca0c6 c0 x: 100 y: 100 diameter: 100 c1 x: 100 y: 100 diameter: 100 (4) MyCircle c0 = new MyCircle(); MyCircle c1 = c0; ca0b6 実体の番号 = ca0b6 c0 c1=c0; ca0b6 x: 100 y: 100 diameter: 100 c1
17 (4) MyCircle c0 = new MyCircle(); MyCircle c1 = c0; ca0b6 実体の番号 = ca0b6 x: 100 c0 c1=c0; ca0b6 y: 100 diameter: 100 c1 c0 が保持する参照データがコピーされ c1 のデータとなる コピーされるのは 参照 だけであり インスタンスそのものはコピーされていない すなわち - 前ページ (3) では c0 と c1 がそれぞれ別個のインスタンスを示す異なる値の 参照 を持つ - (4) では c0 と c1 とも同じ値の 参照 を持つ (= 同一のインスタンスを示す ) 参照のコピーが作られた場合 インスタンス変数へ値の書き込みを行う場合に注意が必要 (3)(4) の両者で c1.x = 50; としたときに何が起こるか考えて見よ ( 次ページスライド )
18 (3) MyCircle c0 = new MyCircle(); MyCircle c1 = new MyCircle(); c1.x = 50; ca0b6 c0 実体の番号 = ca0b6 x: 100 y: 100 diameter: 100 ca0c6 (4) MyCircle c0 = new MyCircle(); MyCircle c1 = c0; c1.x = 50; c1 実体の番号 = ca0c6 x: 50 y: 100 diameter: 100 インスタンス変数の内容を書き換える c1.x は 50 c0.x は 100 のまま ca0b6 実体の番号 = ca0b6 x: 50 c0 c1=c0; ca0b6 c1 y: 100 diameter: 100 c1.x は 50 c0.x も 50に変わる c0 と c1 とも同じ値の 参照 を持つ (= 同一のインスタンスを示す )
19 テーマ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
20 メソッドの参照呼び ( メソッド引数の参照渡し ) プログラムの実行中のメソッド呼び出しにおける 引数の受け渡しは 次のように行われる ( プログラミング入門 1 第 4 回 ) (1) メソッドに渡したい値を計算し (2) これをメソッドの引数変数に代入して渡して (3) 呼び出し先で利用する ここで 呼び出そうとするメソッドの引数の型が参照型 ( つまり クラス名 ) である場合は メソッドに渡される値は インスタンスへの 参照 である インスタンスそのものが渡されないことに注意 ( 次ページスライド ) void start() { MyCircle c0 = new MyCircle(); drawmycircle(c0); } ca0b6 void drawmycircle(mycircle c){ Canvas.drawCircle(c.x, c.y, c.diameter) }
21 参照呼び ( 引数の参照渡し ) void start() { MyCircle c0 = new MyCircle(); drawmycircle(c0); } ca0b6 c0 実体の番号 = ca0b6 x: 100 y: 100 diameter: 100 void drawmycircle(mycircle c){ Canvas.drawCircle(c.x, c.y, c.diameter) } c ca0b6 呼び出されたメソッド側には コピーされた参照が渡され それを通して インスタンスにアクセスすることが可能となる
22 テーマ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
23 インスタンスを生成するメソッド (1) 複合データを作る方法は 大雑把には次の過程を経る (1) インスタンスを生成する (2) インスタンス変数に持たせたい値 ( 初期値 ) を代入する ここでは この (1)(2) を一つのメソッドとしてまとめる方法を紹介する 以下の例では MyCircle クラスのインスタンスを生成し 初期値を設定するメソッド createmycircle を作成する MyCircle c0 = new MyCircle(); c0.x = 100; c0.y = 100; c0.diameter = 200; MyCircle c0 = createmycircle(100, 100, 200); MyCircle c1 = createmycircle(200, 200, 200); MyCircle c1 = new MyCircle(); c1.x = 200; c1.y = 200; c1.diameter = 200; C0 X:100 y:100 diameter:200 C1 X:200 y:200 diameter:200 23
24 インスタンスを生成するメソッド 例題 11 より 問題 : (a) MyCircle クラスのインスタンスを 2 つ作成せよ ただし 同一の座標, 直径を持つようにせよ (b) 次にこれらの円をキャンバス上に表示させよ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する ( クラス名 : Ex11TwoCircles)
25 例題 21 25
26 インスタンスを生成するメソッド (2) メソッドの定義の方法 (0) 複合データに含まれる一つ一つのデータを 引数で受け取るように 引数の型を決める 返り値の型は 作成したいインスタンスのクラス名である ( 前回も少し触れたが クラス名は インスタンスの型名の役割も果たす ) メソッド内では (1) インスタンスを生成する (2) 引数で渡されたデータをインスタンス変数に代入する (3) インスタンスを呼び出し元に返す 26
27 インスタンスを生成するメソッド (3) 呼び出し方法複合データに含まれる一つ一つのデータを メソッドの引数に渡してやればよい それを束ねた複合データが返ってくる ( 引数の順番は注意が必要である ) 27
28 インスタンスを生成するメソッド ( まとめ ) このような形でインスタンスを生成させるメソッドは それを呼び出すことで インスタンス ( 製品 ) を生産することができるので ファクトリー ( 工場 ) メソッドとも呼ばれる データとデータを結びつけて 複合データを作成するというプロセスを一つの式 ( メソッド呼び出し式 ) で表現できるため プログラムが分かりやすくなる MyCircle c0 = createmycircle(100, 100, 200); MyCircle createmycircle(int x, int y, int diameter) { MyCircle newobj = new MyCircle(); newobj.x = x; newobj.y = y; newobj.diameter = diameter; return newobj; } Create MyCircle C0 X:100 y:100 diameter:200 28
29 テーマ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
30 インスタンスを要素に持つ配列 (1) 同じ型のデータをまとめて保持する機構に 配列 があった ここで扱うのは 同じクラスから作成した複数のインスタンスを配列を用いてまとめる方法である 30
31 インスタンスを要素に持つ配列 例題 41 より 問題 : クラス Island のインスタンスを 4 個作成するプログラムを作成せよ ただし それぞれのインスタンスは Island 型の配列に格納するようにせよ 返り値の型メソッド名 ( 引数 ) 機能 Island createisland(string name, double area) 各インスタンス変数の値がそれぞれ name と area である Island のインスタンスを作成し 返す ( 前と同じ ) [0] [1] [2] [3] island 名前 : 沖縄島面積 : 名前 : 淡路島面積 : 名前 : 伊豆大島面積 :91.06 名前 : 与那国島面積 :28.91 ( クラス名 : Ex41Island) 31
32 例題 41 32
33 インスタンスを要素に持つ配列 (2) 生成したインスタンスは ある一つの事柄に関する情報を記録した一枚の情報カード ( あるいはデータシート ) と似ている 配列は 同じフォーマットを持つ大量の情報カードを集めて束ね 保持しておくためのデータの貯蓄庫の役割を果たす また 一つ一つの情報カードを簡単に参照することができる 名前 : 沖縄島面積 : [0] [1] [2] [3] 名前 : 淡路島面積 : 名前 : 伊豆大島面積 :91.06 island 名前 : 与那国島面積 :
34 インスタンスを要素に持つ配列 (3) このように集めたデータは 次のような一覧表 ( テーブル ) の形で表すと分かりやすい すなわち 一覧表の中で インスタンスは 1 行分のデータを保持する これをレコードと呼ぶことがある 島データ (island) 名前 面積 沖縄島 淡路島 伊豆大島 与那国島 [0] [1] [2] [3] 名前 : 沖縄島面積 : 名前 : 淡路島面積 : 名前 : 伊豆大島面積 :91.06 island 名前 : 与那国島面積 :
35 例題 42 問題 : ( 例題 41) の拡張 ) 作成した Island クラスのインスタンスの内容を表示せよ 返り値の型メソッド名 ( 引数 ) 機能 Island createisland(string name, double area) void islanddata(island i, int row) 各インスタンス変数の値が name と area である Island のインスタンスを作成し 返す ( 前と同じ ) 引数 i の各インスタンス変数の値の文字列表現を Spreadsheet の row 行に表示する void header() Spreadsheet のヘッダ行を表示する 既存の Ex41Island を編集する ( クラス名 : Ex42Island) 35
36 例題 42 36
37 例題 42 配列を用いることで for 文のインデックス i を用いて配列 island に格納したインスタンスを参照している なお 配列の要素数に変更があったとしても ( 例えば 登録したいデータが増えたとしても ) この部分を変更する必要は無い 37
38 まとめ : クラスとインスタンス (2) インスタンス生成とその利用 ( 詳細 ) インスタンス ( 実体 ) と参照 メソッドの参照呼び インスタンスを生成するメソッド インスタンスを要素に持つ配列
39 本日の例題と問題 MyCircle のインスタンス作成例 Ex10, Ex11, Ex12, Q10, Q11 MyCircle の膨張 収縮の例 Ex21, Ex22, Ex23*, Q20, Q21 Island のインスタンス作成例 Ex30, Ex31, Ex32, Ex33*, Ex34, Q30, Q31, Q32, Q33* インスタンスを格納する配列の作成例 Ex41, Ex42, Ex43, Q12, Q22, Q34, Q35*, (Q41*) (Ex: 例題, Q: 問題, * は少し手間のかかる問題 ) 各自に適した順番で解けばよいが 上記の順番が自然な流れとなるよう構成されている 39
40 例題集
41 パッケージ j2.lesson04 を作成する パッケージやクラスの作成, 実行の仕方の説明は省略する 作り方を忘れた場合は過去のスライドや を参考にせよ
42 例題 10 問題 : 次のクラス MyCircle クラスを作成せよ インスタンス変数初期値説明 int x 無し x 座標 ( ) int y 無し y 座標 ( ) int diameter 無し 円の直径 (x,y) ( クラス名 : MyCircle)
43 例題 10 クラス MyCircle 初期値は無し x: y: diameter:
44 例題 11(1) 問題 : (a) MyCircle クラスのインスタンスを 2 つ作成せよ ただし 同一の座標, 直径を持つようにせよ (b) 次にこれらの円をキャンバス上に表示させよ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する ( クラス名 : Ex11TwoCircles)
45 実行例 45
46 例題 11(1) 2 つのインスタンスを作成 クラス MyCircle 初期値は無し x: y: diameter: c0 x: 100 x: 100 y: 100 x: 100 diameter: 200 c1
47 例題 11(2) 問題 : 例題 11(1) に拡張を加える (a) 一定の時間ののち キャンバスの内容を一度消す (b) 片方のインスタンスの座標を変更せよ (c) 二つの円を描画しなおせ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle createmycircle(int x, int y, int diameter) void drawmycircle( MyCircle c) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する 既存の Ex11TwoCircles を編集する 47
48 実行例 48
49 例題 11(2) c1 のみを変更 49
50 例題 12(1) 問題 : (a) MyCircle クラスのインスタンスを 1 つ作成せよ ( インスタンスを参照する変数名は c0) (b) このインスタンスを別の変数名 c1 で参照させよ ( インスタンスが二つの名前を持つ ) (c) 変数 c0,c1 の両方に対して メソッド drawmycircle を適用せよ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する ( クラス名 : Ex12Circle) 50
51 実行例 51
52 例題 12(1) インスタンスは一つ 52
53 例題 12(2) 問題 : 例題 12(1) に拡張を加える (a) 一定の時間ののち キャンバスの内容を一度消す (b) c1の座標を変更せよ (c) 二つの円を描画しなおせ 上のプログラムを実行した場合 キャンバスにどのような絵が描画されるか予想せよ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する 既存の Ex12Circle を編集する 53
54 実行例 54
55 例題 12(2) c1 のみを変更 のように思えるが c0 と c1 は同じ実体を指しているので 例題 11(2) のようにはならない
56 例題 21 問題 : 円を膨張 ( 収縮 ) させるメソッドを作成し 動作を確かめよ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) expandmycircleby( MyCircle c, double factor) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する MyCircle c のインタスンス変数 diameter の値を factor 倍する ( クラス名 : Ex21ExpandCircle) 56
57 実行例 57
58 例題 21 渡された参照を利用してインスタンスの直径を書き換えている 58
59 例題 22(1) 問題 : (a) MyCircle クラスのインスタンスを 2 つ作成し これをもとに円を描画せよ (b) 次に片方のインスタンスの大きさをメソッド expandmycircleby を用いて変更せよ (c) キャンバスの内容を一度消した後に 二つの円を描画しなおせ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) expandmycircleby( MyCircle c, double factor) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する MyCircle c のインタスンス変数 diameter の値を factor 倍する ( クラス名 : Ex22ExpandCircle) 59
60 実行例
61 例題 22(1) c1 のみを変更
62 例題 22(2) 問題 :(a) MyCircleクラスのインスタンスを1つ作成せよ (b) このインスタンスを別の変数名 c1で参照させよ ( インスタンスが二つの名前を持つ ) (c) キャンバスに2つの円を描画せよ (d) 次にc1のインスタンスの大きさをメソッド expandmycirclebyを用いて変更せよ (e) キャンバスの内容を一度消した後に 2つの円を描画しなおせ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle createmycircle(int x, int y, int diameter) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す void void drawmycircle( MyCircle c) expandmycircleby(mycir cle c, double factor) キャンバスに引数の MyCircle インスタンス c を描画する MyCircle c のインタスンス変数 diameter の値を factor 倍する 既存の Ex22ExpandCircle を編集する
63 実行例
64 例題 22(2) c1 のみを変更 のように見えるが c0 と c1 は同じ実体を指しているので 例題 22(1) のようにはならない
65 例題 23 問題 : 円が拡大していく様子をアニメーションで表現せよ 返り値の型メソッド名 ( 引数 ) 機能 MyCircle void void createmycircle(int x, int y, int diameter) drawmycircle( MyCircle c) expandmycircleby( MyCircle c, double factor) MyCircle クラスのインスタンス変数の値がそれぞれ x,y,diameter である MyCircle インスタンスを作成し 返す キャンバスに引数の MyCircle インスタンス c を描画する MyCircle c のインタスンス変数 diameter の値を factor 倍する ( クラス名 : Ex23ExpandingCircle) 65
66 実行例
67 例題 23
68 例題 30 問題 : 次のクラス Island を作成せよ クラス Island のインスタンスは次のインスタンス変数を持ち 島 の情報を保持する ( 初期値は指定しなくて良い ) インスタンス変数初期値説明 String name 無し島の名前 2 double area 無し島の面積 ( km ) ( クラス名 : Island) 68
69 例題 30 クラス Island 初期値は無し name: area: インスタンス変数初期値説明 String name 無し島の名前 double area 無し島の面積 ( 2 km ) 69
70 例題 31 問題 : クラス Island のインスタンスを 3 個作成するプログラムを作成せよ ただし インスタンスを生成する次のメソッドを作成し これを利用せよ 返り値の型メソッド名 ( 引数 ) 機能 Island createisland(string name, double area) 各インスタンス変数の値がそれぞれ name と area である Island のインスタンスを作成し 返す island0 名前 : 沖縄島面積 : island1 名前 : 淡路島面積 : island2 名前 : 伊豆大島面積 :91.06 ( クラス名 : Ex31Island) 70
71 例題 31 71
72 例題 32 問題 :( 例題 31 の拡張 ) 作成した Island クラスのインスタンスの内容を表示せよ 返り値の型メソッド名 ( 引数 ) 機能 Island createisland(string name, double area) void islanddata(island i, int row) 各インスタンス変数の値が name と area である Island のインスタンスを作成し 返す ( 前のものと同じ ) 引数 i の各インスタンス変数の値の文字列表現を Spreadsheet の row 行に表示する void header() Spreadsheet のヘッダ行を表示する 既存の Ex31Island を編集する ( クラス名 : Ex32Island) 72
73 例題 32 インスタンス生成メソッドを用いたことで main メソッドが分かりやすくなった 73
74 例題 33 問題 :( 例題 32 の拡張 ) 作成した Island クラスのインスタンスの情報をもとにして 島 の名前と 面積に比例する大きさの正方形で表示させよ 返り値の型メソッド名 ( 引数 ) 機能 Island void createisland(string name, double area) drawislandsquare(i sland island) 各インスタンス変数の値が name と area である Island のインスタンスを作成し 返す ( 前のものと同じ ) キャンバスに 島 の名前と 面積に比例する大きさの正方形を描画する 既存の Ex32Island を編集する ( クラス名 : Ex33Island) 74
75 実行結果 75
76 例題 33 76
77 例題 33 補足 : 文字列を表示する機能 (drawstring) Math.sqrt (1206.9) pixel= (20,20) island0 name: 沖縄島 347 (20,20+pixel) = (20, ) area: 文字列の座標の指定は 文字列の左下で行う 沖縄県 77
78 例題 41 問題 : クラス Island のインスタンスを 4 個作成するプログラムを作成せよ ただし それぞれのインスタンスは Island 型の配列に格納するようにせよ 返り値の型メソッド名 ( 引数 ) 機能 Island createisland(string name, double area) 各インスタンス変数の値がそれぞれ name と area である Island のインスタンスを作成し 返す ( 前と同じ ) [0] [1] [2] [3] island 名前 : 沖縄島面積 : 名前 : 淡路島面積 : 名前 : 伊豆大島面積 :91.06 名前 : 与那国島面積 :28.91 ( クラス名 : Ex41Island) 78
79 例題 41 79
80 例題 42 問題 : ( 例題 41) の拡張 ) 作成した Island クラスのインスタンスの内容を表示せよ 返り値の型メソッド名 ( 引数 ) 機能 Island createisland(string name, double area) void islanddata(island i, int row) 各インスタンス変数の値が name と area である Island のインスタンスを作成し 返す ( 前と同じ ) 引数 i の各インスタンス変数の値の文字列表現を Spreadsheet の row 行に表示する void header() Spreadsheet のヘッダ行を表示する 既存の Ex41Island を編集する ( クラス名 : Ex42Island) 80
81 例題 42 81
82 例題 42 配列を用いることで for 文のインデックス i を用いて配列 island に格納したインスタンスを参照している なお 配列の要素数に変更があったとしても ( 例えば 登録したいデータが増えたとしても ) この部分を変更する必要は無い 82
83 例題 43 問題 :( 例題 42 の拡張 ) 作成した Island クラスのインスタンスの情報をもとにして 島 の名前と 面積に比例する大きさの正方形で表示させよ 返り値の型メソッド名 ( 引数 ) 機能 Island void createisland(string name, double area) drawislandsquare(i sland island) 各インスタンス変数の値が name と area である Island のインスタンスを作成し 返す ( 前のものと同じ ) キャンバスに 島 の名前と 面積に比例する大きさの正方形を描画する ( 前のものと同じ ) 既存の Ex42Island を編集する ( クラス名 : Ex43Island) 83
84 実行結果 84
85 例題 43 85
プログラミング入門1
プログラミング入門 2 第 8 回表形式データ (1) 1 テーマ : 表形式データ (1) 配列と複合データを用いた表形式データ データの登録 データの検索 データの更新 実際的はソフトウェアでは 表形式データの ( 例えば データベースのデータ ) を利用する場面が非常に多く とても重要である そこで 表形式を扱うプログラミングを繰り返しとりあげる 2 テーマ : 表形式データ (1) 配列と複合データを用いた表形式データ
プログラミング基礎I(再)
山元進 クラスとは クラスの宣言 オブジェクトの作成 クラスのメンバー フィールド 変数 配列 メソッド メソッドとは メソッドの引数 戻り値 変数の型を拡張したもの 例えば車のデータベース 車のメーカー 車種 登録番号などのデータ データベースの操作 ( 新規データのボタンなど ) プログラムで使う部品の仕様書 そのクラスのオブジェクトを作ると初めて部品になる 継承 などの仕組みにより カスタマイズが安全
Javaプログラムの実行手順
戻り値のあるメソッド メソッドには 処理に使用する値を引数として渡すことができました 呼び出し 側からメソッドに値を渡すだけでなく 逆にメソッドで処理を行った結果の値を 呼び出し側で受け取ることもできます メソッドから戻してもらう値のことを もどりち戻り値といいます ( 図 5-4) 図 5-4. 戻り値を返すメソッドのイメージ 戻り値を受け取ることによって ある計算を行った結果や 処理に成功したか失
た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name
クラス ( 教科書第 8 章 p.267~p.297) 前回は処理をまとめる方法として メソッドについて学習した 今回はメソッドとその処理の対象となるデータをまとめるためのクラスについて学習する このクラスはオブジェクト指向プログラミングを実現するための最も重要で基本的な技術であり メソッドより一回り大きなプログラムの部品を構成する 今回はクラスにおけるデータの扱いとクラスの作成方法 使用方法について説明していく
(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド
メソッド ( 教科書第 7 章 p.221~p.239) ここまでには文字列を表示する System.out.print() やキーボードから整数を入力する stdin.nextint() などを用いてプログラムを作成してきた これらはメソッドと呼ばれるプログラムを構成する部品である メソッドとは Java や C++ などのオブジェクト指向プログラミング言語で利用されている概念であり 他の言語での関数やサブルーチンに相当するが
JavaプログラミングⅠ
Java プログラミング Ⅰ 12 回目クラス 今日の講義で学ぶ内容 クラスとは クラスの宣言と利用 クラスの応用 クラス クラスとは 異なる複数の型の変数を内部にもつ型です 直観的に表現すると int 型や double 型は 1 1 つの値を管理できます int 型の変数 配列型は 2 5 8 6 3 7 同じ型の複数の変数を管理できます 配列型の変数 ( 配列変数 ) クラスは double
プログラミング入門1
プログラミング入門 2 第 1 回プログラミングの復習 ログオン ( システムに入る ) 授業開始前にログオンする Web ブラウザを起動して以下の URL を開いてみよう http://java2011.cis.k.hosei.ac.jp/ 以下の情報の入力が必要なので確認 ユーザ ID パスワード 他人に教えるのはユーザの義務違反 周りを見回して困っている人がいたら助けてやってください 2 今日の講義のテーマ
Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問
Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問のメソッドを追加する public static void main(string[] args) {
/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){
ソフトゼミ A 第 6 回 関数 プログラムは関数の組み合わせでできています 今までのゼミAでも printf や scanf など様々な関数を使ってきましたが なんと関数は自分で作ることもできるのです!! 今日は自作関数を中心に扱っていきます ゲーム制作でも自作関数は避けては通れないので頑張りましょう そもそもまず 関数とは 基本的には 受け取った値に関数によって定められた操作をして その結果の値を返す
Microsoft PowerPoint - 09.pptx
情報処理 Ⅱ 第 9 回 2014 年 12 月 22 日 ( 月 ) 関数とは なぜ関数 関数の分類 自作関数 : 自分で定義する. ユーザ関数 ユーザ定義関数 などともいう. 本日のテーマ ライブラリ関数 : 出来合いのもの.printf など. なぜ関数を定義するのか? 処理を共通化 ( 一般化 ) する プログラムの見通しをよくする 機能分割 ( モジュール化, 再利用 ) 責任 ( あるいは不具合の発生源
基本情報STEP UP演習Java対策
トレーニング編 1. 予約語 extends アクセスレベル class サブクラス名 extends スーパクラス名 { (1) スーパクラス ( 既存のクラス ) を拡張して, サブクラス ( 新しいクラス ) を定義する場合に extends を利用する (2) extends の後ろには, スーパクラスの名前を一つだけ指定できる (3) サブクラスからインスタンスを生成すると, スーパクラスに定義されたインスタンス変数やメソッドがこのインスタンス内部に引き継がれる
Microsoft Word - VBA基礎(6).docx
あるクラスの算数の平均点と理科の平均点を読み込み 総点を計算するプログラムを考えてみましょう 一クラスだけ読み込む場合は test50 のようなプログラムになります プログラムの流れとしては非常に簡単です Sub test50() a = InputBox(" バナナ組の算数の平均点を入力してください ") b = InputBox(" バナナ組の理科の平均点を入力してください ") MsgBox
PowerPoint プレゼンテーション
オブジェクト指向 プログラミング演習 第 4 回継承 オーバーライド ポリモルフィズム 今日のお題 継承 オーバーライド ポリモルフィズム 継承 (inherit) あるクラス c のサブクラス s を定義する : このとき s は c を継承していると言う 何かの下位概念を表すクラスは その上位概念を表すクラスの属性や機能を ( 基本的には ) 使える 継承の例 大学生 長崎県立大学の学生 大学生を継承する概念
PowerPoint プレゼンテーション
プログラマー勉強会 1 回 basic.h 補足 [ 修飾子 ] const 付けた変数は初期化以外で値を設定することができなくなる 定数宣言に使う unsigned 付けた変数は符号がなくなり 正の値しか設定できない [ 条件コンパイル ] #ifdef M ここ以前に M がマクロとして定義されていれば ここ以下をコンパイルする #ifndef M ここ以前に M というマクロが定義されていなければ
02: 変数と標準入出力
C プログラミング入門 基幹 7 ( 水 5) 13: 構造体 Linux にログインし 以下の講義ページを開いておくこと http://www-it.sci.waseda.ac.jp/ teachers/w483692/cpr1/ 2016-07-06 1 例題 : 多角形の面積 n = 5 (5 角形 ) の例 n 1 n 1 1 p 1 T 0 S = i=0 p 0 T i = i=0 2
Microsoft PowerPoint - chap10_OOP.ppt
プログラミング講義 Chapter 10: オブジェクト指向プログラミング (Object-Oriented Programming=OOP) の入り口の入り口の入り口 秋山英三 F1027 1 例 : 部屋のデータを扱う // Test.java の内容 public class Test { public static void main(string[] args) { double length1,
ガイダンス
情報科学 B 第 2 回変数 1 今日やること Java プログラムの書き方 変数とは何か? 2 Java プログラムの書き方 3 作業手順 Java 言語を用いてソースコードを記述する (Cpad エディタを使用 ) コンパイル (Cpad エディタを使用 ) 実行 (Cpad エディタを使用 ) エラーが出たらどうしたらよいか??? 4 書き方 これから作成する Hello.java 命令文 メソッドブロック
Javaセキュアコーディングセミナー2013東京第1回 演習の解説
Java セキュアコーディングセミナー東京 第 1 回オブジェクトの生成とセキュリティ 演習の解説 2012 年 9 月 9 日 ( 日 ) JPCERT コーディネーションセンター脆弱性解析チーム戸田洋三 1 演習 [1] 2 演習 [1] class Dog { public static void bark() { System.out.print("woof"); class Bulldog
JAVA入門
JAVA 入門後期 10 情報処理試験例題解説 H14 年度秋問 8 次の Java プログラムの説明及びプログラムを読んで, 設問に答えよ プログラムの説明 ディジタル論理回路シミュレータを作成するためのクラスとテスト用クラスである (1) ゲートを表す抽象クラス Gate のサブクラスとして, NOT ゲートを表すクラス NotGate 及び AND ゲートを表すクラス AndGate を定義する
プログラミング実習I
プログラミング実習 I 05 関数 (1) 人間システム工学科井村誠孝 [email protected] 関数とは p.162 数学的には入力に対して出力が決まるもの C 言語では入出力が定まったひとまとまりの処理 入力や出力はあるときもないときもある main() も関数の一種 何かの仕事をこなしてくれる魔法のブラックボックス 例 : printf() 関数中で行われている処理の詳細を使う側は知らないが,
Microsoft PowerPoint - lec10.ppt
今日の内容, とポインタの組み合わせ, 例題 1. 住所録例題 2. と関数とは. を扱う関数. 例題 3. のリスト とポインタの組み合わせ 今日の到達目標 自分で を定義する 自分で定義したについて, 配列やポインタを作成する データ型 基本データ型 char 文字 (1 文字 ) int 整数 double 浮動小数など その他のデータ型配列 データの並び ( 文字列も, 文字の並び ) ポインタ
Java講座
~ 第 1 回 ~ 情報科学部コンピュータ科学科 2 年竹中優 プログラムを書く上で Hello world 基礎事項 演算子 構文 2 コメントアウト (//, /* */, /** */) をしよう! インデントをしよう! 変数などにはわかりやすい名前をつけよう! 要するに 他人が見て理解しやすいコードを書こうということです 3 1. Eclipse を起動 2. ファイル 新規 javaプロジェクト
JavaプログラミングⅠ
Java プログラミング Ⅱ 8 回目抽象クラスとインタフェース課題 確認 問題次の各文は正しいか誤っているか答えなさい (1) 抽象クラスのオブジェクトは生成できる (2) 抽象メソッドとはメソッドの本体が未定義のメソッドである (3) 抽象メソッドをメンバーにもつクラスは抽象クラスである (4) 抽象クラスを拡張してすべての抽象メソッドをオーバーライドすれば サブクラスのオブジェクトを生成できる
gengo1-11
関数の再帰定義 自然数 n の階乗 n! を計算する関数を定義してみる 引数は整数 返却値も整数 n! = 1*2*3*... * (n 1)*n である ただし 0! = 1 とする int factorial(int n) int i, tmp=1; if( n>0 ) for(i=1; i
PowerPoint Presentation
ソフトウェア演習 B GUI を持つ Java プログラムの 設計と実装 4.1 例題 :GUI を持った電卓を作ろう プロジェクトCalculator パッケージ名 :example ソースファイル : Calculator.java GUI.java EventProcessor.java 2 4.2 GUI とイベント処理 GUI の構成 :Swing GUI の場合 フレーム JFrame:
第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ
第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイルの作成方法 コンパイル方法について説明します IDL ファイルの作成にあたっては INTERSTAGE
バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科
バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科 ポインタ変数の扱い方 1 ポインタ変数の宣言 int *p; double *q; 2 ポインタ変数へのアドレスの代入 int *p; と宣言した時,p がポインタ変数 int x; と普通に宣言した変数に対して, p = &x; は x のアドレスのポインタ変数 p への代入 ポインタ変数の扱い方 3 間接参照 (
Taro-ポインタ変数Ⅰ(公開版).j
0. 目次 1. ポインタ変数と変数 2. ポインタ変数と配列 3. ポインタ変数と構造体 4. ポインタ変数と線形リスト 5. 問題 問題 1 問題 2-1 - 1. ポインタ変数と変数 ポインタ変数には 記憶領域の番地が格納されている 通常の変数にはデータが格納されている 宣言 int *a; float *b; char *c; 意味ポインタ変数 aは 整数型データが保存されている番地を格納している
コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?
Copyright (C) Junko Shirogane, Waseda University 2016, All rights reserved. 1 プログラミング初級 (Java) 第 10 回オブジェクト指向って? 白銀純子 Copyright (C) Junko Shirogane, Waseda University 2016, All rights reserved. 2 第 10
メソッドのまとめ
メソッド (4) 擬似コードテスト技法 http://java.cis.k.hosei.ac.jp/ 授業の前に自己点検以下のことがらを友達に説明できますか? メソッドの宣言とは 起動とは何ですか メソッドの宣言はどのように書きますか メソッドの宣言はどこに置きますか メソッドの起動はどのようにしますか メソッドの仮引数 実引数 戻り値とは何ですか メソッドの起動にあたって実引数はどのようにして仮引数に渡されますか
Microsoft PowerPoint ppt
基礎演習 3 C 言語の基礎 (5) 第 05 回 (20 年 07 月 07 日 ) メモリとポインタの概念 ビットとバイト 計算機内部では データは2 進数で保存している 計算機は メモリにデータを蓄えている bit 1bit 0 もしくは 1 のどちらかを保存 byte 1byte 1bitが8つ集まっている byte が メモリの基本単位として使用される メモリとアドレス メモリは 1byte
PowerPoint プレゼンテーション
講座準備 講座資料は次の URL から DL 可能 https://goo.gl/jnrfth 1 ポインタ講座 2017/01/06,09 fumi 2 はじめに ポインタはC 言語において理解が難しいとされる そのポインタを理解することを目的とする 講座は1 日で行うので 詳しいことは調べること 3 はじめに みなさん復習はしましたか? 4 & 演算子 & 演算子を使うと 変数のアドレスが得られる
Microsoft Word - Cプログラミング演習(12)
第 12 回 (7/9) 4. いくつかのトピック (5)main 関数の引数を利用したファイル処理 main 関数は, 起動する環境から引数を受け取ることができる 例えば 次に示すように,main 関数に引数を用いたプログラムを作成する 01 /* sample */ 02 /* main 関数の引数 */ 03 #include 04 05 main(int argc, char
プログラミング実習I
プログラミング実習 I 03 変数と式 人間システム工学科井村誠孝 [email protected] 3.1 変数と型 変数とは p.60 C 言語のプログラム中で, 入力あるいは計算された数や文字を保持するには, 変数を使用する. 名前がついていて値を入れられる箱, というイメージ. 変数定義 : 変数は変数定義 ( 宣言 ) してからでないと使うことはできない. 代入 : 変数には値を代入できる.
オブジェクト指向プログラミング・同演習 5月21日演習課題
オブジェクト指向プログラミング 同演習 5 月 21 日演習課題 問題 1 配列の例外処理例外が発生する可能性のある処理を try で囲み その後に catch で例外を捕捉します 例外処理の終了処理として finally が行われます これは書かなくて自動的に行われます 提出課題 1 (Kadai052301.java) 以下のプログラムは例外処理をしていない ArrayIndexOutOfBoundsException
C#の基本2 ~プログラムの制御構造~
C# の基本 2 ~ プログラムの制御構造 ~ 今回学ぶ事 プログラムの制御構造としての単岐選択処理 (If 文 ) 前判定繰り返し処理(for 文 ) について説明を行う また 整数型 (int 型 ) 等の組み込み型や配列型についても解説を行う 今回作るプログラム 入れた文字の平均 分散 標準偏差を表示するプログラム このプログラムでは calc ボタンを押すと計算を行う (value は整数に限る
