PDA

Просмотр полной версии : файл



maaat
12.01.2007, 14:42
на паскале написать подпрограмму:
дан типизированный файл, с последовательностью символов
мы вводим некотрую подпоследовательность символов и нужно найти число вхождений даной подпослевотельности в последовательность

traveller
12.01.2007, 16:17
надо XML парсер писать... однозначно

lexar
12.01.2007, 19:12
на паскале написать подпрограмму:
дан типизированный файл, с последовательностью символов
мы вводим некотрую подпоследовательность символов и нужно найти число вхождений даной подпослевотельности в последовательность

А что такое "типизированный файл?"

Если текстовый, то могут возникнуть проблемы со строками.
Дореволюционный паскаль имел длину стоки до 255.

Потому алгоритм такой
Индекс тестовой последовательности = 0
Число последовательностей равно = 0

Цикл пока не кончился файл
Читаем символ
Если символ = тестТекст[индекс] то индекс = индекс + 1 в противном случае индекс = 0
Если индекс = длине тестовой последовательности то (Число последовательностей = Число последовательностей + 1; индекс = 0)
Конец цикла (файл кончился)

Задача решается одним циклом.
Идея - дополнительная переменная-индекс бегает по тест-тексту
и если встретился несовпадающий символ - сбрасывается в ноль
Если тест-текст пройден до конца - счетчик результата увеличивается,
индекс опять сбрасывается.

roks
14.01.2007, 04:32
на паскале написать подпрограмму:
дан типизированный файл, с последовательностью символов
мы вводим некотрую подпоследовательность символов и нужно найти число вхождений даной подпослевотельности в последовательность

вводимая последовательность символов может допускать перевод строк?

Вообще, написать такую прогу в лоб на паскале - не так, уж, и сложно. Полчаса.
Подвох может быть в том, что вам могли начитывать конкретные алгоритмы типа Бойера-Мура и если препод не увидит присутcтвие и понимание именно его лекционного метриала, то будут проблемы.

Алгоритм поиска в тексте и соотвествующие процедуры тут:
http://www.rsdn.ru/article/alg/textsearch.xml

Функция подсчета подстрок на основе предыдущих функций:

/counts how many times a substring exists within a string
//StringCount('XXXXX','XX') would return 2
function StringCount(const aSourceString, aFindString : string; Const CaseSensitive : Boolean = TRUE) : Integer;
var
Find,
Source,
NextPos : PChar;
LSource,
LFind : Integer;
Next : TFastPosProc;
JumpTable : TBMJumpTable;
begin
Result := 0;
LSource := Length(aSourceString);
if LSource = 0 then exit;

LFind := Length(aFindString);
if LFind = 0 then exit;

if CaseSensitive then
begin
Next := BMPos;
MakeBMTable(PChar(aFindString), Length(aFindString), JumpTable);
end else
begin
Next := BMPosNoCase;
MakeBMTableNoCase(PChar(aFindString), Length(aFindString), JumpTable);
end;

Source := @aSourceString[1];
Find := @aFindString[1];

repeat
NextPos := Next(Source, Find, LSource, LFind, JumpTable);
if NextPos <> nil then
begin
Dec(LSource, (NextPos - Source) + LFind);
Inc(Result);
Source := NextPos + LFind;
end;
until NextPos = nil;
end;


Заготовка для чтения файла:

Procedure ReadCfg(name:String); {'name' is Filename to read in}
Type
Line = String[80];
Lines = Array[0..799] of Line;
LinesP = ^Lines;
Var
TextBuf : LinesP;
TextFile : Text;
Index,Number:Integer;
buffer:Array[1..2048] of Char;
s:line;
s1:line;
n:Byte;
i:Integer;
begin
assign( TextFile, name );
reset( TextFile );
SetTextBuf(TextFile,Buffer);
Index := 0;
new(TextBuf);

While not eof( TextFile) do
{Read the Text File into heap memory}
begin
readln( TextFile,s);
if s[1]<>';' then if s<>'' then
begin
TextBuf^[Index]:=s;
inc( Index )
end;
end;
close( TextFile );

{********begin of "find a keyWord" block***********}
Number := Index -1;
For Index := 0 to Number do
begin
s:=( TextBuf^[ Index ]);
n:=MCS('BoardNo',s);
if n > 0 then
begin
s1:=getparameter('KeyWord',s,n);
{do other things With found 'keyWord'}
end;
end;
{end of "find a keyWord" block}

dispose( TextBuf); {release heap memory}
end;



Дерзай!