• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Шифровка и расшифровка

virginia

Новые
Регистрация
29 Окт 2011
Сообщения
42
Реакции
0
Баллы
0
Шифровка и расшифровка

const
str= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
alpha='YXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba';
var
S: String;
Ch : Char;
i, j, Len : Integer;
Procedure shifrovka(var s:string);
begin
for i := 1 to Length(S) do
begin
Len := Length(str);
for j := 1 to Len do
if str[j] = S then Break;
if j <= Len then S := alpha[j]
end;
Writeln(S);

end;
Procedure rasshifrovka(var s:string);
begin
for i := 1 to Length(S) do
begin
Len := Length(alpha);
for j := 1 to Len do
if alpha[j] = S then Break;
if j <= Len then S := str[j]
end ;
Writeln(S);
end;

помогите,пожалуйста,переделать программу без break
 
помогите,пожалуйста,переделать программу без break
Начать с того, что я здесь напрочь не вижу программы - только две процедуры. Составленные, к слову сказать, не слишком грамотно: во-первых, именовать глобальный параметр программы и формальный параметр процедуры одинаково (в данном случае строка S) - не то, чтобы ошибка, но дурной стиль. Но это, как говорится, семечки. Там еще куча ошибок и нелепостей. Вот вы вводите цикл по j:
for j := 1 to Len do
а дальше - условие
if j <= Len
абсолютно бессмысленное, поскольку оно и так выполнено исходя из диапазона цикла.
Не говоря уже о таких мелочах, как отсутствие буквы Z в строке alpha, зачем-то всунутые внутрь циклов вычисления (при каждом проходе!!!) длин строк-констант, ну и прочие неряшливости. Да, отмечу еще, что присваивать идентификаторам имена стандартных функций Паскаля хоть и допустимо, но КРАЙНЕ нежелательно. В данном случае я об имени строковой константы Str. (Str(X,S) - это оператор преобразования числа в строку).
Вообще-то задачка оказалась ох, до чего непростая - я с ней где-то полтора часа провозился, пока отладил. Тут когда пытаешься учесть повторы букв, а также отделить совпадающие ранее замененные буквы с с еще не замененными - ух! Ну, в общем, отладил. Но непростой код в итоге получился:
Код:
const
 str1= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvw xyz';
 alpha='ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkji hgfedcba';

var
 Q: String;

Procedure shifrovka(var S:string);
var
 i,j,k:Integer;
 M:Set of Byte;
 Ch:Char;
begin
 M:=[];
 for i:= 1 to Length(S) do
  begin
   If Not(i in M) then
    begin
     Ch:=S[i];
     j:=0;
     repeat
      Inc(j);
     until (str1[j]=Ch) or (j=Length(str1));
     If str1[j]=Ch then
      for k:=i to Length(S) do
       if (S[k]=Ch) and Not(k in M) then
        begin
         S[k]:=alpha[j];
         M:=M+[k];
        end;
    end;
  end;
 Writeln(S);
end;

Procedure rasshifrovka(var S:string);
var
 i,j,k:Integer;
 M:Set of Byte;
 Ch:Char;
begin
 M:=[];
 for i:=1 to Length(S) do
  begin
   If Not(i in M) then
    begin
     Ch:=S[i];
     j:=0;
     repeat
      Inc(j);
     until (alpha[j]=Ch) or (j=Length(alpha));
     If alpha[j]=Ch then
      for k:=i to Length(S) do
       if (S[k]=Ch) and Not(k in M) then
        begin
         S[k]:=str1[j];
         M:=M+[k];
        end;
    end;
  end;
 Writeln(S);
end;

Begin
 writeln('Enter the string to code/decode:');
 readln(Q);
 shifrovka(Q);
 rasshifrovka(Q);
 readln
End.
 
Procedure shifrovka(var S:string);
var
i,j,k:Integer;
M:Set of Byte;
Ch:Char;
begin
M:=[];
for i:= 1 to Length(S) do
begin
If Not(i in M) then
begin
Ch:=S;
j:=0;
repeat
Inc(j);
until (str1[j]=Ch) or (j=Length(str1));
If str1[j]=Ch then
for k:=i to Length(S) do
if (S[k]=Ch) and Not(k in M) then
begin
S[k]:=alpha[j];
M:=M+[k];
end;
end;
end;
Writeln(S);
end;
объясните пожалуйста эту часть пошагово
 
объясните пожалуйста эту часть пошагово
Ха, а я ведь предупреждал, что тут отнюдь не просто! Вообще задача изначально имеет куда более простое (и тупое) решение, если ввести дополнительную строку S1, а потом, например, с помощью оператора Case, задать таблицу заполнения этой S1, а в конце обратно переприсвоить S:=S1. Но Вы пошли по пути последовательной замены символов исходной строки, я, соответственно, тоже. Правда, тут возникает проблема.
Пусть, например, надо закодировать строку
zazazaza
из которой после кодировки должно получиться
azazazaz
Простой вариант - это идти по исходной строке "символ за символом" и заменять последовательно. Тогда получится не сложно, но долго и скучно. Но можно (как это сделано в программе) пытаться сразу заменить все одинаковые символы строки, что и реализовано.
Итак, начали. Первый символ - z. После замены всех символов "z" символом "a", имеем:
aaaaaaaa
И как, спрашивается, программе различить подлежащий замене исходный символ "a" от получившегося в результате замены и потому дальнейшему преобразованию не подлежащего? Вот для этого создается множество M порядковых номеров преобразованных символов. В данном случае после замены z→a это будет множество [1, 3, 5, 7], и символы "a", стоящие на указанных позициях, уже преобразованию не подлежат. Т.е. в данном примере на втором шаге будут заменены только "a", стоящие на позициях 2, 4, 6 и 8.
Ну и пара слов по структуре процедуры. Цикл по i - это последовательное прохождение символов исходной строки. Если текущего номера i нет в "черном списке" (множестве М), то производится замена всех символов строки, идентичных стоящему на i-той позиции, начиная с номера i и до конца (это цикл по k), причем и тут необходимо сверять позицию каждого заменяемого символа с "черным списком", и если эта позиция в нем есть, то пропускать. При этом во время каждой замены "черный список" пополняется номером заменяемого символа.
Понятнее стало? Надеюсь, что объяснил. Если всё же непонятно, спрашивайте.
 
спасибо огромное.теперь понятно
 
Назад
Сверху