最大値 合計 カウンタ(5章の復習)

【課題】 コマンドラインに指定した2つの数値の大きいほうを表示しましょう。

5.1 コマンド・ライン の Compute1.java をもとに Compare1.java を作成しました。

整数に変換し、比較し、表示をしている部分は以下のとおりです。

     int arg1 = Integer.parseInt(args[0]);
     int arg2 = Integer.parseInt(args[1]);

     if(arg1 > arg2) pane.add(new JLabel("" + arg1));
     else            pane.add(new JLabel("" + arg2));
     

改良1

大きいほうを選択してから、ラベルを生成しましょう。  Compare2.java
     int arg1 = Integer.parseInt(args[0]);
     int arg2 = Integer.parseInt(args[1]);

     int max;
     if(arg1 > arg2) max = arg1;
     else            max = arg2;
     pane.add(new JLabel(String.valueOf(max)));
     

改良2

3つの数のうちの最大のものを表示しましょう。  Compare3.java

比較をする部分を次のように書いてはいけません。

     int max;
     if(arg1 > arg2) {
         if(arg1 > arg3) max = arg1;
         else            max = arg3;
     } else {
         if(arg2 > arg3) max = arg2;
         else            max = arg3;
     }
     pane.add(new JLabel(String.valueOf(max)));
     

通常、次のように書きます。

     int max = arg1;
     if(arg2 > max) max = arg2;
     if(arg3 > max) max = arg3;
     pane.add(new JLabel(String.valueOf(max)));
     

arg1 が最大と仮定し、 arg2 の方が大きければ修正し、さらに arg3 の方が大きければ再度修正する。 という手順です。

最大値

4つのときは ...、
arg1、arg2、arg3 ... という変数名も煩わしくなります。次のように書けます。
int max = Integer.parseInt(args[0]);
int arg;
arg = Integer.parseInt(args[1]);
if(max < arg) max = arg;
arg = Integer.parseInt(args[2]);
if(max < arg) max = arg;
arg = Integer.parseInt(args[3]);
if(max < arg) max = arg;
...
まず、最大値を保存する max を用意し、最初のパラメタの値を max に代入します。 2番目のパラメタを arg に(一時的に)代入しておき、 max より大きい場合にだけ、 max に代入します。
「 パラメタを arg におき、max と比べて大きい場合に max を入れ替えてゆく 」 ということを繰り返せば、最後には最大値が max に得られるという方法です。

for 文で書けば次のようになります。

int max = Integer.parseInt(args[0]);
int arg;
for(int i = 1;  i < args.length;  i ++) {
arg = Integer.parseInt(args[i]);
if(max < arg) max = arg;
}

先頭のパラメタを特別扱いにしたくなければ、max の初期値に Integer の最小値をいれておけば うまくいきます。

int max = Integer.MIN_VALUE;
int arg;
for(int i = 0; i < args.length; i++) {
arg = Integer.parseInt(args[i]);
if(max < arg) max = arg;
}

合計

コマンドラインに与えた数値の合計を求めるのに、
int s = 0;
s = s + Integer.parseInt(args[0]);
s = s + Integer.parseInt(args[1]);
s = s + Integer.parseInt(args{2]);
...
といったコーディングを行います。あるいは Java らしく、
int s = 0;
s += Integer.parseInt(args[0]);
s += Integer.parseInt(args[1]);
s += Integer.parseInt(args{2]);
...
としても同じです。 同じ s という変数に次々に新しい値を足しこんでいくという 基本的なコーディングのパターンです。

for 文が書けるようになれば、次のように書けます。

int s = 0;
for(int i=0; i<args.length; i++) s = s + Integer.parseInt(args[i]);
あるいは、
int s = 0;
for(int i=0; i<args.length; i++) s += Integer.parseInt(args[i]);

1から10までの合計を計算したければ、次のように書きます。

int s = 0;
for(int i=1; i<=10; i++) s += i;

カウンタ

ボタンのクリックされた回数など、回数を数えるには次のように書きます。
int n;     // カウンタの宣言
...
n = 0;     // カウンタの初期化
...
n = n + 1;     // カウンタのカウントアップ
...
カウントアップは次のようにも書けます。
n += 1;
さらに、
n++;
または、
++n;
といった書き方をするのが普通です。

n が最初に現れるところで、型宣言( int ) と 初期化( = 0 ) を忘れないようにしましょう。
int n = 0;
のように型宣言と初期化を1行で書くのが普通です。

ここで、++ を変数の前に書いた場合と、後ろに書いた場合の違いを比較してみましょう。 つぎのコーディングで、DOS画面に何が表示されるか考えてください。
int x = 5;
int y = 5;
System.out.println( ++x );
System.out.println( ++x );
System.out.println( x );
System.out.println( y++ );
System.out.println( y++ );
System.out.println( y );

実際にやってみましょう。 PrefixPostfix1.java

for 文の演習

コマンドラインに数値を1つ与えます。 この数値を N としたとき、 1 + 2 + 3 + ... + N を表示するプログラムを作成しなさい。

Top Page
更新日: