課題 [13] 構造体(4/8)

問 4(提出プログラム名:ex1304a.h)

まず,このプログラム(ex1304a.c)ヘッダ(ex1304a.h)をそれぞれダウンロードしなさい.
そして,ex1304a.h (.hの方であり,.c ではない)を編集して次の処理を行うプログラムとして仕上げなさい.
※ヘッダの中で構造体の宣言が
  #ifndef __STRUCT_CITY
  #define __STRUCT_CITY


  #endif
で囲まれているが,これについては問 6 で使用するための措置なのでひとまず気にしなくてよい

  
【目的の処理】
このプログラムでは 1 つの市の名前と人口を格納する CITY という構造体を定義している.
構造体 CITY のメンバは
  ■ name : その市の名前を格納する char 配列(内容の例:Matsuyama
  ■ population:その市の人口を格納する int 変数(内容の例:511192 ← 松山市の人口)
となっている.

main 関数では愛媛県内の COUNT 個の市COUNT はマクロとして定義してある)について,それぞれの市の名前と人口が書かれたデータファイルから内容を読み込み,CITY データの配列 cdata[] に格納している.
そして,関数 sort_p を呼び出し,その配列を人口の降順に(多い順に)並べ替えた後,データを画面に出力させようとしている.

関数 sort_p を完成させ,ex1304a.h のみを提出しなさい.
なお,ソーティングのアルゴリズムにはバブルソートを使用しなさい.

【ヒント】
最初にデータファイルから読み込んだ状態では
 cdata[0] が四国中央市のデータ
  (cdata[0].name"Shikokuchuo"cdata[0].population82754
 になっていて,
 cdata[1] が新居浜市のデータ
  (cdata[1].name"Niihama"cdata[1].population115938
 になっています.
 cdata[2] 以降も同様です.

バブルソートのアルゴリズムで降順に並べ替える場合,
例えば cdata[j]cdata[j+1] の間で人口の大小関係を比較することになりますが,
この場合は if ( cdata[j] < cdata[j+1] ) と書くことはできません
なぜなら cdata[j]cdata[j+1]構造体データであって直接数値を表しているわけではないからです.
それゆえ,人口を表す population に注目して
  if ( cdata[j].population < cdata[j+1].population )
といった比較が必要であることに注意してください.

なお,変数の入れ替えについては,CITY 型の変数(例えば tmp)を用意しておけば,
tmp = cdata[j]; だけで構造体データの内容をまとめてコピーできます.
つまり,通常の int 変数の場合の値の入れ替えと同じ書き方で大丈夫です.

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
    このデータファイル data1304a.txt をダウンロードして使ってください)
愛媛県内の市の人口データファイル名を入力してください
> data1304a.txt

人口の降順に並べ替えると:
 1) Matsuyama
     (511192人)
 2) Imabari
     (151672人)
 3) Niihama
     (115938人)
 4) Saijo
     (104791人)
 5) Shikokuchuo
     ( 82754人)
 6) Uwajima
     ( 70809人)
 7) Ozu
     ( 40575人)
 8) Seiyo
     ( 35388人)
 9) Iyo
     ( 35133人)
10) Toon
     ( 33903人)
11) Yawatahama
     ( 31987人)

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
実行の画面出力の内容が上の例と違うきちんと確認していない).
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 問 5 (ex1305a.h) ]