#author("2017-11-16T06:56:43+00:00","ocha","ocha")
#author("2017-11-16T07:35:59+00:00","ocha","ocha")
#contents

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

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


|学籍番号|10/5|10/12|10/19|10/26|11/2|11/9|欠席回数合計|
|1520531|0|0|0|0|1|0|1|
|1620501|0|0|0|0|0|0|0|
|1620502|0|0|0|0|0|0|0|
|1620503|0|0|0|0|0|0|0|
|1620504|0|0|0|0|0|0|0|
|1620505|0|0|0|0|0|0|0|
|1620506|0|0|0|0|0|0|0|
|1620507|0|0|0|0|0|0|0|
|1620508|0|0|0|1|0|1|2|
|1620509|0|0|0|0|0|0|0|
|1620510|0|0|0|0|0|0|0|
|1620512|0|0|0|0|0|0|0|
|1620513|0|0|0|0|0|0|0|
|1620515|0|0|0|0|0|0|0|
|1620516|0|0|0|0|0|0|0|
|1620517|0|0|0|0|0|0|0|
|1620518|0|0|0|0|0|0|0|
|1620519|0|0|0|0|0|0|0|
|1620520|0|0|0|0|0|0|0|
|1620521|0|0|0|0|0|0|0|
|1620522|0|0|0|0|0|0|0|
|1620523|0|0|0|0|0|0|0|
|1620524|0|0|0|0|0|0|0|
|1620525|0|0|0|0|0|0|0|
|1620526|0|0|0|0|0|0|0|
|1620527|0|0|0|0|0|0|0|
|1620528|0|0|0|0|0|0|0|
|1620529|1|0|0|0|0|0|1|
|1620530|0|0|1|1|1|0|3|
|1620532|0|0|0|0|0|0|0|
|1620533|0|0|0|0|0|0|0|
|1620534|0|0|0|0|1|0|1|
|1620535|0|0|0|0|0|0|0|
|1620536|0|0|0|0|0|0|0|
|1620537|0|0|0|0|0|0|0|
|1620538|1|0|0|0|0|0|1|
|1620539|0|0|0|0|0|0|0|
|1620540|0|0|0|0|0|0|0|
|1620541|0|0|0|0|0|0|0|
|1620542|0|0|0|0|0|0|0|
|学籍番号|10/5|10/12|10/19|10/26|11/2|11/9|11/16|欠席回数合計|
|1520531|0|0|0|0|1|0|0|1|
|1620501|0|0|0|0|0|0|0|0|
|1620502|0|0|0|0|0|0|1|1|
|1620503|0|0|0|0|0|0|0|0|
|1620504|0|0|0|0|0|0|0|0|
|1620505|0|0|0|0|0|0|0|0|
|1620506|0|0|0|0|0|0|0|0|
|1620507|0|0|0|0|0|0|0|0|
|1620508|0|0|0|1|0|0|0|1|
|1620509|0|0|0|0|0|0|0|0|
|1620510|0|0|0|0|0|0|0|0|
|1620512|0|0|0|0|0|0|0|0|
|1620513|0|0|0|0|0|0|0|0|
|1620515|0|0|0|0|0|0|0|0|
|1620516|0|0|0|0|0|0|0|0|
|1620517|0|0|0|0|0|0|0|0|
|1620518|0|0|0|0|0|0|0|0|
|1620519|0|0|0|0|0|0|0|0|
|1620520|0|0|0|0|0|0|0|0|
|1620521|0|0|0|0|0|0|1|1|
|1620522|0|0|0|0|0|0|0|0|
|1620523|0|0|0|0|0|0|0|0|
|1620524|0|0|0|0|0|0|0|0|
|1620525|0|0|0|0|0|0|0|0|
|1620526|0|0|0|0|0|0|0|0|
|1620527|0|0|0|0|0|0|0|0|
|1620528|0|0|0|0|0|0|0|0|
|1620529|1|0|0|0|0|0|0|1|
|1620530|0|0|1|1|1|0|0|3|
|1620532|0|0|0|0|0|0|0|0|
|1620533|0|0|0|0|0|0|0|0|
|1620534|0|0|0|0|1|0|0|1|
|1620535|0|0|0|0|0|0|0|0|
|1620536|0|0|0|0|0|0|0|0|
|1620537|0|0|0|0|0|0|0|0|
|1620538|1|0|0|0|0|0|0|1|
|1620539|0|0|0|0|0|0|0|0|
|1620540|0|0|0|0|0|0|0|0|
|1620541|0|0|0|0|0|0|0|0|
|1620542|0|0|0|0|0|0|0|0|


