Проект дублирует одну из последних лабораторных работ по C++. Основные цели:
- Изучение синтаксиса языка программирования C#, основных терминов и понятий
- Изучение и реализация объектно-ориентированной модели данных
- Изучение базовых паттернов проектирования
- Реализация CLI для работы с данными
- Повторение/изучение работы с системами контроля версий (git, GitHub)
- Получить задание
- Сделать форк данного репозитория
- Выполнить задание согласно полученному варианту
- Сделать PR (pull request) в данный репозиторий
- Исправить замечания после code review
- Получить approve
- Прийти на занятие и защитить работу
Конкурентный принцип. Так как задания в первой лабораторной будут повторяться между студентами, то выделяются следующие показатели для оценки:
- Скорость разработки
- Качество разработки
- Полнота выполнения задания
Быстрее делаете PR - у вас преимущество перед остальными с тем же вариантом.
Быстрее получаете Approve - у вас преимущество перед остальными с тем же вариантом.
Выполните нечто немного выходящее за рамки проекта - у вас преимущество перед остальными.
Преимущество будет выражаться в уменьшении сложности вопросов при очной защите проекта.
Целевая платформа: .NET 5
Необходимые пакеты:
Пакет | Документация | Назначение |
---|---|---|
Microsoft.Extensions.DependencyInjection | Dependency injection in .NET | DI-контейнер |
Spectre.Console | https://spectreconsole.net | CLI-фреймворк |
xunit xunit.runner.visualstudio |
https://xunit.net | Модульное тестирование (опционально) |
Сериализация данных: System.Xml.Serialization
- Реализовать иерархию классов согласно варианту.
- Независимо от варианта, в базовом классе должны быть предоставлены: методы сравнения объектов на равенство и перегружен метод ToString() получения строкового представления объекта.
- Реализовать основное меню приложения. Предоставить пользователю в дополнение к функционалу, требуемого согласно варианту, следующие пункты меню:
- cоздание объекта указанного типа из иерархии классов с его последующей вставкой в коллекцию по указанному пользователем индексу (в качестве коллекции использовать подходяющую из
System.Collections.Generic
); - удаление объекта из коллекции по индексу;
- удаление всех объектов из коллекции;
- сравнение двух объектов по указанным индексам;
- вывод контейнера на экран (выводить не более 10 первых объектов; если объектов больше 10, для обозначения оставшихся использовать
...
).
- cоздание объекта указанного типа из иерархии классов с его последующей вставкой в коллекцию по указанному пользователем индексу (в качестве коллекции использовать подходяющую из
- Хранение объектов реализовать в файле формата XML. Для сериализации/десериализации данных использовать System.Xml.Serialization.XmlSerializer.
- CRUD-операции с данными осуществлять с использованием паттерна Repository. Репозиторий подключать в основном теле функции
Main
c использованием Dependency Injection. - Операции с данными реализовать с использованием паттерна Command.
Варианты распределяются случайным образом преподавателем.
Вариант 1: Плоские фигуры
Минимальный интерфейс:- вычисление периметра;
- вычисление площади;
- получение минимального обрамляющего прямоугольника;
Минимальный набор классов:
- точка на плоскости (структура);
- прямоугольник;
- треугольник;
- круг.
Предоставить возможность вычисления суммарной площади всех фигур в контейнере (считать, что фигуры не накладываются друг на друга). Вычисление организовать двумя способами: своим кодом и с использованием System.Linq
.
Вариант 2: Объёмные фигуры
Минимальный интерфейс:- вычисление площади поверхности;
- вычисление объёма;
- получение минимального обрамляющего прямоугольного параллелепипеда;
Минимальный набор классов:
- точка в пространстве (структура);
- прямоугольный параллелепипед;
- шар;
- цилиндр.
Предоставить возможность вычисления суммарного объёма всех фигур в контейнере (считать, что фигуры не пересекаются друг с другом). Вычисление организовать двумя способами: своим кодом и с использованием System.Linq
.
Вариант 3: Функции от одной переменной
Минимальный интерфейс:- вычисление значения функции при заданном аргументе;
- получение функции, являющейся производной от текущей.
Минимальный набор классов:
- константа;
- линейная функция;
- квадратичная функция;
- синус;
- косинус.
Предоставить возможность определения функции в контейнере, производная которой для заданного аргумента принимает наименьшее значение. Если таких функций несколько, вывести первую из них. Вычисление организовать двумя способами: своим кодом и с использованием System.Linq
.
Вариант 4: Функции от одной переменной
Минимальный интерфейс:- вычисление значения функции при заданном аргументе;
- получение функции, являющейся производной от текущей.
Минимальный набор классов:
- константа;
- степенная функция;
- показательная функция;
- логарифм.
Предоставить возможность определения функции в контейнере, которая для заданного аргумента принимает наибольшее значение. Если таких функций несколько, вывести последнюю из них. Вычисление организовать двумя способами: своим кодом и с использованием System.Linq
.
Вариант 5: Бинарные арифметические операции над целыми числами
Минимальный интерфейс:- вычисление значения по заданным аргументам.
Минимальный набор классов:
- сложение;
- вычитание;
- умножение;
- целочисленное деление;
- остаток от деления.
Предоставить возможность определения операции в контейнере, которая для заданных операндов принимает наименьшее значение. Если таких операций несколько, вывести первую из них. Вычисление организовать двумя способами: своим кодом и с использованием System.Linq.
Вариант 6: Вещественные матрицы
Обеспечить, как минимум, следующее общее поведение:- получение размеров матрицы;
- получение значения по указанным индексам;
- установка значения по указанным индексам.
Минимальный набор классов:
- BufferedMatrix, который хранит все элементы матрицы в массиве (оперативной памяти);
- SparseMatrix, который хранит в оперативной памяти только ненулевые элементы матрицы.
Предоставить возможность определения матрицы с наименьшей нормой максимума модуля:
Если таких матриц несколько, вывести последнюю из них. Вычисление организовать двумя способами: своим кодом и с использованием System.Linq
.