Сортировка элементов массива. Интерфейс IComparable, метод CompareTo. — КиберПедия 

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

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

Сортировка элементов массива. Интерфейс IComparable, метод CompareTo.

2019-08-03 603
Сортировка элементов массива. Интерфейс IComparable, метод CompareTo. 0.00 из 5.00 0 оценок
Заказать работу

Большинство встроенных в.NET классов коллекций и массивы поддерживают сортировку. С помощью одного метода, который, как правило, называется Sort() можно сразу отсортировать по возрастанию весь набор данных. Например:

1 2 3 4 int[] numbers = new int[] { 97, 45, 32, 65, 83, 23, 15 }; Array.Sort(numbers); foreach (int n in numbers) Console.WriteLine(n);

Однако метод Sort по умолчанию работает только для наборов примитивных типов, как int или string. Для сортировки наборов сложных объектов применяется интерфейс IComparable. Он имеет всего один метод:

1 2 3 4 public interface IComparable { int CompareTo(object o); }

Метод CompareTo предназначен для сравнения текущего объекта с объектом, который передается в качестве параметра object o. На выходе он возвращает целое число, которое может иметь одно из трех значений:

  • Меньше нуля. Значит, текущий объект должен находиться перед объектом, который передается в качестве параметра
  • Равен нулю. Значит, оба объекта равны
  • Больше нуля. Значит, текущий объект должен находиться после объекта, передаваемого в качестве параметра

 

19. Перегрузка функций (методов). Примеры.

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

Совершенно недостаточно, чтобы два метода отличались только типами возвращаемых значений. Они должны также отличаться типами или числом своих параметров. Конечно, перегружаемые методы могут отличаться и типами возвращаемых значений. Когда вызывается перегружаемый метод, то выполняется тот его вариант, параметры которого соответствуют (по типу и числу) передаваемым аргументам.

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

int max(int x, int y)

{

if(x>y) return x;

else return y;

}

 

double max(double x, double y)

{

if(x>y) return x;

else return y;

}

В следующем фрагменте программы, мы вызываем один из этих методов.

double x=3.5, y=4.6; label1.Text=max(x,y).ToString();

Также этот метод можно вызвать и для целых чисел

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

Если метод перегружен, то программист-пользователь может следить за его конкретным вызовом. Компил.должен знать, какой метод вызывать. Можно под одним именем описать методы, выполняющие разные действия, но делать этого не рекомендуется.

 

Перегрузка операторов. Примеры.

В С# существует ряд операторов для работы со встроенными типами данных. Это операторы «+», «-», «!», «==», «!=» и т.д. Например, бинарный оператор «+» выполняет операцию сложения над численными типами данных. Этот же самый оператор над строками выполняет конкатенацию (склеивание двух строк). Это происходит потому, что оператор «+» перегружен в классе string.

Перегрузка оператора - это реализация своего собственного функционала оператора для конкретного класса. Перегрузка оператора похожа на перегрузку методов, но требует специального оформления. Для перегрузки операторов используется служебное слово operator. Если мы хотим перегрузить некоторый оператор, то в соответствующем классе мы должны создать общедоступный статический метод с именем operator имя_оператора. Например operator+ или operator*.

Рассмотрим пример:

Класс, в этом классе есть поле rub, в котором хранятся рубли и поле kop предназначенное для копеек. Мы перегрузим двуместный оператор + и одноместный ++, второй оператор будет увеличивать рубли на единицу.