**授業予定 [#m902f1d1]

- 10月5日 授業
- 10月12日 授業
- 10月19日 授業
- 10月26日 授業
- 11月2日 授業
- 11月9日 授業
- 11月18日 授業
- 11月23日 授業(祝日だけど通常授業日)
- 11月30日 授業
- 12月7日 休講(学会出張)
- 12月14日 授業
- 12月21日 休講(椎尾通院)
- 1月4日 授業
- 1月4日 自習
- 1月11日 休講(月曜授業日)
- 1月18日 授業
- 1月25日 授業


*11月16日 [#id92f2b1]



***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>();
 	
	try {
		
 	}
 	catch(Exception e) {
 		
 	}
 
 	}
 }


解答例:

 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");
 	}
 
 	}
 }

**第11章 入出力 [#hb3a05b8]

***整数を出力する例 [#j899e2e7]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }


これでdout.datという名前のファイルができあがるはずです。 作ったファイルを

 od -h dout.dat
 
または

 hexdump dout.dat

してみてください

 e100:java siio$ hexdump dout.dat 
 0000000 00 00 00 64                                    
 0000004


***整数を入出力する例 [#j899e2e7]

 import java.io.*;
 
 public class DoutTest {
 	public static void main (String[] args) {
 		try {
 			FileOutputStream fout = new FileOutputStream("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			dout.writeInt(100);
 			dout.close();
 			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			System.out.println(dinput.readInt());
 			dinput.close();
 			
 		}catch (Exception e) {
 			System.out.println(e);
 		}
 	}
 }


***宿題:演習11.1 をやってください [#z72d00c6]

作ったファイルを
 od -h dout.dat
または
 hexdump dout.dat
してみてください

解答例


 import java.io.*;
 
 public class En111 {
 	public static void main (String[] args) {
 		int i;
 		try {
 			FileOutputStream fout = new FileOutputStream ("dout.dat");
 			DataOutputStream dout = new DataOutputStream(fout);
 			for(i=1;i<101;i++) dout.writeInt(i);
 			dout.close();
 			
 			FileInputStream fin = new FileInputStream ("dout.dat");
 			DataInputStream din = new DataInputStream(fin);
 			
 			for(i=1;i<101;i++) System.out.println(din.readInt());
 			din.close();
 			
 		} catch (FileNotFoundException e) {
 			System.out.println(e);
 		} catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


***プログラム11.3をやってみてください [#h15edee7]


作ったファイルを
 od -h 
または
 hexdump
してみてください

http://gyazo.com/74c061dfe2fcd6b72885878f867c78ba.png


 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			pwriter.println("Java教科書");
 			//fwriter.write("Java教科書");
 			pwriter.close();	
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


つぎに、プログラム11.4を参考にして、
このPrint Write Testに書き足して、
書き込んだデータを読み出して画面に表示するプログラムを作ってください。

ヒント:

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println(2006);
 			pwriter.println("Java教科書");
 			//fwriter.write("Java教科書");
 			pwriter.close();	
			 
			 
			 ここに書き足す
			 
			 
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


***文字ストリームをファイルに書いて読み込むプログラム [#bed8144f]

 import java.io.*;
 
 public class PrintWriterTest{
 	public static void main(String[] args) {
 		try {
 		//writer.txtというファイルを作って文字を書き込む
 			FileWriter fwriter = new FileWriter("writer.txt");
 			PrintWriter pwriter = new PrintWriter(fwriter);
 			pwriter.println("java 教科書" + 2001 );
 			pwriter.close();			
 		//writer.txtのファイルの中身をSystem.out.printlnで表示する
 			FileReader freader = new FileReader("writer.txt");
 			BufferedReader breader = new BufferedReader(freader);
 			String tmp;
 			while( (tmp=breader.readLine() ) != null) {
 				System.out.println(tmp);
 			}
 			breader.close();
 		}
 		catch (IOException e) {
 			System.out.println(e);
 		}
 	}
 }


***プログラム11.5をやってこれを拡張して演習11.2をやってください [#ya1ca508]

キーボードから1行入力された文字列によるテキストファイルを作る

http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png

ヒント

  import java.io.*;
  
  public class En112 {
  	public static void main(String[] args) {
  	
  		try {
 
 
 ここにプログラムを書く
  		
  			}
 			catch(IOException e) {
  				System.out.println(e);
   			}
     }
  }


これができたら、そのファイルを読み込んで表示する機能をさらに追加してください。
(FileReader, BufferedReaderを作ってrealLine()する)


 import java.io.*;
 
 public class En112 {
 public static void main(String[] args) {
	try{
		InputStreamReader ireader = new InputStreamReader(System.in);
		BufferedReader breader = new BufferedReader(ireader);
		String line = breader.readLine();
		System.out.println(line);
		breader.close();
		
		FileWriter fwriter = new FileWriter("writer.txt");
		PrintWriter pwriter = new PrintWriter(fwriter);
		pwriter.println(line);
		pwriter.close();
		
		FileReader freader = new FileReader("writer.txt");
		BufferedReader breader2 = new BufferedReader(freader);
		System.out.println(breader2.readLine());
		breader2.close();
		
	}catch(IOException e){
		System.out.println(e);	
	}		
 }
 }


**本日のレポート [#y5146699]

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


///////////////////////////////////////////////////////////

*11月9日 [#c541167e]


**第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.");
 		}
 	}
 }

このソースは、

 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");
 		}
 	}
 }

である。

**第10章 Stringクラスとコレクションフレームワーク [#w938c6ce]


***引数の単語を表示するプログラムを作る [#wf6cf0b5]

- 引数がないときは"please input a word"と出すようにする

*** 入力した文字を逆に出力するプログラムを作る [#p6f8c354]

 [e100:?/Documents/java] siio% java TestString ochanomizu
 ochanomizu
 uzimonahco
 [e100:?/Documents/java] siio% 


ヒント:System.out.println()は改行するが、System.out.print()という関数は改行をしない



***Linked List の練習 [#d2a5cbd0]

プログラム10.2を入力して実行してください。
サンプルプログラムを実行するときは、

 	LinkedList<String> list = new LinkedList<String>(); 

などと定義すると良い。
またコンパイルで注意が出るので、

    javac -Xlint:unchecked LinkedListTest.java 

というオプションをつけてコンパイルしてみてください。

***プログラム10.2 改造 [#j2f946c0]

プログラム10.2の最後では、Iteratorを使って要素を全部表示しています。
これを教科書p.150のtoArray()メソッドでString配列を作ってfor each文で要素を印刷するように
書き換えてください。


ヒント:

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);
 
         }
 
 }



**本日のレポート [#y5146699]

toArray()メソッドで一覧表示するよう改造したLinkedListTest.javaとlinkedListTest.classを、出席番号+名前(ローマ字)のフォルダに入れて、圧縮して、提出してください。


------------

*11月2日 [#yf52838c]

**第8章 継承 [#ka97b6ac]

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

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

*** Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう [#fc83e4ee]
-OsaifuUSDクラスはアメリカで買い物をするときに便利な、アメリカドルでお金を出し入れできる財布です。
-あたらしく追加するメソッドは以下です
-- void inUSD(int x)   xドルをお財布に入金します。このとき円に換算して残高に追加します
-- int outUSD(int x)   xドルをお財布から出金します。このとき円に換算した金額だけ残高が減ります。戻り値はドルにしましょう。
--1ドルは114円にしてください
//-スーパークラスのメソッドを上書きするメソッドは以下です
//-- 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 * 114;
 		return usd;
 	}
 
 	public void inUSD(int usd) {
 		okane+=usd * 114;
 	}
 	
 	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( usd * 90) / 90 );
 	}
 
 	public void inUSD(int usd) {
 		in( usd * 90 );
 	}
 	
 …
 
 }


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



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


*** OsaifuUSDクラスの改造(2) [#sa44f577]

OsaifuUSDにprint()メソッドを追加して、
円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。
円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。


http://gyazo.com/39a7b24a8c45e15ac55693592c2eb7cf.png



-解答例

 	public void print() {
 		super.print();
 		System.out.println("( " + (okane / 114) + " usd )" );
 	}




***継承でウィンドウを作る [#m14bd7eb]

授業の最初に、こんなウィンドウを作るプログラムを紹介しました。

 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);
        }
 
 }

#ref(How2Java/simplewindow.png)

これはSimpleWindowというクラスの中で、JFrameのインスタンスを作って表示しました。


これを、JFrameを継承したクラスを作り、
そのクラスの中で自分のインスタンスを作り表示することも可能です。

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



Javaでは以下のように継承してウィンドウを作り、
その機能を拡張して、アプリケーションを作るのが一般的です。

 import javax.swing.JFrame;
 
 public class SimpleWindow extends JFrame {
  	
  	void init() {
  	this.setTitle("私が作った最初の窓"); //this.じゃなくてsuper.でもok
  	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	this.setSize(200,100); 
 	this.setVisible(true);
 	}
 
 	public static void main(String args[]) {
 		SimpleWindow w = new SimpleWindow();
 		w.init();
 	}
 	
 }


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

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


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



**本日のレポート [#w02fe277]

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



*10月26日 [#icc32449]

-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());
 	}

**第7章 クラスとオブジェクトの操作 [#k1b96e7b]





***	他の点との距離を返すメソッドの例を説明しました [#xfa5f246]

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

distanceという名前は同じでも、引数の違いで、異なる動作をさせることができます。




*** Osaifuクラスを作ってみよう [#i9df5c2e]
-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; }





**本日のレポート [#taf5ddf5]

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



*10月19日 [#p32c04e4]


**第5章(つづき) [#j26db0b3]

***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);
        }
 }




-----

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

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

-演習5.6をやってみよう

while文をfor文に変えてみる

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

できた人から2:30pmまで休憩してください。



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

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


http://gyazo.com/bbdd3587977a172f7fa7f00c4f5787e0.png



-演習問題6.1, 6.2, 6.3

例えば以下のような実行結果が出るようにしてください

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

***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();
 
        }


**本日のレポート [#taf5ddf5]

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




*10月12日 [#r5f257e7]



**第3章 [#xc22f04b]

-演習

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

--arg[0]とarg[1]をprintlnの中で+でつないで表示する

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

ヒント

 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の基準に従ってABCDEを表示するプログラムを書け。
動作例を以下に示す。

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");
 		}
 	}
 }

**本日のレポート [#taf5ddf5]

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

//-----------------------------------------------------------

*10月5日 [#k1f7eb81]

**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/8/docs/api/index.html






***教科書 [#a7e1ce26]

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

http://www.amazon.co.jp/dp/4883732258/

買ってください。もしくは、先輩から安く譲ってもらってください。

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

*** この講義の順序 [#gcf48d66]
+Javaになれる(C言語などのプログラミング手法の復習)
+オブジェクト指向について理解する
+GUIプログラミングについて理解する(イベント駆動)
+お絵描きプログラムを作ってみる

*** 成績評価 [#c732dbb9]
+欠席は3回までです。欠席4回で自動的に不可になります。公欠、病欠は欠席にカウントしません。
+お絵描きプログラムの完成度,作り込み
+毎回の宿題の達成(参考程度)
+出席状況(欠席回数で減点します)
+成績は研究室配属にも考慮します(予定)




**第1章および第2章 [#y3ae1beb]


*** macOSでJavaを使う [#g3e7de3f]

macOSはJavaと相性が良く、最初からjavaがインストールされています。
ということでWindowsより簡単に(というか何もしなくても)javaが使えます。

*** terminalを起動する [#ia8beba9]

//#ref(How2Java/terminal.png)

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

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

- ダブルクリックすると起動します。
よく使うことになると思いますので、dockにドラッグアンドドロップして
登録しておくと良いかと思います。


//- メニューのターミナル/環境設定...を開きます。
//ここで、テキストを選んで、「テキストをアンチエイリアス処理」に
//チェック入れておくとフォントが奇麗なのでおすすめです。
//
//http://siio.jp/gyazo/8aa6f5ab8878bc57c0657b94f5ae7a58.png

//- おなじウィンドウの「詳細」に、「文字エンコーディング」というのがあります。
//Javaの場合、ここで「Unicode (UTF-8)」を選んでおきましょう。
//(日本語コードにはいろいろな種類があって混乱しますが、21世紀に生きるみなさんはUnicodeで統一していきましょう)

//http://gyazo.com/1b36039be113ef9e8ed04842aaeb3da6.png

- ターミナルから、javacとタイプしてみてください。Javaがすでに入っているので、
オプションの説明が日本語で出てくると思います。
--最近のmacOSでは、Javaが標準で入っていない場合もあります。
その場合は、ダインロードするかどうか聞かれますので、ダウンロードしましょう。
//--ここでの日本語表示が化けていたら、javaがUnicodeじゃなくてShift-JISなどのコードで動いていることになります。タ//ーミナルをShift-JISなどに設定しても良いのですが、ここは、JavaをUnicodeで動かすようにしましょう。

//-JavaをUnicodeで動かす(前項で文字化けした場合の対処)
//--javacを起動するときに、javac -J-Dfile.encoding=UTF-8 とオプションを付けます
//--javaを起動するときには、java -Dfile.encoding=UTF-8 とオプションを付けます。
//--面倒なので、.bash_profileに登録しておきましょう
//-- ~/.bash_profileを開いて以下の行を追加します
// alias javac='javac -J-Dfile.encoding=UTF-8'
// alias java='java -Dfile.encoding=UTF-8'


*** テキストエディタを用意しておく [#qfba9e5b]


//http://siio.jp/gyazo/2c0e58d1b83d396e1fbe6f5d247670ff.png

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

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

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

- CotEditorを使うには、https://coteditor.comからダウンロードして~/Applicationsにコピーします。

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

//http://siio.jp/gyazo/7579915fefe1ecd9c0e4e2ddfa55177d.png


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


- ターミナルから、vi Hello.javaとかemacs Hello.javaとかpico Hello.javaとかタイプしたり、
もしくは、他のエディタを起動してファイル/新規/javaを選んで新しいファイルを作って開きます。

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

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

//-このときmiで改行コードをLF (UNIX)にしておいてください。またUTF-8になっていれば日本語も正しく出るはずです。
//
//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);
        }
 
 }

これを&#x53;impleWindow.javaという名前で保存して、

 javac SimpleWindow.java
 java SimpleWindow

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

#ref(How2Java/simplewindow.png)




** 出来上がったプログラムの提出方法 [#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]]一覧をみることができます。
-同じ名前のフォルダを投げ込むと、エラーになります。ということで新しいバージョンができたら別の名前のフォルダを作って提出し直してください。(フォルダ名最後に数字をつけてください)



**レポート提出方法 [#ac87d6ac]

 /home/isstaff/siio/Public/Drop Box/.

に提出してください。ターミナル.appからなら

 cp 123456siioitiro.zip /home/isstaff/siio/Public/Drop\ Box

としてください。ファインダーからなら、メニューから「移動」「フォルダへ移動...」を選んで
以下のように入力して、移動ボタンを押して、そこに現れるドロップボックスホルダに、ドラッグアンドドロップしてください。

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


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


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS