Тема: файл

Ответить в теме
Показано с 1 по 4 из 4
  1. Вверх #1
    maaat
    гость

    По умолчанию файл

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


  2. Вверх #2
    Посетитель Аватар для traveller
    Пол
    Мужской
    Адрес
    Одесса
    Возраст
    42
    Сообщений
    171
    Репутация
    25
    надо XML парсер писать... однозначно

  3. Вверх #3
    Цитата Сообщение от maaat
    на паскале написать подпрограмму:
    дан типизированный файл, с последовательностью символов
    мы вводим некотрую подпоследовательность символов и нужно найти число вхождений даной подпослевотельности в последовательность
    А что такое "типизированный файл?"

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

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

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

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

  4. Вверх #4
    Посетитель
    Пол
    Мужской
    Адрес
    Одесса
    Сообщений
    418
    Репутация
    43

    По умолчанию обязательно найди конспект лекций

    Цитата Сообщение от maaat
    на паскале написать подпрограмму:
    дан типизированный файл, с последовательностью символов
    мы вводим некотрую подпоследовательность символов и нужно найти число вхождений даной подпослевотельности в последовательность
    вводимая последовательность символов может допускать перевод строк?

    Вообще, написать такую прогу в лоб на паскале - не так, уж, и сложно. Полчаса.
    Подвох может быть в том, что вам могли начитывать конкретные алгоритмы типа Бойера-Мура и если препод не увидит присут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;
    


    Дерзай!

Ответить в теме

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения