Lecture

LectureOld

メディア創造論 2013年集中講義(北陸先端大)

授業資料

  1. http://siio.jp/lecture/humaninterface/HCI_c1.ppt.pdf
  2. http://siio.jp/lecture/humaninterface/HCI_c2.ppt.pdf
  3. http://siio.jp/lecture/humaninterface/HCI_c3.ppt.pdf
  4. http://siio.jp/lecture/humaninterface/HCI_c10.ppt.pdf

試験問題(予定) Exam Question

マルチメディアプログラミング実習 2012年度前期

欠席状況

3/4以上出席してください。(欠席は3回まで)

学籍番号欠席回数判定
11205013
11205021
11205151
11205171
11205291
11205341
11205353
11205372
11205393
11205401
1120541取消
11205422
082051011不可

講義予定

月日内容
10/4第1,2章
10/11
10/18
10/25椎尾海外出張のため休講
11/1学会研究会のため休講
11/8
11/15
11/22
11/29創立記念日
12/6椎尾学会出張のため休講
12/13
12/20
12/25木曜授業の日だそうですので授業実施します
1/10
1/17
1/24
1/31大学院入試のため休講

javaのマニュアル

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html

http://docs.oracle.com/javase/jp/6/api/

マルチメディアプログラミングの最終課題

提出課題として最低やってほしいこと

機能拡張:以下のことができれば加点します

機能拡張の詳細はSimpleDraw

を見てください。SimpleDrawのページでは、

の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。 説明書に、工夫したところを書いておいてください。

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

締切

2013年1月10日

今日の提出課題

一筆書きを解消したプロジェクトファイル(~Documents/workspace/SimpleDraw)を 複製してフォルダ名を「ファイル名+学生名」にしてzipで圧縮して提出してください。

Eclipseを使ってみよう

http://siio.jp/gyazo/4383db7fb81f9eacbf5cc959ff77a33d.png

Eclipseの警告を消す方法

	private static final long serialVersionUID = 42L;

という変数を定義しておきます。

(演習課題1)上のお絵描きプログラムを改良してください

  1. 下のプログラムでは、マウスポインターの位置と、描かれる線の位置がずれています。直してください。
  2. 下のプログラムでは,描画するとゴミが出ます. (前回描き終わった場所から線が引けてしまって、一筆書き状態になっています) これを出ないように改良してください.

一筆書きを解消するヒント

線を引く簡単なプログラム

JPanelのサブクラスを作りました。

import javax.swing.JPanel;
import java.awt.Graphics;

public class DrawPanel extends JPanel {

	public void drawLine(int x1, int y1, int x2, int y2){
		Graphics g = this.getGraphics();
		g.drawLine(x1, y1, x2, y2);
	}
 }

こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けます。 リスナーになっているので、こちらでマウスなどのイベントを受け取ります。

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class SimpleDraw extends JFrame implements MouseMotionListener {

	int lastx=0, lasty=0, newx, newy;
	DrawPanel panel;
 

	public void mouseMoved(MouseEvent arg0) {
       }

	public void mouseDragged(MouseEvent arg0) {
		newx=arg0.getX();
		newy=arg0.getY();
		panel.drawLine(lastx,lasty,newx,newy);
		lastx=newx;
		lasty=newy;
	}


	private void init() {
		this.setTitle("Simple Draw");
		this.setSize(300, 200);
		this.addMouseMotionListener(this);
		panel=new DrawPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		SimpleDraw frame=new SimpleDraw();
		frame.init();
	}

}

マウスイベント

マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。 以下のようにするとイベントをうけとれるます。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{
	
	public void mouseClicked(MouseEvent e) {
		System.out.println("mouse clicked!");
	}
	public void mouseEntered(MouseEvent e) {
		System.out.println("mouse entered!");
	}
	public void mouseExited(MouseEvent e) {
		System.out.println("mouse exited!");
	}
	public void mousePressed(MouseEvent e) {
		System.out.println("mouse pressed!");
	}
	public void mouseReleased(MouseEvent e) {
		System.out.println("mouse released!");
	}
	public void mouseDragged(MouseEvent e) {
		System.out.println("mouse dragged!");
	}
	public void mouseMoved(MouseEvent e) {
		System.out.println("mouse moved!");
	}
	
	public static void main(String[] args) {
		MouseTest test = new MouseTest();
		test.setTitle("MouseTest");
		test.addMouseListener(test);
		test.addMouseMotionListener(test);
		test.setSize(400,300);
		test.setVisible(true);
		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
}

サウンドファイルを再生する

http://siio.jp/lecture/Sounds/Ping.aiff

(他にも、Basso.aiff Frog.aiff Hero.aiff Pop.aiff Submarine.aiff Blow.aiff Funk.aiff Morse.aiff Purr.aiff Tink.aiff Bottle.aiff Glass.aiff Ping.aiff Sosumi.aiff を置いておきました)

これを再生するプログラムを作ってみましょう。以下で再生できます。

import java.io.*;
import javax.sound.sampled.*;

public class AudioPlay {
	public static void main(String[] args)  {
       	try{
          		File audioFile = new File("Ping.aiff");
           		AudioFormat format = AudioSystem.getAudioFileFormat(audioFile).getFormat();
          		DataLine.Info info = new DataLine.Info(Clip.class, format);
           		Clip clip = (Clip)AudioSystem.getLine(info);

	    		clip.open(AudioSystem.getAudioInputStream(audioFile));
           		clip.start();
	    		clip.drain();
	    		clip.close();
        	}
        	catch(Exception e){
             		e.printStackTrace();
       	}
	}
}

2012年12月25日

簡単なアニメーション

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class SimpleAnime extends JFrame {

	private void init() {
		this.setTitle("SimpleAnime");
		this.setSize(300,400);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
	}
}

このアニメーションはかなり手抜きです。 本来は、マルチスレッドにして、アニメーションを動かすパートと、 それ以外の処理をするパートに分けて動かします。 今回は、アニメーション以外の処理を何もしないという前提で、 無限ループでアニメーションを動かしています。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class SimpleAnime extends JFrame {
	JPanel panel;
	Graphics g;
	
	private void init() {
		this.setTitle("SimpleAnime");
		this.setSize(300,400);
		panel = new JPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		g=panel.getGraphics();
		g.setColor(Color.blue);

		int x=0, xdelta=10;
		while(true) {
			g.fillOval(x,100,50,50);
			try{Thread.sleep(50);}catch(Exception e){}
			g.clearRect(x, 100, 52,52);
			x+=xdelta;
			if(x>250) xdelta=-10;
			if(x<0) xdelta=10;
		}
		
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
	}
}

マルチスレッドについて

Javaでは次のようにしてマルチスレッドを実現します

  1. Runnableをimplementsしたクラスを作る
  2. そのインスタンスを作る
  3. そのインスタンスを引数にしてThreadクラスのインスタンスを作る
  4. そのインスタンスのstart()メソッドを呼ぶ

例えば以下のプログラムではメインとサブのスレッドが別個にに数字を表示していきます。

import java.lang.Thread;

class SubThread implements Runnable {
	public void run() {
		int i=0;
		while(true) {
			System.out.println("this is sub:" + i++);
			try {Thread.sleep(1000);}catch(Exception e){}
		}
	}
} 

class ThreadTest {
	public static void main(String[] args) {
		SubThread sub=new SubThread();
		new Thread(sub).start();
		for(int i=0;;i++) {
			System.out.println("this is main:" + i);
			try {Thread.sleep(2000);}catch(Exception e){}
		}
	}
}

マルチスレッド化する

上記のボールを動かすプログラムでは、main()で、frame.init()したあと、このメソッドで無限にアニメーション書き換えを行うことになります。なので、二度とmain()には戻ってきません。(以下で示した、メニューは、また別のスレッドで動くので、このままでも動きます)

アニメーションだけをするなら、これでも良いのですが、他にも仕事をしたい場合には難しいですし、やれないことはないですが、タイミングを計るのが難しいです。ということで、アニメーションする部分は、別のスレッドにして、そちらに任せてしまうのが通常です。

以下のように、別のインスタンスを別スレッドで動かします。別スレッドで動かすインスタンスを作るために、Animatorという名前のクラスを用意しました。別スレッドで動かすためには、Runnableをimplementする必要があります。ここで必須のrunというメソッドが、裏で実行されるので、そこに、上記のプログラムのアニメーション描画部分をそっくり移動させます。Graphics gの情報を伝えておく必要があるので、それを設定するメソッドも作りました。アニメーションしつつ、main()の方で数字を表示しています。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;

class Animator implements Runnable {
	Graphics g;

	public void setGraphics(Graphics animeG) {
		g=animeG;
	}

	public void run() {
		int x=0, xdelta=10;
		while(true) {
			g.fillOval(x,80,50,50);
			try{Thread.sleep(50);}catch(Exception e){}
			g.clearRect(x, 80, 52,52);
			x+=xdelta;
			if(x>250) xdelta=-10;
			if(x<0) xdelta=10;
		}
	}
}

class SimpleAnime extends JFrame {
	JPanel panel;
	Graphics g;
	Animator animator;
	
	private void init() {
		animator=new Animator();
		this.setTitle("SimpleAnime");
		this.setSize(300,200);
		panel = new JPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		g=panel.getGraphics();
		g.setColor(Color.blue);
		
		animator.setGraphics(g);
		new Thread(animator).start();
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
		
		for(int i=0;;i++) {
			System.out.println(i);
			try {Thread.sleep(500);}catch(Exception e){}
		}
	}
}

本日の演習

上記のプログラムにメニューを追加して、 ボールの色と速さをメニューで指定できるようにしてください

http://gyazo.com/d5db8ca6fa153520e94ee7d2b7a93915.png

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.Thread;

class Animator implements Runnable, ActionListener {
	Graphics g;
	int xdelta =5;

	public void setGraphics(Graphics animeG) {
		g=animeG;
	}
			
	public void actionPerformed(ActionEvent e) { 
		String command = e.getActionCommand(); 
		if(command !=null) { 
			System.out.println(command); 
		} 
		if(command=="red") g.setColor(Color.red); 
		 //ここに追加
		if(command=="fast") xdelta=30; 
		 //ここに追加
               //でも本当はもうすこしちゃんとしないといけない
               //このままだとxdeltaがマイナスの時にも+30にしてしまうので動きがおかしくなる
	} 
	
	public void run() {
		int x=0;
		while(true) {
			g.fillOval(x,80,50,50);
			try{Thread.sleep(50);}catch(Exception e){}
			g.clearRect(x, 80, 52,52);
			x+=xdelta;
			if(x>250) xdelta=-xdelta;
			if(x<0) xdelta=-xdelta;
		}
	}
}

class SimpleAnime extends JFrame  {
	JPanel panel;
	Graphics g;
	Animator animator;
	 
	private void makeMenu() { 
		JMenuBar menubar = new JMenuBar(); 
		JMenu menu = new JMenu("color"); 
		JMenu menuSpeed = new JMenu("speed"); 
		 
		JMenuItem item1 = new JMenuItem("red"); 
		item1.addActionListener(animator); 
		item1.setActionCommand("red"); 
		JMenuItem item2 = new JMenuItem("blue"); 
		item2.addActionListener(animator); 
		item2.setActionCommand("blue"); 
		JMenuItem item3 = new JMenuItem("yellow"); 
		item3.addActionListener(animator); 
		item3.setActionCommand("yellow"); 
		menu.add(item1); 
		menu.add(item2); 
		menu.add(item3); 
		 
		JMenuItem item4 = new JMenuItem("fast"); 
		item4.addActionListener(animator); 
		item4.setActionCommand("fast"); 
		JMenuItem item5 = new JMenuItem("slow"); 
		item5.addActionListener(animator); 
		item5.setActionCommand("slow"); 
		menuSpeed.add(item4); 
		menuSpeed.add(item5); 
	 
		menubar.add(menu); 
		menubar.add(menuSpeed); 
		this.setJMenuBar(menubar);
	} 
	
	private void init() {
		animator = new Animator();
		this.setTitle("SimpleAnime");
		this.setSize(300,200);
		this.makeMenu();
		panel = new JPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		g=panel.getGraphics();
		g.setColor(Color.blue);
		
		animator.setGraphics(g);
		new Thread(animator).start();
	}

	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
		
		for(int i=0;;i++) {
			System.out.println(i);
			try {Thread.sleep(500);}catch(Exception e){}
		}
	}
}

本日のレポート

SimpleAnime.javaとclassを「ファイル名+学生名」のフォルダにまとめてzipで圧縮して提出してください。

Mac OS X

How2MacOSXProgramming を見てください

iPhone

How2iPhoneProgramming を見てください

他の環境でのGUIプログラミングの例

X11

以下の内容の新しいファイル,buttontest.cを作ってください. printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください. 入力が面倒なら,添付ファイルの buttontest.c をダウンロードしてください.

#include <X11/Xlib.h>
#include <stdio.h>
 
int main (){
	Display *display = XOpenDisplay (NULL);
	XEvent event;
	Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),0,0,150,100,0,0,0);
	XSelectInput(display,window,KeyPressMask | ButtonPressMask |  ButtonReleaseMask);
	XMapWindow(display, window);
	XFlush(display);

	while(1) {
		XNextEvent(display,&event);
		switch (event.type) {
		  case KeyPress: 
			printf("key\n");
			break;
		  case ButtonPress:
			printf("button down\n");
			printf("button\n");
			break;
		  case ButtonRelease:
			printf("button up\n");
			break;
		}
	}
	return 0;
}

以下のコマンドでコンパイルしてください.

cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -lX11

出来上がったファイルを,./a.outで実行してください.

Java Appletの作り方

いままでは、Java Applicationを作ってました。 これはjavaコマンドから実行するアプリケーションでした。 このほか、Javaには、Java Appletという実行形式式があります。 Appletは、webページなどで動かすことができます。 もともとは、webサービスでクライアント側でアプリケーションを動かすために 開発されました。

AppletはAppletクラスを継承して作ります。 Appletクラスは、java.awt.Panelを継承しています。 なにができるのかは、java のマニュアルをみてください。

