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

Var count: array['a'..'z'] of integer;

В самом начале все счётчики нужно обнулить:

for c:='a' to 'z' do count[c]:=0;

Первый этап (чтение данных) может быть выполнен двумя способами: чтением по строкам и посимвольным чтением. Сначала покажем вариант чтения по строкам. Введем переменную s типа string:

Var s: string;

и организуем бесконечный цикл, который заканчивается по оператору break тогда, когда введена строка, начинающаяся с символа *:

while True do begin

readln(s);

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

then break;

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

end;

Обратите внимание, что сначала нужно проверить, что длина строки больше нуля, то есть строка содержит хотя бы один символ. Иначе при вводе пустой строки программа завершится аварийно (будет обращение к элементу s[1], которого нет).

Обработка состоит в том, что нужно найти в строке первую букву каждого слова. Что такое начало слова? Это ситуация, когда рядом стоят пробел и вслед за ним строчная латинская буква. В этом случае нужно увеличить счётчик, соответствующий этой букве. Есть одно исключение: строка может начинаться с буквы. Можно обрабатывать этот случай отдельно, а можно просто добавить в начало строки пробел:

s := ' ' + s;

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

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

count[s[i+1]]:= count[s[i+1]] + 1;

Второй этап – сортировка букв в порядке убывания значений счётчиков. Тут есть две проблемы: по-первых, недостаточно просто отсортировать элементы массива count по убыванию – при этом мы потеряем связь буквы со счётчиком. Поэтому придется выделить еще один массив, в котором будут храниться буквы:

Var letters: array['a'..'z'] of char;

...

for c:='a' to 'z' do letters[c]:=c;

Вторая проблема: «если количество слов, начинающихся на какие-то буквы, совпадает, эти буквы следует выводить в алфавитном порядке». Методы сортировки, сохраняющие это свойство, называются устойчивыми. Например, метод пузырька – устойчивый метод, а метод выбора минимального элемента – нет (поэтому использовать его в этой задаче нельзя). Итак, применяем метод пузырька, переставляя элементы сразу двух массивов:

for c:='a' to 'y' do begin

for d:='y' downto c do begin

d1:= Succ(d); { следующий символ за d }

if count[d] < count[d1] then begin

i:= count[d]; count[d] := count[d1]; count[d1]:= i;

temp:= letters[d]; letters[d]:=letters[d1];

letters[d1]:=temp;

end;

end;

end;

Вывод результата не представляет сложности: если счётчик не равен нулю, выводим его значение вместе с соответствующей буквой:

for c:='a' to 'z' do

if count[c] > 0 then

writeln(letters[c], ' ', count[c]);

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

Var count: array['a'..'z'] of integer;

letters: array['a'..'z'] of char;

s: string;

c, temp, d, d1: char;

I: integer;

begin

for c:='a' to 'z' do begin

count[c]:=0;

letters[c]:=c;

end;

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

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

count[s[i+1]] := count[s[i+1]] + 1;

end;

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

for c:='a' to 'y' do begin

for d:='y' downto c do begin

d1:= Succ(d);

if count[d] < count[d1] then begin

i:= count[d]; count[d] := count[d1]; count[d1]:= i;

temp:= letters[d]; letters[d]:=letters[d1];

letters[d1]:=temp;

end;

end;

end;

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

for c:='a' to 'z' do

if count[c] > 0 then

writeln(letters[c], ' ', count[c]);

end.

Во многих языках программирования индексы не могут быть символьными значениями, приходится использовать массивы с целыми индексами. Для преобразования символа в его числовой код в Паскале применяется функция Ord, а для обратного преобразования – функция Chr. Вот готовая программа:

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