我正在制作一个替换别人的字母的功能,问题是它不能按我的意愿工作。
来源
function encode(texto:string): string;
var
cadena: string;
i: integer;
const
letras: array [1 .. 26] of string = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z');
const
in_letras: array [1 .. 26] of string =
('z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l',
'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a');
begin
for i := Low(letras) to High(letras) do
begin
texto := StringReplace(texto, letras[i], in_letras[i],[rfReplaceAll]);
end;
Result := texto;
end;
Edit2.Text := encode(Edit1.Text);
使用函数encode()在Edit1和I Edig1中返回,这不应该发生因为我在替换函数时做错了什么
答案 0 :(得分:6)
它不起作用,因为你逐渐破坏循环中的输入。每次循环都会对修改后的字符串进行操作,而不是对原始输入字符串进行操作。
基本问题是,处理完角色后,您不能再处理它。您必须只处理一次输入字符。你处理每个角色26次。你的方法永远无法解决。
你会用这样的事情做得更好:
function encode(const input: string): string;
var
i: Integer;
begin
Result := input;
for i := 1 to Length(Result) do
if (Result[i]>='a') and (Result[i]<='z') then
Result[i] := Chr(ord('a') + ord('z') - ord(Result[i]));
end;
您的函数实现以下映射:
a -> z
b -> y
c -> x
....
y -> b
z -> a
b
的序数值比a
的序数值多1倍。并且c
的序数值比b
多一个。等等。因此,z
的序数值比a
多25个。
因此,我们假设a
的序数为0,b
的序数为1,依此类推。然后我们将0映射到25,1到24,2到23,依此类推。如果是这样,那么我们需要的功能就是:
output = 25 - input
或者你可能会这样写:
output = ord('z') - input
现在,恰好a
的序数值不等于0
。因此,为了使此功能起作用,我们需要将值移位以允许a
的序数值。因此功能变为:
output = ord('a') + ord('z') - input
答案 1 :(得分:3)
最简单的直接解决方案是双循环:
function encode(texto: string): string;
var
I, J: Integer;
const
letras: array [1 .. 26] of Char = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z');
const
in_letras: array [1 .. 26] of Char =
('z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm', 'l',
'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a');
begin
for J := 1 to length(texto) do
for I := Low(letras) to High(letras) do
begin
if texto[J] = letras[I] then
begin
texto[J] := in_letras[I];
Break;
end;
end;
Result := texto;
end;