Skip to content

Instantly share code, notes, and snippets.

@yhaskell
Last active October 7, 2017 04:12
Show Gist options
  • Save yhaskell/28a05486c3d780ad5987888a6df5a0f8 to your computer and use it in GitHub Desktop.
Save yhaskell/28a05486c3d780ad5987888a6df5a0f8 to your computer and use it in GitHub Desktop.
Лабораторные работы по курсу ООП ВКИ НГУ, 2017 г.

Лабораторные работы по курсу ООП

ВКИ НГУ, 2017 г.

Курс состоит из набора лабораторных работ (15 штук). Для получения допуска к экзамену необходимо сдать 12 лабораторных работ.

Лабораторные работы, начиная с №3, перед сдачей будет необходимо пропустить через набор тестов (будут предложены позднее). Без пройденных тестов лабораторная работа к сдаче не принимается.

Для оформления лабораторных работ необходимо в одном проекте создать пакет ru.nsu.hci.{yoursurname}.javalabs. Для каждой лабораторной работы внутри этого пакета необходимо создать подпакет lab# (# -- номер проекта).

Для всех лабораторных работ, кроме №0 и №1, необходимо придерживаться объектно-ориентированного подхода: Сущности, о которых идёт речь, должны находиться в собственных классах. Метод main необходимо объявлять в собственном классе.

Лабораторная работа №0 - установка и запуск

Следуя заветам великих предков, реализовать самую простую программу -- “Hello World”.

Эта программа должна выводить на экран строку Hello World, и затем успешно завершаться.

Данное задание необходимо выполнить без использование интегрированных сред разработки (IDE).

Лабораторная работа №1 - введение

  • Реализовать программу, реализующую игру FizzBuzz:

    Человек называет числа от 1 до 100.

    Каждый раз, когда число делится на 3, вместо числа говорится слово Fizz;

    Каждый раз, когда это число делится на 5, вместо числа говорится слово Buzz.

    Если число делится и на 3, и на 5, говорится слово FizzBuzz (без пробелов).

  • Реализовать программу, которая считывает с клавиатуры число и проверяет его на простоту.

    Число называется простым, если оно делится нацело только на 1 и на себя.

  • Реализовать программу, которая по заданной скобочной последовательности говорит, “правильная” ли она.

    Правильной скобочной последовательностью называется такая последовательность, в которой для каждой открывающейся скобки справа от неё найдётся соответствующая ей закрывающая, и наоборот: для каждой закрывающей скобки слева от неё найдётся соответствующая ей открывающая.

    Примеры:

    • (), (()()), ()()()()(()) - правильные последовательности;
    • ()), )(, (())()()) -- неправильные.

Лабораторная работа №2 - Массивы

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

Необходимо реализовать класс "Хранилище чисел". Начальные данные необходимо передавать через конструктор, а необходимые характеристики должны быть доступны через набор методов.

Лабораторная работа №3 - Коллекции

Используя встроенную коллекцию “стэк”, перевести математическое выражение из инфиксной записи в обратную польскую, а затем вычислить его.

Лабораторная работа №4 - Работа с данными в файле.

Посчитать количество букв, слов, строк в файле. Построить частотную характеристику по буквам.

Лабораторная работа №5 - форматтер

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

Аргументы вставляются в строку через {}.

Пример использования

String yourName = "Igor", name = "jarvis", description = "AI from some movie";
String formatted = Formatter.format("Hello, ${0}. My name is ${1}.\n I am ${1} - ${2}.", 
									yourName, name, description);
System.out.println(formatted);

/* результат:
	Hello, Igor. My name is Jarvis.
	I am Jarvis - AI from some movie.
*/

Лабораторная работа №6 - Класс “Точка”

Реализовать класс “Точка” для трехмерного и двухмерного пространства.

Точка должна уметь возвращать свои координаты, считать расстояние для любой другой точки, пересчитывать свои координаты в Полярные (Цилиндрические) координаты.

