質問: ラックナンバーリサーチの実行時間を新しい順に並べるコードを書いたのですが もう少しカッコイイ、コードに書き直せますか。教えていただければありがたいです。 表示は正常に動きます。char dtfile[]="LACKNUM.DAT"からTIME_DATA lst[]にデータを 取り込むコードを示していただければ、いいのですが。 ``` //jikan_sort4.c #include #include #include #define MAXCNT 100 #define NDATA ((sizeof(lst))/(sizeof(TIME_DATA))) //char dtfile[]="LACKNUM.DAT"; typedef struct // 構造体の宣言 { int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; double score; }TIME_DATA; int main() { TIME_DATA lst[]= {{2017, 9,16, 8,18,23,10.6}, {2015,12, 7,19,59, 8, 8.0}, {2016, 1, 3, 1, 9,11, 7.5}, {2016, 4, 5,19,16, 8, 9.0}, {2015, 6, 4,19, 2,44, 7.5}, {2016, 8, 7,22,31,52, 9.3}, {2014, 1, 4,23,43,50,10.2}, {2016, 5,31,21, 9,53, 7.0}, {2014, 2,12,28,31,49,13.0}, {2016, 2,28, 2,27,20, 7.8}, {2015, 5, 2,16,43,32, 6.3}, {2017, 9,14,10,21,18, 6.0}, {2017, 9,16, 8,18,9, 8.6}}; int i; printf("NDATA:%d\n",NDATA); printf( "■並べ替え前\n" ); for(i=0; igcc -I. -o jikan_sort4 jikan_sort4.c -Wall C:\MinGW\users\chap09\kadai>jikan_sort4 NDATA:13 ■並べ替え前 2017年 9月 16日 8時 18分 23秒 所要時間(score):10.6 2015年 12月 7日 19時 59分 8秒 所要時間(score):8.0 2016年 1月 3日 1時 9分 11秒 所要時間(score):7.5 2016年 4月 5日 19時 16分 8秒 所要時間(score):9.0 2015年 6月 4日 19時 2分 44秒 所要時間(score):7.5 2016年 8月 7日 22時 31分 52秒 所要時間(score):9.3 2014年 1月 4日 23時 43分 50秒 所要時間(score):10.2 2016年 5月 31日 21時 9分 53秒 所要時間(score):7.0 2014年 2月 12日 28時 31分 49秒 所要時間(score):13.0 2016年 2月 28日 2時 27分 20秒 所要時間(score):7.8 2015年 5月 2日 16時 43分 32秒 所要時間(score):6.3 2017年 9月 14日 10時 21分 18秒 所要時間(score):6.0 2017年 9月 16日 8時 18分 9秒 所要時間(score):8.6 ■並べ替え後 2017年 9月 16日 8時 18分 23秒 所要時間(score):10.6 2017年 9月 16日 8時 18分 9秒 所要時間(score):8.6 2017年 9月 14日 10時 21分 18秒 所要時間(score):6.0 2016年 8月 7日 22時 31分 52秒 所要時間(score):9.3 2016年 5月 31日 21時 9分 53秒 所要時間(score):7.0 2016年 4月 5日 19時 16分 8秒 所要時間(score):9.0 2016年 2月 28日 2時 27分 20秒 所要時間(score):7.8 2016年 1月 3日 1時 9分 11秒 所要時間(score):7.5 2015年 12月 7日 19時 59分 8秒 所要時間(score):8.0 2015年 6月 4日 19時 2分 44秒 所要時間(score):7.5 2015年 5月 2日 16時 43分 32秒 所要時間(score):6.3 2014年 2月 12日 28時 31分 49秒 所要時間(score):13.0 2014年 1月 4日 23時 43分 50秒 所要時間(score):10.2 C:\MinGW\users\chap09\kadai> */ ```
回答: ``` // こんな比較関数を用意しておいて int cmp(const void *a1, const void *b1) { long asum, bsum; const TIME_DATA *a = (const TIME_DATA*)a1; const TIME_DATA *b = (const TIME_DATA*)b1; asum = a->tm_year * 10000000000L + a->tm_mon * 100000000L + a->tm_mday * 1000000L + a->tm_hour * 10000L + a->tm_min * 100L + a->tm_sec; bsum = b->tm_year * 10000000000L + b->tm_mon * 100000000L + b->tm_mday * 1000000L + b->tm_hour * 10000L + b->tm_min * 100L + b->tm_sec; if (asum > bsum) return -1; else if (asum < bsum) return 1; return 0; } //..... // 並べ替えはこの一行で qsort(lst, NDATA, sizeof (TIME_DATA), cmp); ```