Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_МЕТ№1.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
180.74 Кб
Скачать

Задача 2 выделения слов из текста (слова разделены несколькими пробелами)

Условие.

Ввести в ЭВМ предложение, в котором слова могут быть разделены одним или несколькими пробелами. Выделить слова и вывести их на экран.

В этом случае задача осложняется тем, что номер слова необходимо менять только при встрече с первым пробелом, а все последующие пробелы – просто пропускать. Алгоритм будет отличаться от предыдущего, в основном, в части, связанной с обработкой пробелов.

Алгоритм к задаче 2:

1.1. Ввести предложение;

1.2. n := Длина предложения;

2.1. Номер слова (k) := 1;

2.2. Слово[k] := '';

2.3. Номер буквы (i) := 1;

2.4. ПОКА i <= n ПОВТОРЯТЬ

2.4.1. ЕСЛИ предл[i] <> ' ', ТО

Слово[k] := Слово[k] + предл[i];

i := i + 1

ИНАЧЕ

k := k + 1;

Слово[k] := ''

ПОКА (предл[i]=' ') И (i<=n) ВЫПОЛНЯТЬ

i = i + 1;

3.1. ДЛЯ i от 1 до k

вывести слово[i];

4. Закончить.

Приводимая ниже программа реализует рассмотренный алгоритм.

Program GetSl2;

const

m = 50;

Var

Predl: string;

Slovo: array [1..m] of string;

n,k,i: integer;

BEGIN

n:= Length(Predl);

k:= 1;

Slovo[k]:= '';

i:=1;

While i<=n do

If predl[i] <> ' ' then

begin

Slovo[k]:= slovo[k] + predl[i];

i:=i + 1;

end

Еlse

begin

k:=k + 1;

slovo[k] := '';

While (predl[i]=' ') and (i <= n) do

i:=i + 1;

end;

WriteLn('Результат : ');

For i := 1 to k do

WriteLn(slovo[i]);

END.

Алгоритмы поиска

Процедуры поиска широко используются в информационно-справочных системах (базах и банках данных), при разработке синтаксических анализаторов и компиляторов (поиск служебных слов, команд и т.п. в таблицах). В процессе поиска всегда используется таблица эталонов.

Рассмотрим алгоритм поиска на примере программы – словаря. Пусть в ЭВМ введена таблица-словарь из n русских и английских слов вида табл.4.

Таблица 4. Словарь

Русское слово

Английское слово

программа

оператор

метка

. . .

PROGRAM

STATEMENT

LABLE

. . .

Размер таблицы фиксирован и известен.

Таблица должна храниться в виде двух массивов слов, причем русскому слову с номером 3 ("слово") соответствует английское с таким же номером ("WORD") и т.д.

Далее при работе программы должны вводиться английские слова, а программа должна печатать их русские эквиваленты. Если слова в словаре нет, то печатается "не знаю". Перевод английского слова на русский язык осуществляется путем поиска его в таблице (словаре) и сравнения каждого английского слова из таблицы с новым словом. Если слово найдено, то перевод выполняется.

1. Простейший алгоритм поиска - линейный. При этом эталонный массив просматривается последовательно от первого до последнего элемента. Наиболее сложный случай, когда слово не найдено. Суждение об этом можно сделать только по окончании просмотра всего массива.

Алгоритм линейного поиска

1. Ввести два исходных массива слов (таблицу-словарь).

2. Пока нет признака конца,

ввести новое слово и отпечатать английское.

3. Закончить.

Пусть признак конца - слово "END".

Уточняем алгоритм:

1. Ввести два исходных массива слов (таблицу-словарь).

2.1. Новое слово :='';

2.2. ПОКА новое слово <> 'END' ВЫПОЛНЯТЬ

2.2.1. Ввести новое слово;

2.2.2. Номер русского слова := 0;

2.2.3. ДЛЯ номера исх. слова (i) от 1 до n ВЫПОЛНЯТЬ

ЕСЛИ новое слово = англ.сл.[i] ТО

номер русск. слова := i;

2.2.4. ЕСЛИ номер русск. слова (j) = 0 ТО

вывести: "не знаю",

ИНАЧЕ

вывести русское слово[i].

3. Закончить.

Программа линейного поиска будет иметь вид:

Обозначим:

Rsl - массив русских слов в словаре

Asl - массив английских слов в словаре

Ns - новое слово

Program Poisk;

Const

N = 100;

Var

Rsl, Asl: Array[1..n] of string;

Ns : String;

I, J : Integer;

BEGIN

Writeln('Введите словарь');

For I := 1 to N do

Begin

ReadLn(Rsl[I]);

ReadLn(Asl[I]);

End;

Ns:= '';

While Ns <> 'END' do

Begin

WriteLn('Введите слово. Для заверш. работы - слово END');

ReadLn(Ns);

J:=0;

For I := 1 to N do

If Ns=Asl[I] then

J:= I;

If J = 0 then

Writeln('Не знаю')

Else

Writeln(Rsl[J]);

End;

END.

Основной недостаток алгоритма линейного поиска – большое время. При использовании оператора For для поиска ВСЕГДА выполняется ровно n операций сравнения, не зависимо от того, найдено слово или нет. Более того, программа, обнаружив слово в начале словаря, продолжает просмотр словаря до конца, т.е. выполняет бесполезную работу. Время поиска может быть существенно сокращено, если обеспечить его прекращение, когда слово найдено.

В рассмотренном ранее алгоритме для этого необходимо изменить пункт 2.2.

Он будет иметь вид:

2.2. ПОКА новое слово <> 'END' ВЫПОЛНЯТЬ

2.2.1. Ввести новое слово

2.2.2. Номер русского слова =0

2.2.3. Номер в таблице i=1

2.2.4. Пока (j=0) и (i<=n) выполнять

2.2.4.1. Если новое слово= англ.сл.[i], то j=i

2.2.4.2. i=i+1

2.2.5. Если j=0, то вывести "не знаю",

иначе вывести русское слово;

Соответствующий фрагмент программы приведен ниже.

{ Поиск }

While Ns <> 'END' do

Begin

WriteLn('Введите слово. Для заверш. работы - слово END');

ReadLn(Ns);

J:=0;

I := 1;

While (J=0) And (I<=N) do

Begin

If Ns=Asl[I] then

J := I;

I:=I+1;

End;

If J = 0 then

Writeln('Не знаю')

Else

Writeln(Rsl[J]);

End;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]