Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 12

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 20.5.2024

Лабораторная работа № 12. Классы в C#. Операции класса

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

Необходимые теоретические сведения

В C# классы могут выполнять роль модулей или типов данных.

Класс как модуль представляет собой основную архитектурную Единицу программной системы. В C# любую программу, выстроенную в объектном типе, можно представить как совокупность классов, которые могут быть объединены в проекты, пространства имен, решения и т.п.

При этом одни и те же задачи могут решать программы, состоящие как из одного, так и из нескольких модулей.

Класс как тип данных задает реализацию некоторой абстракции данных, характерной для задачи, в интересах которой создается программа.

С этой точки зрения состав класса определяется той абстракцией данных, которую должен реализовать класс. Так, например, в классе Банковский_счет нельзя добавить поля класса Автомобиль.

В C# разработка программных систем предполагает реализацию принципа проектирования от данных, когда проектирование системы сводится к поиску абстракций данных, подходящих для конкретной задачи. Каждая из этих абстракций реализуется в виде класса.

Объявляются классы с использованием ключевого слова class:

<модификатор> class ИмяКласса: <ИмяРодителя>, <Интерфейсы>

  { // Члены класса }

Модификаторы доступа к классу

Модификатор

Назначение

Отсутствует или internal

Доступ к классу может быть получен только из текущего класса

public

Общедоступный

abstract / internal abstract

Доступ к классу только из текущего проекта / + не допускает создания экземпляров

public abstract

Общедоступный, не допускает создания экземпляров

sealed / internal sealed

Не допускает наличия потомков-классов / + доступ только из текущего проекта

Абстрактный класс (abstract) – не допускают создания экземпляров, позволяет только наследовать от него другие классы, может иметь абстрактные типы.

Герметизированный класс (sealed) – не допускает наследования от него никаких других классов.

<Имя_родителя> - ссылка на базовый класс. В C# базовый класс может быть только один. Производный класс не может быть более доступным, чем базовый:

Верно!

Неверно!

public class Баз_класс

{// Члены класса}

internal class Произв_класс: Баз_класс

{// Члены класса}

internal class Баз_класс

{// Члены класса}

public class Произв_класс: Баз_класс

{// Члены класса}

В определении класса могут указываться поддерживаемые интерфейсы (перечисляются только после определения базового класса, если таковой имеется!):

public class Класс_Б : Класс_А, Инт_1, Инт_ 2.

Объекты создаются явным или неявным образом, то есть либо программистом, либо системой. Программист создает экземпляр класса с помощью операции new, например:

Demo a = new Demo (); // Создается экземпляр класса Demo

Если достаточный для хранения объекта объем памяти выделить не удалось, то генерируется исключение OutOfMemoryException.  

В теле класса могут быть объявлены:

  •  константы;
  •  поля;
  •  конструкторы и деструкторы;
  •  методы;
  •  события;
  •  делегаты;
  •  вложенные классы (структуры, интерфейсы, перечисления).

Основу класса составляют его конструкторы, поля и методы.

Поле – переменная экземпляра, представляющая собой данные конкретного объекта (по сути это простая переменная).

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

Например, класс Персона может иметь поле Рост, значения которого для разных объектов будут Низкий, Средний, Высокий.

Объявляются поля как обычные переменные:

class Мой_класс

 {

   int Число;

   string Строка;

   static void Main()

     { // }

 }

Доступ к полям определяется соответствующим модификатором: public, private (модификатор по умолчанию, т.е. все поля класса по умолчанию являются закрытыми), protected (защищенные поля – доступны для методов производных классов), internal.

Независимо от значения атрибута, все поля класса доступны для всех методов данного класса.

Упражнение 1. Создание класса

class Circle

{ public int x=0;

 public int y=0;

 public int radius=3;

 public const double pi = 3.14;

 public static string name = "Окружность";

 double p;

 double s;

}

class Program

{ static void Main()

{ Circle cr = new Circle();   // создание экземпляра класса

  Console.WriteLine("pi="+Circle.pi);// обращение к константе

  Console.Write(Circle.name); // обращение к статическому полю

  //обращение к обычным полям

  Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);

  // Console.WriteLine(cr.p); - вызовет ошибку, т.к. поля p, c имеют тип private

  

  Console.Write("Введите коэффициент= ");

  int kof = int.Parse(Console.ReadLine());

  cr.x -= kof; cr.y += kof; cr.radius *= kof;

  Console.WriteLine(" Новая окружность с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);

  //cr.s = 2 * Circle.pi * cr.radius; - вызовет ошибку, т.к. поля s, c имеют тип private

}}

Методы класса содержат описания операций, доступных над объектами класса. Атрибуты: public, private (по умолчанию), protected, internal.

Модификатор

Назначение

public (общедоступный)

Метод доступен отовсюду

private (приватный)

Доступен только из класса, в котором описан

protected (защищенный)

Доступен из класса, в котором описан, а также из любых производных классов

internal (внутренний)

Доступен из всех классов внутри сборки, в которой он описан

protected internal

Действует как protected или internal

Методы находятся в памяти в единственном экземпляре и используются всеми объектами одного класса совместно, поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию экземпляр.

В явном виде параметр this применяется для того, чтобы возвратить из метода ссылку на вызвавший объект, а также для идентификации поля в случае, если его имя совпадает с именем параметра метода

Упражнение 2. Работа с методами класса.

class Circle

{ public int x=0;

 public int y=0;

 public int radius=3;

 public const double pi = 3.14;

 public static string name = "Окружность";

 public Circle T()  // метод возвращает ссылку на экземпляр класса

 {

   return this;

 }

 public void Set(int x, int y, int r)  

 {

   this.x = x;

   this.y = y;

 radius=r;

 }

}

class Program

{ static void Main()

 {

   Circle cr = new Circle();   //создание экземпляра класса

   Console.WriteLine("pi="+Circle.pi); // обращение к константе

   Console.Write(Circle.name); // обращение к статическому полю

   //обращение к обычным полям

   Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);      

   cr.Set(1, 1, 10);

   Console.WriteLine("Новая окружность с центром в точке ({0},{1}) и радиусом {2}",

         cr.x, cr.y, cr.radius);

   Circle b=cr.T();//получаем ссылку на объект cr, аналог b=c

   Console.WriteLine("Новая ссылка на окружность с центром в точке ({0},{1})  и радиусом {2}", b.x, b.y, b.radius);

   }

}

Методы-свойства (Propertis) – поля, которые, с одной стороны, доступны для использования, с другой стороны, имеют ограничения в отношении действий, выполняемых над этим полем. При работе со свойствами объекта для реализации доступа могут быть выбраны следующие стратегии:

  •  чтение и запись (Read, Write);
  •  чтение, запись при первом обращении (Read, Write-once);
  •  только чтение (Read-only);
  •  только запись (Write-only);
  •  ни чтения, ни записи (Not Read, Not Write).

Открытость свойств (public) позволяет реализовать только 1-ую стратегию.

Синтаксис метода-свойства:

public возвращаемый_тип_значения Имя_метода-свойства

   {  // Тело метода свойства  

     [get код_доступа]

     [set код_доступа]  }

Имя_метода-свойства обычно близко к имени поля.

Код_доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) свойства. Метод get возвращает текущее значение свойства, метод set помещает в свойство новое значение, хранящееся  в служебной переменной со стандартным именем value.

Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set,  то свойство доступно только для чтения. Если отсутствует часть get,  то свойство доступно только для записи.

Пример 1. В классе Person создать строковое поле fam и свойство Fam строкового типа:

class Person

{

 string fam = ""; // Закрытое поле

 public string Fam // Открытое свойство

 {

   get {return fam;} // Получение значения свойства

   set {fam = value;} // Установка значения

 }

}

Привлечение свойства Fam в примере 1 никак не влияет на характер доступа к полю fam: проще сделать открытым само поле.

Если, например, поле fam должно получать значение лишь один раз, метод set может быть таким:

set { i f(fam == "")  fam = value;}

Пример 2. Добавить в класс Person закрытое вещественное поле salary (жалованье) и одноименное открытое свойство (доступно только для записи).

class Person

{

 float salary = 0; // Закрытое поле

 public float Salary // Открытое свойство только для записи

 {

   // Отсутствие метода get в свойстве Salary легко делает это поле доступным только для записи

   set {salary = value;}}

 }

}

Примечание. Закрытые поля доступны методам класса Person, поэтому поле salary может учитываться в них.

Упражнение 3. Имеется класс Персона, у которого есть следующие поля: фамилия (может быть задана 1 раз), статус (доступно только для чтения), зарплата (недоступна для чтения), возраст (доступно для чтения и записи), здоровье (закрыто для доступа, информация о здоровье может быть сообщена только специальными методами класса).

namespace ConsoleApplication1

{public class Персона

{ //Все поля закрыты

 string фамилия = "", статус = "", здоровье = "";

 int возраст = 0, зарплата = 0;

 //Методы-свойства

 //Чтение, запись при первом обращении (Read, Write-once)

 public string Фамилия

 { set { if (фамилия == "") фамилия = value; }

   get { return (фамилия); }

 }

 //стратегия - только чтение (Read-only)

 public string Статус

 { get { return (статус); }}

 //Стратегия - чтение и запись (Read, Write)

 public int Возраст

 {set

   {  возраст = value;

      if (возраст < 7) статус = "ребенок";

      else if (возраст < 17) статус = "школьник";

      else if (возраст < 22) статус = "студент";

      else статус = "служащий";   }

   get { return (возраст); }}

 //Стратегия - только запись (Write-only)

 public int Зарплата

 {   set { зарплата = value; }}}

class Program

{ static void Main()

  {Персона персона_1 = new Персона();

   персона_1.Фамилия = "Петров";

   персона_1.Возраст = 21;

   персона_1.Зарплата = 1000;

   Console.WriteLine("Фамилия = {0}, возраст = {1} лет, статус = {2}", персона_1.Фамилия, персона_1.Возраст, персона_1.Статус);

   персона_1.Фамилия = "Иванов"; персона_1.Возраст += 1;

   Console.WriteLine("Фамилия = {0}, возраст = {1} лет, статус = {2}", персона_1.Фамилия, персона_1.Возраст, персона_1.Статус);

   Console.ReadKey();

}}}

Результат работы программы:

Операции классов

С# позволяет переопределить большинство операций так, чтобы при использовании их объектами конкретного класса выполнялись действия, отличные от стандартных. Это дает возможность применять объекты собственных типов данных в составе выражений, например:

newObject x, y, z;

z = x+y; // используется операция сложения, переопределенная для класса newObject

Определение собственных операций класса называют перегрузкой операций. Перегрузка операций обычно применяется для классов, для которых семантика операций делает программу более понятной. Если назначение операции интуитивно непонятно, перегружать такую операцию не рекомендуется.

Операции класса описываются с помощью методов специального вида, синтаксис которых выглядит следующим образом:

[ атрибуты] спецификаторы объявитель_операции

 {  тело  }

В качестве спецификаторов одновременно используются ключевые слова public и static. Кроме того, операцию можно объявить как внешнюю – extern. Объявление операции может выглядеть по-разному, в зависимости от того, что мы перегружаем: унарную  или бинарную операцию.

При описании операций необходимо соблюдать следующие правила:

  •  операция должна быть описана как открытый статический метод класса (public static);
  •  параметры в операцию должны передаваться по значению (недопустимы параметры ref и out);
  •  сигнатуры всех операций класса должны различаться;
  •  типы, используемые в операции, должны иметь не меньшие права доступа, чем сама операция (должны быть доступны при использовании операции).

Унарные операции

В классе можно переопределять следующие унарные операции: +, -, !, ~, ++, --, а также константы    true  и false. При этом, если была перегружена константа true, то должна быть перегружена и константа false,  и наоборот.

Синтаксис объявителя унарной операции:

тип operator унарная_операция (параметр)

Пример 3. Заголовки унарных операций.

public static int operator + (DemoArray m)

public static DemoArray operator --(DemoArray m)

public static bool operator true (DemoArray m)

Параметр, передаваемый в операцию, должен иметь тип класса, для которого она определяется. При этом операция должна возвращать для операций:

  •  +, -, !,  ~  величину любого типа;
  •  ++, -- величину типа класса, для которого она определяется;
  •  для операций true и false величину типа bool.

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

  •  конструктор, позволяющий создать объект-массив заданного размера;
  •  конструктор, позволяющий инициализировать объект-массив обычным массивом;
  •  свойство, возвращающее размерность массива;
  •  индексатор, позволяющий просматривать и устанавливать значение по индексу в закрытом поле-массиве;
  •  метод вывода закрытого поля-массива;
  •  перегрузка операции унарный минус (все элементы массива меняют свое значение на противоположное);
  •  перегрузка операции инкремента (все элементы массива увеличивают свое значение на 1);
  •  перегруза констант true и false (при обращении к объекту будет возвращаться значение true, если все элементы массива положительные, в противном случае, будет возвращаться значение false).

class DemoArray

{ int[] MyArray; // закрытый массив

 public DemoArray(int size) // конструктор 1

 { MyArray = new int[size]; }

 public DemoArray(params int[] arr) // конструктор 2

 { MyArray = new int[arr.Length];

   for (int i=0; i<MyArray.Length; i++) MyArray[i]=arr[i]; }

 public int LengthArray // свойство, возвращающее размерность

 {  get { return MyArray.Length; }}

 public int this[int i]  // индексатор

 { get

   { if (i < 0 || i >= MyArray.Length) throw new Exception("выход за границы массива");

     return MyArray[i];  }

   set

   { if (i < 0 || i >= MyArray.Length) throw new Exception("выход за границы массива");

     else MyArray[i] = value;  }

 }

 // Перегрузка операции унарный минус

 public static DemoArray operator -(DemoArray x)

 { DemoArray temp = new DemoArray(x.LengthArray);

   for (int i = 0; i < x.LengthArray; ++i)

     temp[i] = -x[i];

   return temp;  }

 // Перегрузка операции инкремента

 public static DemoArray operator ++(DemoArray x)

 { DemoArray temp = new DemoArray(x.LengthArray);

   for (int i = 0; i < x.LengthArray; ++i)

     temp[i] = x[i]+1;   

   return temp;  }

 // Перегрузка константы true

 public static bool operator true(DemoArray a) 

 { foreach (int i in a.MyArray)

   { if (i<0)

     {  return false;  }}

   return true;

 }

 // Перегрузка константы false

 public static bool operator false(DemoArray a)

 { foreach (int i in a.MyArray)

   { if (i>0)

     { return true; }}

   return false;

 }

 // Метод – выводит поле-массив на экран

 public void Print(string name)

 { Console.WriteLine(name + ": ");

   for (int i = 0; i < MyArray.Length; i++)

     Console.Write(MyArray[i] + " ");

   Console.WriteLine();

 }

}

class Program

{ static void Main()

 { try

   { DemoArray Mas = new DemoArray(1, -4, 3, -5, 0); //вызов конструктора 2

     Mas.Print("Исходный массив");

     Console.WriteLine("\nУнарный минус");

     DemoArray newMas=-Mas; //применение операции унарного минуса

     Mas.Print("Mассив Mas"); // создается объект и знаки меняются

     newMas.Print("Массив newMas"); // только у нового массива

     Console.WriteLine("\nОперация префиксного инкремента");

     DemoArray Mas1 = ++Mas;

     Mas.Print("Mассив Mas");  

     Mas1.Print("Mассив Mas1=++Mas");

     Console.WriteLine("\nОперация постфиксного инкремента");

     DemoArray Mas2=Mas++;

     Mas.Print("Mассив Mas");  

     Mas2.Print("Mассив Mas2=Mas++");

     if (Mas)

       Console.WriteLine("\nВ массиве все элементы положительные\n");

     else Console.WriteLine("\nВ массиве есть не положительные элементы\n");

   }

   catch (Exception e)

   {  Console.WriteLine(e.Message);  }

}

Задание. Добавьте в класс DemoArray переопределение унарного плюса (все элементы массива преобразуются в положительные), унарного декремента (все элементы массива уменьшаются на единицу)  

Бинарные операции

При разработке класса можно перегрузить следующие бинарные операции: +, -, *, /, %, &, |, ^, <<, >>, ==, !=, <, >, <=, >=.

Синтаксис объявителя бинарной операции:

тип operator бинарная_операция (параметр1, параметр2)

Пример 2. Заголовки бинарных операций.

public static DemoArray operator + (DemoArray a, DemoArray b)

public static bool operator == (DemoArray a, DemoArray b)

Правила переопределения бинарных операций:

  1.  Хотя бы один параметр, передаваемый в операцию, должен иметь тип класса, для которого она определяется.
  2.  Операция может возвращать величину любого типа.
  3.  Операции отношений определяются только парами и обычно возвращают логическое значение. Чаще всего переопределяются операции сравнения на равенство и неравенство для того, чтобы обеспечить сравнение значения некоторых полей объектов, а не ссылок на объект. Для того чтобы переопределить операции отношений, требуется знание стандартных интерфейсов, которые будет рассматриваться чуть позже.

Упражнение 5. Добавить в класс DemoArray (см. упражнение 1), реализующему одномерный массив, две версии переопределенной операции +:

  •  Вариант 1: добавляет к каждому элементу массива заданное число;
  •  Вариант 2: поэлементно складывает два массива

class DemoArray

{

 … 

 //вариант 1

 public static DemoArray operator +(DemoArray x, int a)

 { DemoArray temp = new DemoArray(x.LengthArray);

   for (int i = 0; i < x.LengthArray; ++i)

     temp[i]=x[i]+a;

   return temp;  }

 public static DemoArray operator +(DemoArray x, DemoArray y) //вариант 2

 { if (x.LengthArray == y.LengthArray)

   { DemoArray temp = new DemoArray(x.LengthArray);

     for (int i = 0; i < x.LengthArray; ++i)

       temp[i] = x[i] + y[i];

     return temp; }

   else throw new Exception("несоответствие размерностей"); }}

class Program

{ static void Main()

 { try

   { DemoArray a = new DemoArray(1, -4, 3, -5, 0);

     a.Print("Массива a");

     DemoArray b=a+10;      b.Print("\nМассива b");

     DemoArray c = a+b;     c.Print("\nМассива c");  }

 catch (Exception e)

   {  Console.WriteLine(e.Message);  }}}

Задание. Добавьте в класс DemoArray переопределение бинарного минуса (из всех элементов массива вычитается заданное число) и операции & (поэлементно сравнивает два массива, если соответствующие элементы попарно совпадают, то операция возвращает значение true, иначе false).

Операции преобразования типов

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

explicit operator целевой_тип (параметр) //явное преобразование

implicit operator целевой_тип (параметр) //неявное преобразование

Эти операции выполняют преобразование из типа параметра в тип, указанный в заголовке операции. Одним из этих типов должен быть класс, для которого выполняется преобразование.

Неявное преобразование выполняется автоматически:

  •  при присваивании объекта переменной целевого типа;
  •  при использовании объекта в выражении, содержащем переменные целевого типа;
  •  при передаче объекта в метод параметра целевого типа;
  •  при явном приведении типа.

Явное преобразование выполняется при использовании операции приведения типа.

При определении операции преобразования типа следует учитывать следующие особенности:

  •  тип возвращаемого значения (целевой_тип) включается в сигнатуру объявителя операции;
  •  ключевые слова  explicit и implicit не включаются в сигнатуру объявителя операции.

Упражнение 6. Добавить в класс DemoArray, реализующий одномерный массив (см. упражнение 1, 2), неявную версию переопределения типа DemoArray в тип одномерный массив и наоборот.

class DemoArray

{

 …

 public static implicit operator DemoArray (int []a) //неявное преобразование типа int [] в DemoArray

 {  return new DemoArray(a);  }

 public static implicit operator int [](DemoArray a) //неявное преобразование типа DemoArray в int []

 { int []temp=new int[a.LengthArray];

   for (int i = 0; i < a.LengthArray; ++i)

     temp[i] = a[i];

   return temp;  }}

class Program

{  static void arrayPrint(string name, int[]a) //метод, который позволяет вывести на экран одномерный массив

 { Console.WriteLine(name + ": ");

   for (int i = 0; i < a.Length; i++)

     Console.Write(a[i] + " ");

   Console.WriteLine();  }

 static void Main()

 { try

   { DemoArray a = new DemoArray(1, -4, 3, -5, 0);

     int []mas1=a; //неявное преобразование типа DemoArray в int []

     int []mas2=(int []) a; //явное преобразование типа DemoArray в int []

     DemoArray b1 = mas1; //неявное преобразование типа int [] в DemoArray

     DemoArray b2 = (DemoArray)mas2; //явное преобразование типа int [] в DemoArray

     //изменение значений

     mas1[0]=0;    mas2[0]=-1;      

     b1[0]=100;    b2[0]=-100;

     //вывод на экран

     a.Print("Массива a");  

     arrayPrint("Maccив mas1", mas1);

     arrayPrint("Maccив mas2", mas2);

     b1.Print("Массива b1");

     b2.Print("Массива b2");  }

   catch (Exception e)

   {  Console.WriteLine(e.Message);  }}}

Задание.  В методе Main используется операция приведения типа DemoArray к int[] (и наоборот) в явном виде, хотя явная версия операции преобразования типа DemoArray к int[] не была определена. Объясните, почему возможно использование явного приведения типа.

Задания для самостоятельного выполнения

  1.  Создать класс Triangle, разработав следующие элементы класса:
  2.  Поля:
  •  int a, b, c;
  1.  Конструктор, позволяющий создать экземпляр класса  с заданными длинами сторон.
  2.  Методы, позволяющие:
    •  вывести длины сторон треугольника на экран;
    •  расчитать периметр треугольника;
    •  расчитать площадь треугольника.
  3.  Свойства:
    •  позволяющее получить-установить длины сторон треугольника (доступное для чтения и записи);
    •  позволяющее установить, существует ли треугольник с данными длинами сторон (доступное только для чтения).
  4.  Индексатор, позволяющий по индексу 0 обращаться к полю a, по индексу 1 – к полю b, по индексу 2 – к полю c, при других значениях индекса выдается сообщение об ошибке.
  5.  Перегрузка:
    •  операции ++ (--): одновременно увеличивает (уменьшает) значение полей a, b и c на 1;
    •  констант true и false: обращение к экземпляру класса дает значение true, если треугольник с заданными длинами сторон существует, иначе false;
    •  операции *:  одновременно домножает поля a, b и c на скаляр;
    •  преобразования типа Triangle в string (и наоборот).
  6.  Деструктор класса.

  1.  Создать класс для работы с одномерным массивом целых чисел. Разработать следующие элементы класса:
  2.  Поля:
  •  int [] IntArray;
  •  int n.
  1.  Конструктор, позволяющий создать массив размерности n.
  2.  Методы, позволяющие:
    •  ввести элементы массива с клавиатуры и вывести их на экран;
    •  отсортировать элементы массива в порядке возрастания.
  3.  Свойства:
    •  возвращающее размерность массива (доступное только для чтения);
    •  позволяющее домножить все элементы массива на скаляр (доступное только для записи).
  4.  Индексатор, позволяющий по индексу обращаться к соответствующему элементу массива.
  5.  Перегрузка:
    •  операции ++ (--): одновременно увеличивает (уменьшает) значение всех элементов массива на 1;
    •  операции !: возвращает значение true, если элементы массива не упорядочены по возрастанию, иначе false;
    •  операции бинарный *:  домножить все элементы массива на скаляр;
    •  преобразования класса массив в одномерный массив (и наоборот).
  6.  Деструктор класса.

  1.  Создать класс для работы с двумерным массивом целых чисел. Разработать следующие элементы класса:
    1.  Поля:
    •  int [,] IntArray;
    •  int n.
    1.  Конструктор, позволяющий создать массив размерности n×n.
    2.  Методы, позволяющие:
    •  ввести элементы массива с клавиатуры;
    •  вывести элементы массива на экран;
    •  вычислить сумму элеметов i-того столбца.
    1.  Свойства:
  •  позволяющее вычислить количество нулевых элементов в массиве (доступное только для чтения);
  •  позволяющее установить значение всех элементы главной диагонали массива равное скаляру (доступное только для записи).
    1.  Двумерный индексатор, позволяющий обращаться к соответствующему элементу массива.
    2.  Перегрузка:
  •  операции ++ (--): одновременно увеличивает (уменьшает) значение всех элементов массива на 1;
  •  констант true и false: обращение к экземпляру класса дает значение true, если двумерный массив является квадратным;
  •  операции бинарный +: позволяющей сложить два массива соответсвующих размерностей;
  •  преобразования класса массив в двумерный массив (и наоборот).
    1.  Деструктор класса.

  1.  Создать класс для работы с двумерным массивом вещественных чисел. Разработать следующие элементы класса:
    1.  Поля:
  •  double [][] DoubelArray;
  •  int n, m.
    1.  Конструктор, позволяющий создать массив размерности n×m.
    2.  Методы, позволяющие:
    •  ввести элементы массива с клавиатуры;
    •  вывести элементы массива на экран;
    •  отсортировать элементы каждой строки массива по убыванию.
    1.  Свойства:
    •  возвращающее общее количество элементов в массиве (доступное только для чтения);
    •  позволяющее увеличить значение всех элементов массива на скаляр (доступное только для записи).
    1.  Двумерный индексатор, позволяющий обращаться к соответствующему элементу массива.
    2.  Перегрузка:
    •  операции ++ (--): одновременно увеличивает (уменьшает) значение всех элементов массива на 1;
    •  констант true и false: обращение к экземпляру класса дает значение true, если каждая строка массива упорядоченна по возрастанию, иначе false.
    •  операции *: позволяющей умножить два массива соответствующих размерностей.
    •  преобразования класса массив в ступенчатый массив (и наоборот).
    1.  Деструктор класса.

  1.  Создать класс для работы сo строками. Разработать элементы класса:
    1.  Поля:
  •  StringBuilder Line;
  •  int n.
    1.  Конструктор, позволяющий создать строку из n символов.
    2.  Методы, позволяющие:
    •  подсчитать количество пробелов в строке;
    •  заменить в строке все прописные символы на строчные;
    •  удалить из строки все знаки препинания.
    1.  Свойства:
  •  возвращающее общее количество элементов в строке (доступное только для чтения);
  •  позволяющее установить значение поля, в соответствии с введенным значением строки с клавиатуры, а также получить значение данного поля (доступно для чтения и записи).
    1.  Индексатор, позволяющий по индексу обращаться к соответствующему символу строки.
    2.  Перегрузка:
  •  операции унарного + (-): преобразующей строку к строчным (прописным) символам;
  •  констант true и false: обращение к экземпляру класса дает значение true, если строка не пустая, иначе false.
  •  операции &: возвращает значение true, если строковые поля двух объектов посимвольно равны (без учета регистра), иначе false;
  •  преобразования класса-строка в тип string (и наоборот).
    1.  Деструктор класса.

  1.  Создать класс для работы с регулярными выражениями. Элементы класса:
    1.  Поля:
  •  Regex r;
  •  string text;
    1.  Методы, позволяющие:
    •  определить, содержит ли текст фрагменты, соответствующие шаблону поля;
    •  вывести на экран фрагменты текста, соответствующие шаблону поля;
    •  удалить из текста все фрагменты, соответствующие шаблону поля;
    1.  Свойства:
    •  позволяющее установить или получить строковое поле класса (доступно для чтения и записи)
    •  позволяющее установить или получить регулярное выражение, хранящееся в соответствующем поле класса (доступно для чтения и записи).
    1.  Индексатор, позволяющий по индексу 0 обращаться к полю r, по индексу 1 – к полю text, при других значениях индекса выдается сообщение об ошибке.
    2.  Перегрузку:
    •  операции унарного -: удаляет из поля text все фрагменты, соответсвующие регулярному выражению поля r.
    •  констант true и false: обращение к экземпляру класса дает значение true, если поле text не пустое, иначе false;
    •  операции бинарного +: дописывает в конец поля text строку.
    •  преобразования класса Regex в тип string (и наоборот).
    1.  Деструктор класса.

  1.  Создать класс для работы с датой. Разработать следующие элементы класса:
    1.  Поле DataTime data.
    2.  Конструкторы, позволяющие установить:
    •  заданную дату
    •  дату 1.01.2009
    1.  Методы, позволяющие:
    •  вычислить дату предыдущего дня;
    •  вычислить дату следующего дня;
    •  определить сколько дней осталось до конца месяца.
    1.  Свойства:
    •  позволяющее установить или получить значение поле класса (доступно для чтения и записи)
    •  позволяющее определить год высокосным (только для чтения).
    1.  Индексатор, позволяющий определить дату i-того по счету дня относительно установленной даты (при отрицательных значениях индекса отсчет ведется в обратном порядке).
    2.  Перегрузку:
    •  операции !: возвращает значение true, если установленная дата не является последним днем месяца, иначе false;
    •  констант true и false: обращение к экземпляру класса дает значение true, если установленная дата является началом года, иначе false;
    •  операции &: возвращает значение true, если поля двух объектов равны, иначе false;
    •  преобразования класса DataTime в тип string (и наоборот).
    1.  Деструктор класса.

PAGE  17




1. СУЩНОСТЬ БАНКОВ С ПОЗИЦИИ ИХ ИСТОРИЧЕСКОГО РАЗВИТИЯ
2. Характеристика и оценка деятельности ОАО Омский агрегатный завод.html
3. ООО Киприно 2 Анализ готовой продукции 2
4. ОБЩАЯ ЭЛЕКТРОТЕХНИКА И ЭЛЕКТРОНИКА ОСНОВЫ ЭЛЕКТРОНИКИ ЧАСТЬ IV АНАЛОГОВАЯ СХЕМОТЕХНИКА ИМПУ
5. тематическое Программирование базы данных ПО 1
6. Да они свободнее и раскрепощённее в своих мыслях мне доставляет удовольствие читать их отклики в гостевых
7. Введение в электротехнику Электротехника это область науки и техники изучающая электрические и магни
8. 245м выработки склада ВМ гор
9. иностранцы используют в Тайланде международное водительское удостоверение но по тайским законам использо
10. Нарушение периферического кровообращения
11. Новая заимствованная общественно-политическая лексика в языке российских СМИ
12. 34633
13. Основы эффективности государственного управления
14. . Термодинамические системы и их классификация
15. педагогическая дифференциация нарушений интеллектуального и речевого развития
16. Севильский цирюльник де Бомарше Пьер Огюстен
17. ки ~ предприятию так именно на предприятии создается продукция выполняются работы
18. такую прекрасную совершенно неземную то день прошел впустую
19.  Mtch synonymous words nd phrses hve under your belt expenses bis competitive edge obsolete shell out tckle steer cler
20. Обслуговування обладнання