Программирование

244 группа

Юрий Литвинов

Студент TODO №1 №2 №3 №4 №5 №6 №7 Тест 1 №8 №9 №10
238 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 1 2 3 1 2 1 2 1 2 3 1 1 Доклады Текст Презентация Защита
Berezhnykh Alex 10
Гурьев Василий 16
Добряков Дмитрий 23
Доронин Георгий 17
Зайнуллин Егор 11
Клещин Антон 12
Курнякова Наташа 31
Маненкова Анна 28
Павел Кижнеров 7
Сокольвяк Сергей 9
Сушенцев Денис 11
Тучина Анастасия 7
Файзуллина Динара 15
Фефелов Алексей 13
Шамрай Максим 17
Ярков Иван 11

Задачи

Домашняя работа 11. 09.05.18
Рекомендации по написанию текста курсовой
Рекомендации по подготовке презентации курсовой
Чеклист по презентации
Примеры курсовых работ 2-го курса прошлых лет
Домашняя работа 10. 08.05.18
О курсовых (презентация)
F# во славу Data Science (презентация)
FAKE и Project Scaffold (презентация)
Type Providers (презентация)
WebSharper (презентация)
Дополнительные возможности языка F#
  1. Текст

    Текст курсовой работы

  2. Презентация

    Презентация к защите курсовой

  3. Защита
Домашняя работа 9. 17.04.18
Низкоуровневые потоки, события (презентация)
  1. Реализовать следующий интерфейс, представляющий ленивое вычисление:

    type ILazy<'a> =
    abstract member Get: unit -> 'a

    Объект Lazy создаётся на основе вычисления (представляемого лямбда-функцией supplier : unit -> 'a)
    - Первый вызов Get() вызывает вычисление и возвращает результат
    - Повторные вызовы Get() возвращают тот же объект, что и первый вызов
    - В однопоточном режиме вычисление должно запускаться не более одного раза, в многопоточном — как получится (см. далее)

    Создавать объекты надо не вручную, а с помощью класса LazyFactory, имеющего три метода наподобие

    static member CreateSingleThreadedLazy supplier

    возвращающих три разные реализации Lazy<'a>:
    - Простая версия с гарантией корректной работы в однопоточном режиме (без синхронизации)
    - Гарантия корректной работы в многопоточном режиме; вычисление не должно производиться более одного раза (что-то наподобие многопоточного синглтона, без лишних блокировок)
    - То же, что и предыдущее, но lock-free; вычисление может производиться более одного раза, но при этом Lazy.Get всегда должен возвращать один и тот же объект (то есть результаты "лишних" вычислений должны теряться)

  2. Доклады
    • Дополнительные возможности F# (единицы измерения, lazy, active patterns)
    • F# и анализ данных
    • WebSharper (обзор и небольшая демонстрация)
    • Type Providers, F# Data
    • FAKE, Scaffold
Домашняя работа 8. 10.04.18
Async и многопоточное программирование (презентация)
  1. Написать функцию, принимающую адрес веб-страницы, скачивающую все веб-страницы, на которые есть ссылки с указанной, и печатающую информацию о размере каждой в формате "адрес страницы --- число символов". Ссылки нужно обрабатывать только заданные в форме <a href="http://...">. Для поиска ссылок на странице могут быть полезны регулярные выражения (класс System.Text.RegularExpressions.Regex). Качать страницы надо параллельно.

Тест 1. 03.04.18
  1. Описать бесконечную последовательность из чисел [1, -1, 1, -1, 1, -1, 1, -1, …]. С помощью неё реализовать функцию, выдающую бесконечную последовательность [1, -2, 3, -4, 5, -6, …]. Конструкции императивного программирования использовать нельзя.

  2. Реализовать функцию, возвращающую все элементы двоичного дерева, удовлетворяющие переданному как параметр условию. Конструкции императивного программирования использовать нельзя.

  3. Реализовать класс "хеш-таблица", позволяющий добавить элемент, проверить принадлежность элемента таблице и удалить элемент. Хеш-функция должна передаваться хеш-таблице извне. Мутабельные переменные разрешены, пользоваться библиотечной хеш-таблицей нельзя.

Домашняя работа 7. 27.03.18
Вычислительные выражения в F# (презентация)
  1. Реализовать Workflow, выполняющий математические вычисления с заданной (как аргумент Builder-а) точностью. Например,

        rounding 3 {
            let! a = 2.0 / 12.0
            let! b = 3.5
            return a / b
        }
    

    должно возвращать 0.048

  2. Реализовать Workflow, выполняющий вычисления с числами, заданными в виде строк. Например,

    let result = calculate {
            let! x = "1"
            let! y = "2"
            let z = x + y
            return z
        }
    

    должно возвращать значение, содержащее 3, а

    let res = calculate {
            let! x = "1"
            let! y = "Ъ"
            let z = x + y
            return z
        }
    

    должно возвращать значение, указывающее на отсутствие результата.

Домашняя работа 6. 20.03.18
Объектно-ориентированное программирование в F# (презентация)
  1. Переписать на F# задачу про моделирование локальной сети прошлого семестра, в возможно более F#-овом стиле. Мутабельное состояние в этой задаче использовать можно.

    Оригинальное условие:

    Смоделировать работу локальной сети:

    • в сети есть несколько компьютеров, связанных друг с другом (каким образом - можно задавать, например, матрицей смежности);
    • на каждом компе стоит ОС (Windows, Linux, etc...);
    • в сети гуляют вирусы, так что для каждой машины есть ненулевая вероятность заразиться (вероятность зависит от типа ОС), заражаются компьютеры, непосредственно соединённые с заражёнными;
    • заражения (и проверки, заразился компьютер или нет) происходят дискретно - по ходам.

    Требуется периодически выводить состояние сети.

  2. Переписать на F# задачу о двоичном дереве поиска с итератором. Дерево должно реализовывать интерфейс IEnumerable<T>

    Оригинальное условие:

    Реализовать двоичное дерево поиска (с операциями добавления, поиска и удаления) и итератор для его обхода

Домашняя работа 5. 13.03.18
Генерики в F# (презентация)
  1. Реализовать функцию, которая по произвольной строке проверяет корректность скобочной последовательности в этой строке. Скобки бывают трёх видов.

  2. Записать в point-free стиле func x l = List.map (fun y -> y * x) l. Выписать шаги вывода и проверить с помощью FsCheck корректность результата

  3. Написать программу - телефонный справочник. Она должна уметь хранить имена и номера телефонов, в интерактивном режиме осуществлять следующие операции:
    1. выйти
    2. добавить запись (имя и телефон)
    3. найти телефон по имени
    4. найти имя по телефону
    5. вывести всё текущее содержимое базы
    6. сохранить текущие данные в файл
    7. считать данные из файла

Домашняя работа 4. 06.03.18
Хороший курс про типизированное лямбда-исчисление
Лямбда-исчисление для самых маленьких
Нетипизированное лямбда-исчисление (презентация)
  1. Выполнить бета-редукцию λ-терма ((λa.(λb.b b) (λb.b b)) b) ((λc.(c b)) (λa.a)). Решение (в виде последовательности преобразований) набрать в TeX-е и выложить файл .tex на GitHub. Может помочь www.papeeria.com

  2. Докажите, что S K K = I. Доказательство набрать в TeX-е и выложить на GitHub. Делать надо самостоятельно, это известное (и несложное) упражнение, так что гуглить нечестно.

  3. Реализовать интерпретатор лямбда-выражений, выполняющий бета-редукцию по нормальной стратегии. Лямбда-выражения задаются через размеченные объединения.

Домашняя работа 3. 27.02.18
Продолжение про F# (презентация)
Продолжение про F# (конспект)
  1. Реализовать три варианта функции, подсчитывающей количество четных чисел в списке (с использованием стандартных функций map, filter, fold). Использование рекурсии не допускается.

  2. Реализовать функцию, применяющую функцию к каждому элементу двоичного дерева и возвращающую новое двоичное дерево, каждый элемент которого --- результат применения функции к соответствующему элементу исходного дерева (map для деревьев)

  3. Посчитать значение дерева разбора арифметического выражения, заданного через вложенные discriminated union-ы

  4. Реализовать функцию, генерирующую бесконечную последовательность простых чисел

    Ко всем задачам требуются юнит-тесты

Домашняя работа 2. 20.02.18
Введение в F# (презентация)
Введение в F# (конспект)
  1. Реализовать функцию, которая вычисляет произведение цифр данного числа

  2. Реализовать функцию, которая выдает первую позицию вхождения заданного числа в список

  3. Реализовать функцию, проверяющую, является ли строка палиндромом

  4. Написать mergesort: функцию, которая принимает список и возвращает отсортированный список

Домашняя работа 1. 13.02.18
Введение (конспект)
Хороший блог про F#
Обучалка по F# с онлайн-интерпретатором
Домашняя страница F#
Введение (презентация)
  1. Посчитать факториал

  2. Посчитать числа Фибоначчи (за линейное время)

  3. Реализовать функцию обращения списка (за линейное время)

  4. Реализовать функцию, которая принимает на вход n и m и возвращает список из элементов [2n; 2n + 1; ...; 2n + m]

© 2014-2018 HwProj