Wyszukiwanie Palindromów z pliku i klawiatury

0

Witam,
Na piątek muszę przynieść program którego treść brzmi następująco:

Napisać program znajdujący w podanym na wejście ciągu znaków PALINDROMY (wyrazy
lub zdania, które mają tę samą treść czytane od prawej do lewej i odwrotnie np. “oko”,
“kobyła ma mały bok”). Umożliwić wczytanie ciągu z pliku lub klawiatury.
Dane wejściowe:

  • ciąg znaków.
    Dane wyjściowe:
  • palindromy (o ile wystąpiły w podanym ciągu).
    Przykład:

oto chyba mamy potop
Znaleziono 2 palindromy:
1: oto
2: potop

Program może działać na zasadzie że wyszukuj wszystkie możliwości np. Potop >> potop i oto
Tyle udało mi się napisać, męczę się z tym strasznie... Ale program am błędy i nie działa jak powinien.
Nie wiem jak wykluczyć by nie uznawał 2 liter jako palindrom np. aa
Program działa na zasadzie że usuwa spacje a następnie wyszukuje palindromów.
Jeśli podamy jakiś ciąg gdzie nie będzie 2 liter obok siebie numeracja działa prawidłowo natomiast gdy wpiszemy np." potop zz" to się pojawiają cuda z liczeniem znalezionych palindromów a także numeracja.
Nie wiem także jak sprawdzać palindromy podając ciąg przez plik txt.

Bardzo proszę o szybką pomoc.

program Untitled;
uses crt;
var
ciag1:text;
a,m:char;
ciag,ciag2:ansistring;
i,j,b,x,l,k,g,max:integer;
pal:boolean;

begin
REPEAT
clrscr;
writeln('Witaj w moim programie wyszukujacym palindromy z ciagu znakow.');
writeln('Jak chcesz wprowadzic ciag znakow?');
writeln('1. z pliku');
writeln('2. z klawiatury');
write('Wpisz numer: ');
readln(a); {wybor jak wpisac ciag znakow}
          if (a='1') OR (a='2') Then
                     begin
                        case a of
                             '1': begin
                                      assign(ciag1,'C:\Dev-Pas\Moje programy\Projekt 1 szkoła\ciag.txt');
                                      reset(ciag1);
                                      writeln('Znaleziono nastepujace palindromy:');
                                            while not EOF(ciag1) do
                                            begin
                                            readln(ciag1,ciag2);
                                            writeln(ciag2);
                                      end;
                                      close(ciag1);
                                  end;
                             '2': begin
                                      writeln('Podaj ciag znakow');
                                      readln(ciag);
                                      b:= 1;  
                                      while b<length(ciag) do
                                      if (ciag[b]=' ') then delete(ciag,b,1) else inc(b);
                                      x:=length(ciag);
                                      for i:=1 to x - 1 do
                                      for j:=i + 2 to x + 1 do
                                      begin
                                       l:=i;
                                       g:=j-1;
                                       pal:=true;
                                       while l < g do
                                        begin
                                         if (ciag[l] <> ciag[g]) then
                                          begin
                                           pal:= false;
                                          end;
                                         inc(l); dec(g);
                                        end;
                                       if pal=true then
                                        begin
                                        max:=0;
                                         for k:=1 to i do
                                         begin
                                         if i > max then
                                         max:=i;
                                         end;
                                         end;
                                         end;
                                      writeln('Znaleziono ',max,' palindrom/y/ow: ');
                                      x:=length(ciag);
                                      for i:=1 to x - 1 do
                                      for j:=i + 2 to x + 1 do
                                      begin
                                       l:=i;
                                       g:=j-1;
                                       pal:=true;
                                       while l < g do
                                        begin
                                         if (ciag[l] <> ciag[g]) then
                                          begin
                                           pal:= false;
                                          end;
                                         inc(l); dec(g);
                                        end;
                                        if pal=true then
                                        begin
                                         for k:=1 to i do
                                         write('');
                                         begin
                                         writeln(i,'. ',copy(ciag,i,j-i));
                                         end;
                                         end;
                                         end;
                                         writeln;

                                  end;
                        end;
                            writeln;
                            writeln('chcesz wyliczyc jeszcze raz? Dowolny klawisz = Tak, N = Nie.');
                     end
          else
              writeln('Niepoprawny wybor, chcesz wpisać jeszcze raz? Dowolny klawisz = Tak, N = Nie.');
              readln(m); {powrotrzenie wyboru}
UNTIL ((m='n') or (m='N'));
end. 
0

dlaczego nie zrobisz sobie funkcji czy_jest_palindromem, napisałeś tak nieczytelny kod, że w zasadzie szybciej zajmie napisanie go od nowa niż analizowanie.

to by wyglądało mniej więcej tak (mogą być błędy, bo pisane z ręki i mam naleciałości z C++):

function czy_palindrom(var tekst: AnsiString): boolean;
var
  i,n: integer;
begin
  n:=Length(tekst);
  for i:=1 to (n div 2) do
    if tekst[i]<>tekst[n-i+1] then
      begin
        Result:=false;
        Exit;
      end;
  Result:=true;
end;

jak Ci brakuje funkcji w stylu: usun_spacje albo zamien_na_duze to ją dodaj, bo pisząc takie kody spędzisz większość życia na szukaniu błędów. Lepiej napisać kilka linijek więcej i później nie szukać błędów.

0

Jak mam użyć tej funkcji by podawać tekst z klawiatury, a następnie sprawdzała mi czy wystąpiły palindromy.

0

Jak mam użyć tej funkcji by podawać tekst z klawiatury, a następnie sprawdzała mi czy wystąpiły palindromy.

Ty żartujesz, co nie?

Bo byś musiał mieć ujemne IQ chyba żeby nie wiedzieć jak tego użyć mimo że wiesz jak działają procedury... Domyślam się że to drugie, więc naucz się pascala...

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