#author("2018-11-15T07:01:23+00:00","ocha","ocha") //#contents *大学院HCI演習および人間機械系演習 2018年度後期 [#r13a4a15] **講義予定 [#ab05a7eb] 10月30日の福地先生講義は延期になり、通常授業になります。 -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日 //レポート提出者一覧(2017/2/10 12:00現在) **発表の記録 [#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 *マルチメディアプログラミング実習 2018年度後期 [#s6662b38] **2018年11月15日 [#ub13ef7a] **第9章 エラーと例外処理 [#gd4f8eae] 次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。 public class TestException { public static void main(String argv[]){ System.out.println(argv[0]+" "+argv[1]); System.out.println("Nice to meet you."); } } エラーが出る可能性のある場所をtryでくくっておき、 エラーが出たらそれを捕捉する処置をcatchで指定します。 public class TestException { public static void main(String argv[]){ try{ System.out.println(argv[0]+" "+argv[1]); System.out.println("Nice to meet you."); } catch (Exception e) { System.out.println("please input 2 words."); } } } **第10章 Stringクラスとコレクションフレームワーク [#t1974e59] ***最初の引数(文字列)を表示するプログラムを作る。クラス名はTestString [#h1a15f22] public class TestString { public static void main(String argv[]) { System.out.println(argv[0]); } } ***演習10.1改:最初の引数(文字列)を逆に出力するプログラムを作る [#baa14121] [e100:?/Documents/java] siio% java TestString ochanomizu ochanomizu uzimonahco [e100:?/Documents/java] siio% さらには、引数がない場合は引数入力を促すことを表示してみよう。 [e100:?/Documents/java] siio% java TestString please input a word [e100:?/Documents/java] siio% このソースは、 public class TestString { public static void main (String argv[]) { try{ System.out.println(argv[0]); int len = argv[0].length(); for(int i = len - 1; i>=0; i--) { System.out.print(argv[0].charAt(i)); } System.out.println(); } catch (Exception e) { System.out.println("please input a word"); } } } である。 ***Linked List の練習 [#d2a5cbd0] サンプルプログラムを実行するときは、 LinkedList<String> list = new LinkedList<String>(); などと定義すると良い。 ***program 10.2 改造 [#j2f946c0] Alice --> Bob --> Cindy --> DaveというLinkedListをつくって、 それからtoArray()メソッドでString配列を作ってfor each文で要素を印刷する import java.util.*; public class LinkedListTest{ public static void main(String[] argv) { LinkedList<String> list = new LinkedList<String>(); list.add("Alice"); list.add("Bob"); list.add("Dave"); list.add("Cindy"); Object[] names = list.toArray(); for(Object s: names ) System.out.println(s); } } ***Hash Mapの練習 [#jf7eb616] プログラム10.4を参考にして、 以下のように動作する英語ー日本語単語変換プログラムを作れ。 [e100:?/Documents/java] siio% java EtoJ banana バナナ [e100:?/Documents/java] siio% java EtoJ apple りんご [e100:?/Documents/java] siio% java EtoJ Please input an English word ヒント: import java.util.*; public class EtoJ{ public static void main(String args[]) { HashMap<String,String> map = new HashMap<String,String>(); map.put("apple","りんご"); map.put("banana","バナナ"); map.put("orange","みかん"); map.put("pineapple","パイナップル"); map.put("grape","ぶどう"); map.put("peach","もも"); map.put("melon","メロン"); map.put("lemon","レモン"); try { System.out.println(map.get(args[0])); } catch(Exception e) { System.out.println("Please input an English word"); } } } - 今日の課題提出 EtoJ.javaとEtoJ.classを出席番号+ローマ字名前のフォルダに入れて、圧縮して提出してください。 ------------ **講義予定 [#ab05a7eb] -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日 **欠席状況 [#o4d380f5] 3/4以上出席してください。(欠席は3回まで)欠席4回で自動的に不可になります。 欠席3回以下なら不可にはなりませんが、成績が下がるかもしれませんので、心当たり無ければ連絡ください。 **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 ** 出来上がったプログラムの提出方法 [#bd9cbbf8] - フォルダを作ってその中にjavaファイルとclassファイル //と、取扱説明書ファイルと、それ以外に必要なファイルがもしあればそれら を入れてください。 フォルダの中のclassファイルをダブルクリックしたらプログラムが起動することを確認してください。 -このフォルダに名前を付けてください。フォルダの名前は、「出席番号+氏名(ローマ字の姓名)+必要ならばバージョン番号の数字」にしてください。たとえば09020999siioitiro01のように。なお全部半角英数字でお願いします。 -このフォルダを圧縮してください --フォルダを選択してファイルメニューから圧縮を選択します -圧縮したファイルを以下の手順で /home/isstaff/siio/Public/Drop Box/. に提出してください。ターミナル.appからなら cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで 以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。 http://siio.jp/gyazo/dropbox.png --書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。 -レポート提出用フォルダは書き込み専用で見ることができません。アップロードできたかどうか不安でしたら教員まで質問してください。 -授業中でしたら、[[ココを見ると:http://siio.jp/lecture/java_report.html]]一覧をみることができます。 -同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください) ***教科書 [#a7e1ce26] http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png http://www.amazon.co.jp/dp/4883732258/ 買ってください。もしくは、先輩から安く譲ってもらってください。 *** この講義の目的 [#l5592b29] +Javaでプログラムする +オブジェクト指向の概念を理解してプログラミングする +GUIプログラミングをする *** この講義の順序 [#gcf48d66] +Javaになれる(C言語などのプログラミング手法の復習) +オブジェクト指向について理解する +GUIプログラミングについて理解する(イベント駆動) +お絵描きプログラムを作ってみる *** 成績評価 [#c732dbb9] +お絵描きプログラムの完成度,作り込み +毎回の宿題の達成(参考程度) +出席状況(参考程度) **今学期の授業(終了分) [#od53d56c] **第1章および第2章 [#y3ae1beb] *** terminalを起動する [#ia8beba9] //#ref(How2Java/terminal.png) http://siio.jp/gyazo/7366bfab668207c6598c4d88ef70d2d4.png - terminalは、/Applications/Utilities/の中にあります。 ちなみに、/Applicationsはファインダでは/アプリケーションと日本語として見えます。 /Applications/Utilities/は、/アプリケーション/ユーティリティ/と日本語として見えています。 - ダブルクリックすると起動します。 よく使うことになると思いますので、dockにドラッグアンドドロップして 登録しておくと良いかと思います。 - ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、 オプションの説明が日本語で出てくると思います。 ***おすすめテキストエディタ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まで。