Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инфорамтика C4 ответы.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
912.38 Кб
Скачать

Inc(nOdd);

end;

Если нашли нечетное количество таких символов, то палиндром составить нельзя:

if nOdd > 1 then

writeln('Нет')

else begin

writeln('Да');

{ можно составить! }

end;

Остается разобраться, как вывести палиндром в алфавитном порядке. Сначала проходим весь массив count и выводим каждую букву в «половинном» количестве (вторая половина будем справа от центра!):

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

for i:=1 to count[c] div 2 do

write(c);

Обратите внимание, что буква, стоящая по центру, тут тоже может появиться, если она встречается более одного раза.

Затем выводим центральный символ, если он есть:

if nOdd = 1 then write(cOdd);

и оставшийся «хвост», уже в обратном порядке, от 'Z' до 'A':

for c:='Z' downto 'A' do

for i:=1 to count[c] div 2 do

write(c);

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

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

I, nOdd: integer;

c, cOdd: char;

begin

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

read(c);

while c <> '.' do begin

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

read(c);

end;

nOdd := 0;

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

if count[c] mod 2 = 1 then begin

cOdd := c;

Inc(nOdd);

end;

if nOdd > 1 then

writeln('Нет')

else begin

writeln('Да');

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

for i:=1 to count[c] div 2 do

write(c);

if nOdd = 1 then write(cOdd);

for c:='Z' downto 'A' do

for i:=1 to count[c] div 2 do

write(c);

end;

end.

Альтернативное решение предложила Кочешкова А.С. Отличие от приведённого выше варианта состоит в том, что строка-результат строится в памяти и в конце программы выводится на экран. При проходе по массиву счётчиков от 'A' до 'Z' новые буквы вставляются в середину строки res следующим образом:

Insert(c, res, ((length(res) div 2)+1));

Здесь с – вставляемый символ, а выражение (length(res) div 2)+1) вычисляет место первого символа после середины строки.

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

Var I, oddCount:integer;

res:string;

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

c, cOdd: char;

begin

oddCount:= 0; { количество непарных букв }

res:= ''; { строка-результат }

for c:='A' to 'Z' do count[c]:=0; { обнуление массива }

{ считываем символы до точки }

read(c);

while c <> '.' do begin

Inc(count[c]); { увеличиваем счётчик }

read(c);

end;

{ строим результат в строке res }

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

if count[c] mod 2 = 0 then begin

for i:=1 to count[c] do

Insert( c,res,((length(res) div 2)+1));

end

else begin { нашли непарную букву }

Inc(oddCount);

cOdd:= c { запомнили непарную букву }

end;

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

if oddCount > 1 then writeln('Нет')

else begin

writeln ('Да');

if oddCount = 1 then { непарную букву ставим в середину }

for i:=1 to count[cOdd] do

Insert(cOdd,res,(length(res) div 2)+1);

writeln(res);

end;

end.

  1. Для решения задачи нужно ответить на ряд вопросов:

Какие данные нужно хранить?

Какие структуры данных применить (простые переменные, массив, запись и т.п.)?

Как читать данные?

Какую обработку можно выполнить прямо при чтении?

Какую обработку нужно выполнить после чтения всех данных?

Как выводить результаты?

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

В условии сказано, что количество спортсменов не более 1000. Фактически, это явное указание на то, что нужно сначала прочитать данные всех спортсменов в массив, а потом делать окончательную обработку. Удобно использовать массив записей такого типа:

type TInfo = record

name: string[33];

sum: integer;

end;

Поле name хранит имя и фамилию как одну символьную строку, ее длина равна сумме максимальных длин имени и фамилии (12 + 20) плюс 1 символ на пробел между ними. Второе поле – сумма баллов, ее мы будем считать прямо во время чтения данных. Уже можно написать начало программы: