コンピュータ基礎II 通信授業課題2C 参考ページ



4. 繰り返し、条件分岐

○サンプル2

サンプル2では繰り返しにfor文とwhile文、条件分岐にif文を使用してグラフィックを描画しています。

GSample02.java

**********************************************************************

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

public class GSample02 extends JFrame {

    public GSample02() {

        setSize( 800, 600 );
        setTitle( "プログラムで絵を描こう" );

        addWindowListener( new WindowAdapter(){

            public void windowClosing( WindowEvent e ) {
                System.exit( 0 );
            }

        });

        GraphicJPanel jp = new GraphicJPanel();
        Container cp = getContentPane();
        cp.add( jp );
        setVisible( true );

    }

    public static void main( String[] args ) {

        JFrame w = new GSample02();

    }

    public class GraphicJPanel extends JPanel{

        public GraphicJPanel() {

            setBackground( Color.white );

        }

        public void paintComponent( Graphics g ) {



            int i = 0;
            g.setColor( new Color( 0xFF6600 ) );
            while(  i < 10 ) {
                g.drawOval( 100 + i * 60, 150, 30, 30 );
                i++;
            }

            for( i = 0; i < 10; i++ ) {
            
                if( i % 2 == 0 ) {
                    g.setColor( new Color( 0x33cc00 ) );
                } else {
                    g.setColor( new Color( 0x0033ff ) );
                }
                
                g.drawLine( 100, 275 + i * 10, 700, 275 + i * 10 );
            }

        }

    }

}

**********************************************************************

GSample02.javaをコンパイルし、実行すると以下のような描画が行われます。

GSample02



繰り返しの内、for文を使用した構文は次のようになります。

for( 初期値; 条件; 増分 ){
実行する処理;
}


サンプル2では変数iの値を0〜10まで変化させ、iを10倍した値を線のy座標に与え、平行な線を10本描いています。

繰り返しの内、while文を使用した構文は次のようになります。

while( 条件 ){
実行する処理;
}


条件が成立する場合にずっとループしています。

サンプル2ではfor文と同じ処理をwhile文で記述し、円のx座標を平行に変化させています。

サンプル2ではどちらも繰り返しの回数が決まっていますが、繰り返しの数が決まっている場合にはfor文を、そうではなく、ある変数なりの状況に応じてループさせたい場合はwhile文を使用するのが普通です。

条件分岐の内、if文の構文は次のようになります。

if( 条件 ){
条件に一致した場合に実行する処理;
}else{
条件に一致しなかった場合に実行する処理;
}


サンプル2では繰り返しに使用している変数iの値が偶数(iを2で割った余りが0)の時は緑、奇数(iを2で割った余りが1)の時は青を描画色に設定しています。

条件を複数指定して分岐させたい時は、if〜else ifという書き方ができます。構文は次のようになります。

if( 条件1 ){
条件1に一致した場合に実行する処理;
}else if( 条件2 ){
条件1に一致しなかった場合、条件2に一致したら実行する処理;
}


上記のあとにelseを続けて書くこともできますし、条件はいくつでも分岐させることができます。

○サンプル3

課題制作の際には求めたい図形の描画がどのように繰り返しと条件分岐で表現できるかを考えてみましょう。サンプル3は直線にそって円を描くようなプログラムです。
2点、( x1, y1 )、( x2, y2 ) を通る直線の方程式は、

y - y1 = ( y2 - y1 ) / ( x2 - x1 ) * ( x - x1 )

で表現できます。
for文で、直線上にある間隔で点を取るように値を設定し、drawOvalで描く円の点の値を、直線の方程式に沿って導けば(=直線上に点を取るようにすれば)、直線に添って円を描くことができます。円を描く際に多少注意が必要なのは、drawOvalメソッドには、円の左上の点の座標を渡します。計算で円の中心の座標を求めたとしたら、実際の円の描画の際には半径の1/2だけx、yともマイナスした値をdrawOvalメソッドに渡してあげる必要があります。

