ВКИ НГУ, 2017 г.
Курс состоит из набора лабораторных работ (15 штук). Для получения допуска к экзамену необходимо сдать 12 лабораторных работ.
Лабораторные работы, начиная с №3, перед сдачей будет необходимо пропустить через набор тестов (будут предложены позднее). Без пройденных тестов лабораторная работа к сдаче не принимается.
Для оформления лабораторных работ необходимо в одном проекте создать пакет ru.nsu.hci.{yoursurname}.javalabs
.
Для каждой лабораторной работы внутри этого пакета необходимо создать подпакет lab#
(# -- номер проекта).
Для всех лабораторных работ, кроме №0 и №1, необходимо придерживаться объектно-ориентированного подхода:
Сущности, о которых идёт речь, должны находиться в собственных классах. Метод main
необходимо объявлять в собственном классе.
Следуя заветам великих предков, реализовать самую простую программу -- “Hello World”.
Эта программа должна выводить на экран строку Hello World
, и затем успешно завершаться.
Данное задание необходимо выполнить без использование интегрированных сред разработки (IDE).
-
Реализовать программу, реализующую игру FizzBuzz:
Человек называет числа от 1 до 100.
Каждый раз, когда число делится на 3, вместо числа говорится слово Fizz;
Каждый раз, когда это число делится на 5, вместо числа говорится слово Buzz.
Если число делится и на 3, и на 5, говорится слово FizzBuzz (без пробелов).
-
Реализовать программу, которая считывает с клавиатуры число и проверяет его на простоту.
Число называется простым, если оно делится нацело только на 1 и на себя.
-
Реализовать программу, которая по заданной скобочной последовательности говорит, “правильная” ли она.
Правильной скобочной последовательностью называется такая последовательность, в которой для каждой открывающейся скобки справа от неё найдётся соответствующая ей закрывающая, и наоборот: для каждой закрывающей скобки слева от неё найдётся соответствующая ей открывающая.
Примеры:
(), (()()), ()()()()(())
- правильные последовательности;()), )(, (())()())
-- неправильные.
Реализовать программу, которая считывает с клавиатуры набор чисел (сначала считывается количество, а затем, последовательно, каждое число), и найти различные его статистические характеристики: минимум, максимум, среднее, медиану, среднее геометрическое.
Необходимо реализовать класс "Хранилище чисел". Начальные данные необходимо передавать через конструктор, а необходимые характеристики должны быть доступны через набор методов.
Используя встроенную коллекцию “стэк”, перевести математическое выражение из инфиксной записи в обратную польскую, а затем вычислить его.
Посчитать количество букв, слов, строк в файле. Построить частотную характеристику по буквам.
Написать функцию, которая принимает в себя форматную строку и переменное количество аргументов. На выходе должна получится единая строка со вставленными по правилам аргументами.
Аргументы вставляются в строку через {}.
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.
*/
Реализовать класс “Точка” для трехмерного и двухмерного пространства.
Точка должна уметь возвращать свои координаты, считать расстояние для любой другой точки, пересчитывать свои координаты в Полярные (Цилиндрические) координаты.
Также необходимо для набора из трёх точек проверить, лежат ли они на одной прямой, а для 4 точек -- лежат ли они в одной плоскости. (Реализовать статическими методами).
Реализовать набор классов, описывающих математические выражения:
- Описать базовый интерфейс
Expression
, содержащий методcalculate()
- Реализовать два вида выражений:
UnaryExpression
иBinaryExpression
. - Реализовать функциональность в классах:
Addition
-- сумма двух элементовSubtraction
-- разность двух элементовMultiplication
-- произведение двух элементовDivision
-- частное двух элементовRest
-- остаток от деления двух элементовPower
-- степень двух элементов (левый элемент в степени правого)Negative
-- эквивалентно ранзости нуля и элементаAbsolute
-- модуль элементаSquare
-- квадрат элемента
Параметры внутрь классов передавать через конструкторы.
Реализовать класс Locker
, хранящий внутри себя число.
Класс Locker
содержит следующие методы:
setValue(value)
устанавливает значения локера в переданное;getValue()
возвращает значение ящика.lock()
блокирует ящик. Заблокированный ящик не позволяет менять своё содержимое (при попытке изменить значение должно выбрасываться исключениеLockerLockedException
unlock()
отменяет блокировку.
Реализовать свой список (LinkedList
).
Список необходимо уметь создать, добавлять в него элементы (в начало и в конец), удалять из него элементы (из начала и конца), а так же итерироваться по нему с помощью цикла for
.
Реализовать класс Mapper<TSource, TDestination>
.
Данный класс содержит единственный метод TDestination Map(TSource obj)
, который копирует все поля переданного объекта в результат.
Наличие полей гарантируется.
Написать сериализатор для объектов в JSON и обратно.
Необходимо также реализовать возможность через атрибуты указывать название полей, (какие ключи будут иметь образы данных полей).
Реализовать возможность десериализовать как в конкретный тип, так и в общий, где общение будет через название поля.
Написать метод глубокого рекурсивного сравнения двух объектов одного типа.
Сравнивая рекурсивно вложенные типы.
Учитывать возможные цикличные ссылки.
Так же должен работать для элементарных (примитивных) типов.
Для написанного в лабораторной работе №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
, если все элементы удовлетворяют условию
Написать класс-очередь, которая помогает синхронизировать разные потоки.
У класса должны быть два метода:
- Добавить элемент - добавляет новый элемент в коллекцию.
- Получить элемент - берет элемент из коллекции.
Если в коллекции элементов нет, то метод ждет пока в коллекции не появится элемент и только тогда возвращает значение.
Посчитать первый миллион знаков числа π
.
Студент с самой быстрой реализацией получит автомат за курс при наличии необходимого минимума в 12 сданных задач.