Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Задание

Создать классы, обеспечивающие манипуляцию со списком персонала фирмы.
В фирме все работники делятся на следующие категории:


1) Работник (Employee)


- ФИО
- Дата рождения
- Дата принятия на работу


2) Менеджер (Manager)


- ФИО
- Дата рождения
- Дата принятия на работу
- Список работников в подчинении данного менеджера


3) Другие (руководство, секретари и т. д.) (Other)


- ФИО
- Дата рождения
- Дата принятия на работу
- Текстовое описание сотрудника

Классы должны позволять

1.  Добавлять

2.  Удалять

3.  изменять категорию сотрудника

4.  привязывать сотрудника к разным менеджерам, меняя их подчиненность

5.  сортировать список по фамилиям, датам рождения и принятия на работу.

Данные необходимо читать и писать в xml файл. Отладку проводить в консольном приложении, формируя результаты в виде текстового файла. Исходный xml-файл, образующий базу сотрудников, формировать генератором случайных чисел.

Примечание и рекомендации.

Ключевые классы. net, которые будут полезными:

1.  XMLDocument для манипуляций с содержимым XML-файла. Например, создание простого xml-файла с пятью сотрудниками категории Employee (для примера дается только узел с именем; узлы даты рождения и приема на работу добавляются по аналогии) можно реализовать кодом:

static void Main(string[] args)

{

// Латинский алфавит с пробелом для формирования произвольных строк

char[] chars =

"qwertyuiopasdfghjklzxcvbnm ERTYUIOPASDFGHJKLZXCVBNM".ToCharArray();

// Генератор случайных чисел

НЕ нашли? Не то? Что вы ищете?

Random rnd = new Random();

//Создаем объект класса XmlDocument.

XmlDocument doc = new XmlDocument();

// Формируем корневой узел документа

doc. LoadXml("<Staff></Staff>");

// Создаем список из пяти сотрудников с произвольными именами

for (int i = 0; i < 5; i++)

{

// создаем узел с именем employee для хранения данных о сотруднике

XmlElement emplElem = doc. CreateElement("Employee");

// создаем узел с именем name для хранения имени

XmlElement nameElem = doc. CreateElement("Name");

// Формирование случайного имени лучше оформить в виде отдельного метода

#region Формирование случайного имени

// Хранит строку текущего имени сотрудника

String name;

// Формируем имя, состоящее из случайного числа символов (от 5 до 49),

// взятых из массива латинского алфавита с пробелом

int nameLength = rnd. Next(5, 50);

StringBuilder sb = new StringBuilder();

for (int j = 0; j < nameLength; j++)

sb. Append(chars[rnd. Next(0, chars. Length)]);

// Убираем последние и первые пробелы в строке, если они есть

name = sb. ToString().Trim();

#endregion

// добавляем имя сотрудника в узел name

nameElem. InnerText = name;

// добавляем узел с именем в качестве дочернего к узлу сотрудника

emplElem. AppendChild(nameElem);

// добавляем узел сотрудника в качестве дочернего к корневому узлу документа

doc. DocumentElement. AppendChild(emplElem);

}

// Сохраняем документ в файле

doc. Save(File. CreateText("staff. xml"));

// Выводим документ на консоль

doc. Save(Console. Out);

Console. ReadLine();

}

2.  перечислимый тип (enum). Например, полезно иметь классы перечислимого типа для разбиения сотрудников по категориям

enum EmployeeCategory { Employee, Other, Manager };

и для сортировки, или упорядочения сотрудников

enum OrderBy { Name, DateOfBirth, DateOfEmployment };

3.  коллекция List<T> и интерфейс IComparer<T> для сортировки. Например, можно описать класс, содержащий информацию о сотруднике типа Employee – его имя, дату рождения, дату поступления на работу.

Всю совокупность этой информации можно рассматривать как массив из трех строк, который будем именовать метрикой сотрудника. Метрика будет единственным полем класса. Она будет инициализироваться конструктором класса. Так что класс Employee может иметь вид:

/// <summary>

/// Объекты класса хранят информацию о сотрудниках категории Employee

/// </summary>

class Employee

{

/// <summary>

/// Хранит метрику сотрудника –

/// имя, дату рождения и дату принятия на работу

/// </summary>

String[] _metric = new string[3];

/// <summary>

/// Возвращает метрику сотрудника

/// </summary>

public String[] metric { get { return _metric; } }

/// <summary>

/// Конструктор, инициализирующий метрику

/// </summary>

/// <param name="metric">

/// Данная метрика

/// </param>

public Employee(String[] metric)

{

for (int i = 0; i < 3; i++)

_metric[i] = metric[i];

}

}

Из объектов класса Employee можно формировать список типа List<Employee>, содержащий произвольное количество этих объектов. Пример кода:

List<Employee> emplList = new List<Employee>();

foreach (String[] curMetric in metrics)

emplList. Add(new Employee(curMetric));

Здесь metrics – объект списка типа List<String[]>, содержащего метрики сотрудников, например, считанные из xml-файла.

