ソート

久々にちゃんと考えながら授業を受けている人でも少し時間がかかると思われる問題が出ました。
さすがはI講師、あの人の授業はちゃんと聞いていれば安心して授業を受けれますし、こちらとしても安心して補助できます。
まぁ聞いてればの話ですが…
というか数年ぶりにCHARACTER型とか、複数のデータのソーティングが問題に入った気がする。
でも別に彼らが今までと比べて特別優秀だから次に進めるっていうわけでもないので、ある意味賭けかもしれないw
というかね、寝てる人が多くて、最悪なのは涎が机に溜まってた人がいる…

問題:
最大50人までの名前、身長、体重をリダイレクトで読み込み、身長をキーにして並べ替えを行うプログラムをつくりなさい。

とりあえず私の書いたクソなサンプルで我慢して・・・

サンプルコード

C------------------------------------------------------------------------------
C sort.for | ソート
C------------------------------------------------------------------------------]
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-E
      IMPLICIT NONE
      
      CHARACTER*10   DTN(50), TMPC
      INTEGER        I, J, K, N, NMAX
      REAL           DTH(50), DTW(50), TMPH, TMPW
      
C  *  データの入力  *
      N = 0
      
      DO I = 1, 50
      
          READ(5,200,END = 10) DTN(I), DTH(I), DTW(I)
          N = N + 1
          
      END DO
      
   10 CONTINUE
      
C  *  データの出力  *
      WRITE(*,*) '---------------------------------------'
      WRITE(*,*) '      名 前       身長    体重'
      WRITE(*,*) '---------------------------------------'
      
      DO I = 1, N
      
          WRITE(6,300) DTN(I), DTH(I), DTW(I)
          
      END DO
      
      WRITE(6,*) '---------------------------------------'
      WRITE(6,*) 
      
      WRITE(6,*) '身長をキーにして並べ替えします。'
      
C  *  並び替え  *
      DO J = 1, N - 1
          
          NMAX = J
          DO K = J + 1, N
              
              IF(DTH(K) .LT. DTH(NMAX)) NMAX = K
              
          END DO
          
C      *  名前の並べ替え  *
          TMPC      = DTN(NMAX)
          DTN(NMAX) = DTN(J)
          DTN(J)    = TMPC
          
C      *  身長の並べ替え  *
          TMPH      = DTH(NMAX)
          DTH(NMAX) = DTH(J)
          DTH(J)    = TMPH
          
C      *  体重の並べ替え  *
          TMPW      = DTW(NMAX)
          DTW(NMAX) = DTW(J)
          DTW(J)    = TMPW
          
      END DO
      
C  *  並び替え後のデータの出力  *
      WRITE(*,*) '---------------------------------------'
      WRITE(*,*) '      名 前       身長    体重'
      WRITE(*,*) '---------------------------------------'
      
      DO I = 1, N
          
          WRITE(6,300) DTN(I), DTH(I), DTW(I)
          
      END DO
      
      WRITE(6,*) '---------------------------------------'
      
C  *  FORMAT文  *
  200 FORMAT(A10, F10.1, F10.1)
  300 FORMAT(4X, A10, F8.1, F8.1)
      
      STOP
      END

以下は実行データのサンプル(data26.txtというファイルに格納)

AAAA AAA       172.5      70.5
BBBB BBB       153.0      62.0
CCCC CCC       160.5      75.5
DDDD DDD       170.5      80.5
EEEE EEE       168.5      66.5
FFFF FFF       165.0      58.0
GGGG GGG       173.0      60.5
HHHH HHH       145.5      48.5
IIII III       159.5      70.5
JJJJ JJJ       167.0      52.5
KKKK KKK       170.5      72.0
LLLL LLL       158.5      52.0
MMMM MMM       171.5      65.5
NNNN NNN       160.0      57.5
OOOO OOO       166.5      60.5
PPPP PPP       174.5      70.0
QQQQ QQQ       155.5      52.0
RRRR RRR       161.0      65.5
SSSS SSS       164.5      64.5
TTTT TTT       168.5      57.5
UUUU UUU       158.5      55.5
VVVV VVV       160.5      59.5
WWWW WWW       168.0      68.5
XXXX XXX       170.5      65.0
YYYY YYY       161.5      67.5
ZZZZ ZZZ       163.5      52.0

実行結果

---------------------------------------
      名 前       身長    体重
---------------------------------------
   AAAA AAA     172.5    70.5
   BBBB BBB     153.0    62.0
   CCCC CCC     160.5    75.5
   DDDD DDD     170.5    80.5
   EEEE EEE     168.5    66.5
   FFFF FFF     165.0    58.0
   GGGG GGG     173.0    60.5
   HHHH HHH     145.5    48.5
   IIII III     159.5    70.5
   JJJJ JJJ     167.0    52.5
   KKKK KKK     170.5    72.0
   LLLL LLL     158.5    52.0
   MMMM MMM     171.5    65.5
   NNNN NNN     160.0    57.5
   OOOO OOO     166.5    60.5
   PPPP PPP     174.5    70.0
   QQQQ QQQ     155.5    52.0
   RRRR RRR     161.0    65.5
   SSSS SSS     164.5    64.5
   TTTT TTT     168.5    57.5
   UUUU UUU     158.5    55.5
   VVVV VVV     160.5    59.5
   WWWW WWW     168.0    68.5
   XXXX XXX     170.5    65.0
   YYYY YYY     161.5    67.5
   ZZZZ ZZZ     163.5    52.0
---------------------------------------

身長をキーにして並べ替えします。
---------------------------------------
      名 前       身長    体重
---------------------------------------
   HHHH HHH     145.5    48.5
   BBBB BBB     153.0    62.0
   QQQQ QQQ     155.5    52.0
   LLLL LLL     158.5    52.0
   UUUU UUU     158.5    55.5
   IIII III     159.5    70.5
   NNNN NNN     160.0    57.5
   CCCC CCC     160.5    75.5
   VVVV VVV     160.5    59.5
   RRRR RRR     161.0    65.5
   YYYY YYY     161.5    67.5
   ZZZZ ZZZ     163.5    52.0
   SSSS SSS     164.5    64.5
   FFFF FFF     165.0    58.0
   OOOO OOO     166.5    60.5
   JJJJ JJJ     167.0    52.5
   WWWW WWW     168.0    68.5
   TTTT TTT     168.5    57.5
   EEEE EEE     168.5    66.5
   XXXX XXX     170.5    65.0
   KKKK KKK     170.5    72.0
   DDDD DDD     170.5    80.5
   MMMM MMM     171.5    65.5
   AAAA AAA     172.5    70.5
   GGGG GGG     173.0    60.5
   PPPP PPP     174.5    70.0
---------------------------------------

もし大きいほうから順に並べたければ46行目の

IF(DTH(K) .LT. DTH(NMAX)) NMAX = K

の".LT."を".GT."に変更すればいいし、体重をキーにするなら体重の比較をすればいいという。

ちなみに「午前中は同じ授業内容で2次元配列まで行けたのになぁ…午後は無理かぁ…」という先生のお言葉。
そりゃゆとり教育全盛時代の生徒たちですからね、まだまだ授業方針で悩める日が続く……。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中