条件を利用してみよう

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

選択(if文)

if文

2つの文の中、条件によって1つを選択するには「if文」を使います。

if(式) {
        処理1        
}
else {
        処理2
}

「式」には関係演算子や論理演算子等、結果として論理値が得られる様な演算を書きます。
「処理1」は「式」の結果が「真」の時だけ実行され、「処理2」は「式」の結果が「偽」の時だけ実行されます。

例: char muki = '左';
if(muki == '左'){
 左向きの処理・・・変数「muki」の内容が「'左'」の時だけ実行
}
else{
 右向きの処理・・・変数「muki」の内容が「'左'」ではない時だけ実行
}

四角の描画

ウィンドウ画面やアプレットに四角を描く場合は「paint()」メソッド内に以下の様に書きます。

public void paint(Graphics g)
{
        g.drawRect(左上のx座標,左上のy座標,,高さ);

}
例: g.drawRect(10, 55, 280, 90);

アプレットにパラメータを渡す時のHTMLの記述

HTMLは、アプレットを呼び出す時に、パラメータを渡せます。
以下の様に書きます。

<APPLET code = "クラス名" width="幅" height="高さ">
<PARAM NAME = "パラメータ名" VALUE="パラメータ値">
</APPLET>

パラメータ値は変数名の様な物で、パラメータ値は其の変数に格納されている値と考えれば良いでしょう。
パラメータは此の2つを組にして、複数個渡せます。

例: <APPLET code = "クラス名" width="幅" height="高さ">
<param name = "sw1" VALUE="right">
<param name = "sw2" VALUE="up">
</APPLET>

HTMLからパラメータを受け取るJavaプログラム

アプレットは、HTMLからのパラメータを「Stringクラス(文字列)」で受け取ります。

String オブジェクト名 = getParameter("パラメータ名");

「パラメータ名」の部分にHTMLで指定したパラメータ名を書くと、オブジェクトにHTMLで指定したパラメータ値が代入されます。

例: String param = getParameter("sw1");

文字列と文字列の比較
Stringクラスのメソッド

オペランドに、変数名又はオブジェクト名を書いた時は、其処に記憶されているデータを指します。
変数の場合、記憶されているのは「データ」其の物です。
其の為2つ上の例では変数「muki」の内容が「'左'」であるかどうかを調べられます。
所がオブジェクト名の場合、インスタンス化されたオブジェクトのアドレスが記憶されていますから、下の例では、オブジェクト名「s」の指すアドレスと、無名オブジェクト「"left"」が記憶されているアドレスとを比較する事になります。

変数 オブジェクト
char muki;
    :
if(muk == '左'){
  :
}
String s;
  :
if(s == "left"){
  :
}

下の例は、オブジェクトの比較を実験するプログラムです。

例:
public class Test{
        public static void main(String[] args){
                String s=new String("Happy");
                if(s == "Happy"){
                        System.out.println("等しい");
                }
                else{
                        System.out.println("等しくない");
                }
        }
}
実行結果:
C:\javasrc>javac Test.java
C:\javasrc>java Test
等しくない
C:\javasrc>

各クラスでは、良く使う演算がメソッドの形で提供されている事が有ります。
Stringクラスでは「オブジェクトの内容(文字列)」同士が等しいかどうかを調べる為に、以下の様なメソッドが用意されています。

s1.equals(s2)・・・「Stringクラスのオブジェクト名」が入る
等しい時
true
が得られる
等しくない時
false
例: String s1 = "left";
String s2 = "right";
boolean kekka = s1.equals(s2);
ソース ダウンロード
MedamaLR.java Medama02.zip MedamaLR.html
MedamaLRParam.java MedamaLRParam.html

多分岐(else-ifとswitch)

else-if文

if文は二者択一ですが、もっと沢山の条件を選択出来る様にしたい場合は、「偽」の処理を増やし、次の条件を調べる様にする事で多分岐に出来ます。

if(式1){
        処理1・・・「式1」の結果が「真」の時実行
}
else if(式2){
        処理2・・・「式1」の結果が「偽」で、更に「式2」の結果が「真」の時実行
}
        :
        :
else{
        処理n・・・全ての式の結果が「偽」の時実行
}
例: String param = getParameter("switch");
if(param.equals("left")){
    左向きの処理
}
else if(param.equals("right")){
    右向きの処理
}
else{
    下向きの処理
}

以上の例では、どの条件式も文字列「param」と比較しています。

switch文

多分岐を行う為の選択文です。
評価対象が全て同じで、整数型の値を取る時に使います。

switch(式){
        case 定数式1:文1
        case 定数式2:文2
          :
          :
        case 定数式n:文n
        default :文n+1
}