たとえば、次のようなプログラムをAppletTest.javaとして作ります。 これをコンパイルします。

import java.awt.*;
import java.applet.*;

public class AppletTest extends Applet {
    public void paint(Graphics g) {
        g.drawString("Hello World!!", 60, 30);
    }
}

これはhtmlの中から呼び出すことができます。 たとえば、つぎのような、index.htmlをつくります。

<html>
<head><title>Applet Test</title></head>
<body>

<applet code="AppletTest.class" width="300" height="150">
</applet>

</body>
</html>

これを、さきほどコンパイルしたclassと同じディレクトリにおいて、 webブラウザで開くと、java appletのプログラムが動きます。

http://siio.jp/gyazo/637225a1c08bef7e853944ad9b8ed390.png

または、このhtmlファイルをアップレットビューアでみることもできます。

appletviewer index.html 

などして動作を確認できます。

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

つぎのようにすれば、お絵描きプログラムも作ることができます。 下のプログラムは、前回、前々回やった、一筆書きになってしまうお絵かきプログラムです。 init()は、起動したときに最初に一度だけ呼び出されるメソッドです。

import java.awt.*;
import java.applet.*;
import java.awt.event.MouseMotionListener;
import java.awt.event.*;

public class AppletTest extends Applet implements MouseMotionListener {

int lastx,lasty,newx,newy;
Graphics g;
   
    public void mouseMoved(MouseEvent arg0) {
    }

    public void mouseDragged(MouseEvent arg0) {
	newx=arg0.getX();
	newy=arg0.getY();
	g.drawLine(lastx,lasty,newx,newy);
	lastx=newx;
	lasty=newy;
    }

    public void paint(Graphics g) {
	g.drawString("Hello World!!", 60, 30);
    }

    public void init() {
	g=this.getGraphics();
	this.addMouseMotionListener(this);
    }

}

appletviewerで見てみます。

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

webブラウザでもみてみましょう。 (注意:Safariでは、読み込まれたappletが残っていますので、 更新したappletを試すためには、 Safariを一旦終了して起動しなおしてください。)

http://siio.jp/gyazo/143be91363a277f04a0fa8b1f5d5a43a.png

webサーバにおけば、世界中から使うこともできます。以下をクリックしてみてください。

http://siio.jp/lecture/applet/

2011年12月20日

第13章 様々なコンポーネントとレイアウト

13.2節を読んで,プログラム13.2を実行させてください

ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。

演習13.1をやってください

こんなのをつくってください。

http://siio.jp/gyazo/999f1e766551a994186cc3d159bde0bf.png

BorderLayoutでもできるようですが、私はGridLayour使ってみました。

 		panel.setLayout(new GridLayout(2,2));
		panel.add(textleft);
		panel.add(textright);
		panel.add(button);
		panel.add(clearbutton);

ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。

解答例

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JTextFieldSample extends JFrame implements ActionListener {
	JButton button, clearButton;
	JTextField textleft, textright;
	
	JTextFieldSample(String title) {
		setTitle(title);
		button = new JButton("left to right");
		clearButton = new JButton("clear");
		button.addActionListener(this);
		clearButton.addActionListener(this);
		
		textleft = new JTextField(10);
		textright = new JTextField(10);
		JPanel panel=new JPanel();
		panel.setLayout(new GridLayout(2,2));
		panel.add(textleft);
		panel.add(textright);
		panel.add(button);
		panel.add(clearButton);
		Container container=this.getContentPane();
		container.add(panel);
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==(button)) {
			textright.setText(textleft.getText());
			textleft.setText("");
		}else if(e.getSource()==(clearButton)) {
			textright.setText("");
		}
	}
	
	public static void main(String[] args) {
		JTextFieldSample sample = new JTextFieldSample("JTextFieldSample");
		sample.pack();
		sample.setVisible(true);
		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

13.5節を読んで,プログラム13.5を実行してください

http://siio.jp/gyazo/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。

演習13.2をやってください(メニュー項目は何でも良いです)

演習ができそうにないという人は、飛ばして、次に進んでください。

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

13.6節を読んで,プログラム13.6を実行してください

教科書203ページのプログラム13.6の5行めのところに、

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

ボタンの色がかわるはずですが、javaのバージョンでは機能しないこともあるようです。

		button.setForeground(color);

として試してみてください(この場合ボタンの文字の色が変わります)

今日のレポート

今日作った色選択プログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年12月13日

第12章 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);
       }
}

JFrameを継承するプログラミング(1)

import javax.swing.JFrame;
public class SimpleWindow extends JFrame {

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

JFrameを継承するプログラミング(2)

import javax.swing.JFrame;
public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setSize(200,100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main (String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}
}

ラベルを表示するウィンドウ

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、 Hello!という文字を出してみよう。

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

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JLabel label = new JLabel("Hello!");
		Container container = this.getContentPane();
		container.add(label);
		this.pack();
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}

}

回答例2(こうしても良い)

import javax.swing.*;
import java.awt.*;

public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.getContentPane().add(new JLabel("hello"));
		this.pack();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main (String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}
}

ボタンを2個表示するウィンドウ

プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 2個のボタンを出してみよう。

http://siio.jp/gyazo/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleButton extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JPanel panel = new JPanel();
		JButton button1 = new JButton("button1");
		JButton button2 = new JButton("button2");
		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);	
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

このプログラムでは,ボタンを押しても何もおこりません.

ボタンが押されたイベントを受け取るためには,

  1. ActionListenerをimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンにaddActionListener()で登録する 必要があります.

プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

http://siio.jp/gyazo/67d27d0588f4dd5d11410e1107165994.png

ヒント1(最初の3行です)

import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

ヒント2(最初の5行です)

import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

JButton button1, button2;

	public void initialize () {

解答例

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

JButton button1, button2;

	public void initialize () {
		this.setTitle("私が作った最初の窓");
	
		JPanel panel = new JPanel();
		button1 = new JButton("button1");
		button2 = new JButton("button2");
		button1.addActionListener(this);
		button2.addActionListener(this);

		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void actionPerformed (ActionEvent e) {
		if(e.getSource()==button1) 
			System.out.println("Hello");
		else
			System.out.println("Goodbye");
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

今日のレポート

プログラム12.4に相当するプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年12月13日 (宿題提出)

前回の授業でお願いした宿題を提出してください。

以上を、番号+名前のフォルダに入れて、zipで圧縮して、いつもの課題と同様に提出してください。

宿題(1)の回答例を書いておきます

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。

public class URLJpeg2 {
	public static void main (String argv[]) {
		byte[] data = new byte[512];
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int datalength;
			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

宿題(2011年12月13日授業開始時に提出)

来週、再来週と2回休講するので、宿題を用意しました。 12/3の授業の冒頭で以下のファイルを提出していただきます。

以上を、番号+名前のフォルダに入れて、zipで圧縮して、12/3の授業の冒頭で提出してください。

宿題(1)写真読み込みの高速化

今日の例では写真データを1バイトずつ読み書きしていました。 InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。 たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。 そこで、複数バイト読み書きするよう、上記のプログラムを変更して、 実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。

public int read(byte[] b)
         throws IOException
入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
実際に読み込まれたバイト数は整数として返されます。
このメソッドは、入力データが読み込めるようになるか、ファイルの終わりが検出されるか、
あるいは例外がスローされるまでブロックします。

を使って読みこみ、

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException
指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

を使ってください。

		byte[] data = new byte[512];

という配列を用意して、

			int datalength;
			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);

とします。

このプログラムで何倍速くなったか計測してください。

宿題(2)引数のURLをファイルにするプログラムを考えてみましょう

curlというコマンドがあります。

curl http://ocha.ac.jp/

などとすると、htmlが見られますし、

curl http://siio.jp/cat.jpg > cat.jpg

などとすると、ファイルとして保存できます。これに近いプログラムを作ってみましょう。 たとえば、

java Curl http://ocha.ac.jp/

とすると、htmlが見られ、

java Curl http://siio.jp/cat.jpg > cat.jpg

とすると、ファイルとして保存できるプログラムを作ってください。

ちなみに>を使ってファイルにリダイレクトするのはOSの仕事ですので、皆さんがつくるものは、第一引数のURLから1バイト取得して、それを標準出力に出力することを繰り返すプログラムとなります。

2011年11月22日

第11章 入出力(つづき)

プログラム11.3をやってみてください

作ったファイルを

od -h 

または

hexdump

してみてください

$ hexdump writer.txt 
0000000 32 30 30 36 0a 4a 61 76 61 20 e6 95 99 e7 a7 91
0000010 e6 9b b8 0a                                    
0000014

文字列をかきだすだけならFile Writerでもできる

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

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

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をやってください

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

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

ヒント

 import java.io.*;
 
 public class En112 {
 	public static void main(String[] args) {
 	
 		try {


ここにプログラムを書く
 		
 			}
			catch(IOException e) {
 				System.out.println(e);
  			}
    }
 }

解答例

import java.io.*;

public class En112 {
	public static void main(String[] args) {
	
		try {
			InputStreamReader ireader = new InputStreamReader (System.in);
			BufferedReader breaderK = new BufferedReader(ireader);
			String line = breaderK.readLine();
			
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			pwriter.println(line);
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breaderF = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breaderF.readLine())  != null)
				System.out.println(tmp);
			
			breaderF.close();
		
			}
			catch(IOException e) {
				System.out.println(e);
			}
	}
}

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう

http://siio.jp/gyazo/13044fdd9d372118a1f6fe93896eadb3.png

ヒント1

import java.net.*;

が必要です。

URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

InputStreamReader isreader = new InputStreamReader(istream);

でこれからInputStreamReaderのインスタンスが得られる。

BufferedReader breader = new BufferedReader( isreader );

でこれからBufferedReader のインスタンスが得られる。

ヒント2

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			
			 
			 ここにプログラムを書く
			 
			 
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

解答例:

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			InputStreamReader isreader = new InputStreamReader(istream);
			BufferedReader breader = new BufferedReader(  isreader );
		
			String line;
			while((line=breader.readLine()) != null) System.out.println(line);
		
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

写真ファイルのダウンロード

http://siio.jp/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント1:

InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。 1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。

ヒント2:

import java.io.*;
import java.net.*;

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

というインスタンスを作って、

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int aData;
			while((aData  = istream.read()) != -1) fout.write(aData);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

今日のレポート

写真ファイルのダウンロードのプログラム、 上の例では、URLJpeg.javaとURLJpeg,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年11月15日(つづき)

第11章 入出力

整数を出力する例

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

整数を入出力する例

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

Stringインスタンスも読み書きできる

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.writeUTF("hello java");
			dout.writeInt(100);
			dout.close();
			
 			FileInputStream finput = new FileInputStream("dout.dat");
 			DataInputStream dinput = new DataInputStream(finput);
 			System.out.println(dinput.readUTF());
			System.out.println(dinput.readInt());
 			dinput.close();
			
		}catch (Exception e) {
			System.out.println(e);
		}
	}

ファイルの中身も見ておこう。hello javaが10文字なので、最初に10という数字が入っている。

$ hexdump dout.dat 
0000000 00 0a 68 65 6c 6c 6f 20 6a 61 76 61 00 00 00 64
0000010

演習11.1 をやってください

作ったファイルを

od -h dout.dat

または

hexdump dout.dat

してみてください

解答例

import java.io.*;

public class En111 {
	public static void main (String[] args) {
		try {
                       int i;
			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.1で作ったjavaとclassと、作成したデータファイル(dout.datなど)を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年11月15日

第10章 Stringクラスとコレクションフレームワーク

入力した文字を逆に出力するプログラムを作る

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

ヒント:

public static void main(String argv[]){

と書いた場合、argv[0] が最初の引数を示すString型のインスタンスになる

ヒント:これで順方向の表示ができる

			int len = argv[0].length();
			for(int i = 0; i<len; i++) {
				System.out.print(argv[0].charAt(i));
			}

できた人は、tryを使ったエラー処理も作ってください。

解答例

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 の練習

サンプルプログラムを実行するときは、

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

などと定義すると良い。

Hash Mapの練習

プログラム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

ヒント:

	HashMap<String,String> map = new HashMap<String,String>();

	map.put("apple","りんご");

ヒント:

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","バナナ");//ヒント:

解答例:

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

	}
}

第9章 エラーと例外処理

次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。

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

2012年11月8日

Osaifuクラスを作ってみよう

	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://siio.jp/gyazo/c618901458edc1ba338cab87d2810157.png

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();
	}
}
	public int out(int x) {
		if(x < okane ) {
			okane = okane -x;
			return x;
		} else {
			int nokori = okane;
			okane =0;
			return nokori;
		}
	}	

つぎにOsaifuクラスにコンストラクタを追加してみよう

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

第8章 継承

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

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

public class OsaifuUSD extends Osaifu {
	public static void main(String argv[]) {
		OsaifuUSD saifu1= new OsaifuUSD();
		OsaifuUSD saifu2=new OsaifuUSD();
		saifu1.in(1000);
		saifu2.inUSD(5);
		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クラスの改造

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

http://siio.jp/gyazo/39a7b24a8c45e15ac55693592c2eb7cf.png

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

今日のレポート

OsaifuUSD.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2012年10月18日

第6章

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

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

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

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

       }
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.getx();
		int dy = pty - this.gety();
		int dz = ptz - this.getz();
		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
	}
	
	double distance ( Point3D p ) {
		return this.distance(p.getx(), p.gety(), p.getz());
	}

今日のレポート

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

第5章

for-each文は新しい手法なので練習しましょう

先週やりのこした5章の続き(最後のところ)です。

演習

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

先週作ったArgTest.javaをArgTest2.javaに複製して(クラス名も変更して)書いてみましょう。次のような動作をすれば完成です。

http://siio.jp/gyazo/8d8effac163e0dc939e74f237d8507b1.png

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

今日のレポート

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにmango.siio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. "SIIO Itiro のパブリックフォルダ" を選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

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

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

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

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

2012年10月11日

第3, 4, 5章

hhttp://siio.jp/gyazo/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]);
        }
}

