План курса

Часть 1. Объектно-ориентированное программирование

Тем: 2

Тема 1. Программирование по контракту

Содержание

  1. Контракты кода
    1. Пред- и постусловия
    2. Операторы присваивания, композиции, ветвления, цикла
    3. Стратегии доказательств
  2. Контракты функций
    1. Чистые функции
    2. Хранимое состояние и инварианты

Слайды

HTML

Примеры

zip

Домашнее задание 1. Обработка ошибок

  1. Добавьте в программу, вычисляющую выражения, обработку ошибок, в том числе:
    • ошибки разбора выражений;
    • ошибки вычисления выражений.
  2. Для выражения 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) означает, что в процессе вычисления произошло деление на ноль (переполнение).
  3. При выполнении задания следует обратить внимание на дизайн и обработку исключений.
  4. Человеко-читаемые сообщения об ошибках должны выводиться на консоль.
  5. Программа не должна «вылетать» с исключениями (как стандартными, так и добавленными).

Репозиторий курса

Домашнее задание 2. Вычисление в различных типах

Добавьте в программу разбирающую и вычисляющую выражения трех переменных поддержку вычисления в различных типах.

  1. Создайте класс 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 с детекцией переполнений
      ddouble
      biBigInteger
    • expression — вычисляемое выражение;
    • x1, x2; y1, y2; z1, z2 — диапазоны изменения переменных (включительно).

    Возвращаемое значение — таблица значений функции, где R[i][j][k] соответствует x = x1 + i, y = y1 + j, z = z1 + k. Если вычисление завершилось ошибкой, в соответствующей ячейке должен быть null.

  2. Доработайте интерфейс командной строки:
    • Первым аргументом командной строки программа должна принимать указание на тип, в котором будут производится вычисления:
      ОпцияТип
      -iint с детекцией переполнений
      -ddouble
      -biBigInteger
    • Вторым аргументом командной строки программа должна принимать выражение для вычисления.
    • Программа должна выводить результаты вычисления для всех целочисленных значений переменных из диапазона −2..2.
  3. Реализация не должна содержать непроверяемых преобразований типов.
  4. Реализация не должна использовать аннотацию @SuppressWarnings.
  5. При выполнении задания следует обратить внимание на простоту добавления новых типов и операций.

Домашнее задание 3. Бинарный поиск

  1. Реализуйте итеративный и рекурсивный варианты бинарного поиска в массиве.
  2. На вход подается целое число x и массив целых чисел a, отсортированный по невозрастанию. Требуется найти минимальное значение индекса i, при котором a[i] <= x.
  3. Для main, функций бинарного поиска и вспомогательных функций должны быть указаны, пред- и постусловия. Для реализаций методов должны быть приведены доказательства соблюдения контрактов в терминах троек Хоара.
  4. Интерфейс программы.
    • Имя основного класса — search.BinarySearch.
    • Первый аргумент командной строки — число x.
    • Последующие аргументы командной строки — элементы массива a.
  5. Пример запуска: java search.BinarySearch 3 5 4 3 2 1. Ожидаемый результат: 2.

Тема 2. Реализация ООП

Содержание

  1. Классы
    1. Инвариант класса
    2. Задачи инкапсуляции
  2. Интерфейсы
    1. Интерфейс как синтаксический контракт
    2. Интерфейс как семантический контракт
  3. Абстрактные базовые классы и наследование
    1. Устранение дублирования
    2. Вынос изменяемой логики в наследников

Слайды

HTML

Домашнее задание 4. Очередь на массиве

  1. Определите модель и найдите инвариант структуры данных «очередь».
    • Определите функции, которые необходимы для реализации очереди.
    • Найдите их пред- и постусловия, если очередь не может содержать null.
  2. Реализуйте классы, представляющие циклическую очередь на основе массива.
    • Класс ArrayQueueModule должен реализовывать один экземпляр очереди с использованием переменных класса.
    • Класс ArrayQueueADT должен реализовывать очередь в виде абстрактного типа данных (с явной передачей ссылки на экземпляр очереди).
    • Класс ArrayQueue должен реализовывать очередь в виде класса (с неявной передачей ссылки на экземпляр очереди).
    • Должны быть реализованы следующие функции (процедуры) / методы:
      • enqueue – добавить элемент в очередь;
      • element – первый элемент в очереди;
      • dequeue – удалить и вернуть первый элемент в очереди;
      • size – текущий размер очереди;
      • isEmpty – является ли очередь пустой;
      • clear – удалить все элементы из очереди.
    • Модель, инвариант, пред- и постусловия записываются в исходном коде в виде комментариев.
    • Обратите внимание на инкапсуляцию данных и кода во всех трех реализациях.
  3. Напишите простые тесты к реализованным классам.
  4. Классы ArrayQueueADT и ArrayQueue должны быть параметризованы и типобезопастны.

