![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; Последний раз редактировалось 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]) не изменит самого символа. Это просто для проверки, чтобы не писать два условия для маленького и большого символов. |
|
#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; |