- 締切済み
用意されたファイルを読み込むんですが…
こんにちは。 質問があります。 neme.txt 5 9:山田 太郎 10 17:山田 花子 1 14:佐々木 小次郎 用意された上のようなファイルを読み込んで、誕生日順に並べたいのですが、早生まれが先に来てしまいます。 456789 10 11 12 123 の順番にするにはどうすればよいでしょうか? 月を3桁、日を3桁でテキストに書いています。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
・ソート関数に qsort を使っていたと仮定して比較関数を紹介 ・#2さんの考えを実装例でご紹介します ・ただし、データ数が多いとソート時間がかかります /* データの構造体を宣言 */ typedef struct NAME { int month; int day; char *name; } NAME, *LPNAME; /* 比較関数 */ int SortCompare( const void *data1, const void *data2 ) { int month1 = ((LPNAME)data1)->month; int month2 = ((LPNAME)data2)->month; if ( month1 <= 3 ){←1~3月を13~15月に変換 month1 += 12; } if ( month2 <= 3 ){←1~3月を13~15月に変換 month2 += 12; } if ( month1 < month2 ){ return( -1 ); } if ( month1 > month2 ){ return( +1 ); } return( 0 ); } /* 比較処理 */ void main( void ) { NAME data[ 1000 ];←データ配列 FuncLoad( data, 1000 );←データ配列にデータをセットする関数 qsort( data, 1000, sizeof(NAME), SortCompare );←ソートする FuncDisp( data, 1000 );←データ配列を結果表示する関数 }
内部ロジックで、ソートのときだけ1月は13月、2月は14月、3月は15月と みなすようにしてみてはいかがでしょうか。 もちろん、データの出力時には元の1~3月に戻します。
お礼
僕が経験不足からなのでしょうか…。 とても参考になる意見です。 ありがとうございます! こちらも参考にさせていただきますね。
- alphion
- ベストアンサー率19% (27/136)
月に8(4月が一番初めになるように、割った余りが0となるのは8を足したときなので)を足して12で割った余りでソートする (月+8)%12とすると 1月 => (1+8)%12=9 2月 => (2+8)%12=10 3月 => (3+8)%12=11 4月 => (4+8)%12=0 5月 => (5+8)%12=1 … 11月 => (11+8)%12=7 12月 => (12+8)%12=8
お礼
ああ!この手がありましたか! 気づかなかったです! さっそく実行してみたいと思います!
お礼
うわぁ、ご丁寧にありがとうございます! すごくわかりやすいです!