Примеры

zip

Экзаменационные вопросы

  1. Пре- и постусловия, инварианты
  2. Интерфейсы
  3. Абстрактные базовые классы
  4. Принцип подстановки Лисков

Практические навыки

  1. Реализация программ на Java с применением интерфейсов и абстрактных базовых классов

Часть 2. Введение в JavaScript

Тем: 3

Тема 3. Функции

Содержание

  1. JavaScript и Java
    1. Появление и история JavaScript/ECMAScript
    2. Связь с Java
    3. Различия с Java
    4. Strict mode
  2. Переменные и типы
    1. Объявление переменных
    2. Типы значений
    3. Массивы
  3. Простые функции
    1. Синтаксис объвления
    2. Передача аргументов
    3. Способы вызова
    4. Стрелочные функции
  4. Функции высших порядков
    1. Примеры
      1. Сортировка
      2. Компараторы
      3. Составные компараторы
      4. Функциональные интерфейсы
    2. Комбинаторы
      1. foldLeft, foldRight
      2. map
      3. Композиция
      4. Карринг

Тема 4. Объекты и замыкания

Содержание

  1. Объекты
    1. Объекты как ассоциативные массивы
      1. Свойства
      2. Изменение свойств
      3. Неопределенные свойства
      4. Строки как индексы
      5. Сокращенная запись
      6. Проверка наличия свойства
      7. Перечисление свойств
    2. Наследование
      1. Создание объектов (Object.create)
      2. Получение прототипа (Object.getPrototypeOf)
      3. Наследование свойств
      4. Переопределение свойств
      5. Удаление свойств
    3. Методы
      1. Функции в свойствах
      2. Наследование функций
      3. Aliasing
      4. Неявная передача this
      5. Явная передача this
    4. Конструкторы
      1. Фабрики
      2. Конструкторы
      3. Прототипы в конструкторах
      4. Явное создание объекта и вызов конструктора
      5. Получение конструктора
  2. Замыкания
    1. Хранение состояния в замыкании
    2. Замыкание изменяемых переменных
    3. Трюк с объявлением промежуточной функции
    4. Общее состояние нескольких функций
  3. Модули
    1. Определение модуля
      1. Определение конструкторов
      2. Определение функций
    2. Использования модуля
      1. Прямое использование
      2. Импортирование
      3. Переменные класса

Тема 5. Что еще есть в JavaScript

Содержание

  1. Обработка ошибок
    1. Стандартные ошибки
    2. Try-catch-finally
    3. Что можно бросить
    4. Пользовательские исключения
  2. Нет такой вещи как...
    1. Глобальные переменные
    2. Предопределенные значения
    3. Блочные переменные
    4. Реализация замыканий
  3. Стандартная библиотека
    1. Основные типы
    2. Основные функции
      1. eval
      2. parseInt/Float
      3. isNaN/Finite
    3. Составные типы
      1. Объекты
      2. Функции
      3. Массивы
      4. Строки
      5. Boolean
      6. Number
      7. Date
      8. RegExp
    4. Встроенные ошибки
      1. Error
      2. RangeError
      3. ReferenceError
      4. SyntaxError
      5. TypeError
      6. URIError
    5. Наборы функций
      1. Math
      2. JSON
  4. Классы и методы
    1. Свойства-методы
    2. Getters и setters
    3. Классы
    4. Наследование
  5. Javascript 6+
    1. Шаблонные строки
    2. Set и Map
    3. Модули
  6. Свойства (не рассказывалось)
    1. Определение свойств
    2. Атрибуты свойств: enumerable, writable, configurable
    3. Атрибуты свойств: value, get, set
    4. Атрибуты объектов: extensible, seal/isSealed, freeze/isFrozen

Часть 3. Введение в Clojure

Тем: 5

Тема 6. Функции

