Report4


課題
制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(な るべく短い行数で)を作成し、模範解答例を示せ。併せて、同様な動作を行うC 言語のソースコードを示せ。

制御文と配列を用いたJavaアプリケーション
プログラム
public class Repo4test01 {

    public static void main(String[] args) {
       int dt[] = {50,20,40,10,30};
       int i,j,x;
       System.out.println("A");
    
       for(i = 0; i <= 4; i++){
           j = 4;
           System.out.println("B" + " i=" + i + " j=" + j);
    
           while(j > i){
                 if(dt[j-1] >= dt[j]){
                     x       = dt[j];
                     dt[j]   = dt[j-1];
                     dt[j-1] = x;
                     System.out.println("C dt" + (j) + " " +dt[j] + " と" +
                             "dt" + (j-1) + " " + dt[j-1] + "を交換");
                 }
                 System.out.println("D" + " i=" + i + " j=" + j);
                 j--;
           }
           System.out.println("E");
    
        }
        for(i=0;i<5;i++)
        System.out.print(dt[i] + " ");
    }
}
    
結果
A
B i=0 j=4
D i=0 j=4
C dt3 40 とdt2 10を交換
D i=0 j=3
C dt2 20 とdt1 10を交換
D i=0 j=2
C dt1 50 とdt0 10を交換
D i=0 j=1
E
B i=1 j=4
C dt4 40 とdt3 30を交換
D i=1 j=4
D i=1 j=3
C dt2 50 とdt1 20を交換
D i=1 j=2
E
B i=2 j=4
D i=2 j=4
C dt3 50 とdt2 30を交換
D i=2 j=3
E
B i=3 j=4
C dt4 50 とdt3 40を交換
D i=3 j=4
E
B i=4 j=4
E
10 20 30 40 50 
    
制御文と配列を用いたC言語
プログラム
#include 

main(void)
{
  int dt[] = {50,20,40,10,30};
  int i,j,x;
  printf("A\n");

  for(i=0;i<=4;i++){
    j=4;
    printf("B i=%d j=%d\n",i,j);

    while(j>i){
      if(dt[j-1] >= dt[j]){
        x         = dt[j];
        dt[j]     = dt[j-1];
        dt[j-1]   = x;
        printf("C dt[%d] %d と dt[%d] %d を交換\n",j,dt[j],j-1,dt[j-1]);
      }

      printf("D i=%d j=%d\n",i,j);
      j--;
     
    }
    printf("E\n");
  }

  for(i=0;i<5;i++)
    printf("%d ",dt[i]);
  printf("\n");
}
    
結果
A
B i=0 j=4
D i=0 j=4
C dt[3] 40 と dt[2] 10 を交換
D i=0 j=3
C dt[2] 20 と dt[1] 10 を交換
D i=0 j=2
C dt[1] 50 と dt[0] 10 を交換
D i=0 j=1
E
B i=1 j=4
C dt[4] 40 と dt[3] 30 を交換
D i=1 j=4
D i=1 j=3
C dt[2] 50 と dt[1] 20 を交換
D i=1 j=2
E
B i=2 j=4
D i=2 j=4
C dt[3] 50 と dt[2] 30 を交換
D i=2 j=3
E
B i=3 j=4
C dt[4] 50 と dt[3] 40 を交換
D i=3 j=4
E
B i=4 j=4
E
10 20 30 40 50 
    
考察
今回の課題は配列と制御文を使って、プログラムを組めというものだった。
何をやろうかと考えていたら、基本情報技術者試験の問題集のバブルソートが目 に入ったので、挑戦してみた。
初級問題と書いてあったのでソートする数を少なくし、始めから決められた値を ソートさせた。
まず、配列を五つ用意して値を代入しておく。for文で変数iの値を変化させてい く。変数iの役目はソートさせる値のうち、最小の値が格納される位置を示して いる。ループする期間は配列dtの最後の要素の一個前までである。
変数jに4を入れているのは、バブルソートが配列dtの最後から変数iの位置まで 隣同士を比較しながら交換する為。(変数jには配列dtの最後の添字が入る)
while文で変数jとiを比較し、jが大きい間ループする。
if文で配列dt[j]と配列dt[j]の一個前の要素、dt[j-1]の値を比較して、dt[j]の 方が大きければdt[j-1]と値を交換する。
変数jの値から1減じて、whlie文へ戻る。
最後に並べ替えた配列の結果を見る為にfor文で配列の添字となる変数iを1づつ 増加させていきながら、配列dt[i]の値を出力している。
これと同じ動作をするC言語でのプログラムは、Javaアプリケーションをほとん ど変えること無く出来た。
出力結果に出ているA,Bなどはこのプログラムがどのように動作するのかを調べ る為に付け加えてみた。

感想・反省
条件文はfor文とwhile文の二つしか使わなかった。今思えば、配列の中に負の値 が入っていたらbreak文を使ってループを抜け出すというソースを追加してお いてもよかったと思う。
Javaアプリケーションを作成する段階で、for文のブロックの中にインクリメン トを書いてしまって、うまく動作しないという間違いをやってしまった。これ からはこのようなミスで悩まないようにしたい。

参考
独学Java第二版
ジョセフ・オニール著
C実践プログラミング第三版
Steve Oualline著
望月康司   監訳
谷口功   訳
浅煎り珈琲Javaアプリケーション入門