Czy słowo jest palindromem ?

0

Witam!
Nie dawno przepisałem się do klasy z informatyką i muszę napisać program, żeby zaliczyć.
Ma to być program który sprawdza czy słowo jest palindromem.Bardzo proszę o pomoc, to dla mnie bardzo ważne ! :(

dodam, że ma być to w pascalu

0

A z czym masz problem? Z zaczęciem?

0

Generalnie miałem kilka podejść i niestety zawsze jakieś błędy.
Czy takie coś będzie działać: ?

program palindrom;
function IsPalindrome(S: String): Boolean;
var I : Integer;
begin
  I := Length(S) div 2;
  IsPalindrome := True;
  while (I > 0) do
  begin
    Dec(I);
    if (S[I+1] <> S[Length(S) - I]) then
    begin
      IsPalindrome := False;
      Exit;
    end;
  end;
end;

Czy to będzie gotowy program ?

dodanie znacznika <code class="pascal"> - fp

0

Po szybkim rzucie okiem: będzie OK jak zmienisz warunek z 'while (I > 0)' na 'while (I >= 0)'.

0

Niestety nie kompiluje się..

0

A przed zmianą się kompilowało?

0
daggerfall96 napisał(a)

Czy takie coś będzie działać: ?

Nie będzie, bo Twój program składa się jedynie z nagłówka program palindrom i funkcji, a brakuje głównego bloku programu;

Możesz sobie zadeklarować więcej zmiennych i raz obliczyć długość łańcucha; Dodatkowo trzeba zabezpieczyć się przed podaniem pustego łańcucha; Przykład:

function IsPalindrome(const AString: AnsiString): Boolean;
var
  intLength, intMiddle, I: Integer;
begin
  Result := False;

  if AString <> '' then
  begin
    intLength := Length(AString) + 1;
    intMiddle := intLength div 2;
    I := 1;

    while I <= intMiddle do
      if AString[I] = AString[intLength - I] then
        Inc(I)
      else
        Exit;

    Result := True;
  end;
end;

Lub można zrobić to nieco szybciej za pomocą wskaźników na znaki:

function IsPalindrome(const AString: AnsiString): Boolean;
var
  pchrLeft, pchrRight: PAnsiChar;
begin
  Result := False;

  if AString <> '' then
  begin
    pchrLeft := @AString[1];
    pchrRight := @AString[Length(AString)];

    while pchrLeft < pchrRight do
      if pchrLeft^ = pchrRight^ then
      begin
        Inc(pchrLeft);
        Dec(pchrRight);
      end
      else
        Exit;

    Result := True;
  end;
end;

Ewentualnie jeśli piszesz pod jakimś starociem (jak np. TurboPascal) to zamień słowa Result na nazwę funkcji.

1

A jak może się kompilować skoro nie ma ciała programu.

0

a coś takiego ?

program Palindrom;
var s: string;
    i, j: integer;

begin
write('Podaj ciag znaków: ');
readln(s);
i := 1; { numer pierwszego znaku }
j := length(s); { numer ostatniego znaku }
while i<j do
  begin
    if s[i]<>s[j] then
      begin
      {znaki roznia sie}
      writeln('Nie');
      halt
      end;
    {sprawdzamy dalej}
    i := i+1;
    j := j-1
  end;
{sprawdzenie dobiegło pomyslnie do konca}
writeln('Tak');
readln
end.

dodanie znacznika <code class="pascal"> - fp

1

A sądzisz że kompilator cię okłamuje?

0

Korzystam w wersji przeglądarkowej i nie wiem czy tam jest poprawnie

0

można rekurencyjnie http://ideone.com/N1Uu8I przy założeniu, że pusty string jest palindromem

1

Ciąg znaków 'K','a','j','a','k' palindromem nie jest, ale wyraz 'Kajak' raczej jest.

0

@reptile333 - Twój sposób oczywiście działa, ale przekazywanie parametru przez stałą w tym wypadku jest złe, na dodatek jeszcze używasz funkcji Copy, która także wszystko spowalnia;

Jeśli już używać rekurencji, to przekazywać referencję do łańcucha oraz indeksy znaków do sprawdzenia, np. tak:

function IsPalindrome(AValue: AnsiString): Boolean;

  function SameCharacters(var AValue: AnsiString; ALeft, ARight: Integer): Boolean;
  begin
    if ALeft < ARight then
    begin
      Result := AValue[ALeft] = AValue[ARight];

      if Result then
        Result := SameCharacters(AValue, ALeft + 1, ARight - 1);
    end
    else
      Result := True;
  end;

begin
  Result := AValue <> '';

  if Result then
    Result := SameCharacters(AValue, 1, Length(AValue));
end;

http://ideone.com/VFmcMh

co i tak wciąż nie zmienia faktu, że rekursja w tym przypadku to jedynie ciekawostka, bo sensu jej implementacji nie widać; Najszybsze będzie użycie wskaźników na znak po lewej i prawej i odpowiednie ich inkrementowanie i dekrementowanie.

0

@furious programming wracając do twojego wcześniejszego kawałka kodu

function IsPalindromeArr(const AString: AnsiString): Boolean;
var
  chrLeft, chrRight: Integer;
begin
  Result := False;

  if AString <> '' then
  begin
    chrLeft := 1;
    chrRight := Length(AString);

    while chrLeft < pchrRight do
      if AString[chrLeft] = AString[chrRight] then
      begin
        Inc(chrLeft);
        Dec(chrRight);
      end
      else
        Exit;

    Result := True;
  end;
end;

Równie szybki kawałek kodu na tablicach (równoważny temu ze wskaźnikami). Da się? da.

0

Dzięki panowie za odpowiedzi, zdecydowałem się użyć tej implementacji

program Palindrom;
var s: string;
    i, j: integer;
 
begin
write('Podaj ciag znaków: ');
readln(s);
i := 1; { numer pierwszego znaku }
j := length(s); { numer ostatniego znaku }
while i<j do
  begin
    if s[i]<>s[j] then
      begin
      {znaki roznia sie}
      writeln('Nie');
      halt
      end;
    {sprawdzamy dalej}
    i := i+1;
    j := j-1
  end;
{sprawdzenie dobiegło pomyslnie do konca}
writeln('Tak');
readln
end.

Proste i dobre.Na jaką ocenę byście ocenili? :D (najważniejsze, że działa)

dodanie znacznika <code class="pascal"> - fp

0

Brak formatowania, dwa "na szynach" ;P

0

To jak zrobić te formatowanie ? :)

