diff --git a/ClassDiagram.cd b/ClassDiagram.cd
new file mode 100644
index 0000000..438d3c6
--- /dev/null
+++ b/ClassDiagram.cd
@@ -0,0 +1,53 @@
+
+
+
+
+
+ AEADIAAAAAAAAAAAAABAAAQAACAAAAAACAAAAAAEAAA=
+ src\Tool\Tool.cs
+
+
+
+
+
+ AAAAAAIAAAAAAAAAAAAAAEAAAAACAAAAAAAAAAAAAAA=
+ src\Tool\ManualTool.cs
+
+
+
+
+
+ AAAAAAAAAAAAAAAAAAAAAAAAACAAAAABAAAAAAAAAAA=
+ src\Tool\ElectricTool.cs
+
+
+
+
+
+ AAAAAAAAAIAAAAAAAgAAAAAAAAAAAAAAAAAAAgAAAAA=
+ src\Tool\Trimmer.cs
+
+
+
+
+
+ AAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAABA=
+ src\Tool\Scythe.cs
+
+
+
+
+
+ AAAIAAAAQAAAAAAAAAAAAAAAAAAAQBAIAAAAAAAAAAA=
+ src\Tool\Lawnmower.cs
+
+
+
+
+
+ AAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=
+ src\Tool\Scissors.cs
+
+
+
+
\ No newline at end of file
diff --git a/src/Tool/BladeType.cs b/src/Tool/BladeType.cs
new file mode 100644
index 0000000..16a5e28
--- /dev/null
+++ b/src/Tool/BladeType.cs
@@ -0,0 +1,20 @@
+///
+/// Тип лезвия
+///
+public enum BladeType
+{
+ ///
+ /// Изогнутое лезвие
+ ///
+ Curved,
+
+ ///
+ /// Прямое лезвие
+ ///
+ Straight,
+
+ ///
+ /// Зубчатое лезвие
+ ///
+ Serrated
+}
diff --git a/src/Tool/ElectricTool.cs b/src/Tool/ElectricTool.cs
new file mode 100644
index 0000000..149a3a3
--- /dev/null
+++ b/src/Tool/ElectricTool.cs
@@ -0,0 +1,39 @@
+///
+/// Электрический инструмент для косьбы
+///
+public class ElectricTool : Tool
+{
+ ///
+ /// Мощность электроинструмента
+ ///
+ private uint _power;
+
+ ///
+ /// Мощность электроинструмента
+ ///
+ public uint Power => _power;
+
+ ///
+ /// Инициализирует новый экземпляр класса с указанным именем, материалом, весом и мощностью
+ ///
+ /// Имя электроинструмента
+ /// Материал электроинструмента
+ /// Вес электроинструмента. Должен быть больше нуля
+ /// Мощность электроинструмента. Должна быть больше нуля
+ /// Выбрасывается, когда вес меньше или равен нулю
+ /// Выбрасывается, когда мощность равна нулю
+ public ElectricTool(string name, Material material, double weight, uint power) : base(name, material, weight)
+ {
+ if (power == 0)
+ throw new ArgumentException("Мощность не может быть равна нулю", nameof(weight));
+
+ _power = power;
+ }
+}
+
+namespace KPO_Lab
+{
+ public class Class1
+ {
+ }
+}
\ No newline at end of file
diff --git a/src/Tool/Lawnmower.cs b/src/Tool/Lawnmower.cs
new file mode 100644
index 0000000..86b7e43
--- /dev/null
+++ b/src/Tool/Lawnmower.cs
@@ -0,0 +1,50 @@
+///
+/// Газонокосилка
+///
+public class Lawnmower : ElectricTool
+{
+ ///
+ /// Объем топлива
+ ///
+ private float _fuelCapacity;
+ ///
+ /// Текущий уровень топлива
+ ///
+ private float _fuelLevel;
+
+ ///
+ /// Объем топлива
+ ///
+ public float FuelCapacity => _fuelCapacity;
+ ///
+ /// Текущий уровень топлива
+ ///
+ public float FuelLevel => _fuelLevel;
+
+ ///
+ /// Инициализирует новый экземпляр класса с указанным именем, материалом, весом, мощностью и объемом бензина
+ ///
+ /// Имя электроинструмента
+ /// Материал электроинструмента
+ /// Вес электроинструмента. Должен быть больше нуля
+ /// Мощность электроинструмента. Должна быть больше нуля
+ /// Объем топлива. Должен быть больше нуля
+ /// Выбрасывается, когда вес меньше или равен нулю
+ /// Выбрасывается, когда мощность равна нулю
+ /// Выбрасывается, когда объем топлива равна нулю
+ public Lawnmower(string name, Material material, double weight, uint power, float fuelCapacity) : base(name, material, weight, power)
+ {
+ if (fuelCapacity <= 0)
+ throw new ArgumentException("Объем топлива не может быть меньше или равен нулю", nameof(fuelCapacity));
+
+ _fuelCapacity = fuelCapacity;
+ }
+
+ ///
+ /// Пополняет запас топлива до максимального уровня.
+ ///
+ public void Refuel()
+ {
+ _fuelLevel = _fuelCapacity;
+ }
+}
\ No newline at end of file
diff --git a/src/Tool/ManualTool.cs b/src/Tool/ManualTool.cs
new file mode 100644
index 0000000..63eb4d4
--- /dev/null
+++ b/src/Tool/ManualTool.cs
@@ -0,0 +1,45 @@
+///
+/// Ручной инструмент для косьбы
+///
+public class ManualTool : Tool
+{
+ ///
+ /// Длина рукояти ручного инструмента в метрах
+ ///
+ private float _handleLength;
+
+ ///
+ /// Длина рукояти ручного инструмента в метрах
+ ///
+ public float HandleLength => _handleLength;
+
+ ///
+ /// Инициализирует новый экземпляр класса с указанным именем, материалом, весом и мощностью
+ ///
+ /// Название ручного инструмента
+ /// Материал ручного инструмента
+ /// Вес ручного инструмента в граммах
+ /// Длина рукояти ручного инструмента в метрах. Должна быть больше нуля
+ /// Выбрасывается, когда вес меньше или равен нулю
+ /// Выбрасывается, когда длина рукояти меньше или равна нулю
+ public ManualTool(string name, Material material, double weight, float handleLength) : base(name, material, weight)
+ {
+ if (handleLength <= 0)
+ throw new ArgumentException("Длина рукояти не может быть меньше или равна нулю", nameof(handleLength));
+
+ _handleLength = handleLength;
+ }
+
+ ///
+ /// Заменяет рукоять на новую другой длины
+ ///
+ /// Новая длина рукоятки. Должна быть больше нуля
+ /// Выбрасывается, когда новая длина рукоятки меньше или равна нулю
+ public void SwitchHandle(float newHandleLength)
+ {
+ if (newHandleLength <= 0)
+ throw new ArgumentException("Длина рукояти не может быть меньше или равна нулю", nameof(newHandleLength));
+
+ _handleLength = newHandleLength;
+ }
+}
diff --git a/src/Tool/Material.cs b/src/Tool/Material.cs
new file mode 100644
index 0000000..196bb59
--- /dev/null
+++ b/src/Tool/Material.cs
@@ -0,0 +1,20 @@
+///
+/// Материал инструмента
+///
+public enum Material
+{
+ ///
+ /// Пластик
+ ///
+ Plastic,
+
+ ///
+ /// Метал
+ ///
+ Metal,
+
+ ///
+ /// Дерево
+ ///
+ Wood,
+}
\ No newline at end of file
diff --git a/src/Tool/Scissors.cs b/src/Tool/Scissors.cs
new file mode 100644
index 0000000..4bef7e0
--- /dev/null
+++ b/src/Tool/Scissors.cs
@@ -0,0 +1,71 @@
+///
+/// Класс, представляющий ножницы как ручной инструмент.
+///
+public class Scissors : ManualTool
+{
+ private double _bladeSize;
+
+ ///
+ /// Размер лезвия ножниц.
+ ///
+ public double BladeSize => _bladeSize;
+
+ ///
+ /// Инициализирует новый экземпляр класса с указанными параметрами.
+ ///
+ /// Название ручного инструмента
+ /// Материал ручного инструмента
+ /// Вес ручного инструмента в граммах
+ /// Длина рукояти ручного инструмента в метрах. Должна быть больше нуля
+ /// Длина лезвия ножниц в метрах. Должна быть больше нуля
+ /// Выбрасывается, когда вес меньше или равен нулю
+ /// Выбрасывается, когда длина рукояти меньше или равна нулю
+ /// Выбрасывается, когда длина лезвия меньше или равна нулю
+ public Scissors(string name, Material material, double weight, float handleLength, double bladeSize) : base(name, material, weight, handleLength)
+ {
+ if (bladeSize <= 0)
+ throw new ArgumentException("Длина лезвия не может быть меньше или равна нулю", nameof(bladeSize));
+
+ _bladeSize = bladeSize;
+ }
+
+ ///
+ /// Оценивает точность работы ножниц на основе длины и равномерности лезвия
+ ///
+ /// Значение точности работы ножниц (от 0 до 1)
+ public double MeasureAccuracy()
+ {
+ double cleanlinessFactor = 0.0;
+ double evennessFactor = 0.0;
+
+ if (_bladeSize < 5)
+ {
+ cleanlinessFactor = 0.8;
+ }
+ else if (_bladeSize >= 5 && _bladeSize < 10)
+ {
+ cleanlinessFactor = 0.7;
+ }
+ else
+ {
+ cleanlinessFactor = 0.6;
+ }
+
+ if (_bladeSize < 5)
+ {
+ evennessFactor = 0.9;
+ }
+ else if (_bladeSize >= 5 && _bladeSize < 10)
+ {
+ evennessFactor = 0.8;
+ }
+ else
+ {
+ evennessFactor = 0.7;
+ }
+
+ double accuracy = (cleanlinessFactor + evennessFactor) / 2.0;
+
+ return accuracy;
+ }
+}
diff --git a/src/Tool/Scythe.cs b/src/Tool/Scythe.cs
new file mode 100644
index 0000000..652672b
--- /dev/null
+++ b/src/Tool/Scythe.cs
@@ -0,0 +1,39 @@
+///
+/// Коса
+///
+public class Scythe : ManualTool
+{
+ ///
+ /// Тип лезвия
+ ///
+ private BladeType _bladeType;
+
+ ///
+ /// Тип лезвия
+ ///
+ public BladeType BladeType => _bladeType;
+
+ ///
+ /// Создает новый экземпляр класса
+ ///
+ /// Название косы
+ /// Материал косы
+ /// Вес ручного инструмента в граммах
+ /// Длина рукояти ручного инструмента в метрах. Должна быть больше нуля
+ /// Тип лезвия
+ /// Выбрасывается, когда вес меньше или равен нулю.
+ /// Выбрасывается, когда длина рукояти меньше или равна нулю
+ public Scythe(string name, Material material, double weight, float handleLength, BladeType bladeType) : base(name, material, weight, handleLength)
+ {
+ _bladeType = bladeType;
+ }
+
+ ///
+ /// Заменяет лезвие косы на новое
+ ///
+ /// Новый тип лезвия
+ public void SwitchBlade(BladeType newBladeType)
+ {
+ _bladeType = newBladeType;
+ }
+}
diff --git a/src/Tool/Tool.cs b/src/Tool/Tool.cs
new file mode 100644
index 0000000..fe38dfd
--- /dev/null
+++ b/src/Tool/Tool.cs
@@ -0,0 +1,67 @@
+
+///
+/// Инструмент для косьбы
+///
+public class Tool
+{
+ ///
+ /// Уникальный идентификатор инструмента
+ ///
+ private Guid _id = Guid.NewGuid();
+ ///
+ /// Название инструмента
+ ///
+ private string _name;
+ ///
+ /// Материал инструмента
+ ///
+ private Material _material;
+ ///
+ /// Вес инструмента
+ ///
+ private double _weight;
+
+ ///
+ /// Уникальный идентификатор инструмента
+ ///
+ public Guid Id => _id;
+ ///
+ /// Название инструмента
+ ///
+ public string Name => _name;
+ ///
+ /// Материал инструмента
+ ///
+ public Material Material => _material;
+ ///
+ /// Вес инструмента
+ ///
+ public double Weight => _weight;
+
+ ///
+ /// Инициализирует новый экземпляр класса .
+ ///
+ /// Название инструмента.
+ /// Материал инструмента.
+ /// Вес инструмента. Должен быть больше нуля.
+ /// Выбрасывается, когда вес меньше или равен нулю.
+ public Tool(string name, Material material, double weight)
+ {
+ if (weight <= 0)
+ {
+ throw new ArgumentException("Вес инструмента не может быть меньше или равен нулю", nameof(weight));
+ }
+
+ _name = name;
+ _material = material;
+ _weight = weight;
+ }
+
+ ///
+ /// Печатает детали инструмента, включая его имя, материал и вес.
+ ///
+ public void Print()
+ {
+ Console.WriteLine($"Инструмент: {Name}, Материал: {Material}, Вес: {Weight}");
+ }
+}
diff --git a/src/Tool/Trimmer.cs b/src/Tool/Trimmer.cs
new file mode 100644
index 0000000..dda2c5f
--- /dev/null
+++ b/src/Tool/Trimmer.cs
@@ -0,0 +1,38 @@
+///
+/// Триммер
+///
+public class Trimmer : ElectricTool
+{
+ ///
+ /// Режим работы
+ ///
+ private TrimmerMode _mode;
+
+ ///
+ /// Режим работы
+ ///
+ public TrimmerMode Mode => _mode;
+
+ ///
+ /// Инициализирует новый экземпляр класса с указанным именем, материалом, весом и мощностью
+ ///
+ /// Имя электроинструмента
+ /// Материал электроинструмента
+ /// Вес электроинструмента. Должен быть больше нуля
+ /// Мощность электроинструмента. Должна быть больше нуля
+ /// Выбрасывается, когда вес меньше или равен нулю
+ /// Выбрасывается, когда мощность равна нулю
+ public Trimmer(string name, Material material, double weight, uint power) : base(name, material, weight, power)
+ {
+ _mode = TrimmerMode.Normal;
+ }
+
+ ///
+ /// Изменяет режим работы обрезки
+ ///
+ /// Новый режим обрезки, который нужно установить
+ public void ChangeMode(TrimmerMode mode)
+ {
+ _mode = mode;
+ }
+}
\ No newline at end of file
diff --git a/src/Tool/TrimmerMode.cs b/src/Tool/TrimmerMode.cs
new file mode 100644
index 0000000..e75bb5a
--- /dev/null
+++ b/src/Tool/TrimmerMode.cs
@@ -0,0 +1,20 @@
+///
+/// Режим работы триммера
+///
+public enum TrimmerMode
+{
+ ///
+ /// Нормальный
+ ///
+ Normal,
+
+ ///
+ /// Турбо
+ ///
+ Turbo,
+
+ ///
+ /// Эко
+ ///
+ Eco
+}
\ No newline at end of file