乱数を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://siio.jp/gyazo/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");
		}
	}
}

または、

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

http://siio.jp/gyazo/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.02%だと倍になるのに何年かかるだろうか。確かめてみよう。

http://siio.jp/gyazo/7a30f764158c89aeb678481cfa4c157a.png

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

今日のレポート

を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2012年10月4日

教科書

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

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

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

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考にします)
  3. 出席状況(成績の参考にします。3/4以上出席してください。欠席は3回まで)

第1章および第2章

Mac OS XでJavaを使う

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

terminalを起動する

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

http://siio.jp/gyazo/8aa6f5ab8878bc57c0657b94f5ae7a58.png

miを用意しておく

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

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

超簡単なプログラム(hello world)を作ってみる

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

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

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

}

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

javac SimpleWindow.java
java SimpleWindow

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

simplewindow.png

昨年度以前の講義の情報

理学総論 (2012.11.19講義分)

理学総論レポート (2012.11.19講義分)

Page1 Page2 Page3

上記は、Mark Weiserがユビキタスコンピューティングについて書いた論文の冒頭部分である。 これを読んで、以下の考察をしてください。

「書く技術」「電動モータ」「ボールペン(講義で話しました)」などから、 2つ以上の例を示して、 これらが如何に「透明な技術」であるのかを説明し、 未来のコンピュータがどのような存在になるのか記述してください。

http://siio.jp/gyazo/20121203172028.png
1240655

ヒューマンインタフェース 2012年度前期

レポートのお知らせ

学籍番号受理日
10205232012年7月26日
10205242012年8月7日
10205152012年9月4日
10205192012年9月22日
10205062012年9月24日
10205092012年9月24日
10205332012年9月24日
10205402012年9月24日

レポートの課題

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

出欠表

学籍番号欠席回数評価
10205031
10205071
10205091
10205141
10205169不可
10205201
10205223
10205262
10205281
10205301
10205311
10205321
10205341
10205381
10205392
082051010不可
08205126不可

注:初回(4/12)の欠席は含んでいません。(2012.7.12.現在)

教科書

http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_AA300_.jpg

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

授業資料

  1. http://siio.jp/lecture/humaninterface/HCI_c1.ppt.pdf
  2. http://siio.jp/lecture/humaninterface/HCI_c2.ppt.pdf
  3. http://siio.jp/lecture/humaninterface/HCI_c3.ppt.pdf
  4. http://siio.jp/lecture/humaninterface/HCI_c4.ppt.pdf
  5. http://siio.jp/lecture/humaninterface/HCI_c5.ppt.pdf
  6. http://siio.jp/lecture/humaninterface/HCI_c6.ppt.pdf
  7. http://siio.jp/lecture/humaninterface/HCI_c7.ppt.pdf
  8. http://siio.jp/lecture/humaninterface/HCI_c8.ppt.pdf
  9. http://siio.jp/lecture/humaninterface/HCI_c9.ppt.pdf
  10. http://siio.jp/lecture/humaninterface/HCI_c10.ppt.pdf

(授業開始直前や直後に差し替えされている可能性があります。)

教科書サポートページ

予定

宿題

人の反応速度を測定するプログラムを作って測定してください。(2012.4.26)

GUI黎明期のPC性能を調べてください (2012.4.12)

欠席状況2012年度前期

学部「ヒューマンインタフェース」は出席重視の授業です.そのため70%以上出席お願いします. 授業回数が10回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません. 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

ヒューマンインタフェース 2012年前期

学籍番号欠席回数出席点

レポート提出状況2011年度後期

理学総論 (2011.11.28講義分

現在,提出していただいている学生さんは以下の方々です. もし,提出したのに漏れているという学生さんがいらしたら, siio@is.ocha.ac.jp まで至急お知らせ下さい.

学籍番号提出日
10406792011.12
11406612011.12
10406742011.12

欠席状況2011年度後期

学部「情報と職業」は出席重視の授業です.そのため70%以上出席お願いします. 授業回数が12回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません. 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

情報と職業 2011年後期

学籍番号欠席回数出席点
09205101
09205113
09205141
09205201
09205221
09205232
09205312
092053310不可
09205341
09205371
09305423
09306117不可
08101329不可
08101583
081022410不可
082050510不可
08205191
08205273
08205351

注:初回(10/6)の欠席は含んでいません。(2012.1.29.現在)

情報と職業 2011年後期

シラバス

予定

理学総論 (2011.11.28講義分)

理学総論レポート (2011.11.28講義分)

Page1 Page2 Page3

上記は、Mark Weiserがユビキタスコンピューティングについて書いた論文の冒頭部分である。 これを読んで、以下の考察をしてください。

「書く技術」「電動モータ」「ボールペン(講義で話しました)」などから、 2つ以上の例を示して、 これらが如何に「透明な技術」であるのかを説明し、 未来のコンピュータがどのような存在になるのか記述してください。

集中演習「ヒューマンインタフェース」出題範囲 (2012年1月実施予定)

レポート提出状況2011年前期

ヒューマンインタフェース2011年前期レポート提出状況(提出は任意です)

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

漏れがありましたら至急 siio@mac.com まで至急連絡ください

0920502
0920506
0920507
0920528
0920532
0920540

マルチメディアプログラミング実習2011年前期最終課題提出状況

締めきりました 2011年7月13日10:47

   4037  7 12 16:17:30 2011 0820540暫定版.zip
 374899  7 12 16:26:00 2011 1020501arimotoakane.zip
  37291  7 12 16:26:37 2011 1020502anbesayuri.zip
  46486  7 12 16:45:04 2011 1020502anbesayuri_new.zip
 317756  7 12 16:25:57 2011 1020503ishikawachisako.zip
 317729  7 12 16:32:41 2011 1020503ishikawachisako2.zip
 278108  7 12 16:15:52 2011 1020504itoukaori.zip
4498216  7 12 16:23:07 2011 1020505ushijima.zip
 107481  7 12 16:46:17 2011 1020506kattouhitomi13.zip
2278049  7 12 16:26:56 2011 1020507kadowakikyoko_last.zip
 684411  7 12 16:59:06 2011 1020508kannosaya.zip
 158190  7 12 16:25:38 2011 1020509kinchikukaoru.zip
 137298  7 12 16:28:02 2011 1020510kurosakiyuko.zip
 503724  7 12 16:35:04 2011 1020510kurosakiyuko_part2.zip
 149693  7 12 16:22:23 2011 1020511 gojimiyabi.zip
 533954  7 12 16:24:33 2011 1020512komatsuakiko.zip
 626497  7 12 17:55:18 2011 1020513gomierika 2 2.zip
 587267  7 12 16:35:56 2011 1020513gomierika 2.zip
 129925  7 12 16:42:48 2011 1020514saitouami1.zip
 274472  7 12 16:37:49 2011 1020515sakomiho.zip
  26698  7 12 16:26:32 2011 1020516sasohtomoko.zip
 260590  7 12 16:54:37 2011 1020517shigedomimami-2.zip
 254610  7 12 16:29:44 2011 1020517shigedomimami.zip
1461011  7 12 20:36:06 2011 1020518shimizuran_2.zip
  39364  7 12 16:42:11 2011 1020519souyuuyuu2.zip
 396476  7 12 20:29:52 2011 1020519souyuuyuu_final.zip
 366478  7 12 17:33:43 2011 1020520Tadanohanae.zip
 111048  7 12 16:37:07 2011 1020521tanakaairi15.zip
 230311  7 12 16:23:27 2011 1020522tanimotosatoko.zip
 218458  7 12 16:36:22 2011 1020523tsujiyumari.zip
 141211  7 12 16:27:11 2011 1020524tsubakidamegumi.zip
 355770  7 12 16:26:25 2011 1020525nakamuraayako.zip
 139379  7 12 16:35:35 2011 1020526nodayuriko.zip
 425143  7 12 16:26:30 2011 1020527hashimotonatsumi.zip
5106145  7 12 16:21:54 2011 1020528hamazonoyumi.zip
 346493  7 12 16:33:09 2011 1020529hinomayumi.zip
  27848  7 12 16:47:06 2011 1020530fujiiayaka13-2.zip
   5215  7 12 16:29:14 2011 1020530fujiiayaka13.zip
 324592  7 12 16:32:04 2011 1020531fujitamai.zip
1303961  7 12 16:26:53 2011 1020532hosoya.zip
 232274  7 12 16:37:58 2011 1020533 Masuda Eri 12.zip
   6196  7 12 16:31:15 2011 1020534mizunokanako.zip
 533985  7 12 16:24:20 2011 1020536motohashishiho.zip
 471173  7 12 16:36:54 2011 1020537ryuyuechin.zip
 679495  7 12 16:40:43 2011 1020538wadamegumi 13.zip
  23079  7 12 16:26:18 2011 g1020518shimizuran.zip
 655778  7 12 16:24:31 2011 g1020539watanabelisa12.zip

欠席状況2011年前期

今期の授業はいずれも出席重視の授業です.そのため70%以上出席お願いします. いずれも授業回数が12回ですので,欠席が3回を超えた場合は単位が出ません. 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.

ヒューマンインタフェース 2011年前期

学籍番号欠席回数出席点
09205011
09205031
09205052
09205082
09205113
09205124不可
09205141
09205171
09205181
09205201
09205212
09205233
09205243
09205261
092052910不可
09205351
09205361
09205372
09205381
09205424不可
082051011不可
08205274不可
04205219不可

(2011.7.7現在)

マルチメディアプログラミング実習2011年前期

学籍番号欠席回数出席点
10205071
10205091
10205163
10205221
10205251
10205301
10205381
10205391
082051012不可
08205403

(2011.7.12現在)

ヒューマンインタフェースレポート

レポートのお知らせ

提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します. (出席回数が70%に満たないことの充足にはしません)

課題

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

マルチメディアプログラミングの最終課題

提出課題として最低やってほしいこと

機能拡張:以下のことができれば加点します

機能拡張の詳細はSimpleDraw

を見てください。SimpleDrawのページでは、

の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。 説明書に、工夫したところを書いておいてください。

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

締切


マルチメディアプログラミング実習2011年前期

2011年7月12日

2011年7月5日

Java Appletの作り方

いままでは、Java Applicationを作ってました。 これはjavaコマンドから実行するアプリケーションでした。 このほか、Javaには、Java Appletという実行形式式があります。 Appletは、webページなどで動かすことができます。 もともとは、webサービスでクライアント側でアプリケーションを動かすために 開発されました。

AppletはAppletクラスを継承して作ります。 Appletクラスは、java.awt.Panelを継承しています。 なにができるのかは、java のマニュアルをみてください。

たとえば、次のようなプログラムをAppletTest.javaとして作ります。 これをコンパイルします。

import java.awt.*;
import java.applet.*;

public class AppletTest extends Applet {
    public void paint(Graphics g) {
        g.drawString("Hello World!!", 60, 30);
    }
}

これはhtmlの中から呼び出すことができます。 たとえば、つぎのような、index.htmlをつくります。

<html>
<head><title>Applet Test</title></head>
<body>

<applet code="AppletTest.class" width="300" height="150">
</applet>

</body>
</html>

これを、さきほどコンパイルしたclassと同じディレクトリにおいて、 webブラウザで開くと、java appletのプログラムが動きます。

http://gyazo.com/637225a1c08bef7e853944ad9b8ed390.png

または、このhtmlファイルをアップレットビューアでみることもできます。

appletviewer index.html 

などして動作を確認できます。

http://gyazo.com/d8174aace858dc50e603ee0fef62bcf7.png

つぎのようにすれば、お絵描きプログラムも作ることができます。 下のプログラムは、前回、前々回やった、一筆書きになってしまうお絵かきプログラムです。 init()は、起動したときに最初に一度だけ呼び出されるメソッドです。

import java.awt.*;
import java.applet.*;
import java.awt.event.MouseMotionListener;
import java.awt.event.*;

public class AppletTest extends Applet implements MouseMotionListener {

int lastx,lasty,newx,newy;
Graphics g;
   
    public void mouseMoved(MouseEvent arg0) {
    }

    public void mouseDragged(MouseEvent arg0) {
	newx=arg0.getX();
	newy=arg0.getY();
	g.drawLine(lastx,lasty,newx,newy);
	lastx=newx;
	lasty=newy;
    }

    public void paint(Graphics g) {
	g.drawString("Hello World!!", 60, 30);
    }

    public void init() {
	g=this.getGraphics();
	this.addMouseMotionListener(this);
    }

}

appletviewerで見てみます。

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

webブラウザでもみてみましょう。 (注意:Safariでは、読み込まれたappletが残っていますので、 更新したappletを試すためには、 Safariを一旦終了して起動しなおしてください。)

http://gyazo.com/143be91363a277f04a0fa8b1f5d5a43a.png

webサーバにおけば、世界中から使うこともできます。以下をクリックしてみてください。

http://siio.jp/lecture/applet/

今日の課題

上のappletを、一筆書きにならないように変更してみてください。 やりかたは、前回やったお絵かきプログラムの改良と同じです。 完成したら、.html, .java、.classファイルを、 いつものように、出席番号+名前のフォルダに入れて、 zipで圧縮して、 ファイルサーバから提出してください。

提出した後は、 引き続き、お絵かきプログラム最終課題を進めてください。

2011年6月28日

本日までにできたところ(.java、.classファイルなど)を、 いつものように、出席番号+名前のフォルダに入れて、 zipで圧縮して、 16:30までにファイルサーバから提出してください。

Eclipseの警告を消す方法

	private static final long serialVersionUID = 42L;

という変数を定義しておきます。

(演習課題1)上のお絵描きプログラムを改良してください

  1. 下のプログラムでは、マウスポインターの位置と、描かれる線の位置がずれています。直してください。
  2. 下のプログラムでは,描画するとゴミが出ます. (前回描き終わった場所から線が引けてしまって、一筆書き状態になっています) これを出ないように改良してください.

一筆書きを解消するヒント

2011年6月21日

終章 おまけ

Eclipseを使ってみよう

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png

線を引く簡単なプログラム

JPanelのサブクラスを作りました。

import javax.swing.JPanel;
import java.awt.Graphics;

public class DrawPanel extends JPanel {

	public void drawLine(int x1, int y1, int x2, int y2){
		Graphics g = this.getGraphics();
		g.drawLine(x1, y1, x2, y2);
	}
 }

こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けます。 リスナーになっているので、こちらでマウスなどのイベントを受け取ります。

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class SimpleDraw extends JFrame implements MouseMotionListener {

	int lastx=0, lasty=0, newx, newy;
	DrawPanel panel;
 

	public void mouseMoved(MouseEvent arg0) {
       }

	public void mouseDragged(MouseEvent arg0) {
		newx=arg0.getX();
		newy=arg0.getY();
		panel.drawLine(lastx,lasty,newx,newy);
		lastx=newx;
		lasty=newy;
	}


	private void init() {
		this.setTitle("Simple Draw");
		this.setSize(300, 200);
		this.addMouseMotionListener(this);
		panel=new DrawPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		SimpleDraw frame=new SimpleDraw();
		frame.init();
	}

}

簡単なアニメーション

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class SimpleAnime extends JFrame {

	private void init() {
		this.setTitle("SimpleAnime");
		this.setSize(300,400);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
	}
}

このアニメーションはかなり手抜きです。 本来は、マルチスレッドにして、アニメーションを動かすパートと、 それ以外の処理をするパートに分けて動かします。 今回は、アニメーション以外の処理を何もしないという前提で、 無限ループでアニメーションを動かしています。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class SimpleAnime extends JFrame {
	JPanel panel;
	Graphics g;
	
	private void init() {
		this.setTitle("SimpleAnime");
		this.setSize(300,400);
		panel = new JPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		g=panel.getGraphics();
		g.setColor(Color.blue);

		int x=0, xdelta=10;
		while(true) {
			g.fillOval(x,100,50,50);
			try{Thread.sleep(50);}catch(Exception e){}
			g.clearRect(x, 100, 52,52);
			x+=xdelta;
			if(x>250) xdelta=-10;
			if(x<0) xdelta=10;
		}
		
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
	}
}

こういうのを作ってほしい

http://lab.siio.jp/index.php?plugin=attach&pcmd=open&file=SimpleAnime.class&refer=Lecture

ヒント:上のアニメーションのプログラムに、メニューを取り付けて、 action Performedでメニューからのイベントを受け取れば良いです。 メニューの動きは、プログラム本来の動きと並列に動いてくれるので、 上のアニメーションのようなアニメーション以外何もできない手抜きアニメーションでも、 メニューは動いてくれます。

ヒント: action Performed ではこうしたら良い

public void actionPerformed(ActionEvent e) { 
		String command = e.getActionCommand(); 
		if(command=="red") g.setColor(Color.red); 
		if(command=="blue") g.setColor(Color.blue); 

今日のレポート

ボールのプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

Mac OS X

How2MacOSXProgramming を見てください

iPhone

How2iPhoneProgramming を見てください

他の環境でのGUIプログラミングの例

X11

以下の内容の新しいファイル,buttontest.cを作ってください. printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください. 入力が面倒なら,添付ファイルの buttontest.c をダウンロードしてください.

#include <X11/Xlib.h>
#include <stdio.h>
 
int main (){
	Display *display = XOpenDisplay (NULL);
	XEvent event;
	Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),0,0,150,100,0,0,0);
	XSelectInput(display,window,KeyPressMask | ButtonPressMask |  ButtonReleaseMask);
	XMapWindow(display, window);
	XFlush(display);

	while(1) {
		XNextEvent(display,&event);
		switch (event.type) {
		  case KeyPress: 
			printf("key\n");
			break;
		  case ButtonPress:
			printf("button down\n");
			printf("button\n");
			break;
		  case ButtonRelease:
			printf("button up\n");
			break;
		}
	}
	return 0;
}

