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

関数 encode() が Edit1 と I Edig1 で返されるのを使用します。これは、置換関数で何か問題が発生したため発生しないはずです。

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より 1 大きいa。また、 の序数値はcよりも 1 大きいです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 に答える