学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その14 グラフを表示するプログラム

<<前  [TOP]  次>>


メモ帳を開いて次のプログラムを作ってみましょう。


Graph.java 直

public class Graph {

	public static void main( String[] argv ) {

		int[] a = { 10, 25, 4, 52, 30, 16, 42, 22, 36, 8, 19, 100 };
		String[] s = { "1:", "2:", "3:", "4:", "5:", "6:", "7:", "8:", "9:", "10:", "11:", 										"12:" };

		System.out.println( "  " + '\t' + "---------+---------+---------+---------+---------+---------+" );

		draw( s, a );

		System.out.println( "  "  +  '\t' + "---------+---------+---------+---------+---------+---------+" );
	}

	public static void draw( String[] names, int[] data ) {

		int[] newdata = scaling( data );
		for( int i=0; i<data.length; i++ ){
		drawLine( names[i], data[i], newdata[i] );
		}
	}

	private static void drawLine( String name, int value, int count ) {

		System.out.print( name + '\t' );
		for( int i=0; i<count; i++ ) {
			System.out.print( "*" );
		}
		System.out.println( "(" + value + ")" );

	}

	


	private static int[] scaling( int[] data ) {

		double max = (double)max( data );
		
		int[] newdata = new int[ data.length ];
		double[] newdata2 = new double[data.length];


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


			newdata2[i] = (double)data[i]*(60/max);
			newdata[i] = (int)newdata2[i];

		}

		return newdata;
	}

	private static int max( int[] data ) {

		int max = data[0];
		for( int i=1; i<data.length; i++ ) {
			if( data[i] > max )
				max = data[i];

		}
		return max;
        }
}



グラフを表示するプログラムです。
では内容を見ていきましょう。


まず、整数型の配列 int a と、String型の文字列 Srting s がmainメソッドに与えられています。


グラフの目盛をプリントするときに '\t'というのを使っています。
これは、キーボードのTabキーを入力したのと同じ役割をします。
使うときは必ず、シングルコート(’’)で囲んでください。


その他にも、'\n'がよく使われます。
これは、改行すると言う意味で使われます。


drawメソッドで、int newdata = scaling( data )のようにしてscalingメソッドを呼び出し、その戻り値を int newdata に代入しています。


このscalingは後で解説します。

double max = (double)max( data );



これは、maxメソッドに引数として配列dataを渡し、戻り値をdouble型にキャストしてdouble maxに代入しています。

int[] newdata = new int[ data.length ];
double[] newdata2 = new double[data.length];



これは、配列の入れ物だけを用意する方法です。
new演算子を使用し、配列のメモリを確保します。
右辺=new 型名[配列の大きさ数]のように使います。
これによって、まだデータの入っていない箱だけを作成することができます。

newdata2[i] = (double)data[i]*(60/max);



今回は、*の数60個を最大の100とおいて表示するようにしています。
計算式で使われている60はその意味です。
最大の*の数を変えたければ、この数を変えると良いでしょう。

newdata[i] = (int)newdata2[i];



忠実に表示できるように計算でdouble型を使い、int型にキャストして格納しています。


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


Graph2.java 直

public class Graph2 {

	public static void main( String[] argv ) {

		int[] a = { 120, 600, 60, 10, 100  };
		String[] s = { "A:", "B:", "C:", "D:", "E:" };

		draw( s, a );
	}
	public static void draw( String[] names, int[] data ) {

		int[] newdata = scaling( data );
		for( int i=0; i<data.length; i++ ){
		drawLine( names[i], data[i], newdata[i] );
		}
	}
	private static void drawLine( String name, int value, int count ) {

		System.out.print( name + '\t' );
		for( int i=0; i<count; i++ ) {
			System.out.print( "*" );
		}
		System.out.println( "(" + value + ")" );
	}
	private static int[] scaling( int[] data ) {

		int[] newdata = new int[ data.length ];
		int limit = 10;	//グラフの最大の長さ
		int max = max( data );
		for( int i=0; i<data.length; i++ ) {
			float x = (float)data[i];
			float y = x*limit/max;
			newdata[i] = (int)y;
		}
		return newdata;
	}


	private static int max( int[] data ) {

		int max = data[0];
		for( int i=1; i<data.length; i++ ) {
			if( data[i] > max )
				max = data[i];

		}
		return max;
	}
}



先ほどのプログラムをもっと簡単に書いてみました。
違うのは次の部分です。

private static int[] scaling( int[] data ) {

    int[] newdata = new int[ data.length ];
    int limit = 10; //グラフの最大の長さ
    int max = max( data );
    for( int i=0; i<data.length; i++ ) {
        float x = (float)data[i];
        float y = x*limit/max;
        newdata[i] = (int)y;
    }
    return newdata;
}



ここでは、limitという変数を作りそこにグラフの最大の長さを入れています。
計算にはfloatを使っています。


「//グラフの最大の長さ」という文があります。
これは、コメント文といいます。
ダブルスラッシュ(//)がある後ろの文一行を飛ばして処理を行うようになっています。
このように、プログラムに自分で解りやすいコメントを入れておけば、あとでプログラムを見直るときに便利です。
また、他の人がプログラムを見るときにも解りやすくなります。


そのほかのコメント文

/**
 * 文章
* 文章
*/

このようにしても、文章を飛ばせますし、

/** 文章 */

このようにしても文章を飛ばせます。


出力結果を見てみましょう。





<<前  [TOP]  次>>