Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Поиск подстроки в строке

.doc
Скачиваний:
13
Добавлен:
01.05.2014
Размер:
79.87 Кб
Скачать

Министерство образования Российской Федерации

Санкт–Петербургский Государственный

Электротехнический Университет

Кафедра МО ЭВМ

Дисциплина: Программирование

Отчет по лабораторной работе №2

Выполнил:

студент группы 3341, Худяков Я.Д.

Проверил:

Преподаватель Самойленко В. П.

Санкт-Петербург

2003

1) Задание

Найти координаты первого вхождения в заданную строку подстроки, состоящей из 2-х заданных символов.

2) Постановка задачи

В реализации алгоритма решения поставленной задачи нам необходимо пройти строку один раз, либо до конца, либо до первого вхождения в строку искомой подстроки. Строка реализована в 2-х типах: строка с известной длиной и строка с маркером конца. У каждого типа представлены 3 процедуры: чтения строки(input), её анализа(process) и вывода(output) результатов.

Представленные типы строк:

strLtype=record

strL:array[1..maxlen] of char;

len:byte;

end;

strMtype=record

strM:array[1..maxlen+1] of char;

mk:char;

end;

Спецификация функций и процедур:

Функция

Назначение

Входные параметры

Выходные параметры

inputstrL

Чтение строки в тип с известной длиной

f-дескиптор входного файла, strl-строка с изв. длиной, sim-заданный символ

f-дескиптор входного файла, strl-строка с изв. длиной

inputstrM

Чтение строки в тип с маркером конца

f-дескиптор входного файла, strl-строка с маркером конца строки, sim-заданный символ

f-дескиптор входного файла, strl-строка с маркером конца строки

processl

Обработка строки с известной длиной

strl-строка с известной длиной, sim-заданный символ

k-координата...

processm

Обработка строки с маркером конца

strl-строка с известной длиной, sim-заданный символ

k-координата...

outL

Вывод рез-ов по строке с изв. длиной

f-дескриптор вых файла, strl-строка с изв длиной, k-координаты...

f-дескриптор вых файла

outM

Вывод рез-ов по строке с маркером конца

f-дескриптор вых файла, strl-строка с маркером конца, k-координаты...

f-дескриптор вых файла

3) Текст программы

{Программа нахождения координаты первого вхождения в заданную строку подстроки}

{состоящей из двух одинаковых заданных символов (задание 18)}

{Выполнено студентом гр 3341 Худяковым Ярославом}

{входные выражения в файле koordin.txt}

{выходные данные в файле koordout.txt}

{во входном файле в первой строке содержится заданный символ, во второй - строка для поиска}

uses crt;

const

maxlen=60; {количество значащих символов строки}

type

strLtype=record

strL:array[1..maxlen] of char;

len:byte;

end;

strMtype=record

strM:array[1..maxlen+1] of char;

mk:char;

end;

{ввод строки с известной длинной}

procedure inputstrL(var f:text; var strl:strLtype; var sim:char);

{входные данные: f-дескиптор входного файла, strl-строка с изв. длиной, sim-заданный символ}

{выходные данные: f-дескиптор входного файла, strl-строка с изв. длиной}

var i:byte; {локальн. переменные: i-индекс символа строки}

begin

readln(f,sim);

i:=0;

while not eof(f) and (i<maxlen) do

begin

i:=i+1;

read(f,strl.strL[i])

end;

strl.Len:=i;

end;

{ввод строки в форме с маркером конца}

procedure inputstrM(var f:text; var strl:strMtype; var sim:char);

{входные данные: f-дескиптор входного файла, strl-строка с маркером конца строки, sim-заданный символ}

{выходные данные: f-дескиптор входного файла, strl-строка с маркером конца строки}

var i:byte; {локальн. переменные: i-индекс символа строки}

begin

strl.mk:=#13; {символ "возврат коретки"}

i:=1;

readln(f,sim);

while not eof(f) and (i<=maxlen) do

begin

read(f,strl.strM[i]);

i:=i+1;

end;

strl.strM[i]:=strl.mk;

end;

{вычисление координаты первого вхождения подстроки из 2-х одинаковых заданных}

{символов в данную строку в форме известной длины}

procedure processl(strl:strLtype; sim:char; var k:byte);

{входн данные: strl-строка с известной длиной, sim-заданный символ}

{выходные данные: k-координата...}

var

i:byte;{лок переменные: i-индекс символа строки}

begin

i:=1;

while (i<strl.len) and ((strl.strl[i]<>sim) or (strl.strl[i+1]<>sim)) do

begin

i:=i+1;

end;

if i=strl.len then k:=0 else k:=i;

end;

{вычисление координаты первого вхождения подстроки из 2-х одинаковых заданных}

{символов в данную строку в форме с меркером конца}

procedure processm(strl:strMtype; sim:char; var k:byte);

