- •Программирование и алгоритмические языки
- •Основные понятия процедурного программирования. Области и процедуры
- •Способы обозначения и определения процедур
- •Языки блок-схем
- •Трассировка программы
- •Структурное программирование
- •Программы, как файловые процедуры
- •Итерационные и рекуррентные последовательности
- •Восходящее и нисходящее программирование
- •Язык программирования Pascal
- •Процедурный Паскаль Синтаксис Паскаль-программы
- •Основные операторы
- •Классификация типов Простые (скалярные) типы
- •Стандартные типы
- •Пользовательские скалярные типы данных
- •Алгоритмическое определение булевских операций
- •Стратегия вычисления условий
- •Вычисление кванторов
- •Символьный тип
- •Производные(структурные) типы Массивы
- •Операции над массивами
- •Расширенный синтаксис. Массивы размерности n.
- •Строки. Динамические массивы.
- •Комбинированные типы и записи
- •Оператор присоединения
- •Типизированные файлы.
- •Упорядоченные файлы
- •Поиск в упорядоченном файле
- •Арифметика упорядоченных файлов
- •Дихотомический поиск в упорядоченном массиве
- •Простые алгоритмы сортировки
- •Множества
- •Операции над множествами
- •Решето Эратосфена
- •Подпрограммы. Пользовательские процедуры и функции
- •Синтаксис обращения к процедурам
- •Синтаксис использования или обращения к процедурам.
- •Семантика
- •Правила построения модифицированного тела:
- •Пользовательские процедуры (продолжение)
- •Подпрограммы и функции
- •Описание функции
- •Обращение к функции
Программирование и алгоритмические языки
Цель программирования – облегчение жизни людей путем автоматизации их деятельности, частичной замены человека автоматом, освобождение людей для принятия действительно творческих, ответственных решений.
Программирование – планирование поведения и строения такого автомата. Предполагает создание искусственных объектов – абстрактных моделей, имитирующих строение и поведение реальных.
Полушутя говорят, что математик делает то, что сможет так, как нужно – т.е. точно, надежно. Инженер делает то, что нужно – так, как сможет. Программист - инженер-математик. Он обязан делать то, что нужно, решать произвольные задачи автоматизации из произвольных сфер деятельности, причем делать это так как нужно.
Моделирование – задача любой науки. Судьба программиста - создание моделей на предельно точном, формальном, но очень бедном на обозначения языке.
Математический язык, используемый для описания реальной области – язык моделирования или язык спецификации.
Под изучением программирования обычно понимается изучение языков программирования - языков моделирования, ориентированных на исполнение машиной. Такая трактовка обоснована лишь, если включать в языки моделирования все языки спецификаций, а под изучением не только приобретение навыков использования языковых конструкций на наивном и интуитивном уровне, но и однозначного понимания их смысла – для произвольного языка программирования.
Как в математике и лингвистические определения, относящиеся к обозначениям, имена объектов принято относить к синтаксису, а определения, относящиеся к смыслу понятий – к семантике. Вопрос наилучшего использования языка есть предмет прагматики.
Как правильно понимать? – семантика
Для понимания конструкций одного языка мы описываем их смысл в терминах другого языка (языка описания или метаязыка).
Для программиста особенно важен случай, когда метаязык существенно беднее описываемого языка (как в случае толкования слов в «толковом словаре»). В этих случаях говорят о трансляции или редукции выражений одного языка на выражения другого языка. Такой перевод с очень богатого языка на очень бедный возможен лишь, как постепенный, последовательный процесс.
Основные понятия процедурного программирования. Области и процедуры
При описании объектов и процессов мы обычно выделяем статику и динамику.
При описании статики – фиксированного, неподвижного состояния вещей, допустимых в разные моменты времени, мы выделяем один или несколько атрибутов - характеристик, параметров. Каждое фиксированное распределение значений параметров определяет некоторое состояние объекта.
Каждое состояние подразумевает некоторое соответствие между совокупностью имен (характеристик) и множеством их возможных значений. С точки зрения математики состояние – это функция, областью определения которой служит множество имен атрибутов, а множеством значений – множество возможных значений. Что может служить множеством имен, а что множеством значений? – все, что угодно.
Динамика (изменение вещей) описывается преобразованиями состояний. С точки зрения математики описание динамики – это снова определение функции. Множеством значений и определений этой функции является множество всевозможных состояний объекта. Функции «высших порядков», аргументами и/или значениями которых служат функции, в математике принято называть операторами.
В программировании для описания преобразований также принят термин процедура, подчеркивающий не совсем классическую трактовку понятия функции как абстракции алгоритма - метода, правила вычисления.
Классическое понятие функции как соответствия между двумя множествами выделяет результат такого абстрагирования – описание некоторого, в общем случае длительного и сложно организованного процесса преобразования с точностью до аргументов и результатов, что чаще трактуется как его начало и конец, начальное и конечное состояние. Дай мне аргументы – я верну тебе результаты, но скрою то, как я это делаю.
В математических терминах любой объект можно описать множеством допустимых состояний и классом допустимых преобразований состояний (операторов). Такое математическое описание объектов называют областью или доменом, пространством, типом данных или классом.
Помимо общей цели моделирования, каждый из терминов имеет и свою специфику в разных областях математики и программирования.
Классической пример пространств – арифметика натуральных, рациональных или вещественных чисел. Так, под арифметикой натуральных чисел мы понимаем множество натуральных чисел, рассматриваемых совместно с арифметическими операциями. Обычно в математике наличие соответствующих функций подразумевается неявно. В программировании явное выделение имеющихся в распоряжении программиста функций обязательно.
Пример моделирования
СВЕТОФОР
Состояния:
Наиболее очевидным кажется выделить единственный атрибут – цвет.
«Текущий цвет»
«Предыдущий цвет»
Область значений: {КРАСНЫЙ, ЖЕЛТЫЙ, ЗЕЛЕНЫЙ }
Значения будем выделять заглавными буквами, чтобы не путать их с именами.
Множество всех состояний светофора:
S1< ЖЕЛТЫЙ, КРАСНЫЙ >
S2< ЖЕЛТЫЙ, ЗЕЛЕНЫЙ >
S3< КРАСНЫЙ, ЖЕЛТЫЙ >
S4< ЗЕЛЕНЫЙ, ЖЕЛТЫЙ >
Класс процедур преобразований состояний светофора состоит из 4-х функций:
<ГОТОВЬСЯ>
<ОСТАНОВИСЬ>
<ЕЗЖАЙ>
<СТОЙ>
Готовься = {< ЖЕЛТЫЙ, КРАСНЫЙ > → < КРАСНЫЙ, ЖЕЛТЫЙ >}.
Иной вариант – определить единственную функцию, задающую следующее состояние светофора
Наша модель абстрактна как с содержательной точки зрения («с точки зрения программиста»), так и с формальной («с точки зрения компьютера»). С точки зрения программиста она описывает абстрактный объект, т.е. все возможные в мире светофоры. С формальной точки зрения компьютера важно лишь то, что в модели 4 разных состояния и 4 функции, а не то, как они называются. Формальный смысл не изменится, если переименовать атрибуты.