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

問 5(提出プログラム名:ex1305a.h)

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


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


【目的の処理】
このプログラムも問 4 と同じデータを扱うが,次の点だけが異なる:
main 関数で呼び出す関数が sort_p ではなく sort_n となっていて
関数 sort_nCITY データの配列 cdata[]
市の名前のアルファベット順(「辞書式順」という)に並べ替えるものとする.

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

【ヒント】
市の名前どうしの比較には標準ライブラリ関数の strcmp が便利です.

バブルソートのアルゴリズムで降順に並べ替える場合,
例えば cdata[j]cdata[j+1] の間で名前の大小(順序)関係を比較することになります.
この場合も if ( cdata[j] > cdata[j+1] ) と書くことはできませんが,
if ( cdata[j].name > cdata[j+1].name ) という比較も誤りです.
なぜなら,name はそれぞれ char 配列の名前なので,
上の比較は単なる「先頭要素のアドレスの比較」を行っているにすぎないからです.

そのために strcmp 関数を使います.この関数は 2 つの char 配列(文字列)を引数として受け取り,
1 つ目の方がアルファベット順で 2 つ目よりも後ろならば正の値を返します
(※逆ならば負の値同じならば 0 を返します)
したがって,
  if ( strmp(cdata[j].name, cdata[j+1].name) > 0 )
という書き方になります.

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

市の名前のアルファベット順に並べ替えると:
 1) Imabari
     (151672人)
 2) Iyo
     ( 35133人)
 3) Matsuyama
     (511192人)
 4) Niihama
     (115938人)
 5) Ozu
     ( 40575人)
 6) Saijo
     (104791人)
 7) Seiyo
     ( 35388人)
 8) Shikokuchuo
     ( 82754人)
 9) Toon
     ( 33903人)
10) Uwajima
     ( 70809人)
11) Yawatahama
     ( 31987人)

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


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