2013-12-07 29 views
-1

我已經編程檢查單詞是否爲palindrom。我已經在Java中完成了這幾十次,但在這裏isPalindrom函數i永不增加,並返回false。我的程序有什麼問題?檢查Pascal中的單詞是否爲迴文

program p1; 
    var 
    n,i:integer; 
    slowo:string; 

    function isPalindrom(s: string) : boolean; 
    var 
    dlugosc : integer; 
    begin 
     dlugosc := Length(s); 

     for i:= 1 to dlugosc do 
     begin 
     writeln(i); writeln('i = ', i, ' s[i] = ', s[i], 'dlugosc - i = ', dlugosc - i, 's[dlugosc - i] = ', s[dlugosc - i + 1]); 
     if s[i] <> s[dlugosc - i] then 
     begin 
     exit(false); 
     end; 
     end; 
     writeln('-------'); 
     exit(true); 
    end; 


    begin 
    readln(slowo); 
     if isPalindrom(slowo) = TRUE then 
     begin 
     writeln('is PALINDROM'); 
     end; 
     if isPalindrom(slowo) = FALSE then 
     begin 
     writeln('is not PALINDROM'); 
     end; 



    readln; 
    end. 
+0

您打印'的[dlugosc - 我] =',S [dlugosc - 我+ 1]);'但檢查'S [dlugosc - 我]'把它改成'[dlugosc - i +1]' – Grundy

+0

你的'for'循環太長了:應該是'for i:= 1 to dlugosc div 2'。換句話說,你只需要比較字符串的前半部分和後半部分。如果'slowo'的值是'hannah',那麼你只需要比較前三個字母。 –

回答

0

問題是

  if s[i] <> s[dlugosc - i] then 

i是1..length(串)的範圍內。所以長度(字符串)-i是在長度(字符串)-1 .. 0。當的範圍內,以向後檢查字符串應該是長度(字符串).. 1

所以它更改爲

 s[dlugosc-(i-1)] 
+0

這就是我在java中完成的方式,但是這裏的Pascal數組從1開始索引。 – Yoda

+0

是的,減去兩個基於1的索引相互抵消,這就是重點。再次閱讀,並注意範圍。始終跟蹤範圍是解決這些問題的線索。如有必要,寫出dlugosc-i。 –

0

我不喜歡跳出'for'循環的想法。你可以更清晰地寫你的迴文功能通過以下方式

Function Palindrome (const s: string): boolean; 
var 
i, len: integer; 

begin 
i:= 0; 
len:= length (s); 
result:= true; 
while (i < len div 2) and result do 
    begin 
    inc (i); 
    result:= s[i] = s[len + 1 - i] 
    end 
end; 
相關問題