2013-09-29 31 views
0

我正在爲其他人替換字母,問題是它不能按我的需要工作。在delphi中替換的函數

來源

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,這是不應該的,因爲我做錯了什麼,當替換功能

+6

您不能替換字符這樣。考慮如果您替換例如'd' - >'w',然後通過該迭代轉到'w'。它已經把'w'改回到'd'。 – TLama

+0

或者你需要使用第二個字符串(與傳入變量不同),然後將其分配給結果。 –

回答

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; 
+1

+1。我不知道,這種方法是最有效的,但它回答了OP的意圖:「功能替換字母爲他人」。如果'in_letras'是隨機/洗牌這種方法也能發揮作用。 – kobik

+1

嘆了口氣。無論發生在邏輯,推理和算術上。此外,您可以訪問該字符串不存在的第0個元素。預計會發生特殊長字符串(!!)的破壞以及空字符串的訪問衝突。 –

+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一個。 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 
+0

感謝David Heffernan,但您的解決方案很難理解我,所以我想問我如何在設計的陣列中使用您的代碼。 –

+0

不難理解。將26轉換爲1,25至2,24至3,2 ...至25,1至26.如果需要,可以使用查找表來完成。無論如何,如果你不喜歡我的解決方案,你可以回到你的,如果你喜歡。 –

+0

好吧,你是對的,我希望我不打擾你,但作爲解碼你的代碼我的意思是它返回 –