Цитата:
Сообщение от virginia
помогите,пожалуйста,переделать программу без 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.