Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kpolyakov.narod.ru answC4.doc
Скачиваний:
0
Добавлен:
09.12.2018
Размер:
566.78 Кб
Скачать

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;

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

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

name: string;

count: integer;

end;

I, k, p, n, c: integer;

s: string;

exist: boolean;

begin

readln(N);

for i:=1 to N do begin

readln(s);

p := Pos(' ', s);

s := Copy(s,1,p-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;

end;

for i:=1 to N do begin

write(Info[i].name);

if Info[i].count > 1 then write(Info[i].count);

writeln;

end;

end.

  1. Это упрощенный вариант второй задачи, подробно разобранной в основной части. Отличия: нужно найти максимум вместо минимума, и только один, а не три.

const LIM = 250;

Var Info: array[1..Lim] of record

name: string;

sum: integer;

end;

I, k, n, mark, max: integer;

c: char;

begin

readln(N);

{ ввод исходных данных }

for i:=1 to N do begin

Info[i].name := '';

for k:=1 to 2 do

repeat

read(c);

Info[i].name := Info[i].name + c;

until c = ' ';

Info[i].sum := 0;

for k:=1 to 3 do begin

read(mark);

Info[i].sum := Info[i].sum + mark;

end;

readln;

end;

{ поиск максимума}

max := Info[1].sum;

for i:=2 to N do

if Info[i].sum > max then

max := Info[i].sum;

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

for i:=1 to N do

if Info[i].sum = max then

writeln(Info[i].name);

end.

Возможен другой вариант решения (А.С. Абрамов, лицей при РГСУ, г. Воронеж), основанный на следующей идее: в массив записываются фамилии только тех участников, которые имеют суммарный балл, равный максимальному на данный момент; если максимум меняется, возвращаемся к 1-му элементу массива и следующую «цепочку» максимумов записываем поверх предыдущей. Обработка данных выполняется сразу при вводе, отдельный поиск максимума не требуется.

Целая переменная count будет обозначать количество найденных участников с максимальным баллом. В переменной max будем хранить максимальный (на данный момент) результат, а в переменной ball накапливать сумму баллов очередного участника. Тогда алгоритм обработки выглядит так (переменная s содержит фамилию и имя):

if ball > max then begin { новый максимум }

count := 1;

max := ball;

names[1] := s;

end

else

if ball = max then begin { еще один участник в списке }

count := count + 1;

names[count] := s;

end;

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

const LIM = 250;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]