Содержание

  1. Выражения и переменные
    1. Константы
    2. Функции
      1. Фиксированной арности
      2. Произвольной арности
    3. Переменные
      1. Определение
      2. Функции как значения
    4. Примитивные типы
    5. Приведение типов
  2. Функции
    1. Определение функции
    2. Рекурсивные функции
      1. Общая рекурсия
      2. Хвостовая рекурсия
      3. Оптимизация хвостовой рекурсии
    3. Контракты
  3. Списки
    1. Литералы
    2. Создание
    3. Операции
    4. Проверки
    5. Свертки
  4. Вектора
    1. Литералы
    2. Создание
    3. Операции
    4. Проверки
    5. Свертки
  5. Стандартные функции

Тема 7. Внешний мир

Содержание

  1. Ввод-вывод
    1. Простейший ввод-вывод
    2. Работа с последовательностями событий
    3. Разбор ввода
  2. Разбор и гомоиконность
    1. Стандартный парсер
    2. Операции с кодом
    3. Исполнение сгенерированного кода
    4. Гомоиконность
  3. Подрядки вычисления
    1. Аппликативный
    2. Нормальный
    3. Ленивый
  4. Потоки
    1. Основные определения
    2. Операции с потоками
    3. Конечные потоки
    4. Бесконечные потоки
    5. Ленивые последовательности
  5. Отображения и множества
    1. Литералы
    2. Создание
    3. Проверки
    4. Операции

Тема 8. Объекты

Содержание

  1. JS-подобные объекты
    1. Ассоциативные массивы и прототипы
    2. Свойства
    3. Методы
    4. Конструкторы
    5. Наследование
  2. Java-объекты
    1. Интерфейсы
    2. Реализация
    3. Изменяемые поля
    4. Работа с Java-классами
  3. Изменяемое состояние
    1. Динамические переменные
    2. Локальные переменные
    3. Ссылки

Тема 9. Комбинаторные парсеры

Содержание

  1. Базовые концепции
    1. Результат разбора
    2. Интерфейс парсера
    3. Простейшие парсеры
    4. Простейшие комбинаторы парсеров
  2. Комбинаторы
    1. Вспомогательные методы
    2. Последовательности
    3. Альтернативы
    4. Регулярные замыкания
  3. Пример: JSON
    1. Простые парсеры
    2. Массивы
    3. Объекты
    4. Полный парсер

Тема 10. Макросы и основания информатики

Содержание

  1. Макросы
    1. Генерация кода
    2. Синтаксические кавычки
    3. Пример: JS-подобные объекты
    4. Пример: разбор текста
  2. Кодирование Чёрча
    1. Булева алгебра
    2. Пары и списки
    3. Персистентная память
  3. Числа Чёрча
    1. Натуральные числа
    2. Арифметика
    3. Предикаты сравнения
    4. Числа со знаком
    5. Дальнейшие обобщения

Библиография

  1. Daniel Higginbotham Clojure for the Brave and True (Chapter 8)
  2. Yehonathan Sharvit Numbers and Arithmetics with functions only
  3. Yehonathan Sharvit Boolean Algebra

Часть 4. Введение в Prolog

Тем: 3

Тема 11. Факты, правила и вычисления

Содержание

  1. Факты и правила
    1. Термы
      1. Атомы
      2. Числа
      3. Структуры
    2. Факты
      1. Объявление
      2. Переменные
      3. Запросы
    3. Правила
      1. Объявление
        1. Простые
        2. Конъюнкция
        3. Дизъюнкция
        4. Отрицание
        5. Рекурсия
      2. Запросы
        1. Унификация
        2. Порядок выполнения
        3. Возвраты и отсечения
  2. Вычисления
    1. Операторы и функции
    2. Рекурсивные вычисления
    3. Мемоизация
    4. Обратимые вычисления
  3. Списки
    1. Синтаксис
    2. Сопоставление с образцом
    3. Правила на списках
    4. Правила высшего порядка

Тема 12. Задачи, унификация и объекты

Содержание

  1. Задачи
    1. Задача о расстановке ферзей
    2. Загадка Эйнштейна
  2. Унификация и объекты
    1. Унификация
    2. Определение
    3. Наследование
    4. Мультиметоды

Тема 13. Разбор текста

Содержание

  1. Термы
    1. Преобразование в терм
    2. Обратное преобразование
  2. Списки символов
    1. Преобразование в список
    2. Преобразование списка в атом
    3. Обратное преобразование
  3. Грамматики
    1. Описание грамматики
    2. Преобразование в строку
    3. Обратное преобразование