Также необходимо для набора из трёх точек проверить, лежат ли они на одной прямой, а для 4 точек -- лежат ли они в одной плоскости. (Реализовать статическими методами).

Лабораторная работа №7 - Математические выражения

Реализовать набор классов, описывающих математические выражения:

  • Описать базовый интерфейс Expression, содержащий метод calculate()
  • Реализовать два вида выражений: UnaryExpression и BinaryExpression.
  • Реализовать функциональность в классах:
    • Addition -- сумма двух элементов
    • Subtraction -- разность двух элементов
    • Multiplication -- произведение двух элементов
    • Division -- частное двух элементов
    • Rest -- остаток от деления двух элементов
    • Power -- степень двух элементов (левый элемент в степени правого)
    • Negative -- эквивалентно ранзости нуля и элемента
    • Absolute -- модуль элемента
    • Square -- квадрат элемента

Параметры внутрь классов передавать через конструкторы.

Лабораторная работа №8 - Exceptions

Реализовать класс Locker, хранящий внутри себя число.

Класс Locker содержит следующие методы:

  • setValue(value) устанавливает значения локера в переданное;
  • getValue() возвращает значение ящика.
  • lock() блокирует ящик. Заблокированный ящик не позволяет менять своё содержимое (при попытке изменить значение должно выбрасываться исключение LockerLockedException
  • unlock() отменяет блокировку.

Лабораторная работа №9 - Generics & Iterators

Реализовать свой список (LinkedList).

Список необходимо уметь создать, добавлять в него элементы (в начало и в конец), удалять из него элементы (из начала и конца), а так же итерироваться по нему с помощью цикла for.

Лабораторная работа №10 - Reflection

Реализовать класс Mapper<TSource, TDestination>.

Данный класс содержит единственный метод TDestination Map(TSource obj), который копирует все поля переданного объекта в результат.

Наличие полей гарантируется.

Лабораторная работа №11 - JSON Serializer

Написать сериализатор для объектов в JSON и обратно.

Необходимо также реализовать возможность через атрибуты указывать название полей, (какие ключи будут иметь образы данных полей).

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

Лабораторная работа №12 - Deep compare

Написать метод глубокого рекурсивного сравнения двух объектов одного типа.

Сравнивая рекурсивно вложенные типы.

Учитывать возможные цикличные ссылки.

Так же должен работать для элементарных (примитивных) типов.

Лабораторная работа №13 - Функциональные операции над коллекциями

Для написанного в лабораторной работе №9 класса список реализовать следующие операции:

  • filter(predicate) возвращает новый список, состоящий из элементов e, для которых predicate(e) == true
  • map(fn) возвращает новый список, состоящий из элементов списка, к которым последовательно была применена функция fn
  • fold(fn, init) “сворачивает список”: начиная с элемента init он последовательно применяет функцию fn к паре (предыдущее значение, текущее значение).
  • count(predicate) - возвращает количество элементов удовлетворяющих условию
  • first(predicate) - возвращает первый элемент удовлетворяющий условию, если такого нет - возвращает null
  • last(predicate) - возвращает последний элемент удовлетворяющий условию, если его нет - возвращает null
  • single(predicate) - возвращает элемент удовлетворяющий условию. Если он не один или таких нет, то возвращает null
  • all(predicate) - возвращает true, если все элементы удовлетворяют условию

Лабораторная работа №14 - BlockingQueue

Написать класс-очередь, которая помогает синхронизировать разные потоки.

У класса должны быть два метода:

  • Добавить элемент - добавляет новый элемент в коллекцию.
  • Получить элемент - берет элемент из коллекции.

Если в коллекции элементов нет, то метод ждет пока в коллекции не появится элемент и только тогда возвращает значение.

Лабораторная работа №15 - Parallel computations

Посчитать первый миллион знаков числа π. Студент с самой быстрой реализацией получит автомат за курс при наличии необходимого минимума в 12 сданных задач.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment