Часть 1. Объектно-ориентированное программирование
Тем: 3
Тема 1. Программирование по контракту
Содержание
- Контракты кода
- Пред- и постусловия
- Операторы присваивания, композиции, ветвления, цикла
- Стратегии доказательств
- Контракты функций
- Чистые функции
- Хранимое состояние и инварианты
Примеры
zipДомашнее задание 1. Обработка ошибок
-
Разработайте классы
Checked*, выполняющие соответствующие операции с проверкой на переполнения и неверные аргументы. -
Добавьте в программу, вычисляющую выражения,
обработку ошибок, в том числе:
- ошибки разбора выражений;
- ошибки вычисления выражений.
-
Для выражения
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) означает, что в процессе вычисления произошло деление на ноль (переполнение). - При выполнении задания следует обратить внимание на дизайн и обработку исключений.
- Человеко-читаемые сообщения об ошибках должны выводиться на консоль.
- Программа не должна «падать» с исключениями (как стандартными, так и добавленными).
-
Код должен находиться в пакете
expression.exceptions.
Домашнее задание 2. Бинарный поиск
- Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
-
На вход подается целое число
xи массив целых чиселa, отсортированный по невозрастанию. Требуется найти минимальное значение индексаi, при которомa[i] ≤ x. -
Для
main, функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара. -
Интерфейс программы.
- Имя основного класса —
search.BinarySearch. - Первый аргумент командной строки — число
x. - Последующие аргументы командной строки — элементы массива
a.
- Имя основного класса —
-
Пример запуска:
java search.BinarySearch 3 5 4 3 2 1. Ожидаемый результат:2.
Библиография
- Дейкстра Э. Дисциплина программирования
- Мейер Б. Объектно-ориентированное конструирование программных систем
- Hoare C. An axiomatic basis for computer programming
Тема 2. Реализация ООП
Содержание
- Классы
- Инвариант класса
- Задачи инкапсуляции
- Интерфейсы
- Интерфейс как синтаксический контракт
- Интерфейс как семантический контракт
- Абстрактные базовые классы и наследование
- Устранение дублирования
- Вынос изменяемой логики в наследников
Домашнее задание 3. Очередь на массиве
-
Определите модель и найдите инвариант структуры данных
«очередь».
- Определите функции, которые необходимы для реализации очереди.
-
Найдите их пред- и постусловия, если очередь не может содержать
null.
-
Реализуйте классы, представляющие циклическую очередь
на основе массива.
-
Класс
ArrayQueueModuleдолжен реализовывать один экземпляр очереди с использованием переменных класса. -
Класс
ArrayQueueADTдолжен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди). -
Класс
ArrayQueueдолжен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди). -
Должны быть реализованы следующие функции (процедуры) / методы:
enqueue– добавить элемент в очередь;element– первый элемент в очереди;dequeue– удалить и вернуть первый элемент в очереди;size– текущий размер очереди;isEmpty– является ли очередь пустой;clear– удалить все элементы из очереди.
- Модель, инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
- Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях.
-
Класс
- Напишите простые тесты к реализованным классам.
Домашнее задание 4. Очереди
-
Определите интерфейс очереди
Queueи опишите его контракт. -
Реализуйте класс
LinkedQueue— очередь на связном списке. -
Выделите общие части классов
LinkedQueueиArrayQueueв базовый классAbstractQueue.
Это домашнее задание связано с предыдущим.
Примеры
zipЭкзаменационные вопросы
- Пре- и постусловия, инварианты
- Интерфейсы
- Абстрактные базовые классы
- Принцип подстановки Лисков
Практические навыки
- Реализация программ на Java с применением интерфейсов и абстрактных базовых классов
Тема 3. Generics
Содержание
- Введение в Generics
- Полиморфизм и его типы
- Generics и templates
- Применение Generics
- Реализация Generics
- Wildcards и ограниченные wildcards
- Параметры типов и ограниченные параметры типов
- Ограничения Generics и reifables
- Generics и вариантность
- Ко- и контрвариантность
- Источники и приемники
- Правило выбора extends и super
- Смешение Generic и не Generic кода
- Стирание информации о типе и сырые типы
- Добавление информации о типе и UncheckedWarning
Домашнее задание 5. Вычисление в различных типах
Добавьте в программу разбирающую и вычисляющую выражения трех переменных поддержку вычисления в различных типах.
Создайте класс
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— режим работыРежим Тип iintс детекцией переполненийddoublebiBigIntegerexpression— вычисляемое выражение;x1,x2;y1,y2;z1,z2— диапазоны изменения переменных (включительно).
Возвращаемое значение — таблица значений функции, где
R[i][j][k]соответствуетx = x1 + i,y = y1 + j,z = z1 + k. Если вычисление завершилось ошибкой, в соответствующей ячейке должен бытьnull.-
Доработайте интерфейс командной строки:
-
Первым аргументом командной строки программа должна принимать указание
на тип, в котором будут производиться вычисления:
Опция Тип -iintс детекцией переполнений-ddouble-biBigInteger - Вторым аргументом командной строки программа должна принимать выражение для вычисления.
- Программа должна выводить результаты вычисления для всех целочисленных значений переменных из диапазона −2..2.
-
Первым аргументом командной строки программа должна принимать указание
на тип, в котором будут производиться вычисления:
- Реализация не должна содержать непроверяемых преобразований типов.
-
Реализация не должна использовать аннотацию
@SuppressWarnings. - При выполнении задания следует обратить внимание на простоту добавления новых типов и операций.
Часть 2. Введение в JavaScript
Тем: 3
Тема 4. Функции
Содержание
- JavaScript и Java
- Появление и история JavaScript/ECMAScript
- Связь с Java
- Различия с Java
- Strict mode
- Переменные и типы
- Объявление переменных
- Типы значений
- Массивы
- Простые функции
- Синтаксис объявления
- Передача аргументов
- Способы вызова
- Стрелочные функции
- Функции высших порядков
- Примеры
- Сортировка
- Компараторы
- Составные компараторы
- Функциональные интерфейсы
- Комбинаторы
- foldLeft, foldRight
- map
- Композиция
- Карринг
- Примеры
Домашнее задание 6. Функциональные выражения на JavaScript
-
Разработайте функции
cnst,variable,add,subtract,multiply,divide,negateдля вычисления выражений с переменнойx. -
Функции должны позволять производить вычисления вида:
let expr = subtract( multiply( cnst(2), variable("x") ), cnst(3) ); println(expr(5));При вычислении выражения вместо переменнойxподставляется значение, переданное в качестве аргумента функцииexpr. Таким образом, результатом вычисления приведенного примера должно быть число 7. -
Тестовая программа должна вычислять выражение
x2−2x+1, дляxот 0 до 10. - Сложный вариант. Требуется дополнительно написать функцию
parse, осуществляющую разбор выражений, записанных в обратной польской записи. Например, результатомparse("x x 2 - * x * 1 +")(5)должно быть число76. -
При выполнении задания следует обратить внимание на:
- Применение функций высшего порядка.
- Выделение общего кода для операций.
Тема 5. Объекты и замыкания
Содержание
- Объекты
- Объекты как ассоциативные массивы
- Свойства
- Изменение свойств
- Неопределенные свойства
- Строки как индексы
- Сокращенная запись
- Проверка наличия свойства
- Перечисление свойств
- Наследование
- Создание объектов (Object.create)
- Получение прототипа (Object.getPrototypeOf)
- Наследование свойств
- Переопределение свойств
- Удаление свойств
- Методы
- Функции в свойствах
- Наследование функций
- Aliasing
- Неявная передача this
- Явная передача this
- Конструкторы
- Фабрики
- Конструкторы
- Прототипы в конструкторах
- Явное создание объекта и вызов конструктора
- Получение конструктора
- Объекты как ассоциативные массивы
- Замыкания
- Хранение состояния в замыкании
- Замыкание изменяемых переменных
- Трюк с объявлением промежуточной функции
- Общее состояние нескольких функций
- Модули
- Определение модуля
- Определение конструкторов
- Определение функций
- Использования модуля
- Прямое использование
- Импортирование
- Переменные класса
- Определение модуля
Домашнее задание 7. Объектные выражения на JavaScript
-
Разработайте классы
Const,Variable,Add,Subtract,Multiply,Divide,Negateдля представления выражений с тремя переменными:x,yиz.-
Пример описания выражения
2x-3:let expr = new Subtract( new Multiply( new Const(2), new Variable("x") ), new Const(3) ); println(expr.evaluate(5, 0, 0)); -
При вычислении такого выражения вместо каждой переменной
подставляется её значение, переданное в качестве аргумента
метода
evaluate. Таким образом, результатом вычисления приведенного примера должно стать число 7. -
Метод
toString()должен выдавать запись выражения в обратной польской записи. Например,expr.toString()должен выдавать «2 x * 3 -».
-
Пример описания выражения
-
Функция
parseдолжна осуществлять разбор выражений, записанных в обратной польской записи. Например, результатомparse("x x 2 - * x * 1 +").evaluate(5, 0, 0)должно быть число76, а результатомparse("x x 2 - * x * 1 +").toString()— строка «x x 2 - * x * 1 +». - Сложный вариант.Метод
diff("x")должен возвращать выражение, представляющее производную исходного выражения по переменнойx. Например,expr.diff("x")должен возвращать выражение, эквивалентноеnew Const(2). Выраженияnew Subtract(new Const(2), new Const(0))иnew Subtract( new Add( new Multiply(new Const(0), new Variable("x")), new Multiply(new Const(2), new Const(1)) ) new Const(0) )так же будут считаться правильным ответом. - Бонусный вариант.Требуется написать метод
simplify(), производящий вычисления константных выражений. Например,parse("x x 2 - * 1 +").diff("x").simplify().toString()должно возвращать «x x 2 - +» или аналогичное по сложности эквивалентное выражение. -
При выполнении задания следует обратить внимание на:
- Применение инкапсуляции.
- Выделение общего кода для операций.
- Минимизацию необходимой памяти.
Тема 6. Что еще есть в 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
Тема 7. Функции
Содержание
- Выражения и переменные
- Константы
- Функции
- Фиксированной арности
- Произвольной арности
- Переменные
- Определение
- Функции как значения
- Примитивные типы
- Приведение типов
- Функции
- Определение функции
- Рекурсивные функции
- Общая рекурсия
- Хвостовая рекурсия
- Оптимизация хвостовой рекурсии
- Контракты
- Списки
- Литералы
- Создание
- Операции
- Проверки
- Свертки
- Вектора
- Литералы
- Создание
- Операции
- Проверки
- Свертки
- Стандартные функции
Библиография
Тема 8. Внешний мир
Содержание
- Ввод-вывод
- Простейший ввод-вывод
- Работа с последовательностями событий
- Разбор ввода
- Разбор и гомоиконность
- Стандартный парсер
- Операции с кодом
- Исполнение сгенерированного кода
- Гомоиконность
- Подрядки вычисления
- Аппликативный
- Нормальный
- Ленивый
- Потоки
- Основные определения
- Операции с потоками
- Конечные потоки
- Бесконечные потоки
- Ленивые последовательности
- Отображения и множества
- Литералы
- Создание
- Проверки
- Операции
Библиография
Тема 9. Объекты
Содержание
- JS-подобные объекты
- Ассоциативные массивы и прототипы
- Свойства
- Методы
- Конструкторы
- Наследование
- Java-объекты
- Интерфейсы
- Реализация
- Изменяемые поля
- Работа с Java-классами
- Изменяемое состояние
- Динамические переменные
- Локальные переменные
- Ссылки
Библиография
- Clojure
- Clojure Cheat Sheet
- Daniel Higginbotham Clojure for the Brave and True (Chapters 10, 12)
Тема 10. Комбинаторные парсеры
Содержание
- Базовые концепции
- Результат разбора
- Интерфейс парсера
- Простейшие парсеры
- Простейшие комбинаторы парсеров
- Комбинаторы
- Вспомогательные методы
- Последовательности
- Альтернативы
- Регулярные замыкания
- Пример: JSON
- Простые парсеры
- Массивы
- Объекты
- Полный парсер
Библиография
Тема 11. Макросы и основания информатики
Содержание
- Макросы
- Генерация кода
- Синтаксические кавычки
- Пример: 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
Тема 12. Факты, правила и вычисления
Содержание
- Факты и правила
- Термы
- Атомы
- Числа
- Структуры
- Факты
- Объявление
- Переменные
- Запросы
- Правила
- Объявление
- Простые
- Конъюнкция
- Дизъюнкция
- Отрицание
- Рекурсия
- Запросы
- Унификация
- Порядок выполнения
- Возвраты и отсечения
- Объявление
- Термы
- Вычисления
- Операторы и функции
- Рекурсивные вычисления
- Мемоизация
- Обратимые вычисления
- Списки
- Синтаксис
- Сопоставление с образцом
- Правила на списках
- Правила высшего порядка
Тема 13. Задачи, унификация и объекты
Содержание
- Задачи
- Задача о расстановке ферзей
- Загадка Эйнштейна
- Унификация и объекты
- Унификация
- Определение
- Наследование
- Мультиметоды
Тема 14. Разбор текста
Содержание
- Термы
- Преобразование в терм
- Обратное преобразование
- Списки символов
- Преобразование в список
- Преобразование списка в атом
- Обратное преобразование
- Грамматики
- Описание грамматики
- Преобразование в строку
- Обратное преобразование