Класс List<T> содержит метод Sort, одна из версий которого позволяет упорядочивать список по заданному правилу, сформированному классом, реализующим интерфейс IComparer<T> с его единственным методом Compare. Так может выглядеть описание класса, используемого для упорядочения сотрудников.

class EmployeeComparer : IComparer<Employee>

{

// Хранит способ упорядочения

OrderBy order;

public EmployeeComparer(OrderBy order)

{

this. order = order;

}

// Реализует метод интерфейса IComparer<Employee>

public int Compare(Employee empl1, Employee empl2)

{

// Строки сравнимы методом CompareTo

return empl1.metric[(int)order].CompareTo(empl2.metric[(int)order]);

}

}

Вызов emplList. Sort(new EmployeeComparer(order)); позволит упорядочить сотрудников по заданному правилу order в предыдущем примере кода.

Аналогично можно построить классы двух других категорий сотрудников Other и Manager как наследники класса Employee. Например, класс Other может выглядеть следующим образом

/// <summary>

/// Объекты класса хранят информацию о сотрудниках категории Other

/// </summary>

class Other : Employee

{

/// <summary>

/// Хранит описание сотрудника категории Other

/// </summary>

String _descr;

/// <summary>

/// Возвращает описание сотрудника

/// </summary>

public String descr { get { return _descr; } }

/// <summary>

/// Конструктор. Инициализирует метрику и описание сотрудника

/// </summary>

/// <param name="metric">

/// Метрика

/// </param>

/// <param name="descr">

/// Описание

/// </param>

public Other(String[] metric, String descr)

: base(metric)// вызов конструктора предка

{

_descr = descr;

}

}

4.  Фактически должен быть создан класс Staff с реализацией интерфейса

public interface IStaff

{

/// <summary>

/// Возвращает упорядоченный список всех категорий сотрудников

/// </summary>

/// <param name="order">

/// Формула упорядочения

/// </param>

/// <returns>

/// Список

/// </returns>

List<Employee> GetEmployees(OrderBy order);

/// <summary>

/// Возвращает упорядоченный список данной категории сотрудников

/// </summary>

/// <param name="empl">

/// Категория

/// </param>

/// <param name="order">

/// Формула упорядочения

/// </param>

/// <returns>

/// Список

/// </returns>

List<Employee> GetEmployees(EmployeeCategory empl, OrderBy order);

/// <summary>

/// Создает узел с описанием сотрудника

/// </summary>

/// <param name="emplCtgr"> категория сотрудника </param>

/// <param name="mngdEmplMetric">метрика сотрудника</param>

/// <param name="descr">

/// описание сотрудника категории Other;

/// для других категорий здесь null

/// </param>

/// <param name="mngdEmplMetrics">

/// список подчиненных сотрудников;

/// может быть не null только для категории Manager

/// </param>

/// <exception cref="ArgumentException">

/// Сотрудник с заданной метрикой уже существует

/// </exception>

void AppendEmployee(EmployeeCategory emplCtgr, string[] metric,

string descr, List<string[]> mngdEmplMetrics);

/// <summary>

/// Добавляет подчиненного сотрудника

/// </summary>

/// <param name="mngrMetric">метрика менеджера</param>

/// <param name="mngdEmplMetric">метрика сотрудника</param>

void AppendEmployee(string[] mngrMetric, string[] mngdEmplMetric);

/// <summary>

/// Убирает из документа сотрудника с данной метрикой

/// </summary>

/// <param name="mngdEmplMetric">

/// метрика сотрудника

/// </param>

void RemoveEmployee(string[] metric);

/// <summary>

/// Удаляет узел с подчиненным сотрудником

/// </summary>

/// <param name="mngdEmplMetric">

/// метрика сотрудника

/// </param>

/// <param name="mngrMetric"> метрика менеджера</param>

void RemoveEmployee(string[] mngdEmplMetric, string[] mngrMetric);

/// <summary>

/// Перемещает сотрудника от одного менеджера к другому

/// </summary>

/// <param name="mngdEmplMetric">метрика сотрудника</param>

/// <param name="oldMngrMetric">метрика прежнего менеджера</param>

/// <param name="newMngrMetric">метрика нового менеджера</param>

void MoveEmployee(string[] mngdEmplMetric,

string[] oldMngrMetric, string[] newMngrMetric);

/// <summary>

/// Возвращает категорию сотрудника

/// </summary>

/// <param name="mngdEmplMetric">метрика сотрудника</param>

/// <returns>категория сотрудника</returns>

EmployeeCategory GetCategory(string[] metric);

/// <summary>

/// Меняет категорию сотрудника

/// </summary>

/// <param name="mngdEmplMetric">метрика сотрудника</param>

/// <param name="newCategory">новая категория</param>

/// <param name="descr">описание или null </param>

/// <param name="mngdEmplMetrics">список подчиненных сотрудников

/// или null</param>

void MoveCategory(string[] metric,

EmployeeCategory newCategory, string descr, List<string[]> mngdEmplMetrics);

}