「式」の値から等しい定数式を持つ「case」から、以下の条件を全て実行します。
「式」の値が「定数式1〜定数式n」のどれにも当てはまらない時は、「default」の「文n+1」だけが実行されます。
各「case」には、文も2つ以上書けます。
「式」と「定数式1〜定数式n」は整数でなければなりません。
式の値が「定数式1〜定数式n」のどれとも一致しない時に何も実行する事が無ければ、「default」と「文n+1」を省略出来ます。
「default」を2つ以上書けません。
又、「定数式1〜定数式n」の中に、同じ値も書けません。

例: int kekka = 0;
switch(n){
    case 5;
       kekka += 5;
    case 4;
       kekka += 4;
    case 3;
       kekka += 3;
    case 2;
       kekka += 2;
    case 1;
       kekka += 1;
}
定数式1 「文1」以降の「文n+1」迄、全てが実行
定数式2 「文2」以降「文n+1」迄が実行

整数式に「式」と同じ値が無い場合でしかも「default」と「文n+1」が省略されていると何も実行されません。

n = 1の時、@を実行する為「kekka = 1」
n = 2の時、Aを実行する為「kekka = 2 + 1 = 3」
n = 3の時、Bを実行する為「kekka = 3 + 2 + 1 = 6」
n = 4の時、Cを実行する為「kekka = 4 + 3 + 2 + 1 = 10」
n = 5の時、Dを実行する為「kekka = 5 + 4 + 3 + 2 + 1 = 15」
n = 6の時、「n」が1〜5以外の時は何もしない為「kekka = 0」

switch文とbreak文

上の例では「n」が「5」の場合、「5」以降の全てのcase文を実行して終います。
該当する「case」の処理だけを実行させたい場合は、各「case」の最後に、

break;

と書きます。

switch(式){
        case 定数式1:文1
           break;
        case 定数式2:文2
           break;
          :
          :
        case 定数式n:文n
           break;
        default   :文n+1
}

該当する「case」の文だけを実行します。

例: int kekka = 0;
switch(n){
    case 5;
       kekka += 5;
       break;
    case 4;
       kekka += 4;
       break;
    case 3;
       kekka += 3;
       break;
    case 2;
       kekka += 2;
       break;
    case 1;
       kekka += 1;
       break;
}

「break文」は、「其れより下をスキップ」と言う意味です。

1つのswitch文の中で、「break;」の有る文と無い文が混じっていても構いません。

n = 1の時、@を実行するので「kekka = 1」
n = 2の時、Aを実行するので「kekka = 2」
n = 3の時、Bを実行するので「kekka = 3」
n = 4の時、Cを実行するので「kekka = 4」
n = 5の時、Dを実行するので「kekka = 5」
n = 6の時、「n」が1〜5以外の時は何もしないので「kekka = 0」

データの分離

第2章では家の絵を描く為、データを配列に入れてプログラムとデータを分離しました。
今度は、目玉の絵を描く為にデータを分離します。
目玉の絵では、座標値の他に、「四角」や「楕円」の様な形や「線で描く」「塗り潰す」等の情報が必要になります。
それぞれの描画の方法に番号を付けておく事にしましょう。

0;四角の線画を描く
1;四角を塗り潰す
2;楕円の線画を描く
3;楕円を塗り潰す

第1章と同様、配列にデータを設定する事にします。
配列「draw[]」のデータが「0」の場合は「四角の線画を描く」になり、「3」にした場合は「楕円を塗り潰す」、と言う様な場合分けを行います。

ソース ダウンロード
MedamaLRD.java Medama03.zip MedamaLRD.html
MedamaS.java MedamaS.html

反復

while文

同じ処理を繰り返すには「while文」を使います。

「while文」では、始めに「式」を評価する為、最初から「式」が「偽」の場合、1度も文を実行しない侭反復を終了する事が有ります。

初期設定
while(){
        繰り返す処理
        最初期化
}

「式」が「真」かどうかを調べる事を「式を評価」と言います。

「初期設定」には、反復処理を始める前にして措きたい初期設定を書きますが、必要ない場合も有ります。
「式」には、関係演算子や論理演算子等、結果的に論理値が得られる様な演算を書きます。
while文の処理は、始めに「式」が「真」かどうかを調べられます。
其の時「真」であると「|」と「|」で囲まれた中の処理を実行します。
1回目の実行が終わると、又「式」に戻って「式」が「真」かどうかを調べ再び処理をします。
此の処理を繰り返しながら「式」が「偽」の時反復を終了し、繰り返す為のパラメータ等の更新をします。

例: int i = 0;
int n = 0;
while(i < 3){
     n = n+10;
     i++
}

此のプログラムは「i = 0」から始まり、

n = n+10;

を1回する度に、

i++;

を行い、「i」が「3」より小さい間繰り返します。
つまり「i」は何回繰り返したかを数えるカウンタの役目をしています。
最初期化では、カウンタ「i」を1ずつ増やして行きます。

反復の条件

HouseArray.javaでは、

g.drawLine(x1[0], y1[0], x2[0], y2[0]);
g.drawLine(x1[1], y1[1], x2[1], y2[1]);
g.drawLine(x1[2], y1[2], x2[2], y2[2]);
g.drawLine(x1[3], y1[3], x2[3], y2[3]);
        :
        :

