program SeisekiKanri1; (* 〜 〜 *) (* oYo *) (*  A  *) {$APPTYPE CONSOLE} uses SysUtils; const Size = 100; // 表の大きさ type String8 = string[8]; String18 = string[18]; String20 = string[20]; TKojin = record // 個人成績 Bangou : String8; // 学生証番号 Kanji : String18; // 氏名(漢字) Kana : String18; // 氏名(半角カナ) Romaji : String20; // 氏名(ローマ字) Point : Integer; // 点数(6S+4A+2B+1C+2$) Rank : Integer; // 順位 end; TSoeji = 0..Size; // 添え字 THyou = array [TSoeji] of TKojin; // 成績表 var SeisekiHyou : THyou; // 成績表 Ninzuu : 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 Ranking; {点数順にランクをつける} var M,N : TSoeji; begin // 全員のランクを1に初期設定する for N := 1 to Ninzuu do SeisekiHyou[N].Rank := 1; // 1≦M<N≦Ninzuu なるすべての M,N について // M 番の点数が N 番の点数より高ければ N 番のランクを1下げる // M 番の点数が N 番の点数より低ければ M 番のランクを1下げる for M := 1 to Ninzuu-1 do for N := M+1 to Ninzuu do if SeisekiHyou[M].Point > SeisekiHyou[N].Point then Inc(SeisekiHyou[N].Rank) else if SeisekiHyou[M].Point < SeisekiHyou[N].Point then Inc(SeisekiHyou[M].Rank); end; {Ranking} procedure FileNiKaku; {SeisekiRank.txt に書き出す} var OutF : Text; N : TSoeji; begin Assign(OutF, 'SeisekiRank.txt'); Rewrite(OutF); for N := 1 to Ninzuu do with SeisekiHyou[N] do begin WriteLn(OutF, Bangou, ' ', Kanji, ' ', Kana, ' ', Romaji, ' ', Point:3, Rank:4); WriteLn( Bangou, ' ', Kanji, ' ', Kana, ' ', Romaji, ' ', Point:3, Rank:4); end; Close(OutF); WriteLn('SeisekiRank.txt に書き出しました'); end; {FileNiKaku} begin {Main} FileKaraYomu; Write('Enterキーを押すとランクを計算します'); ReadLn; Ranking; FileNiKaku; ReadLn; end.