Показать сообщение отдельно
Старый 08.06.2010, 14:06   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Вот, что-то нарисовал. Не могу гарантировать, что программа так уж абсолютно оптимизирована, но чем богаты.
Код:
Type Participant=Record
            Surname:String;
            Name:String;
            Class:Byte;
            Balls:Word;
           End;
var
 N:BYTE;
 Prt:Array[1..25] of Participant;
 Num_first,Num_Second:Array[1..25] of Byte;
 Ball:Array[1..25] of WORD;
 Ball_first,Ball_second:WORD;
 N_first, N_second:BYTE;
 i,j:Integer;
begin
{Ввод исходных данных по участникам}
 Write('Enter the number of participants (<26) ');
 ReadLn(N);
 For i:=1 to N do
  With Prt[i] do
   begin
    WriteLn('Surname (max 20 symbols)');
    ReadLn(Surname);
    WriteLn('Name (max 15 symbols)');
    ReadLn(Name);
    Write('Class ');
    ReadLn(Class);
    Write('Balls ');
    ReadLn(Balls);
    WriteLn;
   end;

{Поиск высшего балла}
 Ball_First:=0;
 For i:=1 to N do
  With Prt[i] do
   If Balls>Ball_First then Ball_First:=Balls;

{Поиск количества участников, имеющих высший балл, и их порядковых номеров в списке}
 N_first:=0;
 For i:=1 to N do
  With Prt[i] do
   If Balls=Ball_First then
    begin
     Inc(N_first);
     Num_first[N_first]:=i;
    end;

{Поиск второго по величине балла}
 Ball_Second:=0;
 For i:=1 to N do
  With Prt[i] do
   If (Balls>Ball_Second) and (Balls<Ball_First) then Ball_Second:=Balls;

{Поиск количества участников, имеющих второй балл, и их порядковых  номеров в списке}
 N_Second:=0;
 For i:=1 to N do
  With Prt[i] do
   If Balls=Ball_Second then
    begin
     Inc(N_Second);
     Num_Second[N_Second]:=i;
    end;

{Вывод информации}
 WriteLn('Winners:');
 If (Ball_First<200) or (1.0*N_first/N>0.2) then
  begin
   WriteLn('None');
   WriteLn;
   WriteLn('Best:');
   If N_first=1 then
    WriteLn(Prt[Num_First[1]].Surname+' '+Prt[Num_First[1]].Name) else
   WriteLn(N_First);
  end else
 If (Ball_First>=200) and (1.0*N_first/N<=0.2) then
  begin
   For i:=1 to N_first do
    WriteLn(Prt[Num_First[i]].Surname+' '+Prt[Num_First[i]].Name);
   WriteLn;
   WriteLn('Second:');
   If N_Second>1 then WriteLn(N_Second);
   WriteLn(Prt[Num_Second[1]].Surname+' '+Prt[Num_Second[1]].Name);
  end;
 ReadLn;
end.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070