Часть 1. Объектно-ориентированное программирование
Тем: 2
Тема 1. Программирование по контракту
Содержание
- Контракты кода
- Пред- и постусловия
- Операторы присваивания, композиции, ветвления, цикла
- Стратегии доказательств
- Контракты функций
- Чистые функции
- Хранимое состояние и инварианты
Примеры
zipДомашнее задание 1. Обработка ошибок
-
Добавьте в программу, вычисляющую выражения, обработку ошибок, в том числе:
- ошибки разбора выражений;
- ошибки вычисления выражений.
-
Для выражения
1000000*x*x*x*x*x/(x-1)
вывод программы должен иметь следующий вид:x f 0 0 1 division by zero 2 32000000 3 121500000 4 341333333 5 overflow 6 overflow 7 overflow 8 overflow 9 overflow 10 overflow
Результатdivision by zero
(overflow
) означает, что в процессе вычисления произошло деление на ноль (переполнение). - При выполнении задания следует обратить внимание на дизайн и обработку исключений.
- Человеко-читаемые сообщения об ошибках должны выводиться на консоль.
- Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).
Домашнее задание 2. Вычисление в различных типах
Добавьте в программу разбирающую и вычисляющую выражения трех переменных поддержку вычисления в различных типах.
Создайте класс
expression.generic.GenericTabulator
, реализующий интерфейсexpression.generic.Tabulator
:public interface Tabulator { Object[][][] tabulate( String mode, String expression, int x1, int x2, int y1, int y2, int z1, int z2 ) throws Exception; }
Аргументы
mode
— режим работыРежим Тип i
int
с детекцией переполненийd
double
bi
BigInteger
expression
— вычисляемое выражение;x1
,x2
;y1
,y2
;z1
,z2
— диапазоны изменения переменных (включительно).
Возвращаемое значение — таблица значений функции, где
R[i][j][k]
соответствуетx = x1 + i
,y = y1 + j
,z = z1 + k
. Если вычисление завершилось ошибкой, в соответствующей ячейке должен бытьnull
.-
Доработайте интерфейс командной строки:
-
Первым аргументом командной строки программа должна принимать указание
на тип, в котором будут производится вычисления:
Опция Тип -i
int
с детекцией переполнений-d
double
-bi
BigInteger
- Вторым аргументом командной строки программа должна принимать выражение для вычисления.
- Программа должна выводить результаты вычисления для всех целочисленных значений переменных из диапазона −2..2.
-
Первым аргументом командной строки программа должна принимать указание
на тип, в котором будут производится вычисления:
- Реализация не должна содержать непроверяемых преобразований типов.
-
Реализация не должна использовать аннотацию
@SuppressWarnings
. - При выполнении задания следует обратить внимание на простоту добавления новых типов и операций.
Домашнее задание 3. Бинарный поиск
- Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
-
На вход подается целое число
x
и массив целых чиселa
, отсортированный по невозрастанию. Требуется найти минимальное значение индексаi
, при которомa[i] <= x
. -
Для
main
, функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара. -
Интерфейс программы.
- Имя основного класса —
search.BinarySearch
. - Первый аргумент командной строки — число
x
. - Последующие аргументы командной строки — элементы массива
a
.
- Имя основного класса —
-
Пример запуска:
java search.BinarySearch 3 5 4 3 2 1
. Ожидаемый результат:2
.
Библиография
Тема 2. Реализация ООП
Содержание
- Классы
- Инвариант класса
- Задачи инкапсуляции
- Интерфейсы
- Интерфейс как синтаксический контракт
- Интерфейс как семантический контракт
- Абстрактные базовые классы и наследование
- Устранение дублирования
- Вынос изменяемой логики в наследников
Домашнее задание 4. Очередь на массиве
-
Определите модель и найдите инвариант структуры данных
«очередь».
- Определите функции, которые необходимы для реализации очереди.
-
Найдите их пред- и постусловия, если очередь не может содержать
null
.
-
Реализуйте классы, представляющие циклическую очередь
на основе массива.
-
Класс
ArrayQueueModule
должен реализовывать один экземпляр очереди с использованием переменных класса. -
Класс
ArrayQueueADT
должен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди). -
Класс
ArrayQueue
должен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди). -
Должны быть реализованы следующие функции (процедуры) / методы:
enqueue
– добавить элемент в очередь;element
– первый элемент в очереди;dequeue
– удалить и вернуть первый элемент в очереди;size
– текущий размер очереди;isEmpty
– является ли очередь пустой;clear
– удалить все элементы из очереди.
- Модель, инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
- Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях.
-
Класс
- Напишите простые тесты к реализованным классам.
-
Классы
ArrayQueueADT
иArrayQueue
должны быть параметризованы и типобезопастны.
Примеры
zipЭкзаменационные вопросы
- Пре- и постусловия, инварианты
- Интерфейсы
- Абстрактные базовые классы
- Принцип подстановки Лисков
Практические навыки
- Реализация программ на Java с применением интерфейсов и абстрактных базовых классов
Часть 2. Введение в JavaScript
Тем: 3
Тема 3. Функции
Содержание
- JavaScript и Java
- Появление и история JavaScript/ECMAScript
- Связь с Java
- Различия с Java
- Strict mode
- Переменные и типы
- Объявление переменных
- Типы значений
- Массивы
- Простые функции
- Синтаксис объвления
- Передача аргументов
- Способы вызова
- Стрелочные функции
- Функции высших порядков
- Примеры
- Сортировка
- Компараторы
- Составные компараторы
- Функциональные интерфейсы
- Комбинаторы
- foldLeft, foldRight
- map
- Композиция
- Карринг
- Примеры
Тема 4. Объекты и замыкания
Содержание
- Объекты
- Объекты как ассоциативные массивы
- Свойства
- Изменение свойств
- Неопределенные свойства
- Строки как индексы
- Сокращенная запись
- Проверка наличия свойства
- Перечисление свойств
- Наследование
- Создание объектов (Object.create)
- Получение прототипа (Object.getPrototypeOf)
- Наследование свойств
- Переопределение свойств
- Удаление свойств
- Методы
- Функции в свойствах
- Наследование функций
- Aliasing
- Неявная передача this
- Явная передача this
- Конструкторы
- Фабрики
- Конструкторы
- Прототипы в конструкторах
- Явное создание объекта и вызов конструктора
- Получение конструктора
- Объекты как ассоциативные массивы
- Замыкания
- Хранение состояния в замыкании
- Замыкание изменяемых переменных
- Трюк с объявлением промежуточной функции
- Общее состояние нескольких функций
- Модули
- Определение модуля
- Определение конструкторов
- Определение функций
- Использования модуля
- Прямое использование
- Импортирование
- Переменные класса
- Определение модуля
Тема 5. Что еще есть в JavaScript
Содержание
- Обработка ошибок
- Стандартные ошибки
- Try-catch-finally
- Что можно бросить
- Пользовательские исключения
- Нет такой вещи как...
- Глобальные переменные
- Предопределенные значения
- Блочные переменные
- Реализация замыканий
- Стандартная библиотека
- Основные типы
- Основные функции
- eval
- parseInt/Float
- isNaN/Finite
- Составные типы
- Объекты
- Функции
- Массивы
- Строки
- Boolean
- Number
- Date
- RegExp
- Встроенные ошибки
- Error
- RangeError
- ReferenceError
- SyntaxError
- TypeError
- URIError
- Наборы функций
- Math
- JSON
- Классы и методы
- Свойства-методы
- Getters и setters
- Классы
- Наследование
- Javascript 6+
- Шаблонные строки
- Set и Map
- Модули
- Свойства (не рассказывалось)
- Определение свойств
- Атрибуты свойств: enumerable, writable, configurable
- Атрибуты свойств: value, get, set
- Атрибуты объектов: extensible, seal/isSealed, freeze/isFrozen
Часть 3. Введение в Clojure
Тем: 5
Тема 6. Функции
Содержание
- Выражения и переменные
- Константы
- Функции
- Фиксированной арности
- Произвольной арности
- Переменные
- Определение
- Функции как значения
- Примитивные типы
- Приведение типов
- Функции
- Определение функции
- Рекурсивные функции
- Общая рекурсия
- Хвостовая рекурсия
- Оптимизация хвостовой рекурсии
- Контракты
- Списки
- Литералы
- Создание
- Операции
- Проверки
- Свертки
- Вектора
- Литералы
- Создание
- Операции
- Проверки
- Свертки
- Стандартные функции
Библиография
Тема 7. Внешний мир
Содержание
- Ввод-вывод
- Простейший ввод-вывод
- Работа с последовательностями событий
- Разбор ввода
- Разбор и гомоиконность
- Стандартный парсер
- Операции с кодом
- Исполнение сгенерированного кода
- Гомоиконность
- Подрядки вычисления
- Аппликативный
- Нормальный
- Ленивый
- Потоки
- Основные определения
- Операции с потоками
- Конечные потоки
- Бесконечные потоки
- Ленивые последовательности
- Отображения и множества
- Литералы
- Создание
- Проверки
- Операции
Библиография
Тема 8. Объекты
Содержание
- JS-подобные объекты
- Ассоциативные массивы и прототипы
- Свойства
- Методы
- Конструкторы
- Наследование
- Java-объекты
- Интерфейсы
- Реализация
- Изменяемые поля
- Работа с Java-классами
- Изменяемое состояние
- Динамические переменные
- Локальные переменные
- Ссылки
Библиография
- Clojure
- Clojure Cheat Sheet
- Daniel Higginbotham Clojure for the Brave and True (Chapters 10, 12)
Тема 9. Комбинаторные парсеры
Содержание
- Базовые концепции
- Результат разбора
- Интерфейс парсера
- Простейшие парсеры
- Простейшие комбинаторы парсеров
- Комбинаторы
- Вспомогательные методы
- Последовательности
- Альтернативы
- Регулярные замыкания
- Пример: JSON
- Простые парсеры
- Массивы
- Объекты
- Полный парсер
Библиография
Тема 10. Макросы и основания информатики
Содержание
- Макросы
- Генерация кода
- Синтаксические кавычки
- Пример: JS-подобные объекты
- Пример: разбор текста
- Кодирование Чёрча
- Булева алгебра
- Пары и списки
- Персистентная память
- Числа Чёрча
- Натуральные числа
- Арифметика
- Предикаты сравнения
- Числа со знаком
- Дальнейшие обобщения
Библиография
- Daniel Higginbotham Clojure for the Brave and True (Chapter 8)
- Yehonathan Sharvit Numbers and Arithmetics with functions only
- Yehonathan Sharvit Boolean Algebra
Часть 4. Введение в Prolog
Тем: 3
Тема 11. Факты, правила и вычисления
Содержание
- Факты и правила
- Термы
- Атомы
- Числа
- Структуры
- Факты
- Объявление
- Переменные
- Запросы
- Правила
- Объявление
- Простые
- Конъюнкция
- Дизъюнкция
- Отрицание
- Рекурсия
- Запросы
- Унификация
- Порядок выполнения
- Возвраты и отсечения
- Объявление
- Термы
- Вычисления
- Операторы и функции
- Рекурсивные вычисления
- Мемоизация
- Обратимые вычисления
- Списки
- Синтаксис
- Сопоставление с образцом
- Правила на списках
- Правила высшего порядка
Тема 12. Задачи, унификация и объекты
Содержание
- Задачи
- Задача о расстановке ферзей
- Загадка Эйнштейна
- Унификация и объекты
- Унификация
- Определение
- Наследование
- Мультиметоды
Тема 13. Разбор текста
Содержание
- Термы
- Преобразование в терм
- Обратное преобразование
- Списки символов
- Преобразование в список
- Преобразование списка в атом
- Обратное преобразование
- Грамматики
- Описание грамматики
- Преобразование в строку
- Обратное преобразование