{входн данные: strl-строка с известной длиной, sim-заданный символ}

{выходные данные: k-координата...}

var

i:byte;{лок переменные: i-индекс символа строки}

begin

i:=1;

while (strl.strm[i]<>strl.mk) and ((strl.strm[i]<>sim) or (strl.strm[i+1]<>sim)) do

begin

i:=i+1;

end;

if strl.strm[i]=strl.mk then k:=0 else k:=i;

end;

{вывод строки в форме с изв длиной на экран и в файл}

procedure outL(var f:text; strl:strltype; k:integer; sim:char);

{входн данные: f-дескриптор вых файла, strl-строка с изв длиной}

{k-координаты...}

{вых данные: f-дескриптор вых файла, }

var

i:byte;{лок переменные: i-индекс символа строки}

begin

write('Для строки "');

write(f,'Для строки "');

for i:=1 to strl.len do

begin

write(strl.strl[i]);

write(f,strl.strl[i]);

end;

if (k=0) then

begin

writeln('" подстрока "',sim,sim,'" не содержится в ней.');

writeln(f,'" подстрока "',sim,sim,'" не содержится в ней.');

end else

begin

writeln('" координата первого вхождения подстроки "',sim,sim,'" равна ',k,'.');

writeln(f,'" координата первого вхождения подстроки "',sim,sim,'" равна ',k,'.');

end;

end;

procedure outM(var f:text; strl:strmtype; k:integer; sim:char);

{входн данные: f-дескриптор вых файла, strl-строка с маркером конца}

{k-координаты...}

{вых данные: f-дескриптор вых файла, }

var

i:byte;{лок переменные: i-индекс символа строки}

begin

write('Для строки "');

write(f,'Для строки "');

i:=1;

while (strl.strm[i]<>strl.mk) do

begin

write(strl.strm[i]);

write(f,strl.strm[i]);

i:=i+1;

end;

if (k=0) then

begin

writeln('" подстрока "',sim,sim,'" не содержится в ней.');

writeln(f,'" подстрока "',sim,sim,'" не содержится в ней.');

end else

begin

writeln('" координата первого вхождения подстроки "',sim,sim,'" равна ',k,'.');

writeln(f,'" координата первого вхождения подстроки "',sim,sim,'" равна ',k,'.');

end;

end;

var

strl:strltype;

strm:strmtype;

f,f1:text;

k:byte;

s,ch:char;

name_in,name_out:string;

Begin {Основная программа}

clrscr;

{write('Введите имя файла с исходным текстом: ');

readln(name_in);}

name_in:='koordin.txt';

assign(f,name_in);

{$I-}

reset(f);

{$I+}

if ioresult<>0 then

begin

writeln('Файл пуст. Конец работы.'); close(f);

end else

begin

writeln('Результаты будут выведены на экран и в файл.');

{write('Введите имя файла для вывода результатов: ');

readln(name_out);}

name_out:='koordout.txt';

assign(f1,name_out);

{$I-}

rewrite(f1);

{$I+}

if ioresult<>0 then

writeln('Не удается сформировать файл с результатом. Конец работы.')

else

begin

repeat

writeln('Выберите форму представления строки:');

writeln('L-форма с известной длиной,');

writeln('M-форма с маркером конца строки.');

readln(ch);

until (ch='l') or (ch='L') or (ch='m') or (ch='M');

if (ch='L') or (ch='l') then

begin

inputstrl(f,strl,s);

processl(strl,s,k);

outl(f1,strl,k,s)

end

else

begin

inputstrm(f,strm,s);

processm(strm,s,k);

outm(f1,strm,k,s)

end;

close(f);

close(f1);

write('Конец работы.');

{readkey;}

end;

end;

End.

4) Тестирование

Входные данные

Выходные данные

h

asddaa

Для строки "asddaa" подстрока "hh" не содержится в ней.

a

asddaa

Для строки "asddaa" координата первого вхождения подстроки "aa" равна 5.

a

aaaa

Для строки "aaaa" координата первого вхождения подстроки "aa" равна 1.

a

sfadasd

Для строки "sfadasd" подстрока "aa" не содержится в ней.

a

sfadaasd

Для строки "sfadaasd" координата первого вхождения подстроки "aa" равна 5.

a

sfadsdfddfsfgaa

Для строки "sfadsdfddfsfgaa" координата первого вхождения подстроки "aa" равна 14.

a

aahaajaakkkaa

Для строки "aahaajaakkkaa" координата первого вхождения подстроки "aa" равна 1.

a

fffcsffdsjcgnjskdfgcnjdfncgsdfgcjsnclnfdjgscndflcngnsckdfncgslgcngaa

Для строки "fffcsffdsjcgnjskdfgcnjdfncgsdfgcjsnclnfdjgscndflcngnsckdfncg" подстрока "aa" не содержится в ней.