Опубликован: 02.12.2009 | Уровень: специалист | Доступ: платный | ВУЗ: Тверской государственный университет
Лекция 3:

Структуры

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

Встроенные структуры

Как уже говорилось, все значимые типы языка реализованы структурами. В библиотеке FCL имеются и другие встроенные структуры. Рассмотрим в качестве примера структуры Point, PointF, Size, SizeF, Rectangle, находящиеся в пространстве имен System.Drawing (при работе с консольным проектом это пространство нужно подключать). Данные структуры активно используются при работе с графическими объектами. Структуры Point, PointF определяют точки на плоскости. Свойства X и Y позволяют задавать координаты точки, целочисленные или вещественные. Для структур Size и SizeF свойства Height и Width задают высоту и ширину. Структуры Point и Size позволяют сформировать прямоугольную область - структуру Rectangle. Конструктору прямоугольника можно передать в качестве аргументов две структуры: точку, задающую координаты левого верхнего угла прямоугольника, и размер - высоту и ширину прямоугольника.

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

public void TestPointAndSize()
  {
    Point pt1 = new Point(3,5), pt2 = new Point(7,10), pt3;
    PointF pt4 = new PointF(4.55f,6.75f);
    Size sz1 = new Size(10,20), sz2;
    SizeF sz3 = new SizeF(10.3f, 20.7f);
    pt3 = Point.Round(pt4);
    sz2 = new Size(pt1);
    Console.WriteLine ("pt1: " + pt1);
    Console.WriteLine ("sz2 = new Size(pt1): " + sz2);
    Console.WriteLine ("pt4: " + pt4);
    Console.WriteLine ("pt3 = Point.Round(pt4): " + pt3);
    pt1.Offset(5,7);
    Console.WriteLine ("pt1.Offset(5,7): " + pt1);    
    Console.WriteLine ("pt2: " + pt2);
    pt2 = pt2+ sz2;
    Console.WriteLine ("pt2= pt2+ sz2: " + pt2);
   }//TestPointAndSize

Результаты его выполнения показаны на рис. 2.1.

Операции над точками и размерами

Рис. 2.1. Операции над точками и размерами

Отметим, что метод ToString, определенный для этих структур, выдает строку со значениями полей в приемлемой для восприятия форме.

Еще раз о двух семантиках присваивания

В заключение разговора о ссылочных и развернутых типах построим класс CPoint, являющийся аналогом структуры Point. Не буду приводить описание этого класса, надеюсь, оно достаточно понятно. Ограничусь примером, в котором аналогичные действия выполняются над объектами, принадлежащими структуре Point и классу CPoint:

public void TestClassAndStructPoint()
  {
   string s = "Структуры: присваивание развернутого типа!";
   Console.WriteLine(s);
   Point pt1 = new Point(3, 5), pt2;
   pt2 = pt1;
   Console.WriteLine("pt1: " + pt1);
   Console.WriteLine("pt2 = pt1: " + pt2);
   pt1.Offset(5, 7);
   Console.WriteLine("pt1.Offset(5,7): " + pt1);
   Console.WriteLine("pt2: " + pt2);
   s = "Классы: присваивание ссылочного типа!";
   Console.WriteLine(s);
   CPoint cpt1 = new CPoint(3, 5), cpt2;
   cpt2 = cpt1;
   Console.WriteLine("cpt1: " + cpt1);
   Console.WriteLine("cpt2=cpt1: " + cpt2);
   cpt1.Offset(5, 7);
   Console.WriteLine("cpt1.Offset(5,7): " + cpt1);
   Console.WriteLine("cpt2: " + cpt2);
  }

Результаты вычислений показаны на рис. 2.2.

Две семантики присваивания

Рис. 2.2. Две семантики присваивания

Действия над объектами Point и CPoint выполняются аналогичные, а результаты получаются разные: в конце вычислений pt1 и pt2 различны, а cpt1 и cpt2 совпадают. Объяснение этому понятно: в первом случае присваивание структур pt2 и pt1 - значимое, а для объектов cpt1 и cpt2 - ссылочное.

Архитектура Решения

