0

我正在制作一个为其他人替换字母的功能,问题是它不能按我的意愿工作。

来源

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);

在Edit1和我的Edig1中使用函数encode()返回,这应该不会发生,因为我在替换函数时做错了

4

2 回答 2

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。并且 的序数值c比大一b。等等。所以 的序数值z比 大 25 a

所以,让我们假设序数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
于 2013-09-29T18:43:53.133 回答
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;
于 2013-09-30T12:09:29.377 回答