СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
≡ информатика
сайты - меню - вход - новости




Задания
Версия для печати и копирования в MS Word
Задание 27 № 3112

На вход программе подаётся текст заклинания, состоящего не более чем из 200 символов, заканчивающийся точкой (символ «точка» во входных данных единственный). Оно было зашифровано Гарри Поттером следующим образом. Сначала Гарри определил количество букв в самом длинном слове, обозначив полученное число К (словом называется непрерывная последовательность английских букв, слова друг от друга отделяются любыми другими символами, длина слова не превышает 20 символов). Затем он заменил каждую английскую букву в заклинании на букву, стоящую в алфавите на К букв ранее (алфавит считается циклическим, то есть перед буквой А стоит буква Z), оставив другие символы неизменными. Строчные буквы при этом остались строчными, а прописные — прописными. Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран текст расшифрованного заклинания. Например, если зашифрованный текст был таким: 

 

Zb Ra Ca,Dab Rа.

 

то результат расшифровки должен быть следующим:

Се Ud Fd,Gde Ud.

Решение.

Код:

var f:boolean;

i, k, max: integer;

с,cnew:char;

s:string;

begin

    s:=''; {длина строки – текста заклинания}

{Находим К – количество букв в самом длинном слове}

 

max:=0; k:=0;

f:=false; {текущий символ не буква}

repeat

read(c);  //считываем по символу

s:=s+c;  //прибавляем к строке

 

if f then {слово началось}

if с in ['a'..'z','A'..'Z']

then k:=k+1

else begin {текущий символ не буква – слово кончилось}

   if k>max then max:=k;

   f:=false

end

 

else {f=false}

if с in ['a'..'z','A'..'Z']

   then 

     begin 

       f:=true; 

       k:=l 

     end {начало нового слова}

until c='.';//считываем до точки

 

{Расшифровка заклинания}

 

for i:=l to length(s) do

begin

 

cnew:=chr(ord(s[i])+max); {Находим символ, код которого =s[i]+max}

case s[i] of

'a'..'z': if cnew>'z' then write (chr (ord (cnew)-26))//если новый символ уже не буква,то из него вычтем 26(колво букв в алфавите) и получим нужный символ.т к алфавит у нас циклический

else write(cnew); //иначе выводим

 

'A'..'Z': if cnew>'Z' then write (chr (ord (cnew)-26))

                                  else write(cnew);

else   write(s([i])//если не буква-выводим как есть

end;

end;

readln

 

end.