witam, niestety nie wiem jak zrobić część programu...zrobiłem już wyszukiwanie "zwykłego wzroca"(bez parametrów), a także takich z znakami zapytania. Nie mam pojęcia jak zrobić natomiast wyszukiwanie z znakiem + lub znakiem * (znak * i + nie mogą razem występować w wzorcu, natomiast znak ? moze ile razy chce). Tutaj polecenie zadania:
Program 5 – Wyszukiwanie wzorca
Program powinien wyszukac wszystkie wystapienia danego wzorca w tekscie (w postaci
tekstu pasujacego do wzorca oraz indeksu poczatku wzorca w tekscie). Tekst jest ciagiem
małych liter alfabetu angielskiego. Wzorzec dodatkowo moe zawierac trzy inne znaki:
? – oznacza pojedynczy dowolny znak
- oznacza ciag 0 lub wiecej znaków
- oznacza ciag 1 lub wiecej znaków
Załoenia:
- uytkownik podaje maksymalna długosc znalezionego wzorca
- we wzorcu suma wystapien znaków + oraz * jest co najwyej równa 1.
Przykład:
Dane wejsciowe: ababa – tekst, 3 – maksymalna długosc tekstu
Wzorzec: a+
Dane wyjsciowe: (ab, 1), (aba, 1), (ab, 3), (aba, 3)
Narazie mój program wygląda tak...może ktoś wie co zrobić by działała reszta...Narazie mam do + i * tylko znajdowanie na jakim miejscu są...
```delphi
program Wzorzec_program;
uses crt;
var tekst, wzorzec : string;
tekstdl, wzorzecdl, MAX, k, i, plus, razy: integer;
indeks: array[0..255] of integer;
procedure pobierz_dane;
begin
writeln('------------------------------------------------');
writeln('Pogram "Wyszukiwanie wzorca w tekscie"');
writeln('------------------------------------------------');
writeln;
write('Podaj tekst: '); Readln(tekst);
write('Podaj wzorzec: '); Readln(wzorzec);
MAX:=1;
k:=1;
plus:=0;
razy:=0;
if length(tekst) < length(wzorzec) then
begin
writeln('BLAD. Wzorzec dluzszy od tekstu.');
writeln;
pobierz_dane;
end;
if (length(tekst)=0) or (length(wzorzec)=0) then
begin
writeln('BLAD. Niepoprawne dane.');
writeln;
pobierz_dane;
end;
if wzorzec='?' then
begin
writeln('BLAD. To nie ma sensu');
writeln;
pobierz_dane;
end;
tekstdl:=length(tekst);
wzorzecdl:=length(wzorzec);
for i:=1 to wzorzecdl do
begin
if wzorzec[i]='+' then
begin
plus:=i;
write('Podaj maksymalna dlugosc znalezionego wzorca: '); Readln(MAX);
if MAX < wzorzecdl then
begin
writeln('BLAD. Podana dlugosc musi byc wieksza lub rowna dlugosci wzorca');
writeln;
pobierz_dane;
end;
end;
if wzorzec[i]='*' then
begin
razy:=i;
write('Podaj maksymalna dlugosc znalezionego wzorca: '); Readln(MAX);
if MAX < (wzorzecdl-1) then
begin
writeln('BLAD. Podana dlugosc musi miec wielkosc minimum (dlugosc wzorca-1)');
writeln;
pobierz_dane;
end;
end;
end;
end;
procedure szukaj_wzorca(i, j:integer);
begin
repeat
if (tekst[i]=wzorzec[j]) or (wzorzec[j]='?') then
begin
inc(i);
inc(j);
end
else
begin
i:= i-j+2;
j:=1;
end;
until (i>tekstdl) or (j>wzorzecdl);
if j>wzorzecdl then
begin
indeks[k]:=i-wzorzecdl;
inc(k);
szukaj_wzorca(i-wzorzecdl+1, 1);
end;
end;
procedure wyniki;
var i, j:integer;
begin
writeln;
writeln('Wyniki dla wzorca w indeksie: ');
if k>1 then
begin
for i:=1 to (k-1) do
begin
write('(');
for j:=1 to wzorzecdl do
begin
if wzorzec[j] = '?' then
write(tekst[indeks[i] + j - 1])
else
write(wzorzec[j])
end;
write(', ', indeks[i], '), ');
end;
end
else
writeln('Nie znaleziono wzorca');
end;
begin
clrscr;
pobierz_dane;
szukaj_wzorca(1, 1);
wyniki;
readln;
end.
Może zna ktoś jakiś fajny algorytm to wyszukiwania tego wzorca z parametrem...To jest coś jak wyszukiwarka internetowa tylko w pascalu...heh Proszę o POMOC