問 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 のみを提出しなさい.
なお,ソーティングのアルゴリズムにはバブルソートを使用しなさい.
【ヒント】
市の名前どうしの比較には標準ライブラリ関数の 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 上でインデントを自動で揃える作業をやっていない).
← [ 問 4 (ex1304a.h) ]
ミスが無いことを確認したら次の問題へ → [ 問 6 (ex1306a.c) ]