以下のコマンドでコンパイルしてください.

cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -lX11

出来上がったファイルを,./a.outで実行してください.

サウンドファイルを再生する

http://siio.jp/lecture/Sounds/Ping.aiff

(他にも、Basso.aiff Frog.aiff Hero.aiff Pop.aiff Submarine.aiff Blow.aiff Funk.aiff Morse.aiff Purr.aiff Tink.aiff Bottle.aiff Glass.aiff Ping.aiff Sosumi.aiff を置いておきました)

これを再生するプログラムを作ってみましょう。以下で再生できます。

import java.io.*;
import javax.sound.sampled.*;

public class AudioPlay {
	public static void main(String[] args)  {
       	try{
          		File audioFile = new File("Ping.aiff");
           		AudioFormat format = AudioSystem.getAudioFileFormat(audioFile).getFormat();
          		DataLine.Info info = new DataLine.Info(Clip.class, format);
           		Clip clip = (Clip)AudioSystem.getLine(info);

	    		clip.open(AudioSystem.getAudioInputStream(audioFile));
           		clip.start();
	    		clip.drain();
	    		clip.close();
        	}
        	catch(Exception e){
             		e.printStackTrace();
       	}
	}
}

マウスイベント

マウスイベントを受け取るには、Mouse ListenerやMouse Motion Listenerなどをインプリメントします。 以下のようにするとイベントをうけとれるます。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MouseTest extends JFrame implements MouseListener, MouseMotionListener{
	
	public void mouseClicked(MouseEvent e) {
		System.out.println("mouse clicked!");
	}
	public void mouseEntered(MouseEvent e) {
		System.out.println("mouse entered!");
	}
	public void mouseExited(MouseEvent e) {
		System.out.println("mouse exited!");
	}
	public void mousePressed(MouseEvent e) {
		System.out.println("mouse pressed!");
	}
	public void mouseReleased(MouseEvent e) {
		System.out.println("mouse released!");
	}
	public void mouseDragged(MouseEvent e) {
		System.out.println("mouse dragged!");
	}
	public void mouseMoved(MouseEvent e) {
		System.out.println("mouse moved!");
	}
	
	public static void main(String[] args) {
		MouseTest test = new MouseTest();
		test.setTitle("MouseTest");
		test.addMouseListener(test);
		test.addMouseMotionListener(test);
		test.setSize(400,300);
		test.setVisible(true);
		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
}

前回の宿題:プログラム13.6 の提出

プログラム13.6 の、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年6月14日

宿題提出お願い

前回、プログラム12.4をやってくる宿題をお願いしました。 この、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

第13章 様々なコンポーネントとレイアウト

13.2節を読んで,プログラム13.2を実行させてください

ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。

演習13.1をやってください

こんなのをつくってください。

http://gyazo.com/999f1e766551a994186cc3d159bde0bf.png

BorderLayoutでもできるようですが、私はGridLayour使ってみました。

 		panel.setLayout(new GridLayout(2,2));
		panel.add(textleft);
		panel.add(textright);
		panel.add(button);
		panel.add(clearbutton);

ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。

解答例

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JTextFieldSample extends JFrame implements ActionListener {
	JButton button, clearButton;
	JTextField textleft, textright;
	
	JTextFieldSample(String title) {
		setTitle(title);
		button = new JButton("left to right");
		clearButton = new JButton("clear");
		button.addActionListener(this);
		clearButton.addActionListener(this);
		
		textleft = new JTextField(10);
		textright = new JTextField(10);
		JPanel panel=new JPanel();
		panel.setLayout(new GridLayout(2,2));
		panel.add(textleft);
		panel.add(textright);
		panel.add(button);
		panel.add(clearButton);
		Container container=this.getContentPane();
		container.add(panel);
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==(button)) {
			textright.setText(textleft.getText());
			textleft.setText("");
		}else if(e.getSource()==(clearButton)) {
			textright.setText("");
		}
	}
	
	public static void main(String[] args) {
		JTextFieldSample sample = new JTextFieldSample("JTextFieldSample");
		sample.pack();
		sample.setVisible(true);
		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

13.5節を読んで,プログラム13.5を実行してください

http://gyazo.com/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。

演習13.2をやってください(メニュー項目は何でも良いです)

演習ができそうにないという人は、飛ばして、次に進んでください。

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

13.6節を読んで,プログラム13.6を実行してください

教科書203ページのプログラム13.6の5行めのところに、

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

宿題:プログラム13.6

今日のレポート

今日作ったメニューを出すプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年6月7日

写真読み込みの高速化

上記の例では写真データを1バイトずつ読み書きしていました。 InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。 たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。 そこで、複数バイト読み書きするよう、上記のプログラムを変更して、 実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。

read

public int read(byte[] b)
         throws IOException
入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
実際に読み込まれたバイト数は整数として返されます。
このメソッドは、入力データが読み込めるようになるか、ファイルの終わりが検出されるか、
あるいは例外がスローされるまでブロックします。

を使って読みこみ、

write

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException
指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

を使ってください。

		byte[] data = new byte[512];

という配列を用意して、

			int datalength;
			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);

とします。

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。

public class URLJpeg2 {
	public static void main (String argv[]) {
		byte[] data = new byte[512];
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int datalength;
			while(( datalength=istream.read(data)) != -1) fout.write(data, 0, datalength);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

引数のURLをファイルにするプログラムを考えてみましょう

curlというコマンドがあります。

curl http://ocha.ac.jp/

などとすると、htmlが見られますし、

curl http://siio.jp/cat.jpg > cat.jpg

などとすると、ファイルとして保存できます。これに近いプログラムを作ってみましょう。

第12章 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);
       }
}

JFrameを継承するプログラミング

import javax.swing.JFrame;
public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setSize(200,100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main (String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}
}

ラベルを表示するウィンドウ

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、 Hello!という文字を出してみよう。

http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JLabel label = new JLabel("Hello!");
		Container container = this.getContentPane();
		container.add(label);
		this.pack();
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}

}

ボタンを2個表示するウィンドウ

プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 2個のボタンを出してみよう。

http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleButton extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JPanel panel = new JPanel();
		JButton button1 = new JButton("button1");
		JButton button2 = new JButton("button2");
		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);	
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

このプログラムでは,ボタンを押しても何もおこりません.

ボタンが押されたイベントを受け取るためには,

  1. ActionListenerをimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンにaddActionListener()で登録する 必要があります.

プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png

ヒント1(最初の3行です)

import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

ヒント2(最初の5行です)

import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

JButton button1, button2;

	public void initialize () {

解答例

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

JButton button1, button2;

	public void initialize () {
		this.setTitle("私が作った最初の窓");
	
		JPanel panel = new JPanel();
		button1 = new JButton("button1");
		button2 = new JButton("button2");
		button1.addActionListener(this);
		button2.addActionListener(this);

		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void actionPerformed (ActionEvent e) {
		if(e.getSource()==button1) 
			System.out.println("Hello");
		else
			System.out.println("Goodbye");
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

宿題:プログラム12.4

今日のレポート

ボタンを押すとHelloとGoodbyeを表示するプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年5月31日

第11章 入出力

整数を出力する例

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

整数を入出力する例

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 をやってください

作ったファイルを

od -h dout.dat

または

hexdump dout.dat

してみてください

解答例

import java.io.*;

public class En111 {
	public static void main (String[] args) {
		try {
                       int i;
			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をやってみてください

作ったファイルを

od -h 

または

hexdump

してみてください

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

文字列をかきだすだけならFile Writerでもできる

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

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

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をやってください

キーボードから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);
  			}
    }
 }

解答例

import java.io.*;

public class En112 {
	public static void main(String[] args) {
	
		try {
			InputStreamReader ireader = new InputStreamReader (System.in);
			BufferedReader breaderK = new BufferedReader(ireader);
			String line = breaderK.readLine();
			
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			pwriter.println(line);
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breaderF = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breaderF.readLine())  != null)
				System.out.println(tmp);
			
			breaderF.close();
		
			}
			catch(IOException e) {
				System.out.println(e);
			}
	}
}

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png

ヒント1

import java.net.*;

が必要です。

URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

ヒント2

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			
			 
			 ここにプログラムを書く
			 
			 
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

解答例:

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
			BufferedReader breader = new BufferedReader(  isreader );
		
			String line;
			while((line=breader.readLine()) != null) System.out.println(line);
		
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

写真ファイルのダウンロード

http://siio.jp/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント1:

InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。 1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。

ヒント2:

import java.io.*;
import java.net.*;

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

というインスタンスを作って、

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int aData;
			while((aData  = istream.read()) != -1) fout.write(aData);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

今日のレポート

写真ファイルのダウンロードのプログラム、 上の例では、URLJpeg.javaとURLJpeg,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年5月24日

第9章 エラーと例外処理

次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。

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クラスとコレクションフレームワーク

入力した文字を逆に出力するプログラムを作る

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

ヒント:

			int len = argv[0].length();
			for(int i = len - 1; i>=0; i--) {
				System.out.print(argv[0].charAt(i));
			}

解答例

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 の練習

サンプルプログラムを実行するときは、

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

などと定義すると良い。

Hash Mapの練習

プログラム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

ヒント:

	HashMap<String,String> map = new HashMap<String,String>();

	map.put("apple","りんご");

ヒント:

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","バナナ");//ヒント:

解答例:

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とclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年5月17日

Osaifuクラスを作ってみよう

	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

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();
	}
}
	public int out(int x) {
		if(x < okane ) {
			okane = okane -x;
			return x;
		} else {
			int nokori = okane;
			okane =0;
			return nokori;
		}
	}	

つぎにOsaifuクラスにコンストラクタを追加してみよう

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

第8章 継承

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

public class OsaifuUSD extends Osaifu {
	public static void main(String argv[]) {
		OsaifuUSD saifu1= new OsaifuUSD();
		OsaifuUSD saifu2=new OsaifuUSD();
		saifu1.in(1000);
		saifu2.inUSD(5);
		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クラスの改造

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

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

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

今日のレポート

OsaifuUSD.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年5月10日

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

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

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

       }
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.getx();
		int dy = pty - this.gety();
		int dz = ptz - this.getz();
		return  Math.sqrt(dx * dx + dy * dy + dz * dz);
	}
	
	double distance ( Point3D p ) {
		return this.distance(p.getx(), p.gety(), p.getz());
	}

今日のレポート

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

