program SeisekiKanri2; (* 〜 〜 *) (* oYo *) (*  A  *) {$APPTYPE CONSOLE} uses SysUtils; const Size = 100; // 表の大きさ type String8 = string[8]; String18 = string[18]; String20 = string[20]; TSoeji = 0..Size; // TKojin の上に移動 TKojin = record // Bangou : String8; // Kanji : String18; // Kana : String18; // Romaji : String20; // Point : Integer; // Rank : Integer; // Next : TSoeji; // 順位が次の人を指す end; THyou = array [TSoeji] of TKojin; // var SeisekiHyou : THyou; // Ninzuu : TSoeji; // Top : TSoeji; // 成績がトップの人を指す procedure FileKaraYomu; {Seiseki.txt から読み込む} {人数がここで決まる } var InF : Text; N : TSoeji; X : Char; // 区切りを読み飛ばすため begin Assign(InF,'Seiseki.txt'); Reset(InF); N := 0; repeat Inc(N); with SeisekiHyou[N] do begin ReadLn(InF, Bangou, X,X, Kanji, X,X, Kana, X,X, Romaji, Point); WriteLn(Bangou, ' ', Kanji, ' ', Kana, ' ', Romaji, Point:5); end; until EoF(InF); Close(InF); Ninzuu := N; WriteLn('人数=', Ninzuu); end; {FileKaraYomu} procedure ListWoTsukuru; {成績順に指していくリストを作る} procedure ListNiTsuika(N : TSoeji); {リストに SeisekiHyou[N] を追加する} var P : TSoeji; begin // P を 0 から始める P := 0; // N 番を追加する場所を探していく while (SeisekiHyou[P].Next > 0) and (SeisekiHyou[SeisekiHyou[P].Next].Point > SeisekiHyou[N].Point) do begin P := SeisekiHyou[P].Next; end; // 追加する場所が見つかったら,そこに追加する SeisekiHyou[N].Next := SeisekiHyou[P].Next; SeisekiHyou[P].Next := N; end; {ListNiTsuika} var N : TSoeji; begin SeisekiHyou[0].Next := 0; // 便宜上 0番の空のレコードを使う for N := 1 to Ninzuu do ListNiTsuika(N); // リストに N番を追加する Top := SeisekiHyou[0].Next; end; {ListWoTsukuru} procedure FileNiKaku; {SeisekiList.txt に書き出す} var OutF : Text; N : TSoeji; P : TSoeji; begin Assign(OutF, 'SeisekiList.txt'); Rewrite(OutF); // 番号順に書く for N := 1 to Ninzuu do with SeisekiHyou[N] do begin WriteLn(OutF, N:2, ' ', Bangou, ' ', Kanji, ' ', Kana, ' ', Point:3, Next:4); WriteLn( N:2, ' ', Bangou, ' ', Kanji, ' ', Kana, ' ', Point:3, Next:4); end; WriteLn(OutF); WriteLn; // 成績順に書く P := Top; while P > 0 do with SeisekiHyou[P] do begin WriteLn(OutF, P:2, ' ', Bangou, ' ', Kanji, ' ', Kana, ' ', Point:3, Next:4); WriteLn( P:2, ' ', Bangou, ' ', Kanji, ' ', Kana, ' ', Point:3, Next:4); P := Next; end; Close(OutF); WriteLn('SeisekiList.txt に書き出しました'); end; {FileNiKaku} begin {Main} FileKaraYomu; Write('Enterキーを押すとリストを作ります'); ReadLn; ListWoTsukuru; FileNiKaku; ReadLn; end.