の様に、配列の添字を1つずつ増やして書きました。
此に配列とは?の変数「i」を導入してみましょう。
最終的には「i」は「10」になりました。
此処では、10本の直線を弾けば良いので、「i」が「10」になった地点で繰り返しは終わりです。
while文の反復条件は、

「i」が「10」より小さい間繰り返す

となります。
「i」は配列の添字の役目をすると同時に、終了条件を判定する為のパラメータの役目もします。
所で、此の家は10本の直線で書かれていますが、もう少し豪邸にしたい場合には、もっと沢山の直線が必要です。
データを変更して繰り返す回数が変わっても、while文の条件を変更しなくても良い様にする為には、反復条件を

「i」がデータ数より小さい間繰り返す

の様にします。
具体的には、

i < x1.length

になります。
尚色の指定については、直線1本1本について指定する事にします。

do while文

反復を指定するもう1つの繰り返し文に、「do while文」が有ります。

初期設定
do{
  繰り返す処理
  最初期化
}while(式);

for文

for文は、反復に必要な初期化、繰り返し条件、最初期化を1つの文にまとめて書ける構文です。

for(初期化;条件式;最初期化){
        繰り返す処理
}

処理の順番としては、始めに「初期化」を1回だけ実行します。
次に「条件式」を評価します。
結果が「真」で有れば、「|」と「|」で囲まれた中の繰り返し処理を行い、最後に最初期化を実行します。
後は条件式の評価から繰り返し、「偽」になったら「|」と「|」内の処理をスキップして、次の文の実行に移ります。

例: int i;
int n;
for(i = 0, n = 0, i < 3;i++){
     n = n+10;
}
初期化や最初期化が2つ以上の時 コンマ「,」で区切って書く
条件式が2つ以上の時 論理的「AND」や論理的「OR」でつないで書く
ソース ダウンロード
HouseLoop1.java House04.zip
HouseLoop1do.java
HouseLoop2.java
HouseLoop2D.java

選択と反復の組み合わせ

反復の中の選択 反復構造の処理の中にif文やswitch文を書くと、選択処理を繰り返せる
選択の中の反復 選択構造の処理の中にwhile文やfor文を書くと、選択されたブロックの中で反復

現在設定されている色を調べる

画面に表示する文字や線の色が何色かを調べるには、以下の様に書きます。

public void paint(Graphics g){
        Color オブジェクト名 = g.getColor();
        :
}

「getColor」は現在設定されているColorクラスの情報を得るメソッドです。
「getColor」の前の「g」はGraphicsクラスのオブジェクトと言う意味で、「getColor」がGraphicsクラスに所属するメソッドだと言う事が解ります。
得られたColorクラスの情報をオブジェクトに代入しておく事で、後で利用出来ます。

2つの色情報が同じかどうかを調べる

2つの色情報が同じかどうかを調べるには、以下の様に書きます。

Color c1, c2;
c1, c2にColorクラスの情報を代入
if(c1.equals(c2)){
        //等しい時の処理
}
else{
        //等しくない時の処理
}

「equals」はColorクラスのメソッドです。
此のメソッドは「c1」に設定されている色を基準にして「c2」に設定されている色と等しければ「true」、等しくなければ「false」が得られます。
此をif文の条件にすると、等しい時と等しくない時の処理を分けられます。

演算子「!」

メソッド「equals」は等しい時に「true」となります。
しかし此処では、等しくない時に色を設定する処理をする為、if文の条件式を反転し、等しくない時に「true」となる様なプログラムにしなければなりません。
此の様な条件を反転する処理は、演算子「!」を使う事で行えます。

例: if(!c1.equals(c2)){
i     //等しくない時の処理
}

二重ループ

反復処理の中にもう1つ反復処理を書く構造を二重ループと言います。
内側のループは、すっぽりと外側のループの内側に入っていなければなりません。

座標値

アプリケーションやアプレットでは、文字や図形を描く場合に座標値の指定をします。
今回のプログラムの様に同じ絵を2回描く場合、座標値が其の侭では、同じ位置を2回なぞっているだけで2つの絵になりません。
指定する座標値にも工夫が必要です。
此のプログラムでは、2つ目の家の絵を横に並べて右側に配置します。
其の為、1回目と2回目では「x座標」だけを変更します。
又、家の絵を何回描いたかを記憶するint型の変数「j」を使った場合、1回目が「j = 0」、2回目が「j = 1」になります。
1回目に描く図形の「x座標」を「20」にし、2回目に描く図形を「170」にしたい場合の此の点の「x座標」は、

20+j*150

の様に表せます。
1回目は「j = 0」ですから「x座標」は「20」、2回目は「j = 1」ですから、「x座標」は「170」になります。

ソース ダウンロード
HouseLoop3.java House05.zip
HouseLoop4.java

戻る