• 締切済み

用意されたファイルを読み込むんですが…

こんにちは。 質問があります。 neme.txt 5 9:山田 太郎 10 17:山田 花子 1 14:佐々木 小次郎 用意された上のようなファイルを読み込んで、誕生日順に並べたいのですが、早生まれが先に来てしまいます。 456789 10 11 12 123 の順番にするにはどうすればよいでしょうか? 月を3桁、日を3桁でテキストに書いています。 よろしくお願いします。

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

・ソート関数に 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 );←データ配列を結果表示する関数 }

ikukassk
質問者

お礼

うわぁ、ご丁寧にありがとうございます! すごくわかりやすいです!

noname#22058
noname#22058
回答No.2

内部ロジックで、ソートのときだけ1月は13月、2月は14月、3月は15月と みなすようにしてみてはいかがでしょうか。 もちろん、データの出力時には元の1~3月に戻します。

ikukassk
質問者

お礼

僕が経験不足からなのでしょうか…。 とても参考になる意見です。 ありがとうございます! こちらも参考にさせていただきますね。

  • alphion
  • ベストアンサー率19% (27/136)
回答No.1

月に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

ikukassk
質問者

お礼

ああ!この手がありましたか! 気づかなかったです! さっそく実行してみたいと思います!

関連するQ&A