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 end end; { основная программа } 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 бронз), очков- 118 2: веселые медузы(4 зол, 6 сер, 10 бронз), очков- 114 3: юные сурки(2 зол, 0 сер, 5 бронз), очков- 39
Спасибо
Популярные вопросы