[Pascal]Palindromy - wyszukiwanie

drakoo
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 30 lis 2011, o 22:54
Płeć: Mężczyzna
Lokalizacja: Rybnik

[Pascal]Palindromy - wyszukiwanie

Post autor: drakoo »

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 wyszukuje wszystkie możliwości np. Potop >> potop i oto
Tyle udało mi się napisać, męczę się z tym strasznie... Ale program ma 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 palindromy.
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.
Musiał bym jakoś treść wczytaną (text) przypisać do ansistringa.

Bardzo proszę o szybką pomoc.

Kod: Zaznacz cały

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. 
Xitami

[Pascal]Palindromy - wyszukiwanie

Post autor: Xitami »

Kod: Zaznacz cały

var 
	s:string;
	f:text;
begin
	if paramcount>0 then begin      // jeżeli zawołasz program z parametrem
		assign(f, paramstr(1)); // to potraktuje go jako nazwę pliku
		reset (f);
	end else 
		f:=input;               // bez parametru czyta z klawiatury
	while not eof(f) do begin       // czyta do Ctrl-Z
		readln(f, s); 
		...
		...		
	end;
end.
-- 1 grudnia 2011, 10:05 --
Przykład:
> oto chyba mamy potop
Znaleziono 2 palindromy:
1: oto
2: potop
więc usuwanie spacji jest błędem, bo pojawi się np. "mam".

Kod: Zaznacz cały

function palin(s:string):boolean;
var p,k:integer;
begin
	p:=1; k:=length(s);
	while p<k do begin
		if s[p]<>s[k] then break;
		inc(p); dec(k)
	end;
	palin:= p>=k
end;

var	s:string; p, n:integer;
begin
	s:='oto chyba mamy potop abba';
	
	n:=0; s:= s + #32;
	repeat
		p:=pos(#32, s);
		if p>0 then begin
			if palin(copy(s, 1, p-1)) then begin
				inc(n);
				writeln(n, '. ', copy(s,1,p-1));
			end;
			delete(s, 1, p)
		end;
	until p=0;
end.
drakoo
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 30 lis 2011, o 22:54
Płeć: Mężczyzna
Lokalizacja: Rybnik

[Pascal]Palindromy - wyszukiwanie

Post autor: drakoo »

Ale kobyła ma mały bok i tak nie działa...

Pozatym pojedyńcze litery i spacje bierze za palindrom
Xitami

[Pascal]Palindromy - wyszukiwanie

Post autor: Xitami »

na podstawie przykładu wnoszę, że masz szukać słów które są palindromami
a, że spacje i pojedyncze litery? to może jeszcze mam zanieś tą pracę domową do twojej szkoły?
drakoo
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 30 lis 2011, o 22:54
Płeć: Mężczyzna
Lokalizacja: Rybnik

[Pascal]Palindromy - wyszukiwanie

Post autor: drakoo »

Poradziłem sobie z spacjami i pojedynczymi wyrazami, ogólnie wygląda to dobrze, tylko np. nie rozpozna mi kilku słów jako palindrom np. "kobyla ma maly bok".

Próbuję też zrobić żeby pisało ile tych palindromów znalazł np. znaleziono 5 palindromów.
Myślałem że to musi być na zasadzie że najpierw musi się wykonać kod i liczyć ile jest palindromów po przez

Kod: Zaznacz cały

max:=0;
if n> max then
max:=0;


i liczy ładnie tylko, że później nie wyświetlają się znalezione palindromy. Próbowałem utworzyć drugą funkcję działającą tak samo, tylko po co by policzyć ile znajdzie palindromów ale efekt tez sam.
Xitami

[Pascal]Palindromy - wyszukiwanie

Post autor: Xitami »

Kod: Zaznacz cały

var   s:string; p, n:integer; t:array[1..1000] of string;
begin
   s:='oto chyba mamy potop abba';
   
   n:=0; s:= s + #32;
   repeat
      p:=pos(#32, s);
      if p>0 then begin
         if palin(copy(s, 1, p-1)) then begin
            inc(n);
            //writeln(n, '. ', copy(s,1,p-1));
            t[n]:= copy(s, 1, p-1);            
         end;
         delete(s, 1, p)
      end;
   until p=0;
   writeln(n);
   for p:=1 to n do
       writeln(t[p]);
end.
ODPOWIEDZ