今回からは、各自のオリジナル機能のコーディングを中心に行なう。
プログラミングの参考資料を示す。
ソーティングの基準を、得点順、誕生日順、身長順など様々設けることができる。オプションのスイッチを入れることで、これらの機能を有効にすることが、コマンドラインを用いたプログラムの実行方法として用いられる。
例えば、「> ./prog SORT_BY_NAME」というオプションのときは、名前の ABC 順でソートし、「> ./prog SORT_BY_SCORE」というオプションのときは、得点順でソートするという実行方法である。
ところで、第5回の演習で、qsort を用いたソーティングを練習した。何を基準としてソートするのかは、比較関数の指定によりコントロールしていた。そのこと応用すると、オプション解析時に SORT_BY_NAME という指定であれば、たとえば、cmp_function1 という関数が比較関数として指定すればよく、SORT_BY_SCORE という指定であれば cmp_function2 という関数が比較関数として指定すれば良い。
具体的に、プログラムの骨組みを示す。
// 比較関数についての関数ポインタの型宣言 typedef int (* CmpFunc)(NameCard **, NameCard **); // 総合得点による比較 int cmp_by_total_point(NameCard **nc1, NameCard **nc2) { return nc_get_gp_total(*nc2) - nc_get_gp_total(*nc1); } // ドライバー番号による比較 int cmp_by_driver_number(NameCard **nc1, NameCard **nc2) { return nc_get_driver_number(*nc1) - nc_get_driver_number(*nc2); } // オプション解析 void parse_options(char **argv, CmpFunc *ans) { if( strcmp( argv[1], "SORT_BY_SCORE" ) == 0 ) *ans = cmp_by_total_point; // 関数名は、関数へのポインタを表す else if( strcmp( argv[1], "SORT_BY_NUMBER" ) == 0 ) *ans = cmp_by_driver_number; // 関数名は、関数へのポインタを表す else *ans = NULL; } // メイン int main(int argc, char **argv) { CmpFunc cmp_func; NameCard **ncarray; parse_options( argv, &cmp_func ); ncarray = make_name_card( - - - ); qsort( ncarray, number_of_cards( ncarray ), sizeof(NameCard *), cmp_func ); output_name_card( ncarray, - - - ); } |