GSample03.java

**********************************************************************

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

public class GSample03 extends JFrame {

    public GSample03() {

        setSize( 800, 600 );
        setTitle( "プログラムで絵を描こう" );

        addWindowListener( new WindowAdapter(){

            public void windowClosing( WindowEvent e ) {
                System.exit( 0 );
            }

        });

        GraphicJPanel jp = new GraphicJPanel();
        Container cp = getContentPane();
        cp.add( jp );
        setVisible( true );

    }

    public static void main( String[] args ) {

        JFrame w = new GSample03();

    }

    public class GraphicJPanel extends JPanel{

        public GraphicJPanel() {

            setBackground( Color.white );

        }

        public void paintComponent( Graphics g ) {



            double y_point;
            double x_point;

            double x1_point = 100;
            double x2_point = 700;
            double y1_point = 100;
            double y2_point = 500;

            int count = 0;

            g.drawLine( ( int )x1_point, ( int )y1_point, 
                        ( int )x2_point, ( int )y2_point );

            for( x_point = 100; x_point <= 700; x_point += 20 ) {
                y_point = ( ( ( y2_point - y1_point ) / ( x2_point - x1_point ) ) 
                            * ( x_point - x1_point ) ) + y1_point;

                if( count % 2 == 1 ) {
                    g.setColor( new Color( 0x009933 ) );
                } else {
                    g.setColor( new Color( 0xff0033 ) );
                }
                g.drawOval( ( int )x_point - 15, ( int ) y_point - 15, 30, 30 );
                count++;
            }
            

        }

    }

}


**********************************************************************

GSample03.javaをコンパイルし、実行すると以下のような描画が行われます。

GSample03



○サンプル4

for文は配列に要素を代入したり、配列の要素を表示させたりするのに使用することも多いです。

サンプル4は直線の始まりと終わりのx座標を2つの配列に保存しておき、50本の直線を描きます。各50個の配列に値を代入しますが、その際、値を乱数を用いてランダムに0〜599の任意の整数になるようにしています(Math.random()というメソッドが0.0以上1.0より小さい少数(double値)を返し、それに求めたい整数の数の値を掛けると任意の整数値が取得できます)。プログラムを実行すると、ウィンドウのサイズなどを変更する際に再描画が行われますので、その度に直線の座標も再計算され位置が変わって表示されます。

GSample04.java

**********************************************************************

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

public class GSample04 extends JFrame {

    public GSample04() {

        setSize( 800, 600 );
        setTitle( "プログラムで絵を描こう" );

        addWindowListener( new WindowAdapter(){

            public void windowClosing( WindowEvent e ) {
                System.exit( 0 );
            }

        });

        GraphicJPanel jp = new GraphicJPanel();
        Container cp = getContentPane();
        cp.add( jp );
        setVisible( true );

    }

    public static void main( String[] args ) {

        JFrame w = new GSample04();

    }

    public class GraphicJPanel extends JPanel{

        public GraphicJPanel() {

            setBackground( Color.white );

        }

        public void paintComponent( Graphics g ) {



            int offsetx = 100;

            int[] xarray1 = new int[ 50 ];
            int[] xarray2 = new int[ 50 ];

            for( int i = 0; i <  xarray1.length; i++ ) {

                xarray1[ i ] = ( int )( Math.random() * 600.0 );
                xarray2[ i ] = ( int )( Math.random() * 600.0 );
           
                if( i % 2 == 0 ) {
                    g.setColor( new Color( 0x66ff33 ) );
                    g.drawLine( xarray1[ i ] + offsetx, 80,
                                     xarray2[ i ] + offsetx, 500 );
                } else {
                    g.setColor( new Color( 0xff9933 ) );
                    g.drawLine( xarray1[ i ] + offsetx, 80, 
                                     xarray2[ i ] + offsetx, 500 );
                }    
                              
            }

        }
        
    }

}

**********************************************************************

GSample04.javaをコンパイルし、実行すると以下のような描画が行われます。

GSample04