2011年4月26日

第3章

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

第5章

演習

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

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.02%だと倍になるのに何年かかるだろうか。確かめてみよう。

http://gyazo.com/7a30f764158c89aeb678481cfa4c157a.png

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文は新しい手法なので練習しましょう

演習

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

今日のレポート

を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。

2011年4月19日

javaのマニュアル

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

http://gyazo.com/4b3bd729de9a5bff13fadef9d2f3f1d7.png

http://gyazo.com/78afe2136aced11e393a50336a5fa706.png

http://gyazo.com/35618d5a0582802a7888b3ee50ba3cf2.png

http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png

教科書

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

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

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

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)
  3. 出席状況(参考程度)

第1章および第2章

Mac OS XでJavaを使う

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

terminalを起動する

http://gyazo.com/7366bfab668207c6598c4d88ef70d2d4.png

miを用意しておく

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

http://gyazo.com/7579915fefe1ecd9c0e4e2ddfa55177d.png

超簡単なプログラム(hello world)を作ってみる

class Hello {  
public static void main (String args[]) {
        System.out.println("hello java world!");
        }
}
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.setVisible(true);
       }

}

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

javac SimpleWindow.java
java SimpleWindow

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

simplewindow.png

ヒューマンインタフェース 2011年前期

教科書

http://ec2.images-amazon.com/images/I/51SsP4P1UiL._SL500_AA300_.jpg

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

授業資料

  1. http://siio.jp/lecture/humaninterface/HCI_c1.ppt.pdf
  2. http://siio.jp/lecture/humaninterface/HCI_c2.ppt.pdf
  3. http://siio.jp/lecture/humaninterface/HCI_c3.ppt.pdf
  4. http://siio.jp/lecture/humaninterface/HCI_c4.ppt.pdf
  5. http://siio.jp/lecture/humaninterface/HCI_c5.ppt.pdf
  6. http://siio.jp/lecture/humaninterface/HCI_c6.ppt.pdf
  7. http://siio.jp/lecture/humaninterface/HCI_c7.ppt.pdf
  8. http://siio.jp/lecture/humaninterface/HCI_c8.ppt.pdf
  9. http://siio.jp/lecture/humaninterface/HCI_c9.ppt.pdf
  10. http://siio.jp/lecture/humaninterface/HCI_c10.ppt.pdf

(授業開始直前や直後に差し替えされている可能性があります。)

教科書サポートページ

マルチメディアプログラミング実習2010年後期

最終課題提出者一覧

もし、提出したにもかかわらず、ここに掲載されていない人がいましたら、大至急椎尾 (siio@is.ocha.ac.jp) まで連絡ください。

0820542hasegawayuka.zip
0820543 柳本望帆.zip
0920501IimuraNaho.zip
0920502IkematsuKaori.zip
0920503YukiIshii.zip
0920504 IsomuraMitomo.zip
0920505ichikawashiori.zip
0920506EriguchiAkiko.zip
0920507onokeiko11.zip
0920508okamura.zip
0920509ogurayukari.zip
0920510kakizawamiho11.zip
0920511KAKINOKI.zip
0920512*Kusaoke Midori 8.zip
0920513kubota.zip
0920514koikeeriko.zip
0920515saitomidori.zip
0920516kiho.zip
0920517Shinboakane.zip
0920518 sugahara iori.zip
0920519SatokoSuzuki.zip
0920520takahashi.zip
0920521Tagyo4.zip
0920522Tanaka.zip
0920523tamadamarina.zip
0920524danke.zip
0920525ChikugoSaho8-2.zip
0920526toidasayaka8 2.zip
0920527tomita.zip
0920528NishimuraAyano.zip
0920529HasegawaAyako.zip
0920530  hayakawa ai.zip
0920531hayashiayana.zip
0920532BambaFumie*.zip
0920533AsamiHigai.zip
0920534SatokaFujii.zip
0920535 fujisawasayaka10.zip
0920536 ChikaMtsueda.zip
0920537MatsudaNarumi10.zip
0920538AiMiyata.zip
0920539makiko.zip
0920540yanomidori*.zip
0920541AyanoYoshikuni.zip
0920542NarumiWatanabe.zip

授業時間変更と休講のお知らせ

伊藤先生と椎尾で休講を少なくするよう授業時間を調整しました. その結果, マルチメディアI(伊藤先生)の授業と, マルチメディアプログラミング実習(椎尾)の授業を以下のように 行います.

3-4時限5-6時限7-8時限備考
10月7日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
10月14日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
10月21日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
10月28日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
伊藤出張
11月4日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月11日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月18日マルチメディアIマルチメディアIマルチメディアI椎尾出張
11月25日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
12月2日休講休講休講伊藤・椎尾出張
12月9日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
12月16日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月6日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月13日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月20日未定マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
伊藤出張?
1月27日未定自習自習伊藤出張?・椎尾出張

javaのマニュアル

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html


マルチメディアプログラミングの最終課題

提出課題として最低やってほしいこと

以下のことができれば加点します

詳細はSimpleDrawを見てください

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

締切


2010年12月16日

他の環境でのGUIプログラミングの例

X11

以下の内容の新しいファイル,buttontest.cを作ってください. printfの逆スラッシュが正しくコピペできてないかもしれないので,注意してください. 入力が面倒なら,添付ファイルの buttontest.c をダウンロードしてください.

#include <X11/Xlib.h>
#include <stdio.h>
 
int main (){
	Display *display = XOpenDisplay (NULL);
	XEvent event;
	Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),0,0,150,100,0,0,0);
	XSelectInput(display,window,KeyPressMask | ButtonPressMask |  ButtonReleaseMask);
	XMapWindow(display, window);
	XFlush(display);

	while(1) {
		XNextEvent(display,&event);
		switch (event.type) {
		  case KeyPress: 
			printf("key\n");
			break;
		  case ButtonPress:
			printf("button down\n");
			printf("button\n");
			break;
		  case ButtonRelease:
			printf("button up\n");
			break;
		}
	}
	return 0;
}

以下のコマンドでコンパイルしてください.

cc -L/usr/X11R6/lib -I/usr/X11R6/include buttontest.c -lX11

出来上がったファイルを,./a.outで実行してください.

Mac OS X

How2MacOSXProgramming を見てください

iPhone

How2iPhoneProgramming を見てください

線を引く簡単なプログラム

JPanelのサブクラスを作りました。

import javax.swing.JPanel;
import java.awt.Graphics;

public class DrawPanel extends JPanel {

	public void drawLine(int x1, int y1, int x2, int y2){
		Graphics g = this.getGraphics();
		g.drawLine(x1, y1, x2, y2);
	}
 }

こちらはメインのプログラム。JFrameのサブクラスで、これに上記のJPanelのサブクラスを貼付けます。 リスナーになっているので、こちらでマウスなどのイベントを受け取ります。

import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

public class SimpleDraw extends JFrame implements MouseMotionListener {

	int lastx=0, lasty=0, newx, newy;
	DrawPanel panel;
 

	public void mouseMoved(MouseEvent arg0) {
       }

	public void mouseDragged(MouseEvent arg0) {
		newx=arg0.getX();
		newy=arg0.getY();
		panel.drawLine(lastx,lasty,newx,newy);
		lastx=newx;
		lasty=newy;
	}


	private void init() {
		this.setTitle("Simple Draw");
		this.setSize(300, 200);
		this.addMouseMotionListener(this);
		panel=new DrawPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		SimpleDraw frame=new SimpleDraw();
		frame.init();
	}

}

Eclipseを使ってみよう

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png

Eclipseで出るwarningは、以下の変数を定義するとなおります

private static final long serialVersionUID = 42L;

(冬休みの宿題)上のお絵描きプログラムを改良してください

上のプログラムでは,描画すると一筆書きになってしまいます。 これを直して、普通に描画できるようにしてください。 また、 マウスの位置とずれたところに線が引かれるのも直してください。(すこしずらせばok)

ヒント

2010年12月9日

オブジェクト指向用語の復習

import javax.swing.*;
public class SimpleWindow extends JFrame {
	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.setVisible(true);
	}
}

で,非常に簡単なウィンドウが出ます. ここで何をやっているのか,オブジェクト指向の用語を使って説明してみましょう.

継承することのメリットを考えてみよう

ボタンが押されたイベントを処理する方法

先週作った, プログラム12.2をみてください。 このプログラムでは,ボタンを押しても何もおこりません.

http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png

プログラム12.2

import javax.swing.*;
import java.awt.*;

public class SimpleButton extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JPanel panel = new JPanel();
		JButton button1 = new JButton("button1");
		JButton button2 = new JButton("button2");
		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);	
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

ボタンが押されたイベントを受け取るためには,

  1. ActionListenerをimplementしたクラスを作る
  2. そのインスタンスを作る
  3. これをボタンにaddActionListener()で登録する 必要があります.

プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.

http://gyazo.com/67d27d0588f4dd5d11410e1107165994.png

ヒント1(最初の3行です)

import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

ヒント2(最初の5行です)

import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

JButton button1, button2;

	public void initialize () {

解答例

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleButton extends JFrame implements ActionListener {

JButton button1, button2;

	public void initialize () {
		this.setTitle("私が作った最初の窓");
	
		JPanel panel = new JPanel();
		button1 = new JButton("button1");
		button2 = new JButton("button2");
		button1.addActionListener(this);
		button2.addActionListener(this);

		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void actionPerformed (ActionEvent e) {
		if(e.getSource()==button1) 
			System.out.println("Hello");
		else
			System.out.println("Goodbye");
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

13.2節を読んで,プログラム13.2を実行させてください

ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。

演習13.1をやってください

http://gyazo.com/7932a0e8327be4ebd2f6c90e620d8c90.png

BorderLayoutでもできるようですが、私はGridLayour使ってみました。

 		panel.setLayout(new GridLayout(2,2));
		panel.add(textleft);
		panel.add(textright);
		panel.add(button);
		panel.add(clearbutton);

ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。 演習ができそうにないという人は、飛ばして、次に進んでください。

13.5節を読んで,プログラム13.5を実行してください

http://gyazo.com/4755cce7280963b32050db455d265cc1.png

メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。

演習13.2をやってください(メニュー項目は何でも良いです)

演習ができそうにないという人は、飛ばして、次に進んでください。

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

13.6節を読んで,プログラム13.6を実行してください

教科書203ページのプログラム13.6の5行めのところに、

... implements ActionListener6: {

とありますが、これは、

... implements ActionListener {

の間違いのようです。

レポート提出

演習ができたかどうかに従って、以下の3本から5本のプログラム(.javaと.class)を いつものように学籍番号+名前のフォルダに入れて、圧縮して提出してください。

  1. プログラム13.2
  2. 演習13.1のプログラム
  3. プログラム13.5
  4. 演習13.2のプログラム
  5. プログラム13.6

2011年11月25日

写真ファイルのダウンロード (先週の宿題のヒント)

http://siio.jp/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント: InputStream?のインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。

import java.io.*;
import java.net.*;

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

というインスタンスを作って、

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int aData;
			while((aData  = istream.read()) != -1) fout.write(aData);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

高度な課題

上記の例では写真データを1バイトずつ読み書きしていました。 InputStreamのメソッドを調べると、複数バイト単位で読み込むメソッドがあります。 たとえば、512バイトずつ読み書きすることで、処理速度が向上すると期待できます。 そこで、複数バイト読み書きするよう、上記のプログラムを変更して、 実際にどの程度(実行速度にして何倍くらい)性能向上するか確認してみましょう。

read

public int read(byte[] b)
         throws IOException
入力ストリームから配列長さだけのバイト数を読み込もうとし、それをバッファ配列 b に格納します。
実際に読み込まれたバイト数は整数として返されます。
このメソッドは、入力データが読み込めるようになるか、ファイルの終わりが検出されるか、
あるいは例外がスローされるまでブロックします。

を使って読みこみ、

write

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException
指定された byte 配列の、オフセット位置 off から始まる len バイトを出力ストリームに書き込みます。

を使ってください。

とても簡単なウィンドウ

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

継承を使ったプログラム

import javax.swing.JFrame;
public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setSize(200,100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}

}

ラベルを表示するウィンドウ

プログラム12.1を参考にして、上記の、継承を使ったプログラムによるウィンドウの中に、 Hello!という文字を出してみよう。

http://gyazo.com/c6efe47de19436f7564660377fe8b98c.png

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JLabel label = new JLabel("Hello!");
		Container container = this.getContentPane();
		container.add(label);
		this.pack();
		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}

}

ボタンを2個表示するウィンドウ

プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。

プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 2個のボタンを出してみよう。

http://gyazo.com/4c3086ae9b6b5434d2ea741369f731c5.png

解答例:

import javax.swing.*;
import java.awt.*;

public class SimpleButton extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		
		JPanel panel = new JPanel();
		JButton button1 = new JButton("button1");
		JButton button2 = new JButton("button2");
		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);	
	
		this.pack();		
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	public static void main(String argv[]) {
		SimpleButton sw = new SimpleButton();
		sw.initialize();
	}

}

2010年11月11日

プログラム11.3をやってみてください

作ったファイルを

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.1 をやってください

作ったファイルを

od -h dout.dat

または

hexdump dout.dat

してみてください

作った.java .class 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.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);
		}
	}
}

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

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をやってください

キーボードから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);
  			}
    }
 }

解答例

import java.io.*;

public class En112 {
	public static void main(String[] args) {
	
		try {
			InputStreamReader ireader = new InputStreamReader (System.in);
			BufferedReader breaderK = new BufferedReader(ireader);
			String line = breaderK.readLine();
			
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			pwriter.println(line);
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breaderF = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breaderF.readLine())  != null)
				System.out.println(tmp);
			
			breaderF.close();
		
			}
			catch(IOException e) {
				System.out.println(e);
			}
	}
}

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png

ヒント1

import java.net.*;

が必要です。

URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

ヒント2

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			
			 
			 ここにプログラムを書く
			 
			 
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

ヒント3

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
			BufferedReader breader = new BufferedReader(  isreader );
			
			 
			 ここにプログラムを書く
			 
			 
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

