Другие языки программирования и технологии

паскаль задание

На вход программе подается строка (длиной не более 200 символов), в которой нужно зашифровать все английские слова (словом называется непрерывная последовательность английских букв, слова друга от друга отделяются любыми другими символами, длина слова не превышает 20 символов). Строка заканчивается символом #, других символов # в строке нет. Каждое слово зашифровано с помощью циклического сдвига на длину этого слова. Например, если длина слова равна K, каждая буква в слове заменяется на букву, стоящую в английском алфавите на K букв дальше (алфавит считается циклическим, то есть, за буквой Z стоит буква A). Строчные буквы при этом остаются строчными, а прописные – прописными. Символы, не являющиеся английскими буквами, не изменяются.
Требуется написать программу, которая будет выводить на экран текст зашифрованного сообщения.
Например, если исходный текст был таким:
Day, mice. "Year" is a mistake#
то результат шифровки должен быть следующий:
Gdb, qmgi. "Ciev" ku b tpzahrl#

var
c:char;
s:string;
len,code,i,j,k:integer;
begin
s:='';
len:=0;
repeat
read(c);
s:=s+c;
if ((c>='a') and (c<='z')) or ((c>='A') and ( c<='Z')) then
len:=len+1;
until c='#';
for i:=1 to length(s) do
begin
if ((s>='a') and (s<='z')) or ((s>='A') and ( s<='Z')) then
code:=ord(s);
k:=code-len;
if ((s>='a') and (s<='z')) then if k<ord('a')>>='A') and (s<='Z')) then if k<ord('a')>:=chr(k);
end;
writeln(s);
readln;
readln;
end.

Вопрос: как сдвинуть на длину каждого слова?
Добрый день!

Мне очень понравилась Ваша задача. С удовольствием ее решил.

Мой алгоритм примерно такой:
1) Сначала реализуем процедуру шифрования слова. На вход подается исходная строка, индекс первой буквы, индекс последней. Процедура "на лету" шифрует слово в исходной строке, сдвигая буквы циклически на длину этого слова (индекс последней буквы минус индекс первой буквы плюс единица) .

2) В самом коде программы, занимаемся нахождением индексов первой и последней буквы очередного слова. Для этого "бежим" по строке в цикле (до символа #), и если мы встречаем букву, а предыдущий символ не буква, то первый индекс найден. Затем, во втором цикле бежим дальше по строке, пока не встретим "не букву" - получаем второй индекс. Применяем процедуру шифрования и двигаемся дальше по строке.

3) Выводим зашифрованную строку.

Код программы:

program CryptString;

procedure CryptWord(var InStr:string; LeftIndex,RightIndex:byte);
var i,asciiOffset:byte;
begin
for i:=LeftIndex to RightIndex do
begin
asciiOffset:=0;
if InStr[ i ] in ['a'..'z'] then asciiOffset:=97;
if InStr[ i ] in ['A'..'Z'] then asciiOffset:=65;
if (ord(InStr[ i ])-asciiOffset+(RightIndex-LeftIndex+1)) div 26 > 0 then InStr[ i ]:=chr(ord(Instr[ i ])+(RightIndex-LeftIndex+1)-26)
else InStr[ i ]:=chr(ord(Instr[ i ])+(RightIndex-LeftIndex+1))
end;
end;

var s:string;
i, j, StartIndex, EndIndex:byte;

begin

readln(s);

i:=1;
while s[ i ]<>'#' do
begin
if (not(s[ i-1 ] in ['A'..'z','a'..'z']) and ((s[ i ] in ['A'..'z','a'..'z']))) then
begin
StartIndex:=i;
j:=i;
while s[ j ] in ['A'..'z','a'..'z'] do
begin
EndIndex:=j;
inc(j);
end;
CryptWord(s,StartIndex,EndIndex);
i:=j-1;
end;
inc(i);
end;

writeln(s);

readln;

end.

Вот и всё! Удачи!

P.S. Считаю, что мой ответ достоен звания "Лучшего". Если что-то в коде непонятно, пишите на почту - объясню.
Азамат Бобоев
Азамат Бобоев
7 235
Лучший ответ
Ну то есть код символа увеличиваешь на длину слова, если он превышает длину алфавита, то перескакиваешь на его начало
Было слово Day - стало Gdb
Длина слова = 3
То есть
G=chr(ord('D')+3)
d=chr(ord('a')+3)
А если к коду 'y' прибавить 3, то он перескакивает в начало алфавита, на букву 'b'
Примерно так

for i:=1 to length(s) do begin
if (ord(s[ i])>=65) and (ord(s[ i])<=90) then
if ord(s[ i])+length(s)-64<= 26 then
s[ i]:=chr(ord(s[ i])+length(s)) else
s[ i]:=chr(ord(s[ i])+length(s)-26);
if (ord(s[ i])>=97) and (ord(s[ i])<=122) then
if ord(s[ i])+length(s)-96<= 26 then
s[ i]:=chr(ord(s[ i])+length(s)) else
s[ i]:=chr(ord(s[ i])+length(s)-26);
end;
OW
Oleg Wiebe
8 247