2010 年 度 森 田 ゼミ プログラミングトレーニング 第 2 段 階 Ⅱ 課 題 2-1 うるう 年 の 判 定 次 のように 入 力 した 年 がうるう 年 かどうかを 判 定 するプログラムを 作 って 下 さい プログラムを 起 動 すると 次 の 画 面 が 現 れま す 入 力 欄 に 調 べたい 西 暦 年 を 入 力 し [ 閏 年 判 定 ]ボタンを 押 すと 判 定 メッセージが 表 示 されます 左 はうるう 年 ではない 場 合 これは うるう 年 の 場 合 うるう 年 の 条 件 は 以 下 の 通 りです 1 4の 倍 数 の 年 はうるう 年 2 しかし 100 の 倍 数 はうるう 年 ではない 3 ただし 400 の 倍 数 の 場 合 はうるう 年 9
課 題 2-2 基 準 日 からの 日 数 計 算 次 のように 入 力 した 年 月 日 が 2000 年 12 月 31 日 から 何 日 後 あるいは 何 日 前 かを 表 示 するプログラムを 作 って 下 さい プログラムを 起 動 すると 次 のような 画 面 が 現 れ ます 年 月 日 を 入 力 して [ 日 数 計 算 ]ボタンを 押 すと 基 準 日 (2000 年 12 月 31 日 )からの 経 過 日 数 が 表 示 されます 左 は 基 準 日 以 後 の 場 合 これは 基 準 日 以 前 の 場 合 日 数 を 計 算 する 際 には 途 中 の 経 過 年 がうるう 年 かどうかを 判 定 する 必 要 があります 10
課 題 2-3 曜 日 の 計 算 上 の2つのプログラムを 応 用 して 次 のように 入 力 した 年 月 日 が 何 曜 日 かを 表 示 する プログラムを 作 って 下 さい プログラムを 起 動 すると 次 の 画 面 が 現 れます 年 月 日 を 入 力 して[ 曜 日 計 算 ]ボタンを 押 すと その 日 が 何 曜 日 であるかが 表 示 されます これも 実 行 結 果 の 一 例 です < 考 え 方 > 1 どこかある 基 準 日 を 決 める 例 えば 2000 年 12 月 31 日 の 日 曜 日 を 基 準 日 とする 2 基 準 日 から( 曜 日 を 調 べたい 日 まで)の 日 数 を 計 算 する 3 その 日 数 を7で 割 ったときの 余 りで 曜 日 は 決 まる 例 ) 2001 年 1 月 13 日 の 場 合 1 基 準 日 からの 日 数 は 13 日 2 13 を7で 割 った 時 の 余 りは6 3 従 って 基 準 日 から6つ 曜 日 が 進 んだ 土 曜 日 となる 基 準 日 より 過 去 にさかのぼる 場 合 は 曜 日 の 進 行 方 向 が 逆 となるので 注 意 11
課 題 2-4 元 号 変 換 次 のように 西 暦 を 入 力 し [ 元 号 変 換 ]キーをクリックすると 対 応 する 元 号 が 表 示 さ れるプログラムを 作 成 してください 変 換 したい 年 月 日 を 西 暦 年 で 入 力 する [ 元 号 変 換 ]をクリックすると 該 当 する 元 号 に 変 換 して 表 示 される 明 治 以 前 の 年 月 日 を 入 力 して[ 元 号 変 換 ] ボタンを 押 した 場 合 元 号 と 年 は ****** と 表 示 される 明 治 以 降 の 元 号 と 西 暦 との 対 応 は 次 の 通 りです 明 治 1868 年 9 月 8 日 ~1912 年 7 月 29 日 大 正 1912 年 7 月 30 日 ~1926 年 12 月 24 日 昭 和 1926 年 12 月 25 日 ~1989 年 1 月 7 日 平 成 1989 年 1 月 8 日 ~ 12
この[ 元 号 変 換 ]ボタンクリック 時 のイベントハンドラを 次 の 通 りとします 西 暦 年 月 日 のテキストフィールドの name プロパティはプログラムから 明 白 でしょう void jbutton1actionperformed(actionevent evt) { int Year=Integer.parseInt(jTextFieldYear.getText()); int Month=Integer.parseInt(jTextFieldMonth.getText()); int Day=Integer.parseInt(jTextFieldDay.getText()); GengouCalc(Year,Month,Day); // 元 号 に 変 換 して 表 示 する } ここに 元 号 に 変 換 して 表 示 するメソッド GengouCalc は 新 たに 作 ったものです これ を 次 のように 定 義 します 空 欄 部 に 適 当 な 処 理 内 容 を 記 述 しプログラムを 完 成 させて 下 さ い 定 義 した 変 数 Gengou Nen Answer の 意 味 はプログラムから 読 み 取 れるはずです void GengouCalc(int Year,int Month, int Day) { String Gengou,Nen,Answer; } Answer=Gengou+Nen+" 年 "+String.valueOf(Month)+" 月 " +String.valueOf(Day)+" 日 "; jtextfieldans.settext(answer); // 元 号 を 表 示 <ワンポイントアドバイス> 要 するに 空 欄 部 分 では 元 号 (Gengou)と(その 元 号 の) 何 年 か(Nen)を 求 めれば 良 いことになります 少 し 込 み 入 った 処 理 を 考 える 場 合 のコツは その 詳 細 をいきなり 考 えるのではなく いったん 上 のような 空 欄 にしておくことです そして 求 めるべき 値 を 変 数 として 定 義 し その 結 果 表 示 部 分 を 先 に 記 述 してしまいま す その 後 求 めるべき 変 数 ( 今 の 場 合 Gengou と Nen)を 求 める 部 分 に 集 中 して 考 えます こうすることで プログラムの 全 体 構 造 を 把 握 してから 詳 細 部 分 に 集 中 できるので 見 通 しがよくなりミスも 少 なくなります また 複 数 のメンバーで 議 論 するときにも どこに 集 中 して 考 えればよいかを 共 有 で きるので 効 率 の 良 い 議 論 ができます 13
課 題 2-5 個 性 数 の 計 算 日 本 ピーエイチ 研 究 所 所 長 の 今 野 正 智 氏 によると 生 年 月 日 から 導 き 出 されるある 数 で あなたがもって 生 まれた 個 性 が 分 かる ということです その 数 とは 次 のようにして 求 めます 1 あなたの 生 年 を 西 暦 で 表 し 各 位 の 数 を 一 桁 になるまで 足 します 2 誕 生 月 と 誕 生 日 を 加 え やはり 一 桁 になるまで 足 します 3 1と2で 求 めた 数 を 一 桁 になるまで 足 します このときの 一 桁 の 数 があなたの 個 性 を 表 す 数 です 例 ) 1979 年 12 月 24 日 生 まれの 人 の 場 合 1 1+9+7+9=26 2+6= 8 2 12+24=36 3+6= 9 3 8+9=17 1+7= 8 となり 8が 個 性 を 決 める 数 になります 各 々の 数 について プラス(+)の 要 素 とマイナス(-)の 要 素 が 次 のように 与 えられています 数 字 プラスの 要 素 マイナスの 要 素 1 意 志 念 力 独 断 単 純 2 企 画 力 実 行 力 わがまま 怒 り 3 社 交 聡 明 虚 栄 執 着 4 自 律 合 理 性 むさぼり 孤 独 5 適 応 力 柔 軟 性 取 り 越 し 苦 労 怠 惰 6 知 識 自 立 ぐち 強 情 7 独 創 力 持 久 力 短 気 投 げやり 8 博 識 積 極 性 自 信 過 剰 消 極 性 9 包 容 力 統 率 力 利 己 主 義 複 雑 性 この 表 を 用 いて 次 ページの 様 に 生 年 月 日 を 入 力 すると 各 自 が 持 つ プラスの 要 素 と マイナスの 要 素 を 表 示 してくれるプログラムを 作 成 してください プログラムの 動 作 例 は 以 下 の 通 りです 14
プログラムを 起 動 すると 左 の 画 面 が 現 れる 生 年 月 日 を 入 力 し [ 計 算 ]ボタンをク リックすると 個 性 を 決 める 数 と それに 対 応 す る プラスの 要 素 とマイナスの 要 素 が 表 示 される 15
[ 計 算 ]ボタンクリック 時 のイベントハンドラは 次 の 通 りとします 各 テキストフィー ルドがどの 欄 に 対 応 しているかは プログラムから 読 み 取 れるでしょう なお 下 線 部 は 新 たに 定 義 したメソッドです void jbutton1actionperformed(actionevent evt) { String Year=jTextFieldYear.getText(); int Month=Integer.parseInt(jTextFieldMonth.getText()); int Day=Integer.parseInt(jTextFieldDay.getText()); int Yketa=Year.length(); // 西 暦 年 の 桁 数 ( 文 字 数 ) length()メソッドにつ int YearSum=0; //YearSum: 西 暦 年 の 各 桁 の 和 いては 下 を 参 照 for (int i=0;i< Yketa ;i++) { YearSum=YearSum+Integer.parseInt(Year.substring(i, i+1 )); } substring()メソッドについては 下 を 参 照 int MonthDaySum=Month+Day; int YearNo=NumCal(YearSum); // 西 暦 年 の 一 桁 数 int MonthNo=NumCal(MonthDaySum); // 月 日 合 計 の 一 桁 数 int Kosei=NumCal(YearNo+MonthNo); // 個 性 数 の 計 算 jtextfieldno.settext(string.valueof(kosei)); // 個 性 数 の 表 示 Message(Kosei); // 個 性 数 に 応 じたメッセージの 表 示 } < 課 題 内 容 > 1 上 の 空 欄 を 埋 めて 下 さい 2 整 数 Num を 与 えると その 各 桁 の 数 を 合 計 するという 操 作 を 一 桁 になるまで 繰 り 返 すメソッド NumCal(Num)を 定 義 ( 作 成 )して 下 さい このメソッドは 一 桁 になっ たときの 値 を 戻 り 値 として 持 っています つまり 整 数 型 の 戻 り 値 のあるメソッドです 3 個 性 数 Kosei が 求 まったら それに 応 じて プラス 要 素 とマイナス 要 素 のメッセージ を 表 示 するメソッド Message(Kosei)を 定 義 ( 作 成 )して 下 さい length()メソッド 文 字 列 の 長 さ つまり 文 字 の 個 数 は length()メソッドで 取 得 できます String a="12345"; int Nagasa=a.length(); Nagasa の 値 は5 substring()メソッド 文 字 列 を 抜 き 取 るメソッドは substring(n1,n2)メソッドです これにより 対 象 文 字 列 の n1 番 目 から(n2-1) 番 目 までを 抜 き 取 ります 次 の 使 用 例 を 見 て 機 能 を 理 解 して 下 さい "hamburger".substring(4, 8) "urge" "smiles".substring(1, 5) "mile" なお 文 字 列 を 数 える 場 合 は 左 端 が 0 番 目 になっています 16
課 題 2-6 アンケートの 集 計 次 のように ファイルから3 択 のアンケートの 回 答 を 読 み 込 み その 集 計 結 果 を 求 め 表 示 するプログラムを 考 えましょう 回 答 データを 納 めたファイルは ゼミ <Ank.txt> HP(http://su10.sgu.ac.jp/~morita/Seminar/)の 15 期 生 のページにある 3 該 当 部 分 に Ank.txt として 掲 載 しています これをダウンロードして 2 下 さい このファイルには 右 のように 150 名 分 の 回 答 結 果 が 書 き 込 まれ 2 ています 2 この 課 題 は データ 構 造 とアルゴリズム 論 で 行 った 応 用 課 題 3-E です 作 成 するプログラムの 動 作 は 次 の 通 りです プログラムを 起 動 すると 次 のよう な 画 面 が 現 れます ここで [データ 読 み 込 み]ボタンを クリックすると 入 力 ファイル 指 定 のダイアログ ボックスが 現 れるので ここで ファイル Ank.txt を 指 定 しま す(ファイルを 保 存 した 場 所 を 指 定 して 下 さい) データの 読 み 込 み 完 了 後 [ 集 計 ]ボ タンをクリックすると 選 択 肢 1~ 3それぞれの 回 答 に 対 する 度 数 が 集 計 され 表 示 されます 17
課 題 2-7 クイック 保 存 できる 簡 易 メモ 帳 次 のような クイック 保 存 機 能 のある 簡 易 メモ 帳 を 作 って 下 さい これは データ 構 造 とアルゴリズム 論 で 行 った 応 用 課 題 3-F です プログラムを 起 動 すると 次 の 画 面 が 現 れます 起 動 後 メモ 帳 欄 に 適 当 にメモを 記 入 します ここで 作 業 を 中 断 しなけ ればならなくなったとし ます そこで [メモを 保 存 ]ボタンをクリックし 今 のメモの 内 容 を 保 存 し ておきます そしてプログラムを 終 了 させます 18
再 び プログラムを 起 動 し 作 業 を 再 開 します 起 動 後 [ 保 存 したメモを 呼 び 出 す]ボタンをクリック します すると 先 程 保 存 したメモの 内 容 が 表 示 さ れます <ヒント> 1 [メモを 保 存 ]ボタンをクリックしたときに 適 当 なファイル(プログラム 中 で 指 定 ) に jtextarea コンポーネントの 内 容 を 保 管 する( 書 き 込 む)ようにします 2 [ 保 存 したメモを 呼 び 出 す]ボタンをクリックしたときに 上 で 書 き 込 んだファイル から1 行 ずつ 読 み 込 みます 要 領 は データ 構 造 とアルゴリズム 論 の 基 礎 課 題 3-5 と 同 じです そして 読 み 込 んだ 内 容 を jtextarea コンポーネントに 表 示 させれば 良 いのです 要 領 は 同 じく 基 礎 課 題 3-7 の[ 表 示 ]ボタンのイベントハンドラと 同 様 です < 補 足 > jtextarea コンポーネントはそのままでは 行 端 で 自 動 的 に 折 り 返 してくれません つま り 意 図 的 に 改 行 しない 限 り 次 行 へ 移 りません これでは 不 便 なので 自 動 的 に 行 端 で 折 り 返 すようにしましょう そのためには 下 の 様 に jtextarea コンポーネントの linewrap プロパティを true に 変 更 します( 最 初 は false になっています) これにより 自 動 折 り 返 しが 有 効 になります 19
課 題 2-8 メニューとダイアログボックスの 使 い 方 アプリケーションソフトウェアを 作 成 する 場 合 メニューやダイアログボックスを 使 用 する 機 会 が 多 くなります そこで ここではメニューおよびダイアログコンポーネントの 使 用 の 仕 方 を 学 習 しておくことにします Ⅰ.メニューの 作 成 例 として 次 の 様 に ファイル と ヘルプ の2つのメニューを 持 ったフレームを 考 えます 1.メニューバーの 貼 り 付 け いつも 通 りに Java プロジェクトを 新 規 作 成 します そして GUI Editor から Menu タグにある JMenuBar コンポーネントをフレームに 貼 り 付 けます JMenuBar はフレ ーム 情 報 に 自 動 的 に 配 置 されるので 貼 り 付 ける 場 所 はどこでも 構 いません 次 の 画 面 で コンポーネント 名 を 指 定 します ここでは このままにして[OK]ボタン をクリックします すると 下 の 様 にメニューバーが 貼 り 付 けられます このメニューバー 上 に 種 々のメニュ ーを 貼 り 付 けて 行 きます 20
ここに ファイルのコンポーネント 名 は jmenu1 となっていますが メニューの 管 理 をし 易 くするため その 内 容 が 分 かる 名 前 にしておいた 方 が 良 いでしょう 今 は ファイ ル メニューを 作 っているので コンポーネント 名 も jmenufile と 変 更 しましょう コ ンポーネント 名 を 変 更 するためには 当 該 コンポーネントを 選 択 した 状 態 で 右 ボタンクリ ックし 現 れたメニューから 名 前 変 更 を 選 択 します すると name プロパティ 変 更 画 面 が 現 れるので ここで 新 たな 名 前 (ここでは jmenufile ) を 指 定 します 21
2.メニュー 名 の 指 定 メニュー 項 目 の 追 加 続 いてメニューの 表 示 を ファイル となるようにします 容 易 に 分 かるように これ はメニューコンポーネント jmenufile の text プロパティを 書 き 換 えれば 良 いのです すると 次 の 様 に 表 示 名 が ファイル と 変 わるはずです 次 に この ファイル メニューに 終 了 というメニュー 項 目 を 追 加 しましょう メ ニュー 項 目 を 追 加 するには 次 の 様 に ファイル メニューを 選 択 した 状 態 で 右 ボタンク リックし 現 れたメニューから Add Add Menu JMenuItem たどります すると 次 の 様 なコンポーネント 名 等 の 指 定 画 面 が 現 れるので コンポーネント 名 欄 を jmenufileexit そしてテキスト 欄 を 終 了 と 指 定 しましょう(もちろん コンポー ネント 名 は 任 意 ですが 内 容 が 分 かるようにした 方 が 良 いです) 22
3.メニュー 選 択 時 の 処 理 の 記 述 最 後 に 終 了 メニュー 選 択 時 の 処 理 を 指 定 しま しょう これは これまで 同 様 メニュー 選 択 時 の イベントハンドラを 記 述 すれば 良 いのです GUI Editor を 開 いた 状 態 で 画 面 の 右 側 にある アウト ライン ビューから 終 了 メニューを 選 択 します その 状 態 で いつも 通 りに 画 面 下 方 のイベント 欄 から ActionListener handler method を 選 択 します 現 れた Source(ソース) 画 面 で 次 の 様 に 記 述 します これは フレームを 閉 じて 終 了 す るという 命 令 です private void jmenufileexitactionperformed(actionevent evt) { System.exit(0); } 記 述 後 プログラムを 実 行 し 終 了 メニュー を 選 択 すると 画 面 が 閉 じプログラムが 終 了 す るはずです 23
4.メニューの 追 加 次 に ヘルプ メニューを 追 加 してみましょう さらにメニューを 追 加 するには 上 と に 同 様 にメニューバー 上 で 右 ボタンクリックし 下 の 様 に Add Add Menu JMenu を 選 択 します そして コンポーネント 名 とテキストを 次 の 様 に 指 定 します これで ヘルプ メニュ ーが 追 加 されます Ⅱ.メッセージダイアログの 使 用 次 のように ヘルプメニューの( 中 に 用 意 されている) バージョン 情 報 メニューを 選 択 すると バージョン 情 報 ダイアログボックスが 現 れるようにプログラムを 作 成 してみま しょう 24
1.まず 前 ページの 図 のように ヘルプ メニューに バージョン 情 報 というメニュ ー 項 目 を 加 えて 下 さい コンポーネント 名 は jmenuhelpversion とでもしましょう 2.メッセージダイアログを 表 示 させるには JOptionPane というクラスを 用 います そ こで プログラムの 先 頭 に 次 の import 文 を 追 加 して 下 さい import javax.swing.joptionpane; 3. バージョン 情 報 メニュー 選 択 時 のプログラム(イベントハンドラ)を 以 下 の 様 に 記 述 します private void jmenuhelpversionactionperformed(actionevent evt) { JOptionPane.showMessageDialog(this, "メニューテストプログラム nversion1.00", } "バージョン 情 報 ", JOptionPane.INFORMATION_MESSAGE); n( 半 角 )は 改 行 記 号 < 解 説 > 1 バージョン 情 報 などのメッセージダイアログボックスを 表 示 させるには JOptionPane クラスを 利 用 します 2 今 の 例 のように 単 にメッセージを 表 示 させる 場 合 には showmessagedialog メソッドを 用 います このメソッドは4つの 引 数 を 持 ちます 3 1 番 目 は そのボックスが 発 生 する 親 コンポーネント 名 です 通 常 は this を 用 います 今 の 場 合 this はフレームのことです 4 2 番 目 は 表 示 させるメッセージ 内 容 です 5 3 番 目 は メッセージダイアログボックスのタイトルです 6 4 番 目 は メッセージボックスの 種 類 です 種 類 によって 表 示 されるアイコンが 異 な り 以 下 の5 種 類 あります メッセージボックス 種 類 アイコン 用 途 ERROR_MESSAGE エラーメッセージなど INFORMATION_MESSAGE i バージョン 情 報 など QUESTION_MESSAGE? ファイル 上 書 きの 確 認 など WARNING_MESSAGE! ファイル 削 除 の 警 告 など PLAIN_MESSAGE なし その 他 作 成 後 実 行 し バージョン 情 報 メニューを 選 択 して 動 作 を 確 認 して 下 さい 25
課 題 確 認 用 メッセージダイアログボックスの 活 用 今 度 は ファイルの 終 了 メニューを 選 択 した 際 に(すぐに 終 了 するのではなく) 次 の ように 終 了 して 良 いかどうか 確 認 するダイア ログボックスを 表 示 させるようにしましょう そのためには 終 了 メニュー 選 択 時 のイベントハンドラに 次 のように 付 け 加 えます private void jmenuitem1actionperformed(actionevent evt) { JOptionPane.showConfirmDialog(this, " 終 了 してもよいですか?"," 終 了 確 認 ", JOptionPane.YES_NO_OPTION); System.exit(0); } 挿 入 部 分 これにより [はい] [いいえ]ボタンの 付 いた 確 認 用 メッセージダイアログボックスを 表 示 させることができます < 解 説 > 1 先 程 と 同 様 に JOptionPane クラスを 利 用 します 2 確 認 用 メッセージを 表 示 させる 場 合 には showconfirmdialog メソッドを 用 います こ のメソッドは4つの 引 数 を 持 ちます 3 引 数 の1~3 番 目 は showmessagedialog メソッドの 場 合 と 同 様 です 4 4 番 目 は ボタンの 種 類 です 種 類 によって 表 示 されるボタンが 異 なり 以 下 の4 種 類 あります ボタンの 種 類 ボタンの 組 み 合 わせ DEFAULT_OPTION [ 了 解 ] YES_NO_OPTION [はい][いいえ] YES_NO_CANCEL_OPTION [はい][いいえ][ 取 り 消 し] OK_CANCEL_OPTION [ 了 解 ][ 取 り 消 し] 26
showconfirmdialog メソッドの 値 は 整 数 型 です どのボタンを 押 したかによって それぞ れ 以 下 のような 定 数 が 割 り 当 てられています 操 作 JOption.showConfirmDialog メソッドの 値 [はい]ボタンを 押 した 時 JOptionPane.YES_OPTION [いいえ]ボタンを 押 した 時 JOptionPane.NO_OPTION [ 取 消 し]ボタンを 押 した 時 JOptionPane.CANCEL_OPTION [ 了 解 ]ボタンを 押 した 時 JOptionPane.OK_OPTION [ ]ボタンを 押 した 時 JOptionPane.CLOSED_OPTION 上 表 の 値 を 用 いれば どのボタンを 押 したかによって 処 理 内 容 を 分 岐 させることができ ます < 課 題 > 上 のプログラムは [いいえ]ボタンを 押 しても( 無 条 件 で) 終 了 するようになっています これを [はい]ボタンを 押 したときだけ 終 了 するように 修 正 して 下 さい 27