解答例:

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
			BufferedReader breader = new BufferedReader(  isreader );
		
			String line;
			while((line=breader.readLine()) != null) System.out.println(line);
		
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

宿題:写真ファイルのダウンロード

http://siio.jp/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント1:

InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。 1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。

2010年11月4日

OsaifuUSDクラスの改造

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

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

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

エラーと例外処理

次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。

public class TestException {
	public static void main(String argv[]){
			System.out.println(argv[0]+" "+argv[1]);
			System.out.println("Nice to meet you.");
	}
}

以下のように動きます。

e100:java siio$ java TestException Itiro Siio
Itiro Siio
Nice to meet you.

でも引数の数が足りないとエラーになります。

e100:java siio$ java TestException Itiro
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at TestException.main(TestException.java:3)

エラーが出る可能性のある場所を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.");
		}
	}
}

このようにすると、エラーが起きたときに、catchのブロックに移行し、以下のようにメッセージが出力されます。

e100:java siio$ java TestException Itiro
please input 2 words.

入力した文字を逆に出力するプログラムを作る

[e100:?/Documents/java] siio% java TestString ochanomizu
ochanomizu
uzimonahco
[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 の練習

サンプルプログラムを実行するときは、

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

などと定義すると良い。

Hash Mapの練習

プログラム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");
	}

	}
}

整数を出力する例

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

整数を入出力する例

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

2010年10月28日

他の点との距離を返すメソッドの例を説明しました

	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という名前は同じでも、引数の違いで、異なる動作をさせることができます。 これをメソッドのオーバーロードと呼びます。

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 ( Point p ) {
		return this.distance(p.getx(), p.gety(), p.getz());
	}

Osaifuクラスを作ってみよう

	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

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();
	}
}
	public int out(int x) {
		if(x < okane ) {
			okane = okane -x;
			return x;
		} else {
			int nokori = okane;
			okane =0;
			return nokori;
		}
	}	

つぎにOsaifuクラスにコンストラクタを追加してみよう

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

public class OsaifuUSD extends Osaifu {
	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();
		
	}
}

または、outUSD, inUSDで親のin, outを活用して以下のようにしても良い

	public int outUSD(int usd) {
		return  this.out(usd * 90) / 90;
	}

	public void inUSD(int usd) {
		this.in(usd * 90);
	}

2010年10月21日

クラスとインスタンスの説明をしました

プログラム6.1-6.4を作ってみてください。

public static void main の説明をしました

変数にはメソッド経由でアクセスするのが良いという説明をしました

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

}

演習

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

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

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

       }

2010年10月14日

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

配列の定義方法

クラスのインスタンス化(後日説明します)と同じやりかたですので、 覚えておきましょう。教科書39ページにあるように、

int[] vec;
vec = new int[3];

または、これを1行にまとめて、

int[] vec = new int[3];

と書きます。

vecというのは、ここで作った変数の名前です。 int型の変数を3個分だけ格納するメモリー領域を、new int[3]というコマンドで作ります。 C言語では、malloc()でメモリーを確保するのと同じことです。 その領域を、参照するために、vecという変数を使います。C言語のポインターと同じです。

コマンドライン引数の表示

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

args[0]とargs[1]をprintlnの中で+でつないで表示するプログラムを作ってください

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

解答

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

演習問題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");
		}
	}
}

演習問題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.02%だと倍になるのに何年かかるだろうか。確かめてみよう。

http://gyazo.com/02e29fc82d2706a2a01516d325100b25.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);
	}
}
}

モンテカルロ法で円周率を計算してみる(ループの練習)

http://gyazo.com/e4f68c7ed1045c10801ec201ed00b5e6.png

class MonteCarlo {  
public static void main (String args[]) {
	int i;
	for(i=0;i<100;i++)
        System.out.println(Math.random());
        }
}

矢の落下点x,yをランダムな位置にするには、乱数で指定します。 これがあたりかどうかは、原点からの距離で調べます

			x = Math.random();
			y = Math.random();
			if(x*x + y*y < 1)  hit++;
class MonteCarlo {
	public static void main (String args[]) {
		int i;
		double hit = 0;
		double x, y;
		for(i=0;i<1000;i++) {
			x = Math.random();
			y = Math.random();
			if(x*x + y*y < 1) {
				hit++;
			}
		}
		System.out.println(4 * hit / 1000);	
	}
}

for-each文は新しい手法なので練習しましょう

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

http://gyazo.com/46937d835776a23a845ca5aa641b93c9.png

演習 (これを提出してください)

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

2010年10月7日

教科書

http://gyazo.com/de3288074dae1c75f6df4ef3c0b9b3d4.png

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

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

javaのマニュアル

http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)

Mac OS XでJavaを使う

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

terminalを起動する

http://gyazo.com/7366bfab668207c6598c4d88ef70d2d4.png

miを用意しておく

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

http://gyazo.com/7579915fefe1ecd9c0e4e2ddfa55177d.png

超簡単なプログラム(hello world)を作ってみる

class Hello {  
public static void main (String args[]) {
        System.out.println("hello java world!");
        }
}
javac Hello.java  (コンパイルする)
java Hello      (実行する。.javaなどの拡張子は不要)
hello java world!   (結果)

GUIのプログラムをする (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

とタイプしてコンパイル/実行します。

simplewindow.png

以上のプログラムが完成したら、以下の方法で提出してください。

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

http://gyazo.com/4b3bd729de9a5bff13fadef9d2f3f1d7.png

http://gyazo.com/78afe2136aced11e393a50336a5fa706.png

http://gyazo.com/35618d5a0582802a7888b3ee50ba3cf2.png

http://gyazo.com/bef6a572eb6adb1237c3358345a868e8.png

ヒューマンインタフェース 2010年前期

レポート提出いただいている人のリスト

漏れがありましたら至急 siio@mac.com まで連絡ください

0820504
0820515
0820517
0820522
0820525
0820542

レポートのお知らせ

課題

グラフィカルユーザインタフェース(GUI)は、コンピュータの 画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、 操作可能なグラフィカルなオブジェクトを表示して、 これらをマウスなどの指示装置を用いて操作するユーザインタフェースの 手法である。

一方、文字だけを表示するディスプレイとキーボードを用いて、 文字によるコマンドをタイプしてコンピュータを操作する手法を コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。 現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。

この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。 (ヒントとして示したキーワードをできるだけ多く使用すること)

  1. GUIのメリットを考察して述べよ。
    (ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
  2. GUIのデメリットをCUIと比較して考察せよ。
    (ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
  3. 上の問いで考察したGUIのデメリットを解消する手法について述べよ。
    (ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)

集中演習「ヒューマンインタフェース」出題範囲 (2009年後期)

英文購読からの集中演習出題範囲(2009年後期)

マルチメディアプログラミング実習2009年後期

最終課題の提出状況

2/1 15時現在の状況です. 出したけどここに掲載されていないという人は, 至急,椎尾(siio@mac.com)まで連絡ください. そのときに,課題を添付して送っていただけると良いかと思います.

http://gyazo.com/e432bdf2525cf3789da670463222d2c0.png

2010年1月の予定

椎尾です。昨夜から熱が出て、今朝はだいぶよくなったのですが、 新型インフルエンザだといけないので、念のために欠席します。 申し訳ありませんが1月14日はTAのみなさんの指導を受けて、昨年から説明している、以下の最終課題(お絵かきプログラム)を 進めてください。(1月14日10pm 椎尾)

5--8時限備考
1月14日課題をすすめてください。TAが対応します椎尾急病で欠席。出欠はとります
1月21日課題をすすめてください。椎尾とTAが対応します。出欠とります
1月28日自主的に課題をすすめてください。TAが対応します椎尾海外出張で休講 。出欠とりません

マルチメディアプログラミング2009の最終課題

提出課題として最低やってほしいこと

以下のことができれば加点します

詳細はSimpleDrawを見てください

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

締切


授業時間変更と休講のお知らせ

伊藤先生と椎尾で休講を少なくするよう授業時間を調整しました. その結果, マルチメディアI(伊藤先生)の授業と, マルチメディアプログラミング実習(椎尾)の授業を以下のように 行います.

3-4時限5-6時限7-8時限備考
10月1日休講休講椎尾出張
10月8日休講休講休講台風
10月15日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月22日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
10月29日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
11月5日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月12日マルチメディアIマルチメディアIマルチメディアI伊藤
11月19日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月26日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
12月3日休講休講椎尾出張
12月10日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月14日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月21日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月28日休講休講椎尾出張

javaのマニュアル

http://java.sun.com/javase/ja/6/docs/ja/api/index.html

2009年12月10日

宿題(レポート)の提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

演習13.1をやってください

Eclipseを使ってみよう

http://gyazo.com/4383db7fb81f9eacbf5cc959ff77a33d.png

2009年11月26日

宿題:プログラム12.3

JFrameを継承するプログラミング

import javax.swing.JFrame;
public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setSize(200,100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main (String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}
}

とても簡単なウィンドウ

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

写真ファイルのダウンロード

http://siio.jp/cat.jpg 

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント:InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。

import java.io.*;
import java.net.*;

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");

というインスタンスを作って、

istream.read()

で読んで、

fout.write(1バイト)

で書き出します。

解答例

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int aData;
			while((aData  = istream.read()) != -1) fout.write(aData);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう

http://gyazo.com/13044fdd9d372118a1f6fe93896eadb3.png

ヒント

import java.net.*;

が必要です。

URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
			BufferedReader breader = new BufferedReader(  isreader );
		
			String line;
			while((line=breader.readLine()) != null) System.out.println(line);
		
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

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

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

http://gyazo.com/f9aee7f492d574f870e85e2022df374c.png

解答例

import java.io.*;

public class En112 {
	public static void main(String[] args) {
	
		try {
			InputStreamReader ireader = new InputStreamReader (System.in);
			BufferedReader breaderK = new BufferedReader(ireader);
			String line = breaderK.readLine();
			
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			pwriter.println(line);
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breaderF = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breaderF.readLine())  != null)
				System.out.println(tmp);
			
			breaderF.close();
		
			}
			catch(IOException e) {
				System.out.println(e);
			}
	}
}

プログラム11.3をやってみてください

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

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

2009年11月19日

宿題:演習11.1

作ったファイルを

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

エラーと例外処理

次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。

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

入力した文字を逆に出力するプログラムを作る

[e100:?/Documents/java] siio% java TestString ochanomizu
ochanomizu
uzimonahco
[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 の練習

サンプルプログラムを実行するときは、

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

などと定義すると良い。

Hash Mapの練習

プログラム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");
	}

	}
}

整数を入出力する例

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

2009年11月5日

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

http://gyazo.com/f51ea5895aaab32bb30b9a940d91515d.png

public class OsaifuUSD extends Osaifu {
	public static void main(String argv[]) {
		OsaifuUSD saifu1= new OsaifuUSD();
		OsaifuUSD saifu2=new OsaifuUSD();
		saifu1.in(1000);
		saifu2.inUSD(5);
		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クラスの改造

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

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

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

2009年10月29日

クラスとインスタンスの説明をしました

public static void main の説明をしました

変数にはメソッド経由でアクセスするのが良いという説明をしました

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

}

他の点との距離を返すメソッドの例を説明しました

	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という名前は同じでも、引数の違いで、異なる動作をさせることができます。 これをオブジェクト指向における多様性、ポリモーフィズム、polymorphismとよびます

(教科書ではモリモーフィズムのことをオーバーロードと書いてあります)

演習

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

http://gyazo.com/deeb78a70a724a01ce76945235d42ab8.png

http://gyazo.com/bdef2ab8e69f7f6e62273c2d67d7af2e.png

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

       }
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 ( Point p ) {
		return this.distance(p.getx(), p.gety(), p.getz());
	}

Osaifuクラスを作ってみよう

	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

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();
	}
}
	public int out(int x) {
		if(x < okane ) {
			okane = okane -x;
			return x;
		} else {
			int nokori = okane;
			okane =0;
			return nokori;
		}
	}	

つぎにOsaifuクラスにコンストラクタを追加してみよう

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

2009年10月22日

演習

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

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.04%だと倍になるのに何年かかるだろうか。確かめてみよう。

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

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

モンテカルロ法で円周率を計算してみる(ループの練習)

http://gyazo.com/e4f68c7ed1045c10801ec201ed00b5e6.png

class MonteCarlo {  
public static void main (String args[]) {
	int i;
	for(i=0;i<100;i++)
        System.out.println(Math.random());
        }
}

矢の落下点x,yをランダムな位置にするには、乱数で指定します。 これがあたりかどうかは、原点からの距離で調べます

			x = Math.random();
			y = Math.random();
			if(x*x + y*y < 1)  hit++;
class MonteCarlo {
	public static void main (String args[]) {
		int i;
		double hit = 0;
		double x, y;
		for(i=0;i<1000;i++) {
			x = Math.random();
			y = Math.random();
			if(x*x + y*y < 1) {
				hit++;
			}
		}
		System.out.println(4 * hit / 1000);	
	}
}

for-each文は新しい手法なので練習しましょう

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

演習

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

2009年10月15日

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)
  3. 出席状況(参考程度)

Mac OS XでJavaを使う

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

terminalを起動する

terminal.png

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

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

miを用意しておく

超簡単なプログラム(hello world)を作ってみる

class Hello {  
public static void main (String args[]) {
        System.out.println("hello java world!");
        }
}
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.setVisible(true);
       }

}

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

javac SimpleWindow.java
java SimpleWindow

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

simplewindow.png

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

情報と職業2009年前期

レポートのお知らせ

課題

以下の課題についてレポートを書き,まとめて提出してください。

1982年にIBMが発売したIBM PCは,その後のパーソナルコンピュータ (PC) の標準になり,さまざまな改良が施されつつも,現在のほとんどのPCの起源と言える.しかしながら,IBMは主導権をとることができず,PC部門の利益が悪化したため事業から撤退してしまった.一方で,IBMへの部品提供業者として,CPUやOSを提供したインテル社,マイクロソフト社いまだにPC事業が看板部門であり,大きな利益をあげて業界を主導している.

