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


Задания
Версия для печати и копирования в MS Word
Задания Д19 C4 № 3645

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

Например, если зашифрованный текст был таким:

Bd Тс Ее Fed Тс,

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

Zb Ra Сc Dcb Ra.

Решение.

Программа читает входные данные, сразу подсчитывая минимальную длину встречающихся слов. За второй проход исходных данных производится замена букв латинского алфавита и печать расшифрованного сообщения. Баллы начисляются только за программу, которая решает задачу хотя бы для частного случая (например, для строчных английских букв и без циклического сдвига).

 

Пример правильной и эффективной программы на языке Паскаль:

var f:boolean;

i, k, min: integer;

c,cnew:char;

s:string;

begin

s : = " ;

min:=250;

k:=0;

f:=false;

repeat read(c);

s:=s+c;

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

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

then k:=k+l

else begin

if kcmin then

min:=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] ) -min) ;

case s[i] of

' a'..'z1:i f cnew<1 a 1 then

write(chr(ord(cnew)+2 6))

else write(cnew);

1A'..' Z 1:if cnewc'A' then

write(chr(ord(cnew)+26))

else write(cnew);

else write(s[i])

end;

end;

readln end.

 

Пример правильной программы на языке Бейсик:

 

DIM i, j, min, к, f, a (26) AS. INTEGER

DIM s AS STRING

INPUT s

i = 1

k = 0

min = 250

f = 0

WHILE NOT (MID$(s, i, 1) = ".")

c$ = MID$ (s, i, 1)

IF f = 1 THEN

IF (c$ >= "A") AND (с $ <= "Z") OR

(C$ >= "a") AND (c$ <= "z") THEN

k = k + 1

ELSE IF k < min THEN min = k

f = 0

ENDIF

ELSE

IF (с $ >= "A") AND (c$ <= "Z") OR

(c$ >= "a") AND (c$ <= "z") THEN

f = 1: k = 1

ENDIF

ENDIF

i = i + I

WEND

IF к < min THEN min = k

FOR j = 1 TO i

cnew$ = CHR$(ASC(MID$(s, j, 1)) - min)

IF (MID$(s, j, 1) >= "a") AND (MID$(s, j, 1)

<= "z") THEN

IF cnew$ < "a" THEN

PRINT (CHR$(ASC(cnew$) + 26));

ELSE PRINT cnew$;

ENDIF

ELSE

IF (MIDS (s, j, 1) >= "A") AND (MID$ (s, j, 1)

<= "Z") THEN

IF cnew$ < "A" THEN

PRINT (CHR$(ASC(cnew$) + 26));

ELSE PRINT cnew$;

ENDIF

ELSE PRINT MID$(s, j, 1);

ENDIF

ENDIF

NEXT j

END