![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() текст задачи:
на вход программе подается зашифрованный текст заканчивающейся точкой (другие точки во входной информации отсутствуют). он зашифрован следующим образом: Сначала определяется количество букв в самом коротком слове, обозначив полученное число через К (словом называется непрерывная последовательность английских букв, слова друг от друга отделяются любыми другими символами). Затем заменяется каждая английская буква в тексте на букву, стоящую в английском алфавите К букв ранее (алфавит считается циклическим, то есть, перед буквой А стоит Z), другие символы остаются неизменными. Строчные буквы при этом остались строчными, а прописные прописными. Требуется написать программу которая будет расшифровывать текст мой код неверен т.к. при подаче на вход сообщения: zz aa x/. на выходе: bb cc z/ 2 Код:
program Project1; {$APPTYPE CONSOLE} uses SysUtils; var s: string; d, i, min: integer; f: boolean; begin readln(s); //инфа на входе: zz aa x/. delete(s, pos('.',s), length(s)); min:=length(s); d:=0; //f:=false; for i:=1 to length(s) do begin if (s[i] in ['a'..'z']) or (s[i] in ['A'..'Z']) then begin d:=d+1; f:=true; end else if (min>d) and f then begin min:=d; d:=0; f:=false; end; end; for i:=1 to length(s) do if (s[i] in ['a'..'z']) or (s[i] in ['A'..'Z']) then begin s[i]:=chr(ord(s[i])+min); if ord(s[i])>ord('z') then s[i]:=chr(ord('a')+(ord(s[i])-ord('z')-1)); end; // инфа на выходе writeln(s); // bb cc z/ writeln(min); // 2 read(s); { TODO -oUser -cConsole Main : Insert code here } end. Последний раз редактировалось Red_Sam, 18.12.2010 в 21:26. |
#2
|
||||
|
||||
![]() 1)
Код:
delete(s, pos('.',s), length(s)); 2) если на K букв РАНЕЕ, то логично, что надо вычитать, а не складывать: Код:
s[i]:=chr(ord(s[i])-min); 3) сравнивать символы можно и без ord(): Код:
if s[i]>'z' then 4) раз мы вычитаем, то надо так: Код:
if s[i] in ['a'..'z']then begin s[i]:=chr(ord(s[i])-k); if s[i]<'a' then s[i]:=s[i]+26; // 26 букв в латинском алфавите end else if s[i] in ['A'..'Z']then begin s[i]:=chr(ord(s[i])-k); if s[i]<'A' then s[i]:=s[i]+26; // 26 букв в латинском алфавите end; Код:
if s[i] in ['A'..'z'] then begin if chr(ord(upcase(s[i]))-k)<'A' then s[i]:=s[i]+26; s[i]:=s[i]-k; end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 18.12.2010 в 21:38. |
#3
|
|||
|
|||
![]() все что ты сказал хорошо, но первое что мне не нравится это то что writeln(min); дает не тот результат которых хочется
zz aa x/. на выходе: bb cc z/ 2 Цитата:
Цитата:
Последний раз редактировалось Red_Sam, 18.12.2010 в 21:41. |
#4
|
||||
|
||||
![]() по выходу из цикла проверки надо еще раз проверить
Код:
if (min>d) and f then begin min:=d; d:=0; f:=false; end; или же просто не обрезать последнюю точку. upcase(s[i]) не изменит самого символа. Это просто для проверки, чтобы не писать два условия для маленького и большого символов. jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
![]() Bargest
низкий поклон тебе за столь оперативный ответ |
#6
|
||||
|
||||
![]() Да, и поиск минимума надо чуток изменить.
Код:
for i:=1 to length(s) do begin if (s[i] in ['a'..'z']) or (s[i] in ['A'..'Z']) then begin d:=d+1; f:=true; end else begin if (min>d) and f then begin min:=d; f:=false; end; d:=0; end; end; jmp $ ; Happy End! The Cake Is A Lie. |