Тверской государственный университет
Опубликован: 02.12.2009 | Доступ: свободный | Студентов: 2365 / 261 | Оценка: 4.47 / 4.24 | Длительность: 14:45:00
Лекция 4:

Перечисления

< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Пример. Класс Job

Этот пример работы со шкалами обсуждался в "Перечисления" части 1, когда речь шла о выполнении логических операций. Есть смысл снова вернуться к его рассмотрению, поскольку теперь все детали его должны быть совершенно понятны. Пример содержательный, он описывает ситуацию, когда некоторая фирма нанимает на работу программистов, предварительно опубликовав список свойств, рассматриваемых при приеме на работу. Набор этих свойств определяется перечислением, заданным шкалой.

/// <summary>
/// Свойства претендентов на должность программиста,
/// описывающие знание технологий и языков программирования
/// </summary>
public enum Prog_Properties
{
  VB = 1, C_sharp = 2, C_plus_plus = 4,
  Web = 8, Prog_1C = 16
}

Приведу теперь полный текст класса Job, описывающего процесс приема программистов на работу в фирму на основе анализа их свойств и в соответствии с требованиями фирмы. Конечно, пример модельный, и наибольшие сложности связаны с вероятностным моделированием множества кандидатов и их свойств. Что же касается запросов на поиск кандидатов, удовлетворяющих заданным требованиям, то реализация подобных запросов уже подробно рассмотрена в этой лекции.

/// <summary>
  // Прием программистов на работу 
  /// </summary>
  public class Job
  {
      //fields
      /// <summary>
      /// Число претендентов
      /// </summary>
      int n;

      /// <summary>
      /// массивы, задающие свойства претендентов 
      /// </summary>
      Prog_Properties[] cand;
      string[] strCand;
      Prog_Properties pattern;

      Prog_Properties currentScale;
      Random rnd;

      //Constructors
      public Job()
      {
          n = 10;
          cand = new Prog_Properties[n];
          strCand = new string[n];
          rnd = new Random();
      }
      public Job(int n)
      {
          this.n = n;
          cand = new Prog_Properties[n];
          strCand = new string[n];
          rnd = new Random();

      }
      public Job(Prog_Properties[] pp)
      {
          n = pp.Length;
          cand = pp;
          strCand = new string[n];
          rnd = new Random();

      }
      //Properties
      public Prog_Properties Pattern
      {
          set { pattern = value; }
      }

      //Methods
      /// <summary>
      /// Формирование свойств кандидатов
      /// Каждое свойство появляется с вероятностью 0.5
      /// </summary>
      public void FormCands()
      {
          int properties = 5;
          int p = 0, q = 0, currentProps = 0;
          string strQ;
          for (int i = 0; i < n; i++)
          {
              currentProps = 0; strQ = "";
              for (int j = 0; j < properties; j++)
              {
                  p = rnd.Next(2);
                  q = (int)Math.Pow(2, j);
                  if (p == 1)
                  {
                      currentProps += q;
                      strQ += (Prog_Properties)q + ", ";
                  }
              }
              cand[i] = (Prog_Properties)currentProps;
              if (strQ != "")
                  strCand[i] = strQ.Remove(strQ.Length - 2);
              else strCand[i] = "";
          }
      }//FormCands
      public string[] GetStrCands()
      {
          return strCand;
      }
      public Prog_Properties[] GetCands()
      {
          return cand;
      }
      /// <summary>
      /// Список кандидатов, которые обладают
      /// свойствами, заданных образцом.
      /// </summary>
      public ArrayList CandsHavePat()
      {
          ArrayList temp = new ArrayList();
          for (int i = 0; i < n; i++)
              if ((cand[i] & pattern) == pattern)
                  temp.Add("cand[" + i + "]");
          return temp;
      }

      /// <summary>
      /// Список кандидатов, которые не обладают
      /// всеми свойствами, заданных образцом.
      /// </summary>
      public ArrayList CandsHaveNotAllPat()
      {
          ArrayList temp = new ArrayList();
          for (int i = 0; i < n; i++)
              if ((~cand[i] & pattern) == pattern)
                  temp.Add("cand[" + i + "]");
          return temp;
      }
      /// <summary>
      /// Список кандидатов, которые обладают
      /// некоторыми свойствами, заданных образцом.
      /// </summary>
      public ArrayList CandsHaveSomePat()
      {
          ArrayList temp = new ArrayList();
          for (int i = 0; i < n; i++)
          {
              currentScale = cand[i] & pattern;
              if (currentScale > 0 && currentScale < pattern)
                  temp.Add("cand[" + i + "]");
          }
          return temp;

      }
      /// <summary>
      /// Список кандидатов, которые обладают
      /// только свойствами, заданных образцом.
      /// </summary>
      public ArrayList CandsHaveOnlyPat()
      {
          ArrayList temp = new ArrayList();
          for (int i = 0; i < n; i++)
              if (((cand[i] & pattern) == pattern) &&
                  ((cand[i] & ~pattern) == 0))
                  temp.Add("cand[" + i + "]");
          return temp;
      }
  }

Анализируя код этого класса, следует обратить внимание на метод FormCands, моделирующий создание множества кандидатов, представленного объектом динамического класса ArrayList. Группа методов, реализующих запросы на поиск нужных кандидатов среди множества кандидатов, интересна тем, что результаты поиска также задаются объектом класса ArrayList.

В заключение приведу теперь текст метода, тестирующего работу с классом Job:

/// <summary>
 /// Тестирование процесса приема на работу 
 /// </summary>
 public void TestJob()
 {
     Prog_Properties pattern = Prog_Properties.C_sharp |
         Prog_Properties.Web;
     Console.WriteLine("Требования, заданные образцом:" +
         " Знание языка С# и Web технологии");

     int n = 10;
     Job mys = new Job(n);
     mys.FormCands();
     Prog_Properties[] cand = mys.GetCands();
     string[] strCand = mys.GetStrCands();
     for (int i = 0; i < n; i++)
     {
         Console.WriteLine("Свойства кандидата[{0}] - {1}",
             i, cand[i]);
         Console.WriteLine(strCand[i]);
     }

     mys.Pattern = pattern;
     ArrayList result;
     result = mys.CandsHavePat();
     Console.WriteLine("Кандидаты, имеющие заданные свойства");
     foreach (string pretender in result)
         Console.WriteLine(pretender);

     result = mys.CandsHaveNotAllPat();
     Console.WriteLine("Кандидаты, не имеющие всех свойств");
     foreach (string pretender in result)
         Console.WriteLine(pretender);

     result = mys.CandsHaveSomePat();
     Console.WriteLine("Кандидаты, имеющие некоторые свойства");
     foreach (string pretender in result)
         Console.WriteLine(pretender);

     result = mys.CandsHaveOnlyPat();
     Console.WriteLine("Кандидаты: только заданные свойства");
     foreach (string pretender in result)
         Console.WriteLine(pretender);
 }

Результаты работа теста представлены на рис. 3.5.

Поиск кандидатов при приеме на работу

Рис. 3.5. Поиск кандидатов при приеме на работу
< Лекция 3 || Лекция 4: 12345 || Лекция 5 >
Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?

Дарья Федотова
Дарья Федотова
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002
Олег Корсак
Олег Корсак
Латвия, Рига