class M{ int rub; int kop;

 

public int Rub {get {return rub;} set {if(value≥0) rub=value; else rub=0}};

public int Kop {get {return kop;} set {if(value<0) kop=0; else {kop=value%100; rub=rub+value/100;};

 

public static M operator+(M m1, M m2) {

M m=new M();

m.Rub=m1.Rub+m2.Rub;

m.Kop=m1.Kop+m2.Kop;

return m;}

M m1=new M();

m1.Rub=3; //4

m1.Kop=138; //38

M m2=new M();

m2.Rub=4;

m2.Kop=72;

M m3=m1+m2;

 

public static M operator++(M m)

{m.Rub++; return m; }

}

Пример: переопределим + и ++. + это будет сумма полей объекта, а ++ добавление к каждому полю единицу:

 

public class Rectangle1 {

                   public int x, y, s;

                   public static Rectangle1 operator + (Rectangle1 rec1, Rectangle1 rec2)

                   {

                              Rectangle1 re = new Rectangle1 ();

                              re.x=rec1.x+rec2.y;

                              re.y=rec1.y+rec2.x;

                              return re;

                                  

                   }

                   public static Rectangle1 operator ++ (Rectangle1 rect)

                   {

                              rect.x++;

                          rect.y++;

                              return rect;

                   }

       }

//в мейнформ

re2. x =Convert. ToInt16 (textBox3. Text);
re2. y =Convert. ToInt16 (textBox4. Text);
re2 ++;

Rectangle1 ren= re1 + re2;

 

При перегрузке нельзя менять местность оператора.

Операторы проверки отношений можно перегружать только в парах:

== и!=), < и >, <= и >=.

Нельзя перегружать следующие операторы:

 

[ ] – функционал этого оператора предоставляют индексаторы,

 

() – функционал этого оператора предоставляют методы преобразования типов,

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= краткие формы оператора присваивания будут автоматически доступны при перегрузке соответствующих операторов (+, -, * …).

 

Исключительные ситуации. Обработка исключений. Блоки try-catch. Примеры.

Исключительная ситуация (или исключение) — это ошибка, которая возникает во время выполнения программы. Обработка исключений – это описание реакции программы на подобные события (исключения) во время выполнения программы. Реакцией программы может быть корректное завершение работы программы, вывод информации об ошибке и запрос повторения действия (при вводе данных).

Примерами исключений может быть:

- деление на ноль;

- извлечение корня квадратного из отрицательного числа;

- конвертация некорректных данных из одного типа в другой;

- попытка открыть файл, которого не существует;

- доступ к несуществующему элементу массива;

- другое.

Управление С#-механизмом обработки исключений базируется на четырех ключевых словах: try, catch, throw и finally.

Ядром обработки исключений являются блоки try и catch. Ключевые слова try и catch работают всегда в паре; нельзя использовать слово try без catch или catch без try. В блок try записываются команды, которые могут сгенерировать исключение, в блоки catch фрагменты программы, обрабатывающие эти исключения.

С try -блоком может быть связан не один, а несколько блоков catch. Какой именно из них будет выполнен, определит тип исключения. Другими словами, будет выполнен тот блок catch, который предназначен для обработки сгенерированного исключения. а все остальные блоки catch будут проигнорированы. Если исключение не генерируется, try-блок завершается нормально, и все связанные с ним блоки catch пропускаются. Выполнение программы продолжается с первой команды, которая стоит после последнего блока catch. Таким образом, конкретный блок catch выполняется только в случае, если сгенерировано соответствующее исключение.

Пример обработки исключений. Вводится значение переменной i, затем выполняется деление на эту переменную. Фрагмент программы, записанный в блоке try, может сгенерировать два типа исключений, поэтому после него идут два блока catch

void Button1Click(object sender, EventArgs e)

                   {int i,j;

                              try{i=Convert.ToInt32(textBox1.Text);

                                          j=14/i;}

                              catch(FormatException u)

                              {MessageBox.Show("Ошибка данных", "Внимание"); }

                              catch(DivideByZeroException u)

                              {MessageBox.Show("На 0 делить нельзя", "Внимание");}

                   }

Пример: исключение, если число превышает длину массива

try{

       k=Convert.ToInt32(textBox5.Text);

       if (!((mass[k] is Circle) ||(mass[k] is Romb)))

       {

                   groupBox1.Enabled=true;

                   textBox3.Text=""; textBox4.Text=""; label5.Text="";

catch (System.IndexOutOfRangeException)

                              {

                                          MessageBox.Show (" Введен неправильный индекс ");

                              }


Поделиться с друзьями:

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.029 с.