コンピュータプログラミング B 補 助 教 材 (5) 2015.04 諸 注 意 課 題 レポートの 書 き 方 一 般 にこの 授 業 のレポートでは, まず 課 題 を 自 分 の 言 葉 で 再 現 し, ソースプログラム, 実 行 結 果, 考 察 ( 場 合 により 感 想 もあってよいです. なお 考 察 は 感 想 とは 意 味 が 全 く 違 います)という 構 成 で 書 くのがよいです. 短 いものなら 簡 略 化 しても 構 わないですが. 他 のレポート 類 も 同 じ ですが, " 見 ればわかるでしょう 的 に 何 の 説 明 もなく 素 材 的 なもの( 出 力 結 果 など)を 生 のま まで 提 出 するのは です. 一 般 にレポート 類 は 分 っていない 相 手 に 分 らせてあげるという 形 式 で 書 きます. 学 びの 場 では 受 け 取 る 側 は 大 抵 知 っていることでも 練 習 のためそうするのです. 前 回 課 題 解 説 第 4 回 課 題 1. オンラインドキュメント 2.12(ソースコードのクラス 図 からの 導 出 )のクラス 図 とソースプ ログラムをよく 見 比 べて, クラス 図 からソースプログラムを 機 械 的 導 出 できるようにしなさい. 2. オンラインドキュメント 2.18 演 習 2-5 に 従 い Teacher のクラス 図 からプログラムを 機 械 的 に 導 出 しなさい. 解 答 1. ( 略 ) 2. これは 実 質 2.10 13 の 復 習 です. オンラインドキュメント 参 照.3. Teacher name:string id:string salary:int Teacher(id:String,name:String) getname():string getid():string getsalary():int setsalary(salary:int):void まず 1 番 上 の 欄 (クラス)を 見 るとクラス 名 が Teacher と 分 かるので 次 のように 入 力 します: 5-1
18 ここにクラスは( 当 分 の 間 )public とします. 次 に 2 番 目 の 欄 に 状 態 ( 属 性, 内 部 変 数, フィールド)が 与 えられているのでそれを 入 れます, ここに 変 数 は( 当 分 の 間 )private とします: 例 えば name:string に 対 応 して private String name; とします. 結 果 : 18 3 番 目 の 欄 を 見 ると 振 る 舞 い(メソッド)が 規 定 されています. 最 初 の Teacher(id:String, name:string)はクラスと 同 じ 名 前 なので, 特 別 な 振 る 舞 いコンストラクタです. 一 般 的 に 振 る 舞 いは( 当 分 の 間 )public とします. 呼 び 出 すときの 引 数 として String 型 の id と String 型 の name が 定 められています, またコンストラクタは 返 却 値 を 指 定 しません. そこで 先 頭 部 分 は public Teacher(String id, String name) となり, クラス 図 にはこれ 以 上 の 情 報 はないの で: 5 public Teacher(String id, String name){ 18 と 入 力 します. なお, 引 数 の 区 切 りの, (カンマ)の 直 後 には 必 ず (スペー ス)を 入 れるようにします. またカンマの 前 後 にスペースを 入 れる 人 もいますが 直 後 だけでよ いです. これは 文 法 的 には 意 味 がありませんが, 見 みやすくするためのルールです. ( 資 料 類 を 注 意 深 く 見 てください, このルール 通 りのはず, なお 英 語 の 通 常 の 文 ではこのルールになって います). 次 の 振 る 舞 い(メソッド)getName は, 先 頭 部 分 は 返 却 値 が String 型 と 決 められているので, 名 前 の 前 に public String を 付 け, また 引 数 はないので 名 前 の 後 を()とし, public String getname()とします. また 返 却 値 String に 対 し, 機 械 的 導 出 では null を 返 すよ うにします( 整 数 を 返 す 場 合 は 0 を),クラス 図 にはこれ 以 上 の 情 報 はないので: 5-2
5 public Teacher(String id, String name){ 7 public String getname(){ 8 return null; 9 18 次 の getid も 同 様 にして: 5 public Teacher(String id, String name){ 7 public String getname(){ 8 return null; 9 10 public String getid(){ 11 return null; 12 18 getsalary については, 返 却 値 の 型 が int となっているので 対 応 して return 0; を 入 れます: 5 public Teacher(String id, String name){ 7 public String getname(){ 8 return null; 5-3
9 10 public String getid(){ 11 return null; 12 13 public int getsalary(){ 14 return 0; 15 18 setsalary については void とあるので 返 却 値 を 持 ちません, よって: 5 public Teacher(String id, String name){ 7 public String getname(){ 8 return null; 9 10 public String getid(){ 11 return null; 12 13 public int getsalary(){ 14 return 0; 15 16 public void setsalary(int salary){ 17 18 以 上 で 機 械 的 導 出 が 終 りました. 少 し 慣 れればプログラムそのものがどう 動 くか 何 も 意 識 しな いでも( 分 からなくとも) 機 械 的 導 出 はできます. それができればプログラムは 形 式 的 には 動 い たことになります. なお, 上 記 のプログラムは main がないので 直 接 には 実 行 できません( 無 理 に 実 行 すればエラーになります). また, 今 回 実 行 結 果 は 求 められていません. 以 下 の 解 答 例 は クラス 図 からプログラムを 機 械 的 に 導 出 せよ という 設 問 の 答 としては 誤 り 5-4
です. public class Teacher{ private String name; private String id; private int salary; public Teacher(String id, String name){ this.id = id; this.name = name; public String getname(){ return this.name; public String getid(){ return this.id; public int getsalary(){ return this.salary; public static void setsalary(int salary){ 太 字 で 下 線 を 付 けた 部 分 はクラス 図 からは 読 み 取 ることができません. よってこのような 機 械 的 導 出 はできません. ( 次 の 段 階 でこう 書 くのはあってよいですが) 機 械 的 導 出 では this を 使 ってはいけないと 覚 えておいてください. 機 械 的 導 出 の 意 義 機 械 的 導 出 は 文 字 通 り 何 も 考 えないでクラス 図 に 表 現 されているものを 何 も 足 さない, 何 も 引 かないで, できるだけ 忠 実 に 機 械 的 にプログラム 化 し, 形 式 的 にプログラムの 入 力 ( 引 数 )と 出 力 ( 返 却 値 )を クラス 図 に 従 うようにするものです. 中 で 実 際 にどのように 求 められるプログラ ムの 動 作 (API で 示 されるのが 普 通 )をさせるようにするか( 実 装 するといいいます)は 一 つに 定 まったやり 方 があるとは 限 りません. そこで 機 械 的 導 出 ではプログラムの 中 身 自 体 には 立 ち 入 りません( 書 かない, 書 いてはダメ). よくあるコンストラクタの 引 数 を 使 って 5-5
機 械 的 導 出 によって 混 じりけのない 純 粋 なプログラムの 骨 組 み 部 分 がで き, 確 認 できます. それなりに 意 味 のあるものなので 確 実 に 導 出 してください. なお, 試 験 時 に 機 械 的 導 出 せよとの 設 問 に 正 しく 答 えない 場 合 は 大 幅 に 減 点 されるので 注 意 してくだ さい. ほかのことがほとんど 分 っていなくても 機 械 的 導 出 が 完 璧 にできれば 50 点 は 取 れます. 逆 にほかがどんなによくできていても 機 械 的 導 出 ができていなければ 合 格 点 は 望 めません. 機 械 的 導 出 時 の 返 却 値 について(まとめ) 返 却 値 が int なら return 0; とする.( 参 考 : 一 般 に 返 却 値 の 型 が 基 本 型 ( 授 業 で 出 て 来 る 範 囲 なら int のほか boolean, またなじみやすいものとして double)な ら そ の 型 の 初 期 値 と し て 規 定 されているものを 入 れます, boolean のとき false, double なら 0.0) 返 却 値 が 参 照 型 ( 基 本 型 でないもの)のときは return null; とする( 参 考 : 参 照 型 に 規 定 さ れている 初 期 値 は null です). String のときもこのルールに 従 い null とする. コンピュータ プログラミング A では String のとき return ""; としていましたが, このルールを 変 えます(B の 授 業 で 首 尾 一 貫 させるため). 試 験 のときなどに 注 意 してください. 一 口 メモ クラス 名, 変 数 名 クラス 名 は 大 文 字, 変 数 名 や 振 る 舞 い 名 は 小 文 字 ではじめるのが 原 則 です( 文 法 上 は 自 由 です が). 複 数 の 単 語 からなるクラス 名 や 変 数 名 は, 先 頭 以 外 について 各 単 語 の 先 頭 の 文 字 を 大 文 字 にするのが 原 則 です. クラス 名 の 例 ConcreteBall 変 数 名 の 例 playerhand 振 る 舞 い 名 の 例 getsalary 任 意 課 題 1. 各 自 の 考 える"もの" ( 前 回 と 同 じでも 別 のものでもよい)についてクラス 図 を 作 成 しクラス 図 からプログラムを 機 械 的 に 導 出 しなさい. 解 答 例 5-6
Fish name:string color:string Fish(name:String, color:string) getname():string getcolor():string 1 public class Fish{ 3 private String color; 4 public Fish(String name, String color){ 5 7 public String getname(){ 8 return null; 9 10 public String getcolor(){ 11 return null; 12 13 2. 上 記 の 動 作 を 確 認 するプログラムを 作 って 確 認 しなさい. 下 記 のような main プログラムを 書 いて( 形 式 的 な) 実 行 結 果 を 得 ることができます. プログラム B2_32.java 1 public class B2_32{ 2 public static void main(string[] args){ 3 Fish fish1 = new Fish("ブラックバス", " 黒 "); 4 Fish fish2 = new Fish("ヘラブナ", " 銀 "); 5 System.out.println(fish1.getName()); 6 System.out.println(fish2.getName()); 7 8 5-7
9 実 行 結 果 $ java B2_32 null null 3. 実 際 に 意 味 のあるプログラムに 直 したプログラムを 作 り 動 作 を 確 かめなさい. B2_32.java 1 public class B2_32{ 2 public static void main(string[] args){ 3 Fish fish1 = new Fish("ブラックバス", " 黒 "); 4 Fish fish2 = new Fish("ヘラブナ", " 銀 "); 5 System.out.println(fish1.getName()); 6 System.out.println(fish2.getName()); 7 8 実 行 結 果 > java B2_32 ブラックバス ヘラブナ 一 口 メモ インスタンス 変 数 とは: オンラインドキュメントにはオブジェクトの 状 態 と 表 現 されていることが 多 いです( 他 の 表 記 法 : フィールド, 属 性 ). 個 々のオブジェクトの 特 性 ( 属 性 )を 表 す 変 数. 例 えば Student のオ ブジェクトなら 名 前, id 番 号 などをいいます. コンストラクタとは: クラス(オブジェクト 製 造 機, 設 計 図 )には 名 前, 状 態, 振 る 舞 いがあります. コンストラクタ は 振 る 舞 い( 一 般 のものはメソッドと 呼 ばれます)の 特 別 のもので 個 々のオブジェクト(インス タンス)を 作 り 出 すときに 動 作 するもの. プログラム 中 new クラス 名 と 書 いてあるところで 5-8
呼 び 出 されます. メソッドとは: オンラインドキュメントには 振 る 舞 いと 書 いてあることが 多 いですが 同 じ 意 味 です. プログラ ム 中 で 呼 ばれると 個 々のオブジェクト(インスタンス)に 関 して 何 らかの 定 められた 動 作 をして 結 果 を 返 します( 返 さない 場 合 もある). 引 数 (ひきすう)で 変 数 の 値 を 渡 され, 結 果 は 返 却 値 と して 返 します. void とは: 一 般 には 何 もないとか, 無 効 という 意 味. Java 言 語 の 返 却 値 の 型 名 を 指 定 する 場 所 に void と 記 されていると 返 却 値 がないという 意 味 となります. private とは Java 言 語 では, 公 開 しないことを 意 味 します. 状 態 や 振 る 舞 い(メソッド)を 定 義 するときに 付 加 されると, (そのクラスの 中 からではない) 外 からのアクセスを 認 めないことを 意 味 します. public とは: Java 言 語 では, 公 開 することを 意 味 します. 状 態 や 振 る 舞 い(メソッド)を 定 義 するときに 付 加 されると, そのクラスの 外 からのアクセスを 認 めることを 意 味 します. this とは Java 言 語 では 一 般 にあるプログラムから 他 のプログラムの 状 態 (フィールド)や 振 る 舞 い(メ ソッド)を 参 照 できます. このときの 形 式 がオブジェクト 名. 状 態 名 (または 振 る 舞 い 名 )です. 自 分 自 身 の 状 態 や 振 る 舞 いを 参 照 したいときオブジェクト 名. の 部 分 を 省 略 しても 参 照 できま すが 丁 寧 には this. 状 態 名 (または 振 る 舞 い 名 )で 参 照 します.この this はオブジェクト 自 分 自 身 という 意 味 です. 例 this.name (name という 状 態 を 持 っているとき) クラスとオブジェクトの 違 い: クラスはオブジェクト(インスタンス)の 製 造 機 設 計 図 です. 作 り 出 される(コンストラクタ を 呼 ぶことにより)ものが 個 々のオブジェクトです. ( 上 記 の 項 目 はアンケートの 内 容 に 対 応 していますが, ここに 書 いてあることを 字 面 で 理 解 し ただけでは 本 当 の 意 味 で 理 解 したとはいえません. 実 際 のプログラム 作 りに 活 かされてはじめ て 本 当 に 分 ったことになります. ただ, アンケートには 字 面 の 意 味 が 一 応 分 ったなら yes と 答 えて 構 いません) 機 械 的 導 出 のルールの 違 い(コンピュータプログラミング A と B の 違 い) コ ン ピ ュ ー タ プ ロ グ ラ ミ ン グ A でしっかり 機 械 的 導 出 ができていたはずの 人 が, 今 期 の 機 械 的 導 出 では 微 妙 にルールが 変 わって 戸 惑 ったかと 思 います( 例 : 振 る 舞 いの 名 前 のところに 通 例 付 5-9
けていた static がなくなりました). ここではまず 一 旦 今 までのルールは 忘 れ 新 しいルールを 素 直 に 覚 えてください. (なお, main メソッド( 振 る 舞 い)は 従 来 と 同 じで static を 付 けます.) 本 当 は 今 までのルールが 無 効 になったのではなく, ある 限 られた 情 況 では 依 然 有 効 で, 最 終 的 には 今 までのルールも 新 しいルールも 混 在 させて 使 うことになるのです. ただ, 今 の 段 階 で 細 かに 説 明 すると 混 乱 するのであえて 避 けているのです. どうしても 知 りたい 人 は 下 記 を 参 照 するか 個 人 的 に 質 問 してください. static について static は 変 数 (フィールド)や 振 る 舞 い(メソッド)に 付 けます. これがあるとその 変 数 や 振 る 舞 いはクラスに 付 属 することになります. つまりクラスが 動 く 状 態 になったときすぐ 使 える 状 態 になります. static な 変 数 や 振 る 舞 いは 同 じものについて 1 つ しかありません. static がない 場 合, 変 数 や 振 る 舞 いはオブジェクトに 付 属 します. そのためクラスに 基 づいて オブジェクトを 作 った 後 で 有 効 になります. オブジェクトに 付 属 するので, オブジェクトの 数 だけ 存 在 します. コンピュータプログラミング A では static な 振 る 舞 いしか 出 てきませんでした. 理 由 はクラス からオブジェクトを 作 るという 概 念 抜 きで 話 を 進 めるためです. 逆 に B では static な 振 る 舞 い はほとんど 出 てきません(main を 除 いて). その 先 は static ありもなしも 混 ぜて 使 うというのがあるのですが, B の 範 囲 内 ではそういうこ とはありません. 詳 しく 知 りたければ B が 終 わる 頃 また 質 問 するか 勉 強 するかしてください. 5-10