Wiecie jak zrobić, żeby po wpisaniu pustego pola wyskakiwał napis 'Podales puste pole' .

0

Formatowanie zrobisz albo Jedi Code Formatter albo Lazarusem albo instalując pod Delphi alternatywną wersję dodatku GExperts z formatterem. A sprawdzając if'em czy string = '' wiesz czy jest pusty czy nie lub porównując jego długość funkcją Length.

0

Dzięki , teraz działa perfekcyjnie. :D

0

Wiecie jak zrobić, żeby po wpisaniu pustego pola wyskakiwał napis 'Podales puste pole' .

To chyba pytanie, ale pytajnika nie widzę... Owszem, wiemy, ale wybacz - pomóc rozwiązać problem a uczyć/szkolić to dwie inne rzeczy; Do tego nie będzie potrzebne forum, a porządny kurs; Więc zamiast prosić o każdą pierdółkę po prostu przeczytaj kurs i naucz się chociaż podstaw a zobaczysz, że sam do tego dojdziesz;

Dostałeś i odpowiedzi jak poprawić Twój kod i kilka przykładów (nieco innych) jak zmodyfikować swoją funkcję (nawet rekurencyjny się znalazł) - nie wiem czego chcieć więcej...

1 użytkowników online, w tym zalogowanych: 0, gości: 1