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
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
A z czym masz problem? Z zaczęciem?
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
Po szybkim rzucie okiem: będzie OK jak zmienisz warunek z 'while (I > 0)' na 'while (I >= 0)'.
Niestety nie kompiluje się..
A przed zmianą się kompilowało?
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.
A jak może się kompilować skoro nie ma ciała programu.
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
A sądzisz że kompilator cię okłamuje?
Korzystam w wersji przeglądarkowej i nie wiem czy tam jest poprawnie
można rekurencyjnie http://ideone.com/N1Uu8I przy założeniu, że pusty string jest palindromem
Ciąg znaków 'K','a','j','a','k' palindromem nie jest, ale wyraz 'Kajak' raczej jest.
@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;
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.
@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.
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
Brak formatowania, dwa "na szynach" ;P
To jak zrobić te formatowanie ? :)
Wiecie jak zrobić, żeby po wpisaniu pustego pola wyskakiwał napis 'Podales puste pole' .
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.
Dzięki , teraz działa perfekcyjnie. :D
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...