プログラム作成問題

1から100までの総和

もちろん

x = 1 + 2 + 3 + 4 + .....  + 100;

でできますが、繰り返しを使えば短く書けます。

変数に1を加えるのは

x = x + 1;

でしたが、これにさらに 2 を加えて

x = x + 2;

とすれば x は 3 になっているはず。

これにさらに 3 を加えると

x = x + 3;

とすれば x は 6 になっているはず。つまり、

int x = 0;
x = x + 1;
x = x + 2;
x = x + 3;
System.out.println(x);

で、6 と表示されるということです。

1,2,3,...を i として

x = x + i;

という計算式を i を 1 から 100 まで 1,2,3,...と変化させながら繰り返せば良いはずです。

ファイル名 Souwa01.java

public class Souwa01 {
    public static void main( String[] args ) {
        int x = 0;
         ?????????
            x = x + i;
         ?
        System.out.println( x );
    }//mainの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Souwa01.java 
$ java Souwa01

1から100までの奇数の総和

奇数は 1,3,5,7,9,....97,99 です。

Souwa01.java で 1,2,3,4,...100 だったものを 1,3,5,7,9,....97,99 になるように、くりかえしの条件を変更すればOKです。

ファイル名 Souwa02.java

public class Souwa02 {
    public static void main( String[] args ) {
        int x = 0;
         ?????????
            x = x + i;
         ?
        System.out.println( x );
    }//mainの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Souwa02.java 
$ java Souwa02

1から100までの7で割って3余る数の総和

java で、i が 7で割ったら3余る数かどうか調べるには、

if ( (i % 7) == 3 )

とします。% が割り算の余りを求める演算です。

これを使っても出来ますが、となり同士の奇数の差が2であるように、となり同士の差が7であることを使えば Souwa02.java と同様に出来ます。

ファイル名 Souwa03.java

public class Souwa03 {
    public static void main( String[] args ) {
        int x = 0;
         ?????????
            x = x + i;
         ?
        System.out.println( x );
    }//mainの終わり
}//classの終わり

コンパイルと実行は次のようにします。

$ javac Souwa03.java 
$ java Souwa03

選択ソート

ファイル名 SentakuSort.java

2,5,3,1,4 の並べ替え

データをdata[0]からdata[4]に格納する

int[] data = { 2, 5, 3, 1, 4 }; 
data[0]data[1]data[2]data[3]data[4]
25314

並べ替え手順については、教科書の図を参照

(1) data[0]の確定まで

最初はdata[0]からdata[4]までを対象にする

data[0]と、data[1]からdata[4]まで、つまり 5,3,1,4 を一つずつ比較し、より小さいものと取り替える。

最後のdata[4]までいったら、data[0]には1が入っているが、これは一番小さいのでこれで確定。

(2) data[1]の確定まで

次にdata[1]からdata[4]までを対象にする

data[1]と、data[2]からdata[4]までを一つずつ比較し より小さいものと取り替える。

最後のdata[4]までいったら、data[1]には2が入っているが、これは二番目に小さいのでこれで確定。

(3) data[2]の確定まで

次にdata[2]からdata[4]までを対象にする

data[2]と、data[3]からdata[4]までを一つずつ比較し より小さいものと取り替える。

最後のdata[4]までいったら、data[2]には2が入っているが、これは二番目に小さいのでこれで確定。

・・・

このように、最初にdata[0]を確定させ、次にdata[1]を確定させ、次にdata[2]を確定させる。この 0,1,2,...を i で表すと、

for( int i=0; data.length-1 >i; i++ ){
    ????
}

となります。

最後が定番のdata.length>iでないのはdata[3]まできめればdata[4]は自動的に決まるからです。

次に、

data[0]を確定するときには、data[0]と、data[1]からdata[4]までを比較。

data[1]を確定するときには、data[1]と、data[2]からdata[4]までを比較。

これを j で表すと、

data[j]を確定するときには、data[j]と、data[j+1]から最後までを比較。

となります。

i の時には
for( int j=i+1; data.length>j; j++ ){
    if ( data[i]>data[j] ){
         //data[i]とdata[j]を交換する
     }
}

終わったら、結果を表示します。Koukan01.java の最後に書いてある方法でいいでしょう。

i=0〜3で、j=i〜4 の説明

次の表のように data[i] と data[j] を比較して交換しています。

data[0]data[1]data[2]data[3]data[4]
i=0253 14j=1〜4
j=1j=2j=3j=4
i=1153 24j=2〜4
j=2j=3j=4
i=21253 4j=3〜4
j=3j=4
i=312354j=4〜4
j=4

data.length は 5 になりますから、
data.length-1 > i で i は 3 まで
data.length > j で j は 4 までになります。