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




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

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

Каждая строка файла кодируется отдельно.

В каждой строке ищутся отдельные слова, и все символы слова сдвигаются по алфавиту циклически вправо на длину слова.

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

Циклический сдвиг символа по алфавиту вправо на X — замена символа на символ, стоящий в алфавите на X позиций дальше. Если при этом происходит выход за пределы алфавита, счёт начинается с начала алфавита.

Пример циклического сдвига символов на 3 позиции: буква «Е» превращается в букву «Н», буква «t» — в букву «w» буква «Y» — в букву «В».

Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна закодировать строку по указанному алгоритму.

На вход программе подается строка, состоящая из не более чем 250 символов латинского алфавита, пробелов, знаков препинания, разного рода скобок, кавычек и других символов. Строка заканчивается символом «#». Других символов «#» в строке нет.

Программа должна вывести закодированную по указанному алгоритму строку.

 

Пример входных данных:

Day, mice. "Year" - a mistake#

Пример выходных данных:

Gdb, qmgi. "Ciev" - b tpzahrl#

Решение.

ПАСКАЛЬ

var.s:string;

flag:boolean;

i, k,len:integer; begin

readln(s); {считали всю входную строку}

flag:=false; {признак середины слова}

for i : =1 to length (s) do

begin

{если текущий символ - буква}

if (upcase(s[i])>='A' ) and (upcase(s[i])<= 'Z')

then

if flag then {не первая буква слова}

len:=len+1 {текущая длина слова увеличилась на 1}

else {первая буква слова}

begin

flag:=true;

len:=1 {текущая длина слова = 1}

end

else {текущий символ — не буква}

if flag then {слово только что закончилось}

begin

flag:=false; for k:=1 to len do {перебираем все символы слова}

begin

if ((s[i-k]>='a') and (s[i-k]<='z'))

then

s[i-k]:=chr((ord(s[i-k])+len-ord('a')) mod 26 + ord('a'))

else

s[i-k]:=chr((ord(s[i-k])+len-ord('A')) mod 26 + ord('A'));

end

end

end;

writeln(s)

end.