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

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

I, k, cA, cAm, iMax:integer;

c: char;

begin

cA := Ord('A');

cAm := Ord('a');

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

repeat

read(c);

k := Ord(c);

if ('A' <= c) and (c <= 'Z') then

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

if ('a' <= c) and (c <= 'z') then

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

until c = '.';

iMax := 1;

for i:=2 to 26 do

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

writeln(char(cA+iMax-1), ' ', count[iMax]);

end.

Возможно, несколько лучшее решение получится, если использовать массив счетчиков с символьными индексами (это можно сделать в Паскале, но не во всех языках программирования):

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

После чтения символа удобно сразу привести его к верхнему регистру с помощью функции UpCase (преобразовать строчные буквы в заглавные):

c := UpCase(c);

или (если в вашей версии Паскаля ее нет) вручную

if c in ['a'..'z'] then

c := Char(Ord(c) - Ord('a') + Ord('A'));

Если символ – латинская буква, то увеличиваем соответствующий счётчик:

if c in ['A'..'Z'] then Inc(count[c]);

Поиск максимума и вывод результата тоже упрощаются:

iMax:='A';

for c:='B' to 'Z' do

if count[c] > count[iMax] then iMax:=c;

writeln(iMax,' ',count[iMax]);

Отметим, что такое красивое решение возможно только в тех языках программирования, где есть массивы с симврольными индексами. Вот полная программа:

var c, iMax:char;

count: array['A'..'Z'] of integer;

begin

for c:='A' to 'Z' do count[c]:=0;

repeat

read(c);

if c in ['a'..'z'] then

c := Char(Ord(c) - Ord('a') + Ord('A'));

if c in ['A'..'Z'] then Inc(count[c]);

until c = '.';

iMax:='A';

for c:='B' to 'Z' do

if count[c] > count[iMax] then iMax := c;

writeln(iMax,' ',count[iMax]);

end.

  1. Все аналогично предыдущей задаче с двумя изменениями: заглавных букв нет и нужно вывести количество для всех букв. Код программы:

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

i, k, cA:integer;

c: char;

begin

cA := Ord('a');

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

repeat

read(c);

k := Ord(c);

if ('a' <= c) and (c <= 'z') then

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

until c = '.';

for i:=1 to 26 do

if count[i] > 0 then

writeln(char(cA+i-1), count[i]);

end.

Возможен и другой вариант (идею предложил Р. Басангов, МОУ «СОШ 3» г. Элиста), в котором используется массив с символьными индексами:

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

Вот полное решение:

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

c: char;

begin

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

repeat

read (c);

if ('a' <= c) and (c <= 'z') then

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

until c = '.';

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

if count[c]>0 then

writeln(c, count[c]);

end.

  1. Заметим, что в этой задаче мы должны хранить в памяти все фамилии и считать, сколько раз они встретились. При этом имена нас не интересуют, поэтому можно выделить такой массив записей

var Info: array[1..100] of record

name: string; { фамилия }

count: integer; { счетчик }

end;

Второе поле (счётчик count) показывает, какая это запись по счёту с той же самой фамилией. Например, если счётчик равен 5, раньше эта фамилия встречалась уже 4 раза.

В этой задаче легко читать информацию целыми строками, а затем «вырезать» фамилию с помощью стандартных функций (фамилия окажется в строке s):

readln(s);

p := Pos(' ', s);

s := Copy(s,1,p-1);

Теперь проверяем, сколько таких фамилй уже есть в списке. Нужно в цикле просмотреть i-1 первых элементов массива Info (где i – номер обрабатываемой строки), если фамилия в очередной записи совпала с только что введенной, счетчик (переменная c) увеличивается на 1:

c := 1;

for k:=1 to i-1 do

if s = Info[k].name then

c := c + 1;

Затем записываем фамилию ученика и значение счётчика в очередную запись:

Info[i].name := s;

Info[i].count := c;

После обработки всех строк остается вывести на экран результат (список логинов). Если счётчик равен 1, фамилия встратилась в первый раз, и логин совпадает с фамилией. Если счётчик больше 1, его значение дописывается в конец фамилии (получаются логины вида «Иванов2», «Иванов3» и т.п.):

for i:=1 to N do begin

write(Info[i].name);

if Info[i].count > 1 then

write(Info[i].count);

writeln;

end;

Вот полный код программы:

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