program Olympic;const nMax = 50; { максимум 50 команд } cGold = 7; cSilver = 6; cBronze = 5;type cName = string[20]; RC = record position: byte; name: cName; nGold: byte; nSilver: byte; nBronze: byte; cTotal: byte end; tM = array[1..nMax, 1..2] of byte;procedure Shell(var a: tM; n: integer);{ Сортировка методом Шелла массива a[1..n, 1..2] по убыванию значений элементов второго столбца. }var i, j, step, t1, t2: integer;begin step := n div 2; while step > 0 do begin for j := n - step downto 1 do begin i := j; while i <= n - step do begin if a[i, 2] < a[i + step, 2] then begin t1 := a[i, 1]; t2 := a[i, 2]; a[i, 1] := a[i + 1, 1]; a[i, 2] := a[i + 1, 2]; a[i + 1, 1] := t1; a[i + 1, 2] := t2 end; i := i + step end end; step := step div 2 endend;{ Основная программа }var f: file of RC; a: tM; i, n: byte; s: cName; t: RC;begin { Организуем ввод данных } Assign(f, 'Olympic.in'); Rewrite(f); n := 0; repeat Writeln('Введите наименование команды или * для окончания ввода'); Readln(s); if s[1] <> '*' then begin n := n + 1; Write('Количество медалей: золото, серебро, бронза: '); Readln(t.nGold, t.nSilver, t.nBronze); t.position := n; t.name := s; t.cTotal := t.nGold * cGold + t.nSilver * cSilver + t.nBronze * cBronze; Write(f, t); a[n, 1] := t.position; a[n, 2] := t.cTotal end until s[1] = '*'; Reset(f); { Выполняем сортировку заполненного массива a, определяя положение записей в файле } Shell(a, n); { Выводим результаты, используя прямой доступ к файлу } Writeln('Результаты олимпиады'); for i := 1 to n do begin seek(f, a[i, 1] - 1); Read(f, t); Writeln(i, ': ', t.name, '(', t.nGold, ' зол, ', t.nSilver, ' сер, ', t.nBronze, ' бронз), очков- ', t.cTotal) end; Close(f);end.
Тестовое решение:Введите наименование команды или * для окончания вводаВеселые медузыКоличество медалей: золото, серебро, бронза: 4 6 10Введите наименование команды или * для окончания вводаЮные суркиКоличество медалей: золото, серебро, бронза: 2 0 5Введите наименование команды или * для окончания вводаЧерепашки-ниндзяКоличество медалей: золото, серебро, бронза: 3 7 11Введите наименование команды или * для окончания ввода*Результаты олимпиады1: Черепашки-ниндзя(3 зол, 7 сер, 11 бронз), очков- 1182: Веселые медузы(4 зол, 6 сер, 10 бронз), очков- 1143: Юные сурки(2 зол, 0 сер, 5 бронз), очков- 39