- •Общая функциональная схема эвм
- •Языки программирования
- •Этапы решения задач на эвм
- •Понятие алгоритма и его свойства
- •Типы алгоритмов
- •Ос эвм. Понятие о файловой системе
- •Команды ms dos
- •Программирование на языке паскаль
- •Структура программы на языке паскаль
- •Описание данных
- •1. Константы
- •2. Переменные
- •Комментарии
- •Операторы языка паскаль
- •Операторы обработки данных
- •1. Операторы ввода
- •2. Операторы вывода
- •3. Вычисление по формулам. Оператор присваивания
- •Линейные программы
- •Управляющие операторы
- •1. Разветвляющиеся алгоритмы. Оператор if (если)
- •2. Пример разветвляющейся программы
- •3. Оператор case
- •Циклические алгоритмы и программы
- •1. Общая схема цикла
- •2. Циклы со счетчиком
- •3. Итерационные циклы
- •3.1. Оператор цикла с пост-условием
- •3.2. Оператор цикла с пред-условием
- •Tипы данных, используемых в паскале
- •1.Представление данных в эвм
- •2. Стандартные функции Паскаля и Турбо Паскаля
- •3. Булевские переменные и выражения
- •4.Функции для работы с символами
- •5. Массивы
- •Примеры программ обработки массивов
- •Особенности алгоритмов и программ с накапливанием
- •Алгоритм нахождения минимума и максимума
- •Задача сортировки
- •Обработка многомерных массивов
- •Итерационные циклы
- •Типовые алгоритмы с итерационными циклами
- •1. Приближенное вычисление функций
- •2. Решение уравнений приближенными методами
- •2.1. Метод Ньютона
- •Программы обработки строк символов (текстов)
- •1. Простейшие алгоритмы и программы обработки строк
- •Типовые программы обработки строк
- •Задача 1 выделения слов из текста (слова разделены одним пробелом)
- •Задача 2 выделения слов из текста (слова разделены несколькими пробелами)
- •Алгоритмы поиска
- •Алгоритм линейного поиска
- •Библиографический список
- •Содержание
Задача 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;
