課題 [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_n は CITY データの配列 cdata[] を
市の名前のアルファベット順(「辞書式順」という)に並べ替えるものとする.

関数 sort_n を完成させ,ex1305a.h のみを提出しなさい.
なお,並べ替えのアルゴリズムには問 4 でも説明したバブルソートを使用しなさい.

【ヒント】
市の名前どうしの比較には標準ライブラリ関数の 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) ]