3/4以上出席してください。(欠席は3回まで)
| 学籍番号 | 欠席回数 | 判定 |
| 1120501 | 3 | |
| 1120502 | 1 | |
| 1120515 | 1 | |
| 1120517 | 1 | |
| 1120529 | 1 | |
| 1120534 | 1 | |
| 1120535 | 3 | |
| 1120537 | 2 | |
| 1120539 | 3 | |
| 1120540 | 1 | |
| 1120541 | 取消 | |
| 1120542 | 2 | |
| 0820510 | 11 | 不可 |
| 月日 | 内容 |
| 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 | 大学院入試のため休講 |
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通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。 説明書に、工夫したところを書いておいてください。
一筆書きを解消したプロジェクトファイル(~Documents/workspace/SimpleDraw)を 複製してフォルダ名を「ファイル名+学生名」にしてzipで圧縮して提出してください。
private static final long serialVersionUID = 42L;
という変数を定義しておきます。
一筆書きを解消するヒント
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://is.ocha.ac.jp/~gradthesis/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();
}
}
}
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では次のようにしてマルチスレッドを実現します
例えば以下のプログラムではメインとサブのスレッドが別個にに数字を表示していきます。
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){}
}
}
}
上記のプログラムにメニューを追加して、 ボールの色と速さをメニューで指定できるようにしてください
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で圧縮して提出してください。
How2MacOSXProgramming を見てください
How2iPhoneProgramming を見てください
以下の内容の新しいファイル,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 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のプログラムが動きます。
または、このhtmlファイルをアップレットビューアでみることもできます。
appletviewer index.html
などして動作を確認できます。
つぎのようにすれば、お絵描きプログラムも作ることができます。 下のプログラムは、前回、前々回やった、一筆書きになってしまうお絵かきプログラムです。 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で見てみます。
webブラウザでもみてみましょう。 (注意:Safariでは、読み込まれたappletが残っていますので、 更新したappletを試すためには、 Safariを一旦終了して起動しなおしてください。)
webサーバにおけば、世界中から使うこともできます。以下をクリックしてみてください。
http://is.ocha.ac.jp/~gradthesis/lecture/applet/
ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。
こんなのをつくってください。
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);
}
}
メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。
演習ができそうにないという人は、飛ばして、次に進んでください。
教科書203ページのプログラム13.6の5行めのところに、
... implements ActionListener6: {
とありますが、これは、
... implements ActionListener {
の間違いのようです。
ボタンの色がかわるはずですが、javaのバージョンでは機能しないこともあるようです。
button.setForeground(color);
として試してみてください(この場合ボタンの文字の色が変わります)
今日作った色選択プログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
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 static void main (String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.setTitle("私が作った最初の窓");
sw.setSize(200,100);
sw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
sw.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!という文字を出してみよう。
解答例:
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();
}
}
プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。
プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 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();
}
}
このプログラムでは,ボタンを押しても何もおこりません.
ボタンが押されたイベントを受け取るためには,
プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.
ヒント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で圧縮して提出してください。
前回の授業でお願いした宿題を提出してください。
以上を、番号+名前のフォルダに入れて、zipで圧縮して、いつもの課題と同様に提出してください。
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。
public class URLJpeg2 {
public static void main (String argv[]) {
byte[] data = new byte[512];
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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...");
}
}
}
来週、再来週と2回休講するので、宿題を用意しました。 12/3の授業の冒頭で以下のファイルを提出していただきます。
以上を、番号+名前のフォルダに入れて、zipで圧縮して、12/3の授業の冒頭で提出してください。
今日の例では写真データを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);
とします。
このプログラムで何倍速くなったか計測してください。
curlというコマンドがあります。
curl http://ocha.ac.jp/
などとすると、htmlが見られますし、
curl http://is.ocha.ac.jp/~gradthesis/cat.jpg > cat.jpg
などとすると、ファイルとして保存できます。これに近いプログラムを作ってみましょう。 たとえば、
java Curl http://ocha.ac.jp/
とすると、htmlが見られ、
java Curl http://is.ocha.ac.jp/~gradthesis/cat.jpg > cat.jpg
とすると、ファイルとして保存できるプログラムを作ってください。
ちなみに>を使ってファイルにリダイレクトするのはOSの仕事ですので、皆さんがつくるものは、第一引数のURLから1バイト取得して、それを標準出力に出力することを繰り返すプログラムとなります。
作ったファイルを
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);
}
}
}
キーボードから1行入力された文字列によるテキストファイルを作る
ヒント
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);
}
}
}
ヒント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://is.ocha.ac.jp/~gradthesis/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://is.ocha.ac.jp/~gradthesis/cat.jpg");
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg");
というインスタンスを作って、
istream.read()
で読んで、
fout.write(1バイト)
で書き出します。
解答例
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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で圧縮して提出してください。
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
作ったファイルを
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で圧縮して提出してください。
[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");
}
}
}
サンプルプログラムを実行するときは、
LinkedList<String> list = new LinkedList<String>();
などと定義すると良い。
プログラム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");
}
}
}
次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。
public class TestException {
public static void main(String argv[]){
System.out.println(argv[0]+" "+argv[1]);
System.out.println("Nice to meet you.");
}
}
エラーが出る可能性のある場所をtryでくくっておき、 エラーが出たらそれを補足する処置をcatchで指定します。
public class TestException {
public static void main(String argv[]){
try{
System.out.println(argv[0]+" "+argv[1]);
System.out.println("Nice to meet you.");
}
catch (Exception e) {
System.out.println("please input 2 words.");
}
}
}
public 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 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;
}
}
ことができるコンストラクタを作ろう。
これを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; }
継承の話をしました。 別のクラスを継承することで、 差分だけを書いて機能を拡張していくことができます。
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にprint()メソッドを追加して、 円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。 円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。
public void print() {
super.print();
System.out.println("( " + (okane / 90) + " usd )" );
}
OsaifuUSD.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
例えば以下のような実行結果が出るようにしてください
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章の続き(最後のところ)です。
mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、 コマンドの後に続けた書いた文字が入っています。 args[0], args[1], args[2] .... をすべてfor-each文で 表示するプログラムを書いてみましょう。
先週作ったArgTest.javaをArgTest2.javaに複製して(クラス名も変更して)書いてみましょう。次のような動作をすれば完成です。
ヒント:for(String s: args)を使います
class ArgsTest2 {
public static void main (String args[]) {
for(String s: args)
System.out.println(s);
}
}ヒント(最初の引数の文字だけを表示するプログラム)
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を表示するプログラムを書け。 動作例を以下に示す。
解答例:
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);
}
}
}
解答例:
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%だと倍になるのに何年かかるだろうか。確かめてみよう。
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で圧縮して提出してください。
http://www.amazon.co.jp/dp/4883732258/
買ってください。もしくは、先輩から安く譲ってもらってください。
Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。 ということでWindowsより簡単に(というか何もしなくても)javaが使えます。
/.bash_profileを開いて以下の行を追加します
alias javac='javac -J-Dfile.encoding=UTF-8' alias java='java -Dfile.encoding=UTF-8'
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を押します.
上記は、Mark Weiserがユビキタスコンピューティングについて書いた論文の冒頭部分である。 これを読んで、以下の考察をしてください。
「書く技術」「電動モータ」「ボールペン(講義で話しました)」などから、 2つ以上の例を示して、 これらが如何に「透明な技術」であるのかを説明し、 未来のコンピュータがどのような存在になるのか記述してください。
| 学籍番号 | 受理日 |
| 1020523 | 2012年7月26日 |
| 1020524 | 2012年8月7日 |
| 1020515 | 2012年9月4日 |
| 1020519 | 2012年9月22日 |
| 1020506 | 2012年9月24日 |
| 1020509 | 2012年9月24日 |
| 1020533 | 2012年9月24日 |
| 1020540 | 2012年9月24日 |
| 学籍番号 | 欠席回数 | 評価 |
| 1020503 | 1 | |
| 1020507 | 1 | |
| 1020509 | 1 | |
| 1020514 | 1 | |
| 1020516 | 9 | 不可 |
| 1020520 | 1 | |
| 1020522 | 3 | |
| 1020526 | 2 | |
| 1020528 | 1 | |
| 1020530 | 1 | |
| 1020531 | 1 | |
| 1020532 | 1 | |
| 1020534 | 1 | |
| 1020538 | 1 | |
| 1020539 | 2 | |
| 0820510 | 10 | 不可 |
| 0820512 | 6 | 不可 |
注:初回(4/12)の欠席は含んでいません。(2012.7.12.現在)
http://www.amazon.co.jp/dp/4781912605/
(授業開始直前や直後に差し替えされている可能性があります。)
学部「ヒューマンインタフェース」は出席重視の授業です.そのため70%以上出席お願いします. 授業回数が10回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません. 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.
| 学籍番号 | 欠席回数 | 出席点 |
現在,提出していただいている学生さんは以下の方々です. もし,提出したのに漏れているという学生さんがいらしたら, siio@is.ocha.ac.jp まで至急お知らせ下さい.
| 学籍番号 | 提出日 |
| 1040679 | 2011.12 |
| 1140661 | 2011.12 |
| 1040674 | 2011.12 |
学部「情報と職業」は出席重視の授業です.そのため70%以上出席お願いします. 授業回数が12回程度と見込まれますので,欠席が3回を超えた場合は単位が出ません. 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.
| 学籍番号 | 欠席回数 | 出席点 |
| 0920510 | 1 | |
| 0920511 | 3 | |
| 0920514 | 1 | |
| 0920520 | 1 | |
| 0920522 | 1 | |
| 0920523 | 2 | |
| 0920531 | 2 | |
| 0920533 | 10 | 不可 |
| 0920534 | 1 | |
| 0920537 | 1 | |
| 0930542 | 3 | |
| 0930611 | 7 | 不可 |
| 0810132 | 9 | 不可 |
| 0810158 | 3 | |
| 0810224 | 10 | 不可 |
| 0820505 | 10 | 不可 |
| 0820519 | 1 | |
| 0820527 | 3 | |
| 0820535 | 1 |
注:初回(10/6)の欠席は含んでいません。(2012.1.29.現在)
上記は、Mark Weiserがユビキタスコンピューティングについて書いた論文の冒頭部分である。 これを読んで、以下の考察をしてください。
「書く技術」「電動モータ」「ボールペン(講義で話しました)」などから、 2つ以上の例を示して、 これらが如何に「透明な技術」であるのかを説明し、 未来のコンピュータがどのような存在になるのか記述してください。

