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

Var fio: array[1..Max] of string;

count: array[1..MAX] of integer;

Выделим в памяти место для переменных

Var I, k, n, nFio: integer;

abbr, s: string;

Здесь

N – количество элементов списка (вводится в самом начале),

nFIO – количество найденных подходящих личностей,

abbr – заданная аббревиатура,

остальные переменные – вспомогательные.

В начале программы читаем аббревиатуру и размер списка:

readln(abbr);

readln(N);

и обнуляем счетчики:

nFIO := 0;

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

Далее следует основной цикл

for i:=1 to N do begin

readln(s);

если аббревиатура совпадает с abbr то

искать ФИО в массиве FIO

если не нашли то

добавить в массив FIO

иначе

увеличить счётчик для этого ФИО

все

все

end;

Здесь все строки, записанные синим цветом – это псевдокод, который нужно перевести на язык программирования.

Для построения аббревиатуры, соответствующей введенной строке, удобно использовать функцию, которая принимает строку и возвращает аббревиатуру. Для этого нужно «сцепить» первые буквы всех слов в строке.

Начало слова удобно определить по сочетанию символов «пробел, а за ним – не пробел». Для того, чтобы не рассматривать отдельно первый символ (перед которым нет пробела), добавим один пробел в начало строки. Аббревиатуру собираем в локальной переменной a:

function Abbrev(s: string): string;

Var I: integer;

a: string;

begin

s := ' ' + s; { добавляем пробел в начало }

a := ''; { пустая строка }

for i:=2 to Length(s) do

if (s[i-1] = ' ') and (s[i] <> ' ') then { начало слова }

a := a + s[i];

Abbrev := a; { вернуть результат функции }

end;

Итак, предположим, что аббреавиатура совпадает. Тогда ищем только что введенную строку среди первых nFIO элементов массива FIO:

k := 1;

while (k <= nFIO) and (s <> FIO[k]) do

k := k + 1;

Этот цикл останавливается в двух случаях: если строки нет в массиве (новая персона) – при этом k>nFIO, и если такая строка найдена – при этом k<=nFIO. В первом случае нужно добавить строку в массив FIO и записать в соответствующий счетчик число 1 (встретили в первый раз), а во втором нужно просто увеличить счетчик (соответствующий элемент массива count):

if k > nFIO then begin

nFIO := nFIO + 1;

FIO[nFIO] := s;

count[nFIO] := 1;

end

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

Теперь остается вывод на экран в порядке убывания частоты встречаемости. Конечно, можно отсортировать массив FIO с помощью любого алгоритма, не забывая переставлять соответствующие значения счетчиков в массиве count. Но можно обойтись без перестановки. Для этого придётся ввести еще одну переменную maxCount – в ней будем хранить максимальное значение из всех счётчиков массива count. До основного цикла эта переменная обнуляется, а при каждом изменении какого-либо счётчика проверяем, не нужно ли менять и maxCount:

if count[k] > maxCount then

maxCount:= count[k];

После цикла сначала выводим все ФИО, которые встречаются maxCount раз (больше не может быть!), затем те, которые встречаются maxCount-1 раз и т.д.:

for i:=maxCount downto 1 do

for k:=1 to MAX do

if count[k] = i then

writeln(FIO[k], ' ', count[k]);

Вот полная программа:

const MAX = 10;

Соседние файлы в папке ЕГЭ 2016-11 класс