Помощь - Поиск - Пользователи - Календарь
Полная версия: Поиск подстроки в строке!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Neon6868
Надо написать программу, которая осуществляет поиск подстроки в строке 2 методами(прямой поиск в строке и алгоритм Боуера и Мура). Для каждого метода определить число сравнений, за которые строка будет найдена или не найдена.Каждый из этих методов реализовать с помощью процедур.В основной программе запрашивактся ввод имени текстового файла, затем запрашивается ввод подстроки поиска.Затем организуется цикл пока файл не кончится, в котором считывается строка, затем идёт поочереди обращение к одной процедуре и к другой.Процедуре передать считанную из файла строку, подстроку, переменные, которые будут счётчиками сравнений.Потом когда цикл кончится на экран выводится в какой строке обнаружена подстрока, с какой позиции в строке она начинается и за сколько сравнений была обнаружена.Если не обнаружена, то вывести соответствующее сообщение и за сколько сравнений.

Файл в самом низу

Я прогу написал, но она не всегда правильно считает:
  1. Если подстроки нет в тексте, то прога неправильно считает число сравнений.
  2. Прога не всегда правильно считает число сравнений для некоторых слов.Например, слово crimes в самом конце текста.
  3. Если взять текст с программой на Паскале, то прога, если написать сразу 2 слова, вообще считает всё неправильно.


Вот прога:

Program Stroka;
var
z,a,k,i,j,y:integer;
t:text;
name,st,st2:string[80];
key1,key2:boolean;
Procedure poisk1(var i,y:integer;st,st2:string);
var
j:integer;
m,n:byte;
Begin
m:=ord(st2[0]);
n:=ord(st[0]);
i:=-1;
y:=-1;
repeat
i:=i+1;
j:=1;
while (j<=m) and (st[i+j]=st2[j]) do
begin
y:=y+1;
j:=j+1;
end;
y:=y+1;
until (j=m+1) or (i=n-m);
if j=m+1 then i:=i+1;
if (j<>m+1) and (i=n-m) then i:=0;
End;
Procedure poisk2(var k,z:integer;st,st2:string);
var
m,n:byte;
d:array[char] of byte;
i,x:integer;
Begin
m:=ord(st2[0]);
n:=ord(st[0]);
for i:=0 to 255 do d[chr(i)]:=m;
for j:=1 to m-1 do d[st2[j]]:=m-j;
i:=m;
j:=m;
z:=-1;
while (j>0) and (i<=n) do
begin
j:=m;
k:=i;
z:=z+1;
while (j>0) and (st[k]=st2[j]) do
begin
k:=k-1;
j:=j-1;
z:=z+1;
end;
i:=i+d[st[i]];
end;
if j<>0 then k:=0;
End;
Begin
writeln('Vvedite imya faila:');
readln(name);
assign(t,name);
reset(t);
a:=0;
writeln;
writeln('Vvedite podstroky poiska:');
read(st2);
readln;
writeln('Tekst:');
while not eof(t) and ((i=0) and (k=0)) do
begin
readln(t,st);
a:=a+1;
write(st);
writeln;
poisk1(i,y,st,st2);
poisk2(k,z,st,st2);
end;
if (i<>0) or (k<>0) then
begin
writeln;
writeln('Pryamoi poisk:');
write('Nomer stroki:',a);
writeln;
write('Nomer pozicii podstroki v stroke:',i);
writeln;
writeln('Chislo sravnenii v stroke:',y);
writeln('Algoritm Bouera i Mura:');
write('Nomer stroki:',a);
writeln;
write('Nomer pozicii podstroki v stroke:',k+1);
writeln;
writeln('Chislo sravnenii v stroke:',z);
end;
if (i=0) and (k=0) then
begin
writeln('Podstroka ne obnaruzhena!');
writeln('Pryamoi poisk:');
write('Chislo sravnenii v stroke:',y);
writeln;
writeln('Algoritm Bouera i Mura:');
writeln('Chislo sravnenii v stroke:',z);
end;
close(t);
readln;
End.



файл:

more, the operations of our businesses, governments,
and financial institutions are controlled by information
that exists only inside computer memories. Anyone
clever enough to modify this information for his own
purposes can reap substantial rewards.Even worse, a
number of people who have done this and been caught
at it have managed to get away without punishment.
These facts have not been lost on criminals or would-be
criminals. A recent Stanford Research Institute study of
computer abuse was based on 160 case histories, which
probably are just the proverbial tip of the iceberg. After
all, we only know about the unsuccessful crimes

volvo
Цитата
Я прогу написал
Сам написал? А зачем? Что, нормальной реализации, приведенной в FAQ-е было недостаточно?

А вот отсюда - поподробнее:
Цитата
Например, слово crimes в самом конце текста.
ГДЕ ты в приведенном тобой тексте видишь слово crimes? Покажи а то у меня видно со зрением проблемы - НЕ ВИЖУ Я ЕГО! А если его нет - о чем речь в п. 2?

P.S. Пока не будет НОРМАЛЬНОГО критерия, что считать словами - ответа не будет... Что именно ты ищещь в программе на Паскале? Приводи свои тесты ПОЛНОСТЬЮ, а не так, как ты привел - только когнстатацию фактов: дублировать уже проделанную тобой работу желания нет совершенно...
Neon6868
А где в FAQе ты видел эту программу, а то я не могу найти???


Цитата(volvo @ 10.03.2007 18:46) *


А вот отсюда - поподробнее:
ГДЕ ты в приведенном тобой тексте видишь слово crimes? Покажи а то у меня видно со зрением проблемы - НЕ ВИЖУ Я ЕГО! А если его нет - о чем речь в п. 2?


Извини я случайно удалил слово crimes!

Цитата(volvo @ 10.03.2007 18:46) *

P.S. Пока не будет НОРМАЛЬНОГО критерия, что считать словами - ответа не будет... Что именно ты ищещь в программе на Паскале? Приводи свои тесты ПОЛНОСТЬЮ, а не так, как ты привел - только когнстатацию фактов: дублировать уже проделанную тобой работу желания нет совершенно...


Надо искать подстроку в строке. Например,когда я ищу слово crimes, он неправильно считает число сравнений.А если набрать любые буквы на клавиатуре, которых нет в тексте, то программа также неправильно считает число сравнений!!!!! dry.gif
Neon6868
Неужели никто не знает в чём ошибки???
Neon6868
Всем спасибо. Помощь больше не нужна!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.