#author("2018-11-08T07:03:20+00:00","ocha","ocha")
#author("2021-03-02T12:03:32+00:00","ocha","ocha")
//#contents


*大学院博士前期課程授業2020年度後期 [#o618d6d1]

*大学院HCI演習および人間機械系演習 2018年度後期 [#r13a4a15]

- ヒューマンインタフェース(理学専攻)
- ヒューマン・コンピュータ・インタラクション(HCI) (生活工学共同専攻)

**講義予定 [#ab05a7eb]
の授業です。毎週火曜日で開始時間は2:50pmです。

10月30日の福地先生講義は延期になり、通常授業になります。
今学期はZoomの遠隔授業として実施します。ZoomのアドレスはMoodleを見ていただくか、椎尾までお問い合わせください。

-10月9日ガイダンス
-10月16日休講
-10月23日
-10月30日
-11月6日
-11月13日
-11月20日[[明治大学福地先生:https://www.meiji.ac.jp/ams/professor/6t5h7p00000qmg84.html]]
-11月27日
-12月4日
-12月11日
-12月18日
-12月25日
-1月8日
-1月15日
-1月22日
** 講義開催予定 [#xe5bc23d]

今のところの予定です。休講などはまた連絡します。

-10/6 ガイダンス
-10/13 使いやすい道具・使いにくい道具
-10/20 使いやすい道具・使いにくい道具 
-10/27 グラフィカルユーザインタフェース(休講)
-11/3 (文化の日)
-11/10
-11/17
-11/24
-12/1
-12/8
-12/15
-12/22
-1/12

//レポート提出者一覧(2017/2/10 12:00現在)
**講義資料 [#dde386ec]

**発表の記録 [#m6c7145e]

 学籍番号
 1840702
 1840706
 1840708
 1840709
 1840710
 
 1840644 (聴講)
 1840645 2018年11月6日
 1840648
 1840649 2018年11月6日
 1840651
 1840655
 1840658
 1840659
 1840661
 1840662
 1840663
 1840665
 1840669
 1840673 2018年11月6日
 1840675
 1840677
 1740671
- http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3.ppt.pdf
- http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c6.ppt.pdf
- http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c9.ppt.pdf
- http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c10.ppt.pdf




*マルチメディアプログラミング実習 2018年度後期 [#s6662b38]
**出席点 [#kc664278]

**2018年11月15日 [#ub13ef7a]
出席重視の授業ですので70%以上出席お願いします. 今期はzoomへの接続状況から出席、遅刻、欠席を集計します。授業回数が11回ですので,欠席が3回を超えた場合は単位が出ません.zoomへの接続が不調だった場合は考慮しますので連絡ください。また、研究上必要な用事(学会・研究会への参加・発表など)ありましたらそれも公欠としますので連絡ください。


**第9章 エラーと例外処理 [#gd4f8eae]
*マルチメディアプログラミング実習2020年度後期 [#q77c37e1]

次のプログラムを作って試してください。
引数が少ないとエラーが出るのを確認してください。
今学期はZoomの遠隔授業として実施します。詳細はMoodleを見てください。

 public class TestException {
 	public static void main(String argv[]){
 			System.out.println(argv[0]+" "+argv[1]);
 			System.out.println("Nice to meet you.");
 	}
 }
https://moodle.cc.ocha.ac.jp/course/view.php?id=24421

*ヒューマンインタフェース2020年度前期 [#o618d6d1]

------------
**ヒューマンインタフェースのレポート [#fa42ea61]

提出は任意です.もし良いレポートを提出いただけたら出席点の加算に使用します.

-締め切り2020年8月31日月曜日
-形式分量:A4, ページ数は1-2ページ程度
-提出先・提出方法:PDFにしてsiio@is.ocha.ac.jpまでメール添付で送付
-メール表題:ヒューマンインタフェースレポート: 18205XX

メールの標題は「ヒューマンインタフェースレポート: 18205XX」としてください。数字部分は出席番号です。
提出いただいた方はこのページでお知らせします。提出してしばらく経つのに、 自分の番号がなかなか表示されない場合は,受付されていないかもしれません.もう一度催促してください 
(提出を確認出来るよう締め切りより早めに提出していただくことをお勧めします)。

提出状況は、この下に、学籍番号と受理日で案内します。
もし、学籍番号が公表されたくない場合は、確認用の秘密の仮名を提出メールの中でお知らせください。
学籍番号の代わりにその名前を使います。


**講義予定 [#ab05a7eb]
|学籍番号|受理日|
| 1820533 |2020年8月12日|
| 1820527 |2020年8月15日|
| 1620530 |2020年8月19日|
| 1820503 |2020年8月20日|
| 1820518 |2020年8月20日|
| 1820529 |2020年8月31日|
| 弧月 |2020年8月31日|
//| 1720535 |2020年8月31日|
//| 1720543 |2020年8月31日|
//| sunny |2019年8月31日|

-10月4日ガイダンス
-10月11日
-10月18日休講
-10月25日
-11月1日休講
-11月8日
-11月15日
-11月22日
-11月29日
-12月6日
-12月13日
-12月20日
-12月27日
-1月10日
-1月17日
-1月24日

***レポートの課題 [#c9d0add0]

-身の回りの携帯機器、家電製品、機械製品、コンピュータソフトウェア、 道具、日用品、調度品、設備などから、 使いにくいと思われる道具を見つけ出して説明してください。
-そして、それがなぜ使いにくいのかを、 授業で説明した、 制約、マッピング、Affordance、モデル、 エラー対策、 標準化、直接操作、メタファー、モードなどの用語を使って分析してください。 (全部の用語を使う必要は無い)
-また,自分ならこのように設計して使いやすくするというアイディアを、 これも授業で使った用語を交えて、述べてください。


**欠席状況 [#o4d380f5]
3/4以上出席してください。(欠席は3回まで)欠席4回で自動的に不可になります。
欠席3回以下なら不可にはなりませんが、成績が下がるかもしれませんので、心当たり無ければ連絡ください。
**出席状況 [#te5cda59]

学部「ヒューマンインタフェース」は出席重視の授業です.そのため70%以上出席お願いします. 今期はミニテストの提出状況とzoomへの接続状況から出席、遅刻、欠席を集計します。授業回数が13回程度ですので,欠席が3回を超えた場合は単位が出ません. 以下に授業全体の欠席状況を示す予定です。
//しておきます. 
欠席回数は成績に大きく影響しますので、間違いありましたら至急お知らせください.
//公欠届のある日は出席としてあります。
これも、学籍番号が公表されたくない場合は、確認用の秘密の仮名をメールでお知らせください。
学籍番号の代わりにその名前を使います。

|学籍番号|5月7日|5月14日|5月21日|5月28日|6月4日|6月11日|6月18日|6月25日|7月2日|7月9日|7月16日|7月23日|欠席回数|
//|1620415|出|出|欠|出|出|欠|欠|欠|出|出|出|出|出|4不可|
//|1620501|出|出|出|出|出|出|出|出|出|出|出|出|出|0|

**javaのマニュアル [#beafbfad]

//http://sdc.sun.co.jp/java/docs/j2se/1.5.0/ja/docs/ja/api/index.html
//http://java.sun.com/javase/ja/6/docs/ja/api/index.html
//http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
//http://docs.oracle.com/javase/jp/6/api/
http://docs.oracle.com/javase/jp/8/docs/api/index.html
** 講義開催予定 [#p8ec1788]

** 出来上がったプログラムの提出方法 [#bd9cbbf8]
- フォルダを作ってその中にjavaファイルとclassファイル
//と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら
を入れてください。
フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。
-このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiro01のように。なお全部半角英数字でお願いします。
-このフォルダを圧縮してください
--フォルダを選択してファイルメニューから圧縮を選択します
-圧縮したファイルを以下の手順で
 /home/isstaff/siio/Public/Drop Box/.
に提出してください。ターミナル.appからなら
 cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box
としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで
以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。
-5/7 ガイダンス
-5/14 GUIの歴史
-5/21 人の知覚特性
-5/28 人の認知特性
-6/4
-6/11
-6/18
-6/25
-7/2
-7/9
-7/16
-7/23 (海の日)
-7/30

http://siio.jp/gyazo/dropbox.png
--書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。
-レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。
-授業中でしたら、[[ココを見ると:http://siio.jp/lecture/java_report.html]]一覧をみることができます。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)


***教科書 [#a7e1ce26]

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png
//**宿題 [#pb8621ca]

http://www.amazon.co.jp/dp/4883732258/
//下のリンク先のソースコードをコンパイルして、応答速度を図るプロログラムを作ってください。これを使って、みなさんの応答速度を図って、次回(2019年5月16日)の小テスト用紙(A5サイズ)で報告してください。

買ってください。もしくは、先輩から安く譲ってもらってください。
//http://is.ocha.ac.jp/~siio/index.php?CSL11HCI#k497ebbd

*** この講義の目的 [#l5592b29]
+Javaでプログラムする
+オブジェクト指向の概念を理解してプログラミングする
+GUIプログラミングをする

*** この講義の順序 [#gcf48d66]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる
//**宿題 [#x69779a5]
//
//***GUI黎明期のPC性能を調べてください(2018.4.19) [#ba9db6ff]
//-GUI黎明期PCのCPU名、CPUクロック、メモリ容量、画素数を調べてください
//--現在,Windows を使っている人は,最初の Windows が出荷された 1985 年当時に使われていたIBM PC/AT
//--Mac OS Xを使っている人は,1984に出荷された最初の Macintosh 
//-今あなたが使っているコンピュータと比較してください. 
//-次回の授業(5/17)最初に配布するA5サイズの用紙に各自で記入して提出してもらいます

*** 成績評価 [#c732dbb9]
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(参考程度)

//**宿題
//
//***人の反応速度を測定するプログラムを作って測定してください。(2014.4.24) † [#jbad7411]
//-連休明けの授業(5/15)の開始時に、A4, 1枚(両面印刷でも可)で提出してください。
//--用紙の上辺に学籍番号、学年、氏名を1行で書いておいてください。
//-C 言語では,次のようなプログラムで、”hit now”という文字を表示した後、リターンキーが押されるまでの時間を測定できます。
//--http://is.ocha.ac.jp/~siio/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示されます。乱数を使って表示までの時間を変える改良をしてもらっても良いです。(改良したらそのこともレポートしてください)
//-これによりあなたの応答速度を複数回実測して、人の応答速度が 300ms 程度であることを確認してください。 
//-また個人差や年齢などで結果は変わるかもしれません。周りの複数の人に被験者になってもらって調査しても面白いかもしれません。
//-また何度も測定することで、習熟して速度が向上したり、それでも限界があったり、さらには、逆に疲労により速度が低下することがあるかもしれません。
//--そのような現象が観察できたら、これも報告してください。(教科書8章の学習曲線を参考にしてください)

**教科書 [#ta8dbb5f]
http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_AA300_.jpg

**今学期の授業(終了分) [#od53d56c]
http://www.amazon.co.jp/dp/4781912605/

**授業資料 [#s6bf1fc3]
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c1.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c2.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c3.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c4.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c5.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c6.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c7.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c8.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c9.ppt.pdf
+http://is.ocha.ac.jp/~siio/lecture/humaninterface/HCI_c10.ppt.pdf

**第1章および第2章 [#y3ae1beb]
(授業開始直前や直後に差し替えされている可能性があります。)

**教科書サポートページ [#b385f64d]

*** terminalを起動する [#ia8beba9]
-http://is.ocha.ac.jp/~siio/index.php?CSL11HCI

//#ref(How2Java/terminal.png)

http://siio.jp/gyazo/7366bfab668207c6598c4d88ef70d2d4.png

- terminalは、/Applications/Utilities/の中にあります。
ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。
/Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。
//**宿題:ボタンを押すたびに点灯/消灯を繰り返す(トグルする)プログラム (2015/7/17提出) [#a9dc7742]
//
//以下は、Arduinoの2ピンに接続された押しボタンスイッチを押すとLEDが点灯するプログラムです。これを改造して、押し//ボタンスイッチを押すたびに、点灯/消灯を切り替えるプログラムを作ってください。
//ちなみにHIGHとLOWはintの値で、int型の変数で保存することができます。
//
// int outpin=13; //An LED is connected to ping 13
// int inpin=2;  //A switch is connected to pin 2
// 
// void setup() {                
//   // initialize the digital pin as an output and input.
//   pinMode(outpin, OUTPUT);     
//   pinMode(inpin, INPUT);
// }
// 
// void loop() {
//   if ( digitalRead(inpin) == HIGH) {
//     digitalWrite(outpin, LOW);   // set the LED on
//   }
//   else {
//     digitalWrite(outpin, HIGH);    // set the LED off
//   }
//   delay(30);              // wait for 30 msecond
// }


- ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。
//**宿題:人の反応速度を測定するプログラムを作って測定してください。(2015.5.1) [#f5834458]
//-連休明けの授業(5/8)の開始時に、A5, 1枚に書いて提出していただきます。
//-C 言語では,次のようなプログラムで、”hit now”という文字を表示した後、リターンキーが押されるまでの時間を測定でき//ます。
//--http://is.ocha.ac.jp/~siio/hci/hitnow.c
//--このプログラムは固定時間(5秒)後にhit nowが表示されます。
//-- 乱数を使って表示までの時間を変える改良をしてもらっても良いです。(改良したらそのこともレポートしてください)
//-これによりあなたの応答速度を実測して、人の応答速度が 300ms 程度であることを確認してください。(複数回実測して平均とってもらえるとさらに正確ですね)
//
//


***おすすめテキストエディタCotEditor[#c7258b9c]

https://coteditor.com/img/appicon/128@2x.png

- Javaのプログラムを作るテキストエディタです。一番簡単にはterminalからviとかemacsとかpicoとかタイプして
エディタを呼び出せば良いです。

- でも日本語の設定などが結構難しいので、GUIベースのエディタを使ってみましょう。

- いくつかありますが、おすすめの一つはCotEditorという、便利なフリーウェアのテキストエディタです。

- これも便利なのでdockに入れておくとよいと思います。


こちらからダウンロードできます。
演習室のOSにあわせたバージョンをダウンロードして~/Applicationsにコピーします。

https://coteditor.com/archives.ja

*** 超簡単なプログラム(hello world)を作ってみる [#v4ccc293]


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、cotEditerを起動して作成します。

- ここで、以下のようなプログラムを書いてみます。

 class Hello {  
 public static void main (String args[]) {
         System.out.println("hello java world!");
         }
 }

http://siio.jp/gyazo/20121004010107.png


- これをHello.javaという名前で保存して、コンパイル実行します。すると以下のようになります。

 javac Hello.java  (コンパイルする)
 java Hello      (実行する。.javaなどの拡張子は不要)
 hello java world!   (結果)


- 次に簡単なウィンドウを出してみましょう。

授業の最後の方で紹介する,Swingというフレームワークを使ってウィンドウを出してみます.


 import javax.swing.JFrame;
 public class SimpleWindow {
 
        public static void main(String argv[]) {
                JFrame f = new JFrame("私が作った最初の窓");
                f.setSize(200,100); 
//                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
        }
 
 }

これをSimpleWindow.javaという名前で保存して、

 javac SimpleWindow.java
 java SimpleWindow

とタイプしてコンパイル/実行します。
このプログラムは,ウィンドウのクローズボタンを押しても終了しません.
プログラムを停止するには,ターミナルでコントロール-cを押します.

#ref(How2Java/simplewindow.png)




**第3章 [#xc22f04b]

-演習1

--演習3.4をみて、自分の名前の最初の文字の文字コードを表示してみてください。

-演習2

--コマンドの引数はarg[0], arg[1] ... などにString型の配列としてプログラムに引き渡されます。
--二つの引数を与えたときに、それが+でつないで表示されるプログラムを作りましょう。


http://gyazo.com/8159f78165e17781a7110de3763c833c.png

ヒント


--以下は引数一つを表示するだけのサンプルです。これをもとに考えてください。
--arg[0]とarg[1]をprintlnの中で+でつないで表示すれば良いです。

 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0]);
         }
 }


解答


 class ArgsTest {  
 public static void main (String args[]) {
 	System.out.println(args[0] + " + " + args[1]);
         }
 }


**第4章 [#f2e95643]

--演習4.2をやってみよう


**第5章 [#p54c6568]

***演習 [#leda55b3]

-演習問題5.4(変更)

乱数を10個表示する

 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.println(a);
 		}
 	}
 }

次にこの乱数を点数とみなして、演習問題5.4の基準に従ってABCDを表示するプログラムを書け。
動作例を以下に示す。

http://gyazo.com/829b04a7fc82cdfe9dd0dfa650af873e.png

解答例:


 public class Score {
 	public static void main (String argv[]) {
 		int i,a;
 		for(i=0;i<10;i++) {
 			a=(int)(Math.random() * 100);
 			System.out.print(a + " ");
 			if(a<40) System.out.println("D");
 			else if(a<60) System.out.println("C");
 			else if(a<80) System.out.println("B");
 			else System.out.println("A");
 		}
 	}
 }

-演習問題5.5をやってみよう

http://gyazo.com/1733defca0c709c41c69ea729320ab61.png



解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	year=1;
 	while(okane < 200000) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	 	year++;
 	}
 }
 }

現在の普通預金の金利0.001%だと倍になるのに何年かかるだろうか。確かめてみよう。


//http://gyazo.com/95cd94db39b407e7961355b20da8fc67.png


-演習5.6をやってみよう

while文をfor文に変えてみる

解答例:

 class Kinri {
 public static void main (String args[]) {
 	double okane=100000;
 	int year;
 	for(year=1;okane < 200000; year++) {
 		okane = okane * 1.05;
 		System.out.println("year = " + year + "  okane= " + okane);
 	}
 }
 }

***for-each文は新しい手法なので練習しましょう [#s17e2f54]

-プログラム5.7の代わりに以下をやってみよう

 class ArrayTest {  
 public static void main (String args[]) {
 	int[] vec = new int[3];
 	vec[0]=1;
 	vec[1]=2;
 	vec[2]=3;
 	for (int x: vec) {
 	     System.out.println(x);
 	     }
        }
 }

*** 演習 [#vc946bd9]

mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、
コマンドの後に続けた書いた文字が入っています。
args[0], args[1], args[2] .... をすべてfor-each文で
表示するプログラムを書いてみましょう。

http://gyazo.com/8d8effac163e0dc939e74f237d8507b1.png

ヒント:for(String s: args)を使います

-解答例


 class ArgsTest2 {  
 public static void main (String args[]) {
 	for(String s: args) 
 	    System.out.println(s);
        }
 }


-今日の課題提出

ArgsTest2.javaとArgsTest2.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。


**第6章 クラスの基礎 [#h5b270c6]

***クラスとインスタンスの説明をしました [#gc6def4c]
-クラスは型、インスタンスはそれから作られたもの
--クラスがたいやきの焼き型だとすると、インスタンスはそれから作られたたいやき
--クラスは設計図でインスタンスはそれから作られたもの
-クラスとインスタンスそれぞれにメソッドと変数がある
--クラス変数 例:何個のインスタンスを作ったか?
--クラスメソッド 例:インスタンスを作れ
--インスタンス変数 例:ひとつのたいやきの重さ
--インスタンスメソッド 例:たいやきをxxグラム食べる


http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png


-演習

今作ったTestPoint3D.javaを変更して

- 二つのインスタンスpt1, pt2を作り、
- それぞれのインスタンス変数x, y, zを10,20,30と-10,-20,-30にして、
- それぞれのインスタンスメソッドpinrt()を呼ぶ

ようにしてください。
この結果、以下のような実行結果が出るようにしてください

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png



***クラス変数・メソッドとインスタンス変数・メソッド [#w88794f1]

- staticとついているのがクラス変数、クラスメソッド
- staticが付いていないのがインスタンス変数、インスタンスメソッドです



***public static void main の説明をしました [#p8e5e198]
-javaコマンドは、引数のクラスのクラスメソッドmainを実行します
--staticと付いているのがクラス変数、クラスメソッドの印です
-Pointクラスにクラスメソッドmainを実装すれば自分自身をテストできます


-クラスPoint3Dに自分自身をテストするクラスメソッドmainを作ってみよう

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png


***変数にはメソッド経由でアクセスするのが良いという説明をしました [#c813a888]
-変数の型などを将来変更してもメソッドの書き換えで対応できます

 public class Point {
 	private int x, y;
 	void set(int newx, int newy) {x=newx; y=newy;}
 	int getx() { return x;}
 	int gety() { return y;}
 
 	void print () {
 		System.out.println(x + ", " + y);
 	}
 
 	public static void main(String argv[]) {
 		Point pt1= new Point();
 		Point pt2 = new Point();
 		pt1.set(10,20);
 		pt2.set(-pt1.getx(), -pt1.gety());
 		pt1.print();
 		pt2.print();
 	}
 
 }


-Point3Dのメソッドを充実させて次のmain()メソッドで 

 10, 20, 30
 -10, -20, -30

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
        }

-Point3Dに、他の点との距離を返すメソッド distance ( Point3D p ) を実装して、次のmain()メソッドで 


 10, 20, 30
 -10, -20, -30
 74.83314773547883

という結果が出るようにしましょう


        public static void main(String argv[]) {
                Point3D pt1 = new Point3D();
                Point3D pt2 = new Point3D();
                pt1.set(10, 20, 30);//インスタンス変数を設定
                pt2.set(-pt1.getx(), -pt1.gety(), -pt1.getz());
                pt1.print();//インスタンスメソッド呼出
                pt2.print();
 
                System.out.println(pt1.distance(pt2));
 
        }

--解答例

	
 	double distance ( int ptx, int pty, int ptz ) {
 		int dx = ptx - this.x;
 		int dy = pty - this.y;
 		int dz = ptz - this.z;
 		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
 	}
 	
 	double distance ( Point3D p ) {
 		return this.distance(p.getx(), p.gety(), p.getz());
 	}



-今日の課題提出

Point3D.javaとPoint3D.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。


**2018年10月25日宿題: Osaifuクラスを作ってみよう [#ce76c10a]

次回は休講ですので再来週11/8の授業の最初に回収します。

-Osaifuクラスからはインスタンスがたくさん作られる
--Osaifuクラスはお財布の設計図/工場、ここから実際のお財布(インスタンス)が複数作られる
--工場出荷時の残金は0円だけど、その後、いろいろな値になるだろう(お金持ちのお財布には残金が多いだろうし、逆ならば少ないだろう)
--ということで残金はインスタンス変数とすべきだろう
-Osaifuクラスには次のメソッド、変数が必要だろう
--残金を表すインスタンス変数 int okane
--お金を入金するインスタンスメソッド void in(int x);
--お金を出金するインスタンスメソッド int out(int x);  戻り値は実際に出金できた金額(残金が不足ならばあるだけしか出せない)
--残金を印刷するインスタンスメソッドがあってもよいだろう void print(); &br;
http://gyazo.com/bd6eaafd220dc7ff791288089f293b28.png
-Osaifuクラスをテストするmain()メソッドでは次のことをやってください
-- Osaifuインスタンスを一つ作ってそれをsaifu1という名前にする
-- Osaifuインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に500円入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から200円出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 
http://gyazo.com/c618901458edc1ba338cab87d2810157.png


-Osaifu.java 解答編

 public class Osaifu {
 	int okane;	
 	public void in (int x) { okane += x; }
 	public int out(int x) { okane -= x; return x; }
 	public void print() {
 		System.out.println( "okane = " + okane +" yen");
 	}
 	
 	public static void main(String argv[]) {
 		Osaifu saifu1 = new Osaifu();
 		Osaifu saifu2 = new Osaifu();
 		saifu1.in(1000);
 		saifu2.in(500);
 		saifu1.print();
 		saifu2.print();
 		saifu2.in(saifu1.out(200));
 		saifu1.print();
 		saifu2.print();
 	}
 }

--このプログラムでは残金がマイナスになってしまってもかまわない設計になってしまっています。実際には残金だけの金額しか出せないはずなので、outメソッドを改良して、残金以上の金額を要求されたら、残金分だけしか出さないように変更してみてください。

--このためには、例えばoutメソッドを以下のようにすれば良い

 	public int out(int x) {
 		if(x < okane ) {
 			okane = okane -x;
 			return x;
 		} else {
 			int nokori = okane;
 			okane =0;
 			return nokori;
 		}
 	}	




*** つぎにOsaifuクラスにコンストラクタを追加してみよう [#a8a56d7e]
-Osaifu() で残金0のインスタンスを作る
-Osaifu(int x) で引数を残金の初期値としたインスタンスを作る

ことができるコンストラクタを作ろう。

これをmainから呼んで、上記のプログラムと同じことをするためには、

 		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
 		//最初の保持金額を1000円にする
 		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
 		//最初の保持金額を500円にする

とすることになる。

***コンストラクタ解答編 [#w62499a7]

以下のコンストラクタを作ることになる。

 	Osaifu() { okane = 0; }
 	Osaifu(int x) { okane = x; }

これは以下のように書いても良い。

 	Osaifu() { this(0); }
 	Osaifu(int x) { okane = x; }


**第8章 継承 [#ka97b6ac]

継承の話をしました。
別のクラスを継承することで、
差分だけを書いて機能を拡張していくことができます。

http://gyazo.com/2c8ef14d8be63b9fc18c58d79f2f3879.png


*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#fc83e4ee]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
--1ドルは90円にしてください
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- void print()   お財布の残高を円とドルで表示します
-OsaifuUSDクラスをテストするmain()メソッドでは次のことをやってください
-- OsaifuUSDインスタンスを一つ作ってそれをsaifu1という名前にする
-- OsaifuUSDインスタンスをもう一つ作ってそれをsaifu2という名前にする
--saifu1に1000円入金する
--saifu2に5ドル入金する
--saifu1とsaifu2が持っている金額を印刷する
--saifu1から2ドル出金してそれをsaifu2に入金する
--saifu1とsaifu2が持っている金額を印刷する

-動作例

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

-ヒント:一行目はこれ

 public class OsaifuUSD extends Osaifu {



-ヒント:mainはこんな感じ

 	public static void main(String argv[]) {
 		OsaifuUSD saifu1= new OsaifuUSD();
 		OsaifuUSD saifu2=new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 	}



-解答例


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		okane-=usd * 90;
 		return usd;
 	}
 
 	public void inUSD(int usd) {
 		okane+=usd * 90;
 	}
 	
 	public static void main(String argv[]) {
 		OsaifuUSD saifu1 = new OsaifuUSD();
 		OsaifuUSD saifu2 = new OsaifuUSD();
 		saifu1.in(1000);
 		saifu2.inUSD(5);
 		saifu1.print();
 		saifu2.print();
 		saifu2.inUSD(saifu1.outUSD(2));
 		saifu1.print();
 		saifu2.print();
 		
 	}
 }


*** OsaifuUSDクラスの改造(1) [#g8c0b7a2]

親のメソッドを活用しても良い

 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		return ( out( use * 90) / 90 );
 	}
 
 	public void inUSD(int usd) {
 		in( usd * 90 );
 	}
 	

 
 }


親のメソッドを呼ぶことを明示的に書くためにsuper.をつかってもよい。


 public class OsaifuUSD extends Osaifu {
 
 	public int outUSD(int usd) {
 		return ( super.out( use * 90) / 90 );
 	}
 
 	public void inUSD(int usd) {
 		super.in( usd * 90 );
 	}
 	

 
 }


***小テスト練習 [#g4c60a6e]

以下のプログラムの中で、
クラス、インスタンス、サブクラス、スーパクラス、クラスメソッド、インスタンスメソッドがどれであり、
インスタンス化、継承がどこで行われているのか確認してください。
(importで始まる一行目はまだ説明していない内容なので小テストでは扱いません。無視してください)


 import javax.swing.JFrame;
 
  public class SampleWindow extends JFrame {
 	public static void main(String args[]) {
 		SampleWindow w = new SampleWindow();
  		w.setVisible(true);
 	}
  }




------
このページについてのお問い合わせはsiio@is.ocha.ac.jpまで。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS