[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

情報処理IIIA(Javaプログラミング入門)第4回

目次 索引
4.1 アプリケーションとアプレットの引数
4.1.1 コマンドライン引数
4.1.2 アプレット・パラメタ
4.2 選択(1)
4.2.1 if
4.3 式と演算子(2)
4.4 選択(2)
4.4.1 if-else文(1)
4.4.2 if-else文(2)
4.5 演習4
4.6 レポート課題

4.1 アプリケーションとアプレットの引数

4.1.1 コマンドライン引数

javaコマンドでプログラムを実行するさいに、プログラムにデータを渡すことができます。 次のプログラムは、渡されたデータをそのまま出力するものです。

/* 1*/ class FirstArgument {
/* 2*/     public static void main (String[] args) {
/* 3*/         int x = Integer.parseInt(args[0]);
/* 4*/         System.out.println(x);
/* 5*/     }
/* 6*/ }
b00a001@Ampere:~/java% java FirstArgument 100
100
b00a001@Ampere:~/java% java FirstArgument 200
200
b00a001@Ampere:~/java%

データの渡し方は、javaコマンドにそのデータを追加して入力します。 このデータを コマンドライン引数 とよびます。 プログラムでは、式 Integer.parseInt(args[0]) がコマンドライン引数を表します。

注意: コマンドライン引数を入力しなかったり、整数( int 型)でないものを入力した場合、式 Integer.parseInt(args[0]) の部分でエラーが発生します。 また、コマンドライン引数を複数入力しても、この式で取り出せるのは最初の一つだけです。 ちゃんとしたプログラムを書くには、コマンドライン引数の個数を確かめ、それが整数であることを確認する必要があります。

4.1.2 アプレット・パラメタ

コマンドライン引数と同様に、アプレットに対してもデータを渡すことができます。 このデータは、アプレット・パラメタとよばれます。 「引数」と「パラメタ」は同じ概念だと思ってください。

次のプログラムは、円の中心座標と半径のデータを受け取り、そのような円を描くアプレットです。

DrawCircle.java
/* 1*/ import java.applet.*;
/* 2*/ import java.awt.*;
/* 3*/ 
/* 4*/ public class DrawCircle extends Applet {
/* 5*/     public void paint (Graphics g) {
/* 6*/         int x = Integer.parseInt(getParameter("centerx"));
/* 7*/         int y = Integer.parseInt(getParameter("centery"));
/* 8*/         int r = Integer.parseInt(getParameter("radius"));
/* 9*/         g.setColor(Color.black);
/*10*/         g.drawOval(x - r, y - r, 2 * r, 2 * r);
/*11*/     }
/*12*/ }
DrawCircle.html
<html>
<head>
<title>Drawing circles</title>
</head>
<body>
<hr>
<applet code="DrawCircle.class" width="300" height="100">
  <param name="centerx" value="70">
  <param name="centery" value="50">
  <param name="radius" value="40">
</applet>
<hr>
<applet code="DrawCircle.class" width="300" height="100">
  <param name="centerx" value="100">
  <param name="centery" value="50">
  <param name="radius" value="30">
</applet>
<hr>
</body>
</html>
Drawing circles
図 4.1  アプレットのイメージ

アプレットに渡すデータは、HTMLドキュメントの中に書きます。 HTMLドキュメントを書くために、まず、データに名前をつけます。 ここでは、円の中心の x 座標は centerxy 座標は centery 、円の半径は radius です。 次に、 <param> タグを用い、

<param name="name" value="value">

という形式で、名前とデータの対応を表します。 この例では、座標 (70, 50), 半径 40 ですので、

  <param name="centerx" value="70">
  <param name="centery" value="50">
  <param name="radius" value="40">

となります。 なお、 <param> タグに終了タグはありません。 最後に、これを <applet> タグで囲みます。

アプレットでデータを受け取るには、式

Integer.parseInt(getParameter("name"))

を用います。 上記のプログラムの6行目から8行目で、変数 x , y , r のそれぞれに、円の中心の x 座標、 y 座標、円の半径が格納されています。


4.2 選択(1)

4.2.1 if

今までのプログラムは、書いてあることを無条件に順次実行するものばかりでした。 プログラムの構成要素には、このほかにも「もし何々が成り立つならば何々する」というようなものがあります。 これを 選択文selective statement )、あるいは 条件文conditional statement )とよびます。

次のプログラムは、もしコマンドライン引数が負の数ならばThat is a negative number.と出力するものです。 4行目の temp < 0 の部分が、「負の数ならば」という条件を表しています。

/* 1*/ class NegativeNumber {
/* 2*/     public static void main (String[] args) {
/* 3*/         int temp = Integer.parseInt(args[0]);
/* 4*/         if (temp < 0) {
/* 5*/             System.out.println("That is a negative number.");
/* 6*/         }
/* 7*/     }
/* 8*/ }
b00a001@Ampere:~/java% java NegativeNumber 100
b00a001@Ampere:~/java% java NegativeNumber -30
That is a negative number.
b00a001@Ampere:~/java%

「もし何々が成り立つならば何々する」という選択は、 if 文を使うと書けます。 if 文は次のような形をとります。 条件 condition が成り立つならば、 statement1 , statement2 , statement3 , ... を実行します。

if (condition) {
    statement1;
    statement2;
    statement3; ...
}

if 文の中に、さらに if 文を書くこともできます。

次のプログラムは、コマンドライン引数が3桁の数ならばThat is a number of three figures.と出力するものです。 4行目で「 x は100以上」という条件が課され、5行目で「 x は999以下」という条件が課されますので、6行目は、 x が100以上999以下の場合、すなわち3桁の数の時に実行されます。 記号 >= , <= はそれぞれ≧, ≦に対応します。

/* 1*/ class ThreeFigures {
/* 2*/     public static void main (String[] args) {
/* 3*/         int x = Integer.parseInt(args[0]);
/* 4*/         if (x >= 100) {
/* 5*/             if (x <= 999) {
/* 6*/             System.out.println("That is a number of three figures.");
/* 7*/             }
/* 8*/         }
/* 9*/     }
/*10*/ }
b00a001@Ampere:~/java% java ThreeFigures 55
b00a001@Ampere:~/java% java ThreeFigures 555
That is a number of three figures.
b00a001@Ampere:~/java%

4.3 式と演算子(2)

上記の例では、条件として temp < 0x >= 100 を書きました。 条件は、 関係演算子relational operator )や 論理演算子logical operator )を用いて構成されます。 関係演算子は次の通りです。

表 4.1  関係演算子
記号 関係
> 大きい 19 > 3⇒ true
< 小さい 19 < 3⇒ false
>= 以上 19 >= 3⇒ true
<= 以下 19 <= 3⇒ false
== 等しい 19 == 3⇒ false
!= 等しくない 19 != 3⇒ true

等しい関係は記号 == で表すことに注意してください。 記号 = では代入文になります。

実は、条件は式の一種です。 式の値がtrueになることが、条件が成り立つことを意味します。 式の値がfalseになることが、条件が成り立たないことを意味します。

論理演算子を使いますと、より複雑な条件が書けます。

表 4.2  論理演算子
記号 論理演算
&& かつ 16 > 5 && 4 == 7⇒ false
|| または 16 > 5 || 4 == 7⇒ true
! 〜でない !(4 == 7)⇒ true

記号 && は、ふたつの条件を結んで新しく条件を作ります。 これは、両方の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。 記号 || も、ふたつの条件を結びます。 これは、一方(両方でもよい)の値がtrueになるときtrueという値を持ち、そうでないときfalseという値を持ちます。 記号 ! は、ひとつの条件から新しく条件を作ります。 これは、trueをfalseに、falseをtrueに変えます。

これまでに説明した演算子の優先順位は次のようになります。 分からなくなりそうでしたら、括弧を使って計算順序を明示するのがよいでしょう。

表 4.3  演算子の優先順位(上のほうがより強く結合する)
! -(単項)
* / %
+ -
> < >= <=
== !=
&&
||

ここで、単項の - とは、式 -1 + x などの - のことです。

次のプログラムでは、100以上999以下というひとつの条件で3桁の数を判定します。

/* 1*/ class ThreeFigures2 {
/* 2*/     public static void main (String[] args) {
/* 3*/         int x = Integer.parseInt(args[0]);
/* 4*/         if (100 <= x && x <= 999) {
/* 5*/             System.out.println("That is a number of three figures.");
/* 6*/         }
/* 7*/     }
/* 8*/ }

注意: 4行目の条件を 100 <= x <= 999 と書くことはできません。


4.4 選択(2)

4.4.1 if-else文(1)

選択の中には、「もし何々が成り立つならば何々する。成り立たないならば何々する。」というものもあります。 この選択には、 if - else 文を使います。

次のプログラムは、コマンドライン引数が偶数ならばThat is an even number.と出力し、そうでないならばThat is an odd number.と出力するものです。

/* 1*/ class EvenOdd {
/* 2*/     public static void main (String[] args) {
/* 3*/         int x = Integer.parseInt(args[0]);
/* 4*/         if (x % 2 == 0) {
/* 5*/             System.out.println("That is an even number.");
/* 6*/         } else {
/* 7*/             System.out.println("That is an odd number.");
/* 8*/         }
/* 9*/     }
/*10*/ }
b00a001@Ampere:~/java% java EvenOdd 12
That is an even number.
b00a001@Ampere:~/java% java EvenOdd 15
That is an odd number.
b00a001@Ampere:~/java%

if - else 文は次のような形をとります。 条件 condition が成り立つならば、 statement1 , ...を実行します。 成り立たないならば、 statement2 , ...を実行します。

if (condition) {
    statement1; ...
} else {
    statement2; ...
}

4.4.2 if-else文(2)

「何々が成り立つならば何々する。 そうでなくて、何々が成り立つならば何々する。 どちらも成り立たないならば何々する。 」というような選択は、プログラミングでよく用いられます。 これは次のように書きます。

if (condition1) {
    statement1; ...
} else if (condition2) {
    statement2; ...
} else {
    statement3; ...
}

条件 condition1 が成り立つならば、 statement1 ...が実行されます。 条件 condition1 が成り立たなくて、条件 condition2 が成り立つならば、 statement2 ...が実行されます。 条件 condition1condition2 も成り立たないならば、 statement3 ...が実行されます。

条件がより多い場合は次のようになります。 条件 condition1 , condition2 ,...と順に確かめていき、はじめて成り立つ条件が condition_i ならば、 statement_i ...が実行されます。 どの条件も成り立たないならば、 statement_n+1 ...が実行されます。

if (condition1) {
    statement1; ...
} else if (condition2) {
    statement2; ...
} else if (condition3) {
    statement3; ...
}
...
  else if (condition_n) {
    statement_n; ...
} else {
    statement_n+1; ...
}

次のプログラムは、コマンドライン引数として試験の得点を入力しますと、その評価を出力するものです。 90点以上100点以下ならばAを、80点以上90点未満ならばBを、70点以上80点未満ならばCを、60点以上70点未満ならばDを、0点以上60点未満ならばFを、それぞれ出力します。 どの条件も成り立たない場合は、入力が間違っていますので、Illegal scoreと出力します。

/* 1*/ class ScoreGrade {
/* 2*/     public static void main (String[] args) {
/* 3*/         int score = Integer.parseInt(args[0]);
/* 4*/         if (90 <= score && score <= 100) {
/* 5*/             System.out.println("A");
/* 6*/         } else if (80 <= score && score < 90) {
/* 7*/             System.out.println("B");
/* 8*/         } else if (70 <= score && score < 80) {
/* 9*/             System.out.println("C");
/*10*/         } else if (60 <= score && score < 70) {
/*11*/             System.out.println("D");
/*12*/         } else if (0 <= score && score < 60) {
/*13*/             System.out.println("F");
/*14*/         } else {
/*15*/             System.out.println("Illegal score");
/*16*/         }
/*17*/     }
/*18*/ }
b00a001@Ampere:~/java% java ScoreGrade 85
B
b00a001@Ampere:~/java% java ScoreGrade 78
C
b00a001@Ampere:~/java% java ScoreGrade -10
Illegal score
b00a001@Ampere:~/java%

4.5 演習4

JavaプログラムBarGraph.javaを作成して、以下のイメージのような、売上目標と実績を棒グラフで表すホームページを完成させてください。 HTMLドキュメントは以下のものを用いることにします。 棒グラフの部分は画像ファイルではなくアプレットです。 また、一つのアプレットを4か所で用いています。

このアプレットは、はじめに売上目標( target )と売上実績( result )を <param> タグから取得します。 そして、売上実績が目標を超えていたら、青で棒グラフを描きます。 目標以下でしたら赤です。 最後に、目標の位置に黒で印を付けます。 棒グラフは、1億円を1ピクセルで表すことにします。 また、アプレットの大きさは、幅200ピクセル、高さ20ピクセルと仮定してください。

なお、ホームページのデザインを変更してもかまいませんが、目標超過/以下の区別を明確にし、売上目標を分かりやすく表してください。

A bar graph
図 4.2  棒グラフのイメージ
BarGraph.html
<html>
<head>
<title>A bar graph</title>
</head>
<body>
<div>
  売上目標と実績<br>
  (単位は億円、黒は目標、青は目標超過、赤は目標以下)
</div>
<table border="1">
<tr>
  <th>年</th><th>目標</th><th>実績</th><th>グラフ</th>
</tr>
<tr>
  <td>1997</td><td>100</td><td>130</td>
  <td>
    <applet code="BarGraph.class" width="200" height="20">
      <param name="target" value="100">
      <param name="result" value="130">
    </applet>
  </td>
</tr>
<tr>
  <td>1998</td><td>110</td><td>100</td>
  <td>
    <applet code="BarGraph.class" width="200" height="20">
      <param name="target" value="110">
      <param name="result" value="100">
    </applet>
  </td>
</tr>
<tr>
  <td>1999</td><td>120</td><td>140</td>
  <td>
    <applet code="BarGraph.class" width="200" height="20">
      <param name="target" value="120">
      <param name="result" value="140">
    </applet>
  </td>
</tr>
<tr>
  <td>2000</td><td>130</td><td>110</td>
  <td>
    <applet code="BarGraph.class" width="200" height="20">
      <param name="target" value="130">
      <param name="result" value="110">
    </applet>
  </td>
</tr>
</table>
</body>
</html>

4.6 レポート課題

今日の演習4に従ってJavaプログラムを作成し、そのプログラムをkonishi@twcu.ac.jpあてにメールで提出してください。 メールには、学生番号、氏名、科目名、授業日(10/11)を明記してください。


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2001年10月11日更新
konishi@twcu.ac.jp
Copyright (C) 2001 Zenjiro Konishi. All rights reserved.