Как обычно, для демонстрации примеров данной лекции построено Решение с именем лекции Ch2_2. В Решение включен единственный консольный проект с именем StructuresAndClasses. К проекту присоединены две DLL с именами ClassSamples и Geometrical_Figures, включенные в Решение Ch2_1, которое приведено в предыдущей лекции. Классы CPoint и SRational из этих библиотек используются в консольном проекте. Консольный проект содержит традиционный класс Testing, большое число его методов представляют собой различные тесты, которые иллюстрируют работу с различными объектами классов из DLL, присоединенных к консольному проекту.

Задачи

В задачах и проекте этой лекции все классы необходимо создавать в двух вариантах - как классы, принадлежащие ссылочному типу, и как структуры, принадлежащие развернутому типу. Windows-проект, строящийся в задачах, должен позволять оценить сходство и различие, появляющееся при работе с объектами ссылочных и развернутых типов.

  1. Создать DLL с классом Point, описывающим точку на плоскости, заданную декартовыми и полярными координатами. Среди методов класса Point предусмотреть метод Distance, вычисляющий расстояние до заданной точки. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с классом Point.
  2. Создать DLL с классами Point и Line, описывающими точку и линию на плоскости. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Line предусмотреть метод, определяющий принадлежность заданной точки линии.
  3. Создать DLL с классами Point и Square, описывающими точку и квадрат на плоскости со сторонами, параллельными осям координат. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Square предусмотреть метод, определяющий принадлежность заданной точки квадрату.
  4. Создать DLL с классами Point и Circle, описывающими точку и круг на плоскости. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Circle предусмотреть метод, определяющий принадлежность заданной точки кругу.
  5. Создать DLL с классами Point и Rectangle, описывающими точку и прямоугольник на плоскости со сторонами, параллельными осям координат. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Rectangle предусмотреть метод, определяющий принадлежность заданной точки прямоугольнику.
  6. Создать DLL с классами Point и Rhomb, описывающими точку и ромб на плоскости с осями, параллельными осям координат. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Rhomb предусмотреть метод, определяющий принадлежность заданной точки ромбу.
  7. Создать DLL с классами Point и Tetragon, описывающими точку и четырехугольник на плоскости. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Tetragon предусмотреть метод, определяющий принадлежность заданной точки четырехугольнику.
  8. Создать DLL с классами Point и Triangle, описывающими точку и треугольник на плоскости. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL. Среди методов класса Triangle предусмотреть метод, определяющий принадлежность заданной точки треугольнику.
  9. Создать DLL с классами Account и Accounts, описывающими счет в банке и множество счетов клиентов, хранящихся в файле. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  10. Создать DLL с классами Lexeme и AriphmeticExpression, описывающими лексему и арифметическое выражение. Среди методов класса AriphmeticExpression предусмотреть метод, представляющий выражение в виде массива лексем. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  11. Создать DLL с классами Lexeme и LogicExpression, описывающими лексему и логическое выражение. Среди методов класса LogicExpression предусмотреть метод, представляющий выражение в виде массива лексем. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  12. Создать DLL с классами Lexeme и Assignment, описывающими лексему и оператор присваивания. Среди методов класса Assignment предусмотреть метод, представляющий оператор в виде массива лексем. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  13. Создать DLL с классами Student и Exam, описывающими студента и экзамен. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  14. Создать DLL с сервисным классом Poisk, содержащего методы линейного и бинарного поиска. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  15. Создать DLL с сервисным классом Sorting, содержащего методы сортировки. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.
  16. Создать DLL с интерфейсным классом InputArray, позволяющий вводить одномерный массив с проверкой корректности ввода элементов. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с DLL.

Проекты

  1. Дано множество точек P1, P2, \dots Pn со случайными координатами. Построить множество точек P1, P2, \dots Pm ( m <= n ), обход которых позволяет построить многоугольник без пересечений, если это возможно. Уметь вычислять площадь многоугольника, определять, является ли он выпуклым, принадлежит ли заданная точка внутренней области (границам) многоугольника. Построить реализацию в виде класса Polygon, включенного в состав DLL. Построить Windows-проект, предоставляющий пользователю интерфейс для работы с объектами класса Polygon.
< Лекция 2 || Лекция 3: 1234 || Лекция 4 >
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

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

Дмитрий Штаф
Дмитрий Штаф
Россия
Дмитрий Слапогузов
Дмитрий Слапогузов
Россия, Бийск