IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Поиск подстроки в строке!, Помогите найти ошибку!
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Надо написать программу, которая осуществляет поиск подстроки в строке 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



Сообщение отредактировано: Neon6868 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.08.2022 18:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name