ヒューマンインタフェース 2009年前期

レポートのお知らせ

課題

グラフィカルユーザインタフェース(GUI)は、コンピュータの 画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、 操作可能なグラフィカルなオブジェクトを表示して、 これらをマウスなどの指示装置を用いて操作するユーザインタフェースの 手法である。

一方、文字だけを表示するディスプレイとキーボードを用いて、 文字によるコマンドをタイプしてコンピュータを操作する手法を コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。 現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。

この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。 (ヒントとして示したキーワードをできるだけ多く使用すること)

  1. GUIのメリットを考察して述べよ。
    (ヒント:直接操作、アフォーダンス、制約、デスクトップメタファ、WYSIWYGなど)
  2. GUIのデメリットをCUIと比較して考察せよ。
    (ヒント:熟達、キーボードと指示装置の併用、パイプ、正規表現、コマンドスクリプト言語など)
  3. 上の問いで考察したGUIのデメリットを解消する手法について述べよ。
    (ヒント:キーボードショートカット、例示プログラミング、ビジュアルプログラミングなど)

授業で使う予定のプレゼン資料(一部)

集中演習 (2009年2月) のヒューマンインタフェースの範囲

人の短期記憶について説明されている以下の文を読んでおいてください.

ここに書かれている短期記憶,魔法の数字,チャンクなどの用語を使って, つぎのような質問に答えていただく記述式の問題を作成する予定です.

  1. グラフィカルユーザインタフェース(GUI)で用いられるメニューの項目は,5から9項目であることが望ましいと言われている

    #ref(): File not found: "menu1.png" at page "LectureOldOld"

  2. メニュー項目がどうしてもこれを超える場合には,
    • 関連項目を線で区切ってまとめて5から9項目のグループにしたり,
    • 階層的なメニューにして,一階層のメニュー項目を5から9項目にすると良いとされている

      #ref(): File not found: "menu2.png" at page "LectureOldOld"

  3. このように言われているのはなぜだろうか?人の短期記憶について考察して,その理由を推察して述べよ.

マルチメディアプログラミング実習2008年後期

課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

以下のことができれば加点します

詳細はSimpleDrawを見てください

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

授業時間変更と休講のお知らせ

今年度後期は,伊藤先生と椎尾の出張が多いため,できるだけ休講を少なくするよう授業時間を調整しました. その結果, マルチメディアI(伊藤先生)の授業と, マルチメディアプログラミング実習(椎尾)の授業を以下のように 行います.

3-4時限5-6時限7-8時限備考
10月2日休講休講休講海外出張
10月9日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月16日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月23日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
10月30日マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
マルチメディア
プログラミング実習
椎尾
11月6日マルチメディアIマルチメディアIマルチメディアI伊藤
11月13日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
11月20日休講休講休講海外出張
11月27日休講休講休講学会出張
12月4日マルチメディアIマルチメディアIマルチメディアI伊藤
12月11日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
12月18日(マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月8日(月曜授業)(月曜授業)(月曜授業)時間割通り
1月15日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月22日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り
1月29日マルチメディアIマルチメディア
プログラミング実習
マルチメディア
プログラミング実習
時間割通り

javaのマニュアル

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

冬休みの課題

年明けからはEclipseを使います。授業で説明しますが、あらかじめ使ってみておいていただけるとわかりやすいかと思います。Eclipseについてはネット上にたくさん情報があります。本家は以下です。

http://www.eclipse.org/

2008年12月18日

アニメーションボールの設定ができるアプリケーションを作ってみよう

こういうのを作ってほしい

ヒント: action Performed ではこうしたら良い

	public void actionPerformed(ActionEvent e) { 
		String command = e.getActionCommand(); 
		if(command=="red") g.setColor(Color.red); 
		if(command=="blue") g.setColor(Color.blue); 

http://lab.siio.jp/index.php?plugin=attach&pcmd=open&file=SimpleAnime.class&refer=Lecture

以下の方法で提出してください.

http://lab.siio.jp/index.php?Lecture#u5201c9d

簡単なアニメーション

動くボールを出す

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class SimpleAnime extends JFrame {
	JPanel panel;
	Graphics g;
	
	private void init() {
		this.setTitle("SimpleAnime");
		this.setSize(300,400);
		panel = new JPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		g=panel.getGraphics();
		g.setColor(Color.blue);

		int x=0, xdelta=10;
		while(true) {
			g.fillOval(x,100,50,50);
			try{Thread.sleep(50);}catch(Exception e){}
			g.clearRect(x, 100, 52,52);
			x+=xdelta;
			if(x>250) xdelta=-10;
			if(x<0) xdelta=10;
		}
		
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
	}
}

なにもしないウィンドウを出す

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class SimpleAnime extends JFrame {

	private void init() {
		this.setTitle("SimpleAnime");
		this.setSize(300,400);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		SimpleAnime frame = new SimpleAnime();
		frame.init();
	}
}

演習13.1をやってみよう

こういうのを作ってほしい

http://lab.siio.jp/index.php?plugin=attach&pcmd=open&file=JTextFieldSample.class&refer=Lecture

完成したら以下の方法で提出してください.

http://lab.siio.jp/index.php?Lecture#u5201c9d

2008年12月11日

ボタンのイベントを処理するプログラム

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JButtonSample extends JFrame implements ActionListener {
	
	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JButton button1 = new JButton("Push Me!");
		JButton button2 = new JButton("Push Me!2");
		button1.addActionListener(this);
		button2.addActionListener(this);
		JPanel panel = new JPanel();
		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);
		this.pack();
		this.setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {
		//System.out.println("hello");
		System.out.println(e.getActionCommand());
	}

	public static void main (String argv[]) {
		JButtonSample w = new JButtonSample();
		w.initialize();
	}
}

ボタンを表示するプログラム

import javax.swing.*;
import java.awt.*;

public class JButtonSample extends JFrame {
	
	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JButton button1 = new JButton("Push Me!");
		JButton button2 = new JButton("Push Me!2");
		JPanel panel = new JPanel();
		panel.add(button1);
		panel.add(button2);
		Container container = this.getContentPane();
		container.add(panel);
		this.pack();
		this.setVisible(true);
	}

	public static void main (String argv[]) {
		JButtonSample w = new JButtonSample();
		w.initialize();
	}
}

JFrameを継承するプログラミング

import javax.swing.JFrame;
public class SimpleWindow extends JFrame {

	public void initialize () {
		this.setTitle("私が作った最初の窓");
		this.setSize(200,100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	public static void main (String argv[]) {
		SimpleWindow sw = new SimpleWindow();
		sw.initialize();
	}
}

とても簡単なウィンドウ

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

宿題の提出

11/13の宿題その1とその2を以下の方法で提出してください.

http://lab.siio.jp/index.php?Lecture#u5201c9d

宿題その1解答編

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");
			BufferedReader breader = new BufferedReader(  isreader );
		
			String line;
			while((line=breader.readLine()) != null) System.out.println(line);
		
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

宿題その2解答編

import java.io.*;
import java.net.*;

//http://siio.jp/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。

public class URLJpeg {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://siio.jp/cat.jpg");
			InputStream istream = targetURL.openStream();
			
			FileOutputStream fout = new FileOutputStream("cat.jpg");
			
			int aData;
			while((aData  = istream.read()) != -1) fout.write(aData);
			
			istream.close();
			fout.close();
			
			
		} catch (IOException e) {
			System.out.println("error...");
		}
	}
}

2008年11月13日

宿題その1

http://www.ocha.ac.jp/の内容を表示するプログラムを書いてみよう。 ヒント、

import java.net.*;

が必要です。

URL targetURL = new URL("http://www.ocha.ac.jp/");

でURLクラスのインスタンスが得られる。

InputStream istream = targetURL.openStream();

でこれからInputStreamのインスタンスが得られる。

InputStreamReader isreader = new InputStreamReader(istream, "JISAutoDetect");

でこれからInputStreamReaderのインスタンスが得られる。

BufferedReader breader = new BufferedReader(  isreader );

でこれからBufferedReader のインスタンスが得られる。

宿題その2

http://siio.jp/cat.jpg

をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。

ヒント:InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。

きょうの復習

演習11.2

//キーボードから一行打ち込んでファイルに書いて読んで表示する
import java.io.*;

public class En112 {
	public static void main(String[] args) {
	
		try {
			InputStreamReader ireader = new InputStreamReader (System.in);
			BufferedReader breaderK = new BufferedReader(ireader);
			String line = breaderK.readLine();
			
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			pwriter.println(line);
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breaderF = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breaderF.readLine())  != null)
				System.out.println(tmp);
			
			breaderF.close();
		
			}
		catch (FileNotFoundException e) {
			System.out.println(e);
			}
		catch(IOException e) {
			System.out.println(e);
			}
	}
}

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

import java.io.*;

public class PrintWriterTest {
	public static void main(String[] args) {
	
		try {
			FileWriter fwriter = new FileWriter("writer.txt");
			PrintWriter pwriter = new PrintWriter(fwriter);
			for(int i=0; i<10; i++)
			pwriter.println( i + "----" + 2006 + " Java 教科書");
			pwriter.close();
			
			FileReader freader = new FileReader("writer.txt");
			BufferedReader breader = new BufferedReader(freader);
			
			String tmp=null;		
			while(  (tmp=breader.readLine())  != null)
				System.out.println(tmp);
			
			breader.close();
			
			}
		catch (FileNotFoundException e) {
			System.out.println(e);
			}
		catch(IOException e) {
			System.out.println(e);
			}
	}
}

演習11.1

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

バイトストリームをファイルに書いて読み込むプログラム

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 (2006);
			dout.writeUTF("Java 教科書");
			dout.close();
			
			FileInputStream finput = new FileInputStream("dout.dat");
			DataInputStream dinput = new DataInputStream(finput);
			
			System.out.println(dinput.readInt());
			System.out.println(dinput.readUTF());
			dinput.close();
			
			
			}
		catch (FileNotFoundException e) {
			System.out.println(e);
			}
		catch(IOException e) {
			System.out.println(e);
			}
	}
}

2008年10月30日

エラーと例外処理

名前と名字を入れると挨拶するけど、入力される引数が2文字未満のときにはエラーメッセージを出すプログラムを、tryとcatchを使って作ってみよう

[e100:?/Documents/java] siio% java TestException Itiro Siio
Itiro Siio
Nice to meet you.
[e100:?/Documents/java] siio% java TestException Itiro 
please input 2 words.
[e100:?/Documents/java] siio% 

このプログラムのソースは、

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

である。

入力した文字を逆に出力するプログラムを作る

[e100:?/Documents/java] siio% java TestString ochanomizu
ochanomizu
uzimonahco
[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");
		}
	}
}

である。

LinkedList の練習

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

と定義すると良い

HashMapの練習

以下のように動作する英語ー日本語単語変換プログラムを作れ。

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

2008年10月23日

Osaifuクラスを作ってみよう

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();
	}
}
	public int out(int x) {
		if(x < okane ) {
			okane = okane -x;
			return x;
		} else {
			int nokori = okane;
			okane =0;
			return nokori;
		}
	}	

つぎにOsaifuクラスにコンストラクタを追加してみよう

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

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

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

とすることになる。

コンストラクタ解答編

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

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

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

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

Osaifuクラスを継承してOsaifuUSDクラスを作ってみよう

OsaifuUSD.java 解答編

public class OsaifuUSD extends Osaifu {

	public int outUSD(int usd) {
		return ( super.out(usd * 97) );
	}

	public void inUSD(int usd) {
		super.in( usd * 97);
	}
	
	public void print() {
	//okane = 230 yen
	//(2 usd)
	//と印刷するメソッド
	super.print();
	System.out.println("(" + ( super.okane / 97) + "usd)" );
	}

	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.in(saifu1.outUSD(2));
		saifu1.print();
		saifu2.print();
	}
}

2008年10月16日

Point3Dのメソッドを充実

次のプログラムで

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

       }

演習6.1-6.2-6.3をやってみましょう

クラスとインスタンスの説明をしました

モンテカルロ法で円周率を計算してみる(ループの練習)

class MonteCarlo {  
public static void main (String args[]) {
	int i;
	for(i=0;i<100;i++)
        System.out.println(Math.random());
        }
}
class MonteCarlo {
	public static void main (String args[]) {
		int i;
		double hit = 0;
		double x, y;
		for(i=0;i<1000;i++) {
			x = Math.random();
			y = Math.random();
			if(x*x + y*y < 1) {
				hit++;
			}
		}
		System.out.println(4 * hit / 1000);	
	}
}

授業で作ったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

2008年10月9日

この講義の目的

  1. Javaでプログラムする
  2. オブジェクト指向の概念を理解してプログラミングする
  3. GUIプログラミングをする

この講義の順序

  1. Javaになれる(C言語などのプログラミング手法の復習)
  2. オブジェクト指向について理解する
  3. GUIプログラミングについて理解する(イベント駆動)
  4. お絵描きプログラムを作ってみる

成績評価

  1. お絵描きプログラムの完成度,作り込み
  2. 毎回の宿題の達成(参考程度)

Mac OS XでJavaを使う

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

terminalを起動する

terminal.png

miを用意しておく

超簡単なプログラム(hello world)を作ってみる

class Hello {  
public static void main (String args[]) {
        System.out.println("hello java world!");
        }
}
javac Hello.java  (コンパイルする)
java Hello      (実行する。.javaなどの拡張子は不要)
hello java world!   (結果)

本日やった演習

ヒューマンインタフェース 2008年前期

授業で使う予定のプレゼン資料(一部)

  1. 人とモノとのインタフェース http://siio.jp/lecture/humaninterface/everydaythings.pdf
  2. グラフィカルユーザインタフェース(GUI) http://siio.jp/lecture/humaninterface/gui.pdf

レポート締め切り/提出先

レポート課題

以下の課題についてレポートを書き,まとめて提出してください。

  1. 身の回りの道具について以下の考察をせよ.
    1. 以下の日用品を1つ以上例示せよ
      • 使いやすい/使いにくい道具
      • 利用者によって貼紙された道具
    2. 上記の日用品が,なぜこのような状態であるかを、分析せよ
      • 制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、 標準化の問題か、などを議論せよ。
      • また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.

