Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var w: array[1..26] of structW;

temp: structW;

c, c1: char;

I, k: integer;

begin

for i:=1 to 26 do begin

W[i].count:=0;

W[i].letter:=Chr(Ord('a')+i-1);

end;

{ чтение данных, подсчёт начальных букв }

c1 := ' ';

repeat

read(f, c);

if (c1 = ' ') and (c in ['a'..'z']) then begin

k:=Ord(c) - Ord('a') + 1;

W[k].count := W[k].count + 1;

end;

c1 := c;

if c in [#10,#13] then c1 := ' '; { перевод строки }

until c = '*';

{ сортировка }

for i:=1 to 26 do begin

for k:=25 downto i do begin

if W[k].count < W[k+1].count then begin

temp:= W[k]; W[k]:=W[k+1]; W[k+1]:=temp;

end;

end;

end;

{ вывод результата }

for i:=1 to 26 do

if W[i].count > 0 then

writeln(W[i].letter, ' ', W[i].count);

end.

Кроме того, Н.М. Айзикович (лицей №410, г. Санкт-Петербург) предложил идею решения, использующего только один массив. Напомним, что проблема в том, что нужно вывести все ненулевые счетчики для букв в порядке возрастания. Для этого можно не сортировать массив count, а поступить следующим образом:

  1. определить, с какой буквы начиналось наибольшее количество слов: найти максимальное значение счетчика и записать его в переменную max (в этом решении используется массив count с целочисленными индексами):

max:= count[1];

for i:=2 to 26 do

if count[i] > max then max:= count[i];

  1. затем в цикле перебираем (в переменной k) возможные значения счетчиков в порядке убывания, от max до 1; для каждого из таких значений проходим весь массив счетчиков и выводим те счетчики, которые равны k, и соответствующие буквы:

for k:=max downto 1 do

for i:=1 to 26 do

if count[i] = k then

writeln(Chr(Ord('a')+i-1), ' ', count[i]);

Здесь запись Chr(Ord('a')+i-1) служит для того, чтобы получить символ с номером i в латинском алфавите (определить код буквы a, добавить к нему i и вычесть 1, поолучить символ с полученным таким образом кодом).

Таким образом, массив letters в этом варианте решения не нужен. Структуры – тоже. Фактически сортировка выполнена «на месте», без перестановки элементов, только при выводе. Приведем полное решение:

Var count: array[1..26] of integer;

s: string;

temp: char;

I, k, max: integer;

begin

for i:=1 to 26 do count[i]:=0;

while True do begin

readln(s);

if (Length(s) > 0) and (s[1] = '*') then break;

s := ' ' + s;

for i:=1 to Length(s)-1 do

if (s[i] = ' ') and (s[i+1] in ['a'..'z']) then begin

k:=Ord(s[i+1]) - Ord('a') + 1;

count[k] := count[k] + 1;

end;

end;

max:= count[1];

for i:=2 to 26 do

if count[i] > max then max:= count[i];

for k:=max downto 1 do

for i:=1 to 26 do

if count[i] = k then

writeln(Chr(Ord('a')+i-1), ' ', count[i]);

end.

1Вообще говоря, без массиваTotalможно обойтись, потому чтоTotal[i]– это суммаi-ой строки матрицыCount. Но его использование сильно упрощает дело при обработке данных. На досуге вы можете написать программу без него.

2На практике это не обязательно, потому что глобальные переменные и массивы обнуляются автоматически во всех известных автору версиях Паскаля. Тем не менее, на экзамене вы должны показать эксперту, что вы понимаете суть дела.

3Решение, предложенное в проекте демо-варианта ФИПИ 2010 года, содержит массивы, описанные какarray[92..98], что само по себе очень неграмотно.

4 Это ограничение снято в Delphi.

Соседние файлы в папке ЕГЗ_2012_Поляков_май