program SeisekiKanri4; (* 〜 〜 *) (* 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; var P : TSoeji); {recursive} {リストの SeisekiHyou[P] から先に SeisekiHyou[N] を追加する} begin if (P = 0) or // List の最後尾 または (SeisekiHyou[P].Point <= SeisekiHyou[N].Point) // P番の点数 ≦ N番の点数 か then begin // そうであるとき SeisekiHyou[N].Next := P; // P番をN番の次にする P := N; // P番を指していたのを // N番を指すように変更する // (Pは変数引数!!) end else begin ListNiTsuika(N,SeisekiHyou[P].Next); // P番の次以降に追加する end; end; {ListNiTsuika} var N : TSoeji; begin Top := 0; // リストを空にする for N := 1 to Ninzuu do begin ListNiTsuika(N,Top); // リストに N番を追加する end; end; {ListWoTsukuru} procedure FileNiKaku; {SeisekiList.txt に書き出す} var OutF : Text; procedure SeijunDeKaku(P : TSoeji); {正順(点数の高い順)で書く} begin if P > 0 then with SeisekiHyou[P] do begin WriteLn(OutF, Bangou, ' ', Kanji, ' ', Point:3); WriteLn( Bangou, ' ', Kanji, ' ', Point:3); SeijunDeKaku(Next); end; end; {SeijunDeKaku} procedure GyakujunDeKaku(P : TSoeji); {逆順(点数の低い順)で書く} begin if P > 0 then with SeisekiHyou[P] do begin GyakujunDeKaku(Next); WriteLn(OutF, Bangou, ' ', Kanji, ' ', Point:3); WriteLn( Bangou, ' ', Kanji, ' ', Point:3); end; end; {GyakujunDeKaku} var N : TSoeji; begin Assign(OutF, 'SeisekiList.txt'); Rewrite(OutF); WriteLn(OutF, '正順'); WriteLn( '正順'); SeijunDeKaku(Top); WriteLn(OutF); WriteLn; WriteLn(OutF, '逆順'); WriteLn( '逆順'); GyakujunDeKaku(Top); Close(OutF); WriteLn('SeisekiList.txt に書き出しました'); end; {FileNiKaku} begin {Main} FileKaraYomu; Write('Enterキーを押すとリストを作ります'); ReadLn; ListWoTsukuru; FileNiKaku; ReadLn; end.