集中演習 (2008年2月) のヒューマンインタフェースの範囲

授業で使ったプレゼン資料

のうち,2,3,4,6ページにある,マッピングとモデルの項目を見ておいてください. このページにある図を使って, つぎのような質問に答えていただく記述式の問題を作成する予定です.

  1. 座席の形をした車の電動シート調節スイッチが使いやすいのはなぜでしょうか?
  2. 製品の操作がわかりやすいかどうかの評価実験をする際に,開発関係者が 被験者になっては意味がないと言われています.その理由はなぜでしょうか.

マルチメディアプログラミング2007年後期

javaのマニュアル

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

追試課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

追試提出課題として最低やってほしいこと

以下のことができれば加点します

取扱説明書の作り方

出来上がったプログラムの提出方法

課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

以下のことができれば加点します

詳細はSimpleDrawを見てください

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください
    • 書き込み専用なので確認できないけどokですかという意味のダイアログが出るかと思いますが問題ありません。

ヒューマンインタフェース 2007年前期

授業で使う予定のプレゼン資料

  1. 人とモノとのインタフェース http://siio.jp/lecture/humaninterface/everydaythings.pdf
  2. グラフィカルユーザインタフェース(GUI) http://siio.jp/lecture/humaninterface/gui.pdf

レポート課題

課題

以下の2つの課題についてレポートを書き,まとめて提出してください。

  1. 身の回りの道具について以下の考察をせよ.
    1. 以下の日用品を1つ以上例示せよ
      • 使いやすい/使いにくい道具
      • 利用者によって貼紙された道具
    2. 上記の日用品が,なぜこのような状態であるかを、分析せよ
      • 制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、 標準化の問題か、などを議論せよ。
      • また,自分ならこのようにデザインするなどのアイディアがあればそれを書いても良い.
  2. グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して, 以下のことを述べよ.
    1. CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、 WYSIWYG」などの言葉を使って説明せよ.
    2. CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、 正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.

情報と職業 2007年前期

レポートのお知らせ

課題

以下の2つの課題についてレポートを書き,まとめて提出してください。

  1. みなさんがよく使っているWWWページを3箇所挙げてください。次に、そのページが どういうビジネスモデルで運営されているか調べてください。 たとえば、www.asahi.com, google.co.jp, mixi.jp, ekitan.com, www.2ch.net などを調べて、その運営資金をどうやって得ているか(もしくは非営利なのか) を調べて/推測してください。 (インターネット上の記事をそのままコピーペーストすることは避けてください. 自分の文章で書いてください.もし, 引用する場合はかならずそれがわかるように書いてください.)
  2. 某O女子大学の大学生協の店舗では、レストラン、売店を運営しています。 売店では、書籍、文房具、コンピュータとその消耗品、家電製品、雑貨、食品、弁当、 チケット、旅行サービス、大学グッズなどを販売しています。 顧客のほとんどが、インターネットを日常的に利用しているため、 インターネットの技術と結びついたビジネス展開を計画しています。 そこで、あなたが、この店舗(レストランと売店)のサイバービジネス担当として雇われました。 インターネット技術を活用したビジネスモデルを提案してください。 また,このモデルを実現するための, 具体的なサイトのイメージ(入り口のページ,注文のページなど)も示してください. そのビジネスモデルを実現した場合に、生協にとってどのような メリットがあるかも述べてください。

マルチメディアプログラミング2006年後期

javaのマニュアル

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html

課題:お絵描きプログラムを作成してさらに取扱説明書を作成して提出すること

この課題のヒントは SimpleDraw をみてください。

提出課題として最低やってほしいこと

以下のことができれば加点します

詳細はSimpleDrawを見てください

取扱説明書の作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください

1月10日の課題

1月10日の線を引く簡単なプログラム

import javax.swing.JPanel;
import java.awt.Graphics;

/**
 * 
 */

/**
 * @author siio
 *
 */
public class DrawPanel extends JPanel {

	public void drawLine(int x1, int y1, int x2, int y2){
		Graphics g = this.getGraphics();
		g.drawLine(x1, y1, x2, y2);
	}
 }
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;

/**
 * 
 */

/**
 * @author siio
 *
 */
public class SimpleDraw extends JFrame implements ActionListener,
		MouseListener, MouseMotionListener {
 

	int lastx, lasty, newx, newy;
	DrawPanel panel;
 

	/* (non-Javadoc)
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
	 */
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
	 */
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
	 */
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
	 */
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
	 	lastx=arg0.getX();
	 	lasty=arg0.getY();
	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
	 */
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	/* (non-Javadoc)
	 * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
	 */
	public void mouseDragged(MouseEvent arg0) {
		// TODO Auto-generated method stub
		newx=arg0.getX();
		newy=arg0.getY();
		panel.drawLine(lastx,lasty,newx,newy);
		lastx=newx;
		lasty=newy;
	}

 

	public void mouseMoved(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	private void init() {
		this.setTitle("Simple Draw");
		this.setSize(300, 200);
		this.addMouseListener(this);
		this.addMouseMotionListener(this);
		panel=new DrawPanel();
		this.getContentPane().add(panel);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SimpleDraw frame=new SimpleDraw();
		frame.init();
	}

}

12月21日のマウスイベントのサンプル

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class SimpleDraw extends JFrame implements MouseListener, MouseMotionListener{

	SimpleDraw(String title) {
		setTitle(title);
		addMouseListener(this);
		addMouseMotionListener(this);
	}
	
	public void mouseClicked(MouseEvent e) {
		System.out.println("mouse clicked!");
	}
	public void mouseEntered(MouseEvent e) {
		System.out.println("mouse entered!");
	}
	public void mouseExited(MouseEvent e) {
		System.out.println("mouse exited!");
	}
	public void mousePressed(MouseEvent e) {
		System.out.println("mouse pressed!");
	}
	public void mouseReleased(MouseEvent e) {
		System.out.println("mouse released!");
	}
	public void mouseDragged(MouseEvent e) {
		System.out.println("mouse dragged!");
	}
	public void mouseMoved(MouseEvent e) {
		System.out.println("mouse moved!");
	}
	
	public static void main(String[] args) {
		SimpleDraw sample = new SimpleDraw("Drawing application");
		sample.setSize(400,300);
		sample.setVisible(true);
		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
}

12月14日にやった演習13.2の回答例

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class JTextFieldSample extends JFrame implements ActionListener {
	JButton button, clearButton;
	JTextField textleft, textright;
	
	JTextFieldSample(String title) {
		setTitle(title);
		button = new JButton("left to right");
		clearButton = new JButton("clear");
		button.addActionListener(this);
		clearButton.addActionListener(this);
		
		textleft = new JTextField(10);
		textright = new JTextField(10);
		JPanel panel=new JPanel();
		panel.setLayout(new GridLayout(2,2));
		panel.add(textleft);
		panel.add(textright);
		panel.add(button);
		panel.add(clearButton);
		Container container=this.getContentPane();
		container.add(panel);
	}
	
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==(button)) {
			textright.setText(textleft.getText());
			textleft.setText("");
		}else if(e.getSource()==(clearButton)) {
			textright.setText("");
		}
	}
	
	public static void main(String[] args) {
		JTextFieldSample sample = new JTextFieldSample("JTextFieldSample");
		sample.pack();
		sample.setVisible(true);
		sample.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

11月30日に説明したURL読み込みの例

import java.io.*;
import java.net.*;

public class URLTest {
	public static void main (String argv[]) {
		try {
			URL targetURL = new URL("http://www.ocha.ac.jp/");
			InputStream istream = targetURL.openStream();
			BufferedReader breader = new BufferedReader
			(new InputStreamReader(istream, "JISAutoDetect"));
		
			String line;
			while((line=breader.readLine()) != null) System.out.println(line);
		
		
		}catch(IOException e) {
			System.out.println("error...");
		}
	}
}

11月2日の宿題

Class Osaifuを作り、以下のクラスメソッドが
java Osaifuコマンドで動くようにせよ。

	public static void main(String argv[]) {
		Osaifu saifu1 = new Osaifu(1000);//インスタンスを作る
		//最初の保持金額を1000円にする
		Osaifu saifu2 = new Osaifu(500);//インスタンスを作る
		//最初の保持金額を500円にする
		saifu2.in(saifu1.out(200));//saifu1からsaifu2に200円移す
		saifu1.print();//現在の金額を表示
		saifu2.print();//現在の金額を表示
	}

11月2日の解答例

public class Point3D {
	private int x, y, z;
	void putx( int ptx) { x=ptx; }
	void puty(int pty) { y=pty; }
	void putz(int ptz) { z=ptz; }
	int getx() { return x; }
	int gety() { return y; }
	int getz() { return z; }
	
	Point3D(int ptx, int pty, int ptz) {
		//x=ptx; y=pty; z=ptz; 
		this.putx(ptx); this.puty(pty); this.putz(ptz);
	}
	
	//指定された点との距離を求めるインスタンスメソッド
	double distance(int ptx, int pty, int ptz) {
		double d;
		int dx = ptx - x;
		int dy = pty - y;
		int dz = ptz - z;
		d =   Math.sqrt(dx * dx + dy * dy + dz * dz);
		return d;
	}
	//指定された点との距離を求めるインスタンスメソッド
	double distance(Point3D pt) {
		return this.distance(pt.getx(), pt.gety(), pt.getz());
	}
//Point3Dクラスに以下のクラスメソッドを追加して、
//これがjava Point3Dコマンドで動くようにせよ。
	public static void main(String argv[]) {
		Point3D pt1 = new Point3D(1,2,3);
		Point3D pt2 = new Point3D(30,20,10);
		System.out.println(pt1.distance(pt2)); //pt1,pt2の距離を表示
	}
}
	

ヒューマンインタフェース 2006年前期

授業で使っているプレゼン資料

  1. 人とモノとのインタフェース http://siio.jp/lecture/humaninterface/everydaythings.pdf
  2. グラフィカルユーザインタフェース(GUI) http://siio.jp/lecture/humaninterface/gui.pdf

レポート課題

(1-1) 以下の日用品を1つ以上例示せよ

(1-2) なぜ(1-1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

(2) グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して,以下のことを述べよ.

(2-1)CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、WYSIWYG」などの言葉を使って説明せよ.

(2-2)CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.

マルチメディアプログラミング2005年後期

演習課題;お絵描きプログラムを作る

説明マニュアルの作り方

出来上がったプログラムの提出方法

  1. Finderの移動メニューから、「サーバへ接続...」を選んでください
  2. サーバアドレスのところにsiio.jpと書いてください
  3. 接続ボタンを押してください
  4. ゲストのラジオボタンを選んで、接続ボタンを押してください
  5. Publicを選択してください
  6. 画面にjava_reportというフォルダが見えると思います
  7. このフォルダに、上で用意したフォルダをドラッグアンドドロップしてください

入れておくと便利なソフトウェア

mi (みみかきエディタ)

便利なフリーウェアのテキストエディタです。 http://www.mimikaki.net/からダウンロードして/Users/ユーザ名/Applicationsにコピーします。 (Applicationsディレクトリが存在しない場合は作成)。

Terminal Here Plugin

ファインダーの上で右クリック(もしくはコントロールキー+クリック)すると現れる メニューの中に、Open Terminal Hereという項目を追加します。 そうすると、その場所をカレントディレクトリとしてTerminalが起動します。 日本語のディレクトリ名にはうまく対応していないようです。 説明は、http://pcweb.mycom.co.jp/column/osx/118/参照。 http://www.pyehouse.com/lynn/termopen.phpからダウンロード。 /Users/ユーザ名/Library/Contextual Menu Items/ ディレクトリへプラグインをコピー(ディレクトリが存在しない場合は作成)。 その後、シェルから「killall Finder」を実行してFinderを再起動。

Eclipse

Mac OS XでJavaを使う方法

How2Java

お絵描きソフトの作り方のヒント

DrawFrame.java

情報と職業2005年前期

レポートのお知らせ

課題

以下の3つの課題の中から2つを選んで、提出してください。

  1. みなさんがよく使っているWWWページを3箇所挙げてください。次に、そのページが どういうビジネスモデルで運営されているか調べてください。 たとえば、www.asahi.com, google.co.jp, mixi.jp, ekitan.com, www.2ch.net などを調べて、その運営資金をどうやって得ているか(もしくは非営利なのか) を調べて/推測してください。
  2. 某O女子大学の大学生協の店舗では、レストラン、売店を運営しています。 売店では、書籍、文房具、コンピュータとその消耗品、家電製品、雑貨、食品、弁当、 チケット、旅行サービス、大学グッズなどを販売しています。 顧客のほとんどが、インターネットを日常的に利用しているにもかかわらず、 インターネットの技術と結びついたビジネス展開をほとんど行っていません。 そこで、あなたが、この店舗(レストランと売店)のサイバービジネス担当として雇われました。 インターネット技術を活用したビジネスモデルを提案してください。 そのビジネスモデルを実現した場合に、生協にとってどのような メリットがあるかを述べてください。
  3. 授業のノートを提出してください。自筆ならコピーでも可。 だれかのノートを写してもokですが、その場合は誰のノートを写したかを明記してください。 オリジナルのノートの人の方に高い点数をつけます。一方、欠席した授業の分を補うために、 他人のノートを参照して完璧なノートを作っていただいた場合は、高く評価します。 ノート返却を希望する人は、メモ書きしておいてください。 後日、研究室のドアのところで返却いたします。

人間機械系特論 2005年前期

レポート課題

(1-1) 以下の日用品を1つ以上例示せよ

(1-2) なぜ(1-1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

(2) 以下のような計算機の応用を、1つ以上考えて、提案せよ

ヒューマンインタフェース 2005年前期

レポート課題

(1) 以下の日用品を1つ以上例示せよ

(2) なぜ(1)のような事態になったのかを、分析せよ

制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。

玉川大学での非常勤講師の授業について

LectureTamagawa をご覧ください.


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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-11-18 (水) 20:51:45