- •Программирование и алгоритмические языки
- •Основные понятия процедурного программирования. Области и процедуры
- •Способы обозначения и определения процедур
- •Языки блок-схем
- •Трассировка программы
- •Структурное программирование
- •Программы, как файловые процедуры
- •Итерационные и рекуррентные последовательности
- •Восходящее и нисходящее программирование
- •Язык программирования Pascal
- •Процедурный Паскаль Синтаксис Паскаль-программы
- •Основные операторы
- •Классификация типов Простые (скалярные) типы
- •Стандартные типы
- •Пользовательские скалярные типы данных
- •Алгоритмическое определение булевских операций
- •Стратегия вычисления условий
- •Вычисление кванторов
- •Символьный тип
- •Производные(структурные) типы Массивы
- •Операции над массивами
- •Расширенный синтаксис. Массивы размерности n.
- •Строки. Динамические массивы.
- •Комбинированные типы и записи
- •Оператор присоединения
- •Типизированные файлы.
- •Упорядоченные файлы
- •Поиск в упорядоченном файле
- •Арифметика упорядоченных файлов
- •Дихотомический поиск в упорядоченном массиве
- •Простые алгоритмы сортировки
- •Множества
- •Операции над множествами
- •Решето Эратосфена
- •Подпрограммы. Пользовательские процедуры и функции
- •Синтаксис обращения к процедурам
- •Синтаксис использования или обращения к процедурам.
- •Семантика
- •Правила построения модифицированного тела:
- •Пользовательские процедуры (продолжение)
- •Подпрограммы и функции
- •Описание функции
- •Обращение к функции
Алгоритмическое определение булевских операций
Отрицание
Конъюнкция
a) b)
Эти 2 определения блок-схем не эквивалентны, если рассматривать неопределенное значение переменных.
b1=false b2=0.
Вторая блок-схема соответствует классическому определению конъюнкции: если хотя бы один из элементов функции не определен, то и функция не определена.
Вариант «а» дает так называемое быстрое означивание конъюнкции. Строго говоря, это другая, отличная от конъюнкции операция, которая часто обозначается “cand” или условный (conditional and, но не в паскале). В паскале обозначение and используется для обеих операций. Точная семантика реализуется директивой компилятора. {$B±}
Пример: найти номер заданного значения в последовательности из n чисел
Вариант 1
i:=1; while (i≤n) and (a[i]=x) do i:=i+1;
i:=1; read(a); while (i≤n) and (a=x) do begin
read(a);
i:=i+1;
end;
i≤n) and (a[i]=x)
Рекомендации: не полагаться на разную семантику булевских операций, не допускать неопределенности выражений. Те же соображения приложимы к определению дизъюнкции, true or 0.
Замечания по программированию условий:
Упрощение отрицания not(not_b)=b
not(b1 and b2)=not b1 or not b2
not(b1 or b2)=not b1 and not b2
Удобство применения булевских выражений: можно избегать многочисленных вложений условных операторов, делая алгоритмы еще более линейными.
Пример: линейный поиск.
Program poisk4(input,output);
Var a,x:integer;
found:boolean;
begin
found:=false;
read(x);
while not eof() and not found do
begin
read(a);
if x=a then found:=true;
end;
end.
Стратегия вычисления условий
Написание достаточно сложных условий само по себе требует некоторой системы.
Стратегия: разбить область на выпуклые фигуры, принадлежность точки к каждой из таких фигур определяется уравнением каждой из границ.
b:= (принадлежит сектору 1) or (принадлежит сектору 2) or (принадлежит треуг)
Принадлежит сектору 1:= (y>=x+1) and (sqr(x)+sqr(y)<=1)
Принадлежит сектору 2:= (y>-x-1) and (sqr(x)+sqr(y)<=1).
Принадлежит треугольнику:= (abs(y)<=x) and (x<=1).
Замечание: эта стратегия иллюстрирует важный факт в математической логике. Любое свойство можно записать в виде дизъюнкции элементарных конъюнкций.
Вычисление кванторов
Полный язык математической логики содержит кроме перечисленных выше булевских операций кванторные операции.
Зафиксируем некоторое перечисление элементов множества X:
X={x1, x2, x3, …}
x X B(x)=B(x1) and B(x2) and B(x3) …
x X B(x)=B(x1) or B(x2) or B(x3) …
Рекуррентное определение кванторов
{b=xX B(x)}
b0:=true
bi+1:=bi and b(xi+1)
b:=true
i:=1
while (i<=n) and b do begin
if not B(xi+1) then b:=false;
i:=i+1;
end;
Выяснить, является ли данная последовательность упорядоченной
Begin
assign(f,’input.txt’);
reset(f);
b:=true;
if eof(f)=false then
begin
read(f,ao);
while(eof(f)=false) and b do
begin
read(f,a);
if ao<=a then ao:=a
else b:=false;
end;
end;
writeln(b);
close(f);
End.
Пример вычисления квантора существования – задача поиска.
b:= i[1..n] (x=ai