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

問 6(提出プログラム名:ex1306a.c)

まず,このプログラム(ex1306a.c)をダウンロードしなさい.
そして,ex1306a.cを編集して次の処理を行うプログラムとして仕上げなさい.

【目的の処理】
このプログラムは問 4 や問 5と同じデータを扱うが,次の点が異なる:
 ● データファイル名はコマンドライン引数として受け取る
 ● 人口で並べ替えるか名前で並べ替えるかをコマンドライン引数で選べるようにする
  ("p" が指定されたら人口で,"n" が指定されたら名前で並べ替える)
  それゆえ, sort_psort_n のどちらも使えるよう
    #include "ex1304a.h"
    #include "ex1305a.h"
  として両方を読み込んでいる.

main 関数内の手順(1)と(3)を完成させて ex1306a.c を提出しなさい.
 手順(1):コマンドライン引数が不適切な場合はエラーメッセージを出力して終了させる.
      個数(argc)がおかしい場合は実装済みなので,
      コマンドの方(argv[2] が該当)が p でも n でもない場合のエラー処理を完成させよ.
      strcmp の利用が便利である.
 手順(2):データファイルからデータの読み込みを行う(実装済み).
 手順(3):コマンド(上の p または n のこと)に応じて
      呼び出す関数を変え,メッセージも変える.
 手順(4):並べ替えた後のデータを出力する(実装済み).

【補足説明】
ex1304a.h と ex1305a.h ので構造体の宣言が
  #ifndef __STRUCT_CITY
  #define __STRUCT_CITY


  #endif
で囲まれていました.
これは,同じ構造体の定義を二重に行ってしまうエラーを回避するための措置でした.
簡単に説明すると,
  #ifndef __STRUCT_CITY
というのは,もしも __STRUCT_CITY というラベルが未定義ならば以下を行いなさいという
意味で,その直後に
  #define __STRUCT_CITY
としてそのラベルを定義しているので,その後は仮に同じプログラムが #include で読み込まれても無視される仕組みになっています.
なお,上の if が有効な範囲は #endif までとなっています.

このように,ヘッダを作るときは #ifndef#endif で挟み込んだかたちで書いておくと,
同じ定義を二重にインクルードしてしまってエラーになるという問題を回避できます.
(C 言語でヘッダを作るときによくやる手です)

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
a data1304a.txt a
[エラー] コマンド a は定義されていません
  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
    (問 4 と同じデータファイルを使ってください)
a data1304a.txt n
データファイル: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人)
  • 【プログラムの実行結果】(その3)赤字は実行時にキーボードから入力する内容
a data1304a.txt p
データファイル: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 上でインデントを自動で揃える作業をやっていない).


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