14 14 14 23 23 32 32 32 41 41
提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します.
漏れがありましたら至急 siio@mac.com まで至急連絡ください
0920502 0920506 0920507 0920528 0920532 0920540
締めきりました 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
今期の授業はいずれも出席重視の授業です.そのため70%以上出席お願いします. いずれも授業回数が12回ですので,欠席が3回を超えた場合は単位が出ません. 以下に欠席状況を示しておきます.間違いありましたら至急お知らせください.
| 学籍番号 | 欠席回数 | 出席点 |
| 0920501 | 1 | |
| 0920503 | 1 | |
| 0920505 | 2 | |
| 0920508 | 2 | |
| 0920511 | 3 | |
| 0920512 | 4 | 不可 |
| 0920514 | 1 | |
| 0920517 | 1 | |
| 0920518 | 1 | |
| 0920520 | 1 | |
| 0920521 | 2 | |
| 0920523 | 3 | |
| 0920524 | 3 | |
| 0920526 | 1 | |
| 0920529 | 10 | 不可 |
| 0920535 | 1 | |
| 0920536 | 1 | |
| 0920537 | 2 | |
| 0920538 | 1 | |
| 0920542 | 4 | 不可 |
| 0820510 | 11 | 不可 |
| 0820527 | 4 | 不可 |
| 0420521 | 9 | 不可 |
(2011.7.7現在)
| 学籍番号 | 欠席回数 | 出席点 |
| 1020507 | 1 | |
| 1020509 | 1 | |
| 1020516 | 3 | |
| 1020522 | 1 | |
| 1020525 | 1 | |
| 1020530 | 1 | |
| 1020538 | 1 | |
| 1020539 | 1 | |
| 0820510 | 12 | 不可 |
| 0820540 | 3 |
(2011.7.12現在)
提出は任意です.もし良いレポートを提出いただけたら出席点、小テスト点の加算に使用します. (出席回数が70%に満たないことの充足にはしません)
機能拡張の詳細はSimpleDrawの
を見てください。SimpleDrawのページでは、
の2通りの拡張を書いてあります。どちらの方針で進めていただいても結構です。 説明書に、工夫したところを書いておいてください。
いままでは、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のプログラムが動きます。
または、このhtmlファイルをアップレットビューアでみることもできます。
appletviewer index.html
などして動作を確認できます。
つぎのようにすれば、お絵描きプログラムも作ることができます。 下のプログラムは、前回、前々回やった、一筆書きになってしまうお絵かきプログラムです。 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で見てみます。
webブラウザでもみてみましょう。 (注意:Safariでは、読み込まれたappletが残っていますので、 更新したappletを試すためには、 Safariを一旦終了して起動しなおしてください。)
webサーバにおけば、世界中から使うこともできます。以下をクリックしてみてください。
http://is.ocha.ac.jp/~gradthesis/lecture/applet/
上のappletを、一筆書きにならないように変更してみてください。 やりかたは、前回やったお絵かきプログラムの改良と同じです。 完成したら、.html, .java、.classファイルを、 いつものように、出席番号+名前のフォルダに入れて、 zipで圧縮して、 ファイルサーバから提出してください。
提出した後は、 引き続き、お絵かきプログラム最終課題を進めてください。
本日までにできたところ(.java、.classファイルなど)を、 いつものように、出席番号+名前のフォルダに入れて、 zipで圧縮して、 16:30までにファイルサーバから提出してください。
private static final long serialVersionUID = 42L;
という変数を定義しておきます。
一筆書きを解消するヒント
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();
}
}
こういうのを作ってほしい
ヒント:上のアニメーションのプログラムに、メニューを取り付けて、 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で圧縮して提出してください。
How2MacOSXProgramming を見てください
How2iPhoneProgramming を見てください
以下の内容の新しいファイル,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://is.ocha.ac.jp/~gradthesis/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 の、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
前回、プログラム12.4をやってくる宿題をお願いしました。 この、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。
こんなのをつくってください。
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);
}
}
メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。
演習ができそうにないという人は、飛ばして、次に進んでください。
教科書203ページのプログラム13.6の5行めのところに、
... implements ActionListener6: {
とありますが、これは、
... implements ActionListener {
の間違いのようです。
今日作ったメニューを出すプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
上記の例では写真データを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://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。
public class URLJpeg2 {
public static void main (String argv[]) {
byte[] data = new byte[512];
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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...");
}
}
}
curlというコマンドがあります。
curl http://ocha.ac.jp/
などとすると、htmlが見られますし、
curl http://is.ocha.ac.jp/~gradthesis/cat.jpg > cat.jpg
などとすると、ファイルとして保存できます。これに近いプログラムを作ってみましょう。
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!という文字を出してみよう。
解答例:
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();
}
}
プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。
プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 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();
}
}
このプログラムでは,ボタンを押しても何もおこりません.
ボタンが押されたイベントを受け取るためには,
プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.
ヒント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();
}
}
ボタンを押すとHelloとGoodbyeを表示するプログラムの、.javaと,class を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
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);
}
}
}
作ったファイルを
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);
}
}
}
作ったファイルを
od -h
または
hexdump
してみてください
文字列をかきだすだけなら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);
}
}
}
キーボードから1行入力された文字列によるテキストファイルを作る
ヒント
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);
}
}
}
ヒント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://is.ocha.ac.jp/~gradthesis/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://is.ocha.ac.jp/~gradthesis/cat.jpg");
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg");
というインスタンスを作って、
istream.read()
で読んで、
fout.write(1バイト)
で書き出します。
解答例
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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で圧縮して提出してください。
次のプログラムを作って試してください。 引数が少ないとエラーが出るのを確認してください。
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%
ヒント:
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");
}
}
}
である。
サンプルプログラムを実行するときは、
LinkedList<String> list = new LinkedList<String>();
などと定義すると良い。
プログラム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で圧縮して提出してください。
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 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;
}
}
ことができるコンストラクタを作ろう。
これを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; }
継承の話をしました。 別のクラスを継承することで、 差分だけを書いて機能を拡張していくことができます。
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にprint()メソッドを追加して、 円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。 円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。
public void print() {
super.print();
System.out.println("( " + (okane / 90) + " usd )" );
}
OsaifuUSD.javaとclass を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
例えば以下のような実行結果が出るようにしてください
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で圧縮して提出してください。
ヒント
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を表示するプログラムを書け。 動作例を以下に示す。
解答例:
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");
}
}
}
解答例:
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%だと倍になるのに何年かかるだろうか。確かめてみよう。
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);
}
}
}
mainの引数argsは、Stringの配列で、コマンドラインで起動したとき、 コマンドの後に続けた書いた文字が入っています。 args[0], args[1], args[2] .... をすべてfor-each文で 表示するプログラムを書いてみましょう。
ヒント:for(String s: args)を使います
class ArgsTest2 {
public static void main (String args[]) {
for(String s: args)
System.out.println(s);
}
}
を、番号+名前のフォルダに入れて、zipで圧縮して提出してください。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
http://www.amazon.co.jp/dp/4883732258/
買ってください。もしくは、先輩から安く譲ってもらってください。
Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。 ということでWindowsより簡単に(というか何もしなくても)javaが使えます。
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を押します.
http://www.amazon.co.jp/dp/4781912605/
(授業開始直前や直後に差し替えされている可能性があります。)
もし、提出したにもかかわらず、ここに掲載されていない人がいましたら、大至急椎尾 (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日 | 未定 | 自習 | 自習 | 伊藤出張?・椎尾出張 |
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
詳細はSimpleDrawを見てください
以下の内容の新しいファイル,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で実行してください.
How2MacOSXProgramming を見てください
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で出るwarningは、以下の変数を定義するとなおります
private static final long serialVersionUID = 42L;
上のプログラムでは,描画すると一筆書きになってしまいます。 これを直して、普通に描画できるようにしてください。 また、 マウスの位置とずれたところに線が引かれるのも直してください。(すこしずらせばok)
ヒント
import javax.swing.*;
public class SimpleWindow extends JFrame {
public static void main(String argv[]) {
SimpleWindow sw = new SimpleWindow();
sw.setVisible(true);
}
}
で,非常に簡単なウィンドウが出ます. ここで何をやっているのか,オブジェクト指向の用語を使って説明してみましょう.
先週作った, プログラム12.2をみてください。 このプログラムでは,ボタンを押しても何もおこりません.
プログラム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();
}
}
ボタンが押されたイベントを受け取るためには,
プログラム12.3を参考に,ボタンを押したらprintlnで次のようなメッセージを表示するプログラムを作ってみましょう.
ヒント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();
}
}
ボタンが一つしかないプログラムなので、ActionPerformedの中で、 ボタン種類のチェックを省略してしまっているところが特徴です。
BorderLayoutでもできるようですが、私はGridLayour使ってみました。
panel.setLayout(new GridLayout(2,2)); panel.add(textleft); panel.add(textright); panel.add(button); panel.add(clearbutton);
ボタンが複数になるので、ActionPerformedの中で、ボタンを区別する必要があります。 演習ができそうにないという人は、飛ばして、次に進んでください。
メニューアイテムにcommandという情報をつけて、ActionPerformedではこれを使ってメニュー項目を区別しています。
演習ができそうにないという人は、飛ばして、次に進んでください。
教科書203ページのプログラム13.6の5行めのところに、
... implements ActionListener6: {
とありますが、これは、
... implements ActionListener {
の間違いのようです。
演習ができたかどうかに従って、以下の3本から5本のプログラム(.javaと.class)を いつものように学籍番号+名前のフォルダに入れて、圧縮して提出してください。
http://is.ocha.ac.jp/~gradthesis/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://is.ocha.ac.jp/~gradthesis/cat.jpg");
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg");
というインスタンスを作って、
istream.read()
で読んで、
fout.write(1バイト)
で書き出します。
解答例
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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!という文字を出してみよう。
解答例:
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();
}
}
プログラム12.2をみてください。 getContentPane()で得られたContainerに直接ボタンを貼付けることもできますが、 貼付けられるのは一つのボタンだけのようです。 パネルに2個のボタンを貼付け、それをContainerに貼付けることで複数のボタンを表示しています。
プログラム12.2を参考にして、継承を使ったプログラムによるウィンドウの中に、 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();
}
}
作ったファイルを
od -h
または
hexdump
してみてください
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);
}
}
}
作ったファイルを
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);
}
}
}
キーボードから1行入力された文字列によるテキストファイルを作る
ヒント
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);
}
}
}
ヒント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://is.ocha.ac.jp/~gradthesis/cat.jpg
をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。 データはテキストじゃなくて、バイナリーです。
ヒント1:
InputStreamのインスタンスに対してread()メソッドを使うと1バイトのデータが得られます。読み終わると-1になります。 1バイトのデータを書き出すなら、FileOutputStreamだけで可能です。
OsaifuUSDにprint()メソッドを追加して、 円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。 円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。
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");
}
}
}
である。
サンプルプログラムを実行するときは、
LinkedList<String> list = new LinkedList<String>();
などと定義すると良い。
プログラム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);
}
}
}
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());
}
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 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;
}
}
ことができるコンストラクタを作ろう。
これを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; }
継承の話をしました。 別のクラスを継承することで、 差分だけを書いて機能を拡張していくことができます。
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);
}
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();
}
}
例えば以下のような実行結果が出るようにしてください
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();
}
クラスのインスタンス化(後日説明します)と同じやりかたですので、 覚えておきましょう。教科書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]);
}
}
解答
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を表示するプログラムを書け。 動作例を以下に示す。
解答例:
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");
}
}
}
解答例:
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%だと倍になるのに何年かかるだろうか。確かめてみよう。
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);
}
}
}
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);
}
}
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文で 表示するプログラムを書いてみましょう。
ヒント:for(String s: args)を使います
class ArgsTest2 {
public static void main (String args[]) {
for(String s: args)
System.out.println(s);
}
}
http://www.amazon.co.jp/dp/4883732258/
買ってください。もしくは、先輩から安く譲ってもらってください。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html
Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。 ということでWindowsより簡単に(というか何もしなくても)javaが使えます。
class Hello {
public static void main (String args[]) {
System.out.println("hello java world!");
}
}
javac Hello.java (コンパイルする) java Hello (実行する。.javaなどの拡張子は不要) hello java world! (結果)
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
とタイプしてコンパイル/実行します。
以上のプログラムが完成したら、以下の方法で提出してください。
漏れがありましたら至急 siio@mac.com まで連絡ください
0820504 0820515 0820517 0820522 0820525 0820542
グラフィカルユーザインタフェース(GUI)は、コンピュータの 画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、 操作可能なグラフィカルなオブジェクトを表示して、 これらをマウスなどの指示装置を用いて操作するユーザインタフェースの 手法である。
一方、文字だけを表示するディスプレイとキーボードを用いて、 文字によるコマンドをタイプしてコンピュータを操作する手法を コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。 現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。
この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。 (ヒントとして示したキーワードをできるだけ多く使用すること)
2/1 15時現在の状況です. 出したけどここに掲載されていないという人は, 至急,椎尾(siio@mac.com)まで連絡ください. そのときに,課題を添付して送っていただけると良いかと思います.
椎尾です。昨夜から熱が出て、今朝はだいぶよくなったのですが、 新型インフルエンザだといけないので、念のために欠席します。 申し訳ありませんが1月14日はTAのみなさんの指導を受けて、昨年から説明している、以下の最終課題(お絵かきプログラム)を 進めてください。(1月14日10pm 椎尾)
| 5--8時限 | 備考 | |
| 1月14日 | 課題をすすめてください。TAが対応します | 椎尾急病で欠席。出欠はとります |
| 1月21日 | 課題をすすめてください。椎尾とTAが対応します。 | 出欠とります |
| 1月28日 | 自主的に課題をすすめてください。TAが対応します | 椎尾海外出張で休講 。出欠とりません |
詳細はSimpleDrawを見てください
伊藤先生と椎尾で休講を少なくするよう授業時間を調整しました. その結果, マルチメディア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日 | 休講 | 休講 | 椎尾出張 |
http://java.sun.com/javase/ja/6/docs/ja/api/index.html
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://is.ocha.ac.jp/~gradthesis/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://is.ocha.ac.jp/~gradthesis/cat.jpg");
InputStream istream = targetURL.openStream();
FileOutputStream fout = new FileOutputStream("cat.jpg");
というインスタンスを作って、
istream.read()
で読んで、
fout.write(1バイト)
で書き出します。
解答例
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラム
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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...");
}
}
}
ヒント
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...");
}
}
}
キーボードから1行入力された文字列によるテキストファイルを作る
解答例
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);
}
}
}
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);
}
}
}
作ったファイルを
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");
}
}
}
である。
サンプルプログラムを実行するときは、
LinkedList<String> list = new LinkedList<String>();
などと定義すると良い。
プログラム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);
}
}
}
継承の話をしました。 別のクラスを継承することで、 差分だけを書いて機能を拡張していくことができます。
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にprint()メソッドを追加して、 円表示の次の行に ( xxx USD ) と残高をUSD表示するようにしてください。 円表示を行う部分はスーパークラスOsaifuのインスタンスメソッドprint()を利用することを考えてみてください。
public void print() {
super.print();
System.out.println("( " + (okane / 90) + " usd )" );
}
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とよびます
(教科書ではモリモーフィズムのことをオーバーロードと書いてあります)
例えば以下のような実行結果が出るようにしてください
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());
}
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 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;
}
}
ことができるコンストラクタを作ろう。
これを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; }
乱数を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を表示するプログラムを書け。 動作例を以下に示す。
解答例:
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");
}
}
}
解答例:
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%だと倍になるのに何年かかるだろうか。確かめてみよう。
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);
}
}
}
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);
}
}
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文で 表示するプログラムを書いてみましょう。
ヒント:for(String s: args)を使います
class ArgsTest2 {
public static void main (String args[]) {
for(String s: args)
System.out.println(s);
}
}
Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。 ということでWindowsより簡単に(というか何もしなくても)javaが使えます。
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を押します.
ヒント
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]);
}
}
以下の課題についてレポートを書き,まとめて提出してください。
1982年にIBMが発売したIBM PCは,その後のパーソナルコンピュータ (PC) の標準になり,さまざまな改良が施されつつも,現在のほとんどのPCの起源と言える.しかしながら,IBMは主導権をとることができず,PC部門の利益が悪化したため事業から撤退してしまった.一方で,IBMへの部品提供業者として,CPUやOSを提供したインテル社,マイクロソフト社いまだにPC事業が看板部門であり,大きな利益をあげて業界を主導している.
グラフィカルユーザインタフェース(GUI)は、コンピュータの 画面にウィンドウ、アイコン、メニュー、ボタン、スライダーなどの、 操作可能なグラフィカルなオブジェクトを表示して、 これらをマウスなどの指示装置を用いて操作するユーザインタフェースの 手法である。
一方、文字だけを表示するディスプレイとキーボードを用いて、 文字によるコマンドをタイプしてコンピュータを操作する手法を コマンドラインインタフェース(CLI)、またはキャラクタユーザインタフェース(CUI)と呼ぶ。 現在のパーソナルコンピュータでは、CUIに代わりGUIが一般的になっている。
この二種類のインタフェース手法について以下の1, 2, 3の問いに答えよ。 (ヒントとして示したキーワードをできるだけ多く使用すること)
人の短期記憶について説明されている以下の文を読んでおいてください.
ここに書かれている短期記憶,魔法の数字,チャンクなどの用語を使って, つぎのような質問に答えていただく記述式の問題を作成する予定です.
#ref(): File not found: "menu1.png" at page "LectureOldOld"
#ref(): File not found: "menu2.png" at page "LectureOldOld"
この課題のヒントは SimpleDraw をみてください。
詳細はSimpleDrawを見てください
今年度後期は,伊藤先生と椎尾の出張が多いため,できるだけ休講を少なくするよう授業時間を調整しました. その結果, マルチメディア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 | マルチメディア プログラミング実習 | マルチメディア プログラミング実習 | 時間割通り |
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
年明けからはEclipseを使います。授業で説明しますが、あらかじめ使ってみておいていただけるとわかりやすいかと思います。Eclipseについてはネット上にたくさん情報があります。本家は以下です。
こういうのを作ってほしい
ヒント: 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://is.ocha.ac.jp/~gradthesis/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();
}
}
こういうのを作ってほしい
完成したら以下の方法で提出してください.
http://is.ocha.ac.jp/~gradthesis/index.php?Lecture#u5201c9d
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();
}
}
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://is.ocha.ac.jp/~gradthesis/index.php?Lecture#u5201c9d
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...");
}
}
}
import java.io.*;
import java.net.*;
//http://is.ocha.ac.jp/~gradthesis/cat.jpg
//をダウンロードして、cat.jpgというファイルを作るプログラムを作ってください。
//データはテキストじゃなくて、バイナリーです。
public class URLJpeg {
public static void main (String argv[]) {
try {
URL targetURL = new URL("http://is.ocha.ac.jp/~gradthesis/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/の内容を表示するプログラムを書いてみよう。 ヒント、
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 のインスタンスが得られる。
http://is.ocha.ac.jp/~gradthesis/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);
}
}
}
名前と名字を入れると挨拶するけど、入力される引数が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<String> list = new LinkedList<String>();
と定義すると良い
以下のように動作する英語ー日本語単語変換プログラムを作れ。
[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");
}
}
}
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;
}
}
ことができるコンストラクタを作ろう。
これを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; }
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();
}
}
次のプログラムで
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));
}
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);
}
}
Mac OS XはJavaと相性が良く、最初からjavaがインストールされています。 ということでWindowsより簡単に(というか何もしなくても)javaが使えます。
class Hello {
public static void main (String args[]) {
System.out.println("hello java world!");
}
}
javac Hello.java (コンパイルする) java Hello (実行する。.javaなどの拡張子は不要) hello java world! (結果)
以下の課題についてレポートを書き,まとめて提出してください。
授業で使ったプレゼン資料
のうち,2,3,4,6ページにある,マッピングとモデルの項目を見ておいてください. このページにある図を使って, つぎのような質問に答えていただく記述式の問題を作成する予定です.
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
この課題のヒントは SimpleDraw をみてください。
この課題のヒントは SimpleDraw をみてください。
詳細はSimpleDrawを見てください
以下の2つの課題についてレポートを書き,まとめて提出してください。
以下の2つの課題についてレポートを書き,まとめて提出してください。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html
この課題のヒントは SimpleDraw をみてください。
詳細はSimpleDrawを見てください
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();
}
}
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);
}
}
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);
}
}
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...");
}
}
}
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();//現在の金額を表示
}
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の距離を表示
}
}
(1-1) 以下の日用品を1つ以上例示せよ
(1-2) なぜ(1-1)のような事態になったのかを、分析せよ
制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。
(2) グラフィカルユーザインタフェース(GUI)をキャラクターベースのインタフェース(CUI)と比較して,以下のことを述べよ.
(2-1)CUIに対するGUIの長所を,「初心者、子供、直接操作、アフォーダンス、デスクトップメタファ、WYSIWYG」などの言葉を使って説明せよ.
(2-2)CUIに対するGUIの短所を,「熟達者、キーボードと指示装置の併用、計算機資源、パイプ、正規表現、コマンドスクリプト言語」などの言葉を使って説明せよ.
便利なフリーウェアのテキストエディタです。 http://www.mimikaki.net/からダウンロードして/Users/ユーザ名/Applicationsにコピーします。 (Applicationsディレクトリが存在しない場合は作成)。
ファインダーの上で右クリック(もしくはコントロールキー+クリック)すると現れる メニューの中に、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を再起動。
The serializable class xxxxxxx does not declare a static final serial Version UID field of type long
private static final long serialVersionUID = 42L;というインスタンス変数を宣言しておくとよいようです。
How2Java
DrawFrame.java
以下の3つの課題の中から2つを選んで、提出してください。
(1-1) 以下の日用品を1つ以上例示せよ
(1-2) なぜ(1-1)のような事態になったのかを、分析せよ
制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。
(2) 以下のような計算機の応用を、1つ以上考えて、提案せよ
(1) 以下の日用品を1つ以上例示せよ
(2) なぜ(1)のような事態になったのかを、分析せよ
制約、マッピング、Affordance、モデル、複雑性、エラー対策、状態がビジュアルかどうか、標準化の問題か、などを議論せよ。
LectureTamagawa をご覧ください.