Report#4


学籍番号:055704J
氏 名 :伊志嶺拓人


■プログラム

public class repo4 {
   public static void main(String args[]){

       int n = 5;   int tensu[] = { 76, 80, 60, 90, 85};
       int i,k,r;       int max =tensu[0];
       float gokei=0;

       for(i = 0,r = 1  ; i < n; i++,r++){
          for(k = i+1 ; k < n ; k++){
              if( a________ ){
                 int x = tensu[i];
                 tensu[i] = tensu[k];
                 tensu[k] = x;
              }
          }
          System.out.println("ranking["+r+"]="+tensu[i]+"")
          gokei += tensu[i];
          if(  b_________  ){
              max = tensu[i];
          }
       }
       System.out.println("平均点="+ c_________ +"");
       System.out.println("最高点="+max+"");
   }
}

■問題

・上のプログラムは5人のテストの点数を高い順に出力し、その平均と最高点を 出力するプログラムである。

問1、空欄a〜cに入る適切な式を書け。
問2、出力結果を書け。
問3、最高得点をmax以外で出力する空欄に入る式を書け。System.out.println("最高点="+________+"")

■解答

問1

a : tensu[i] < tensu[k]

・空欄aにはif文の条件式が入る。
・この条件式を満たした場合tensu[i]とtensu[k]の数字を入れ替えている事が分かる。
・入れ替えを行うのは点数の高い順に並べる為である。
・tensu[i]の値よりtensu[k]の値が大きい場合入れかが必要なる。
・よって空欄aに入る条件式は tensu[i] < tensu[k] である。

b : max < tensu[i]

・空欄bにもif文の条件式が入ります。
・この条件式を満たした場合maxにtensu[i]を代入しています。
・max には最初tensu[0]の値が入っている。
・maxには最終的に一番高い得点が入るので条件式にはtensu[i]がtensu[0]より大きいか比べる式が入る。
・よって空欄bに入る条件式は max < tensu[i] である。

c : gokei/n

・空欄cには全ての点数の平均点を入れる。
・ここでgokei += tensu[i]に注目する。これはgokeiにtensu[0~4]を足していく式である。
・つまりgokeiには最終的に全ての点数の総和が代入されている。

問2

・出力結果を考えるにはSystem.out.printlnを考えれば良い。
・最初のSystem.out.printlnはfor文の中にある。
・出力する内容はranking["+r+"]="+tensu[i]+"とある。 ・この内容がfor文により5回繰り返される。
・rは最初1で+1されていき5回目には5になる。
・tensu[i]はif文の式により大きい値の順に出てくる。
・よって次のように出力されると予想出来る。
 ranking[1]=90
 ranking[2]=85
 ranking[3]=80
 ranking[4]=76
 ranking[5]=60
・次のSystem.out.printlnは("平均点="+ gokei/n +"")という内容である。
・これは平均点=まではそのまま出力し"+ gokei/n +"の部分は式を計算した値を出力する。
・gokeiには全ての点数の総和nには5が代入されているので、計算すると78.2になる。
・よって次のように出力される。
 平均点=78.2
・最後はSystem.out.println("最高点="+max+"");である。
・これは最高点=まではそのまま出力し、"+max+"はmaxの値を出力する。 ・よって次のように出力される。
 最高点=90
・この結果をまとめると出力結果はこのようになる。
ranking[1]=90
ranking[2]=85
ranking[3]=80
ranking[4]=76
ranking[5]=60
平均点=78.2
最高点=90

問3

・この空欄にはmax以外で最高得点の代入されている式を入れれば良い。
・max以外で最高得点が代入されているのは、tensu[0]である。
・そもそもtensu[0]には最高得点がくるのはあたりまえなので、わざわざmaxとか作る必要もなかった…
・よって tensu[0] が空欄に入る。

■考察

・for文二つとif文が絡み合ってて分かりにくい所を説明します。
    
 for(i=0,r=1; i < n; i++,r++){
           for(k = i+1;k < n ;k++){
               if(tensu[i] < tensu[k]){
                  int x = tensu[i];
                  tensu[i] = tensu[k];
                  tensu[k] = x;
               }
           }
           System.out.println("ranking["+r+"]="+tensu[i]+"");
           gokei += tensu[i];
 
・まずは下の部分ですが、ここではtensu[i]の値とそれ以降の値を比べていき、
・tensu[i]より大きい値なら入れ替えるという作業を繰り返しています。
    
for(k = i+1;k < n ;k++){
    if(tensu[i] < tensu[k]){
       int x = tensu[i];   
       tensu[i] = tensu[k];    
       tensu[k] = x;
    }
}
・この作業をfor(i=0,r=1; i < n; i++,r++)を使いtensu[0]からtensu[4]まで繰り返しています。
・次に下の部分で最終的に残ったtensu[i]を出力して、gokeiに足します。
    
  System.out.println("ranking["+r+"]="+tensu[i]+"");
  gokei += tensu[i];             
・具体的な流れを説明します。
i=0,r=1
   76,80,60,90,85 
         |
         |76と80を入れ替え
         |
  80,76,60,90,85
         |
         |60は80より小さいので無視して、80と90を入れ替え
         |
   90,76,60,80,85
ranking[1]=90を出力
gokeiに90足す。gokei==90
i++,r++

___________________________
i=1,r=2
   90,76,60,80,85
         |
         |60は76より小さいので無視して、76と80を入れ替え
         |
   90,80.60,76,85
         |
         |80と85を入れ替え
         |
   90,85,60,76,80
ranking[2]=85を出力
gokeiに85足す。gokei==175
i++,r++

___________________________
i=2,r=3
   90,85,60,76,80
         |
         |60と76を入れ替え
         |
   90,85,76,60,80
         |
         |76と80を入れ替え
         |
   90,85,80,60,76
ranking[3]=80を出力
gokeiに80足す。gokei==255
i++,r++

___________________________
i=3,r=4
   90,85,80,60,76
         |
         |60と76を入れ替え
         |
   90,85,80,76,60
ranking[4]=76を出力
gokeiに76足す。gokei==331
i++,r++  

___________________________
i=4,r=5
ranking[5]=60を出力
gokeiに60足す。gokei==391
gokei/n==391/5で平均出力
平均点=78.2
最高点=90を出力
・てな感じです。疲れた〜orz

■C言語のソースコード

 #include 
  void main(void){
     int n=5;
     int tensu[ ] = { 75, 80, 60, 90, 85};
     int i,k,r,x; 
     float gokei = 0;

     for(i=0,r=1; i < n; i++,r++){
         for(k = i+1; k < n; k++){
            if(tensu[i] < tensu[k]){
               x = tensu[i];
               tensu[i] = tensu[k];
               tensu[k] = x;
            }
         }
          printf("ranking[%d]=%d\n", r, tensu[i]);
          gokei += tensu[i];
           if( max < tensu[i]){
               max = tensu[i];
           }
     }
      printf("平均点=%7.2f\n", gokei/n);
      printf("最高点=%d\n", max);
  }

■反省・感想

・なんとか難しい問題を作ろうと思いましたが、超簡単問題が出来てしまいました。
・一応頑張ったんでお許しください。
・久しぶりのc言語に戸惑った2週間でした。次も頑張ります。

・参考文献・URL
:独習Java 第3版