3664

Клас Array і нові можливості масивів

Лекция

Информатика, кибернетика и программирование

Клас Array і нові можливості масивів Клас Array Не можна зрозуміти багато деталей роботи з масивами в C#, якщо не знати пристрій класу Array з бібліотеки FCL, нащадками якого є всі класи-масиви. Розглянемо наступні оголошення: Клас Array...

Украинкский

2012-11-05

90.5 KB

5 чел.

Клас Array і нові можливості масивів

Клас Array

Не можна зрозуміти багато деталей роботи з масивами в C#, якщо не знати пристрій класу Array з бібліотеки FCL, нащадками якого є всі класи-масиви. Розглянемо наступні оголошення:

//Клас Array

        int[] ar1 = new int[5];

        double[] ar2 ={5.5, 6.6, 7.7};

        int[,] ar3 = new Int32[3,4];

Задамося природним запитанння: до якого або до яких класів належать об'єкти ar1, ar2 й ar3? Відповідь проста: всі вони належать до різних класів. Змінна ar1 належить до класу int[] - одномірному масиву значень типу int, ar2 - double[] - одномірному масиву значень типу double, ar3 - двовимірному масиву значень типу int. Наступне закономірне питання: а що загального є в цих трьох об'єктів? Насамперед, всі три класи цих об'єктів, як й інші класи, є нащадками класу Object, а тому мають загальні методи, успадковані від класу Object і доступні об'єктам цих класів.

У всіх класів, що є масивами, багато загального, оскільки всі вони є нащадками класу System.Array. Клас System.Array успадковує ряд інтерфейсів: ICloneable, IList, ICollection, IEnumerable, а, отже, зобов'язаний реалізувати всі їхні методи й властивості. Крім спадкування властивостей і методів класу Object і перерахованих вище інтерфейсів, клас Array має досить велике число власних методів і властивостей. Гляньте, як виглядає відношення спадкування на сімействі класів, що визначають масиви.


Рис. 14.1. 
Відношення спадкування на класах-масивах

Завдяки такому потужному батькові, над масивами визначені найрізноманітніші операції - копіювання, пошук, обіг, сортування, одержання різних характеристик. Масиви можна розглядати як колекції й улаштовувати цикли ForEach для перебору всіх елементів. Важливо й те, що коли в сімейства класів є загальний батько, то можна мати загальні процедури обробки різних нащадків цього батька. Для загальних процедур роботи з масивами характерно, що один або кілька формальних аргументів мають батьківський тип Array. Природно, усередині такої процедури може знадобитися аналіз - який реальний тип масиву переданий у процедуру.

Розглянемо приклад подібної процедури. Раніше я для печатки елементів масиву використав різні процедури PrintAr1, PrintAr2 і так далі, по однієї для кожного класу масиву. Тепер я приведу загальну процедуру, формальний аргумент якої буде належати батькові всіх класів-масивів, що дозволить передавати масив будь-якого класу як фактичний аргумент:

public static void PrintAr(string name, Array A)

{

  Console.WriteLine(name);

  switch (A.Rank)

  {

     case 1:

        for(int i = 0; i<A.GetLength(0);i++)

           Console.Write("\t" + name + "[{0}]={1}",

              i, A.GetValue(i));

        Console.WriteLine();

        break;

     case 2:  

        for(int i = 0; i<A.GetLength(0);i++)

        {

           for(int j = 0; j<A.GetLength(1);j++)

              Console.Write("\t" + name + "[{0},{1}]={2}",

                 i,j, A.GetValue(i,j));

           Console.WriteLine();

        }

        break;

     default: break;

  }

}//PrintAr

От як виглядає створення масивів і виклик процедури печаті:

public void TestCommonPrint()

{

  //Клас Array

  int[] ar1 = new int[5];

  double[] ar2 ={5.5, 6.6, 7.7};

  int[,] ar3 = new Int32[3,4];

  Arrs.CreateOneDimAr(ar1);Arrs.PrintAr("ar1", ar1);

  Arrs.PrintAr("ar2", ar2);

  Arrs.CreateTwoDimAr(ar3);Arrs.PrintAr("ar3", ar3);

}//TestCommonPrint

От результати виводу масивів ar1, ar2 й ar3.

Рис.14.2. Печать масивів. Результати роботи процедури PrintAr

Приведу деякі коментарі.

Перше, на що варто звернути увагу: формальний аргумент процедури належить базовому класу Array, спадкоємцями якого є всі масиви в CLR й, природно, всі масиви C#.

Для того щоб зберегти можливість роботи з індексами, як в одномірному, так й у двовимірному випадку, довелося організувати розбір випадків. Властивість Rank, що повертає розмірність масиву, використовується в цьому розборі.

До елементів масиву A, що має клас Array, немає можливості прямого доступу у звичайній манері - A [<індекси>], але зате є спеціальні методи GetValue (<індекси>) і SetValue (<індекси>).

Природно, розбір випадків можна продовжити, додавши процедурі більшу функціональність.

Помітьте, якщо розбір випадків взагалі не робити, а використати PrintAr тільки для печатки одномірних масивів, то вона буде настільки ж проста, як і процедура PrintAr1, але зможе друкувати будь-які одномірні масиви, незалежно від типу їхніх елементів.

Масиви як колекції

У ряді завдань масиви C# доцільно розглядати як колекції, не використовуючи систему індексів для пошуку елементів. Це, наприклад, завдання, що вимагають однократного або багаторазового проходу по всьому масиві - знаходження суми елементів, знаходження максимального елемента, печать елементів. У таких завданнях замість циклів типу For по кожному вимірі досить розглянути єдиний цикл For Each по всій колекції. Ця можливість забезпечується тим, що клас Array успадковує інтерфейс IEnumerable. Зверніть увагу, цей інтерфейс забезпечує тільки можливість читання елементів колекції (масиву), не допускаючи їхньої зміни. Застосуємо цю стратегію й побудуємо ще одну версію процедури печаті. Ця версія буде самою короткою й самою універсальною, оскільки підходить для печаті масиву, незалежно від його розмірності й типу елементів. От її код:

public static void PrintCollection(string name,Array A)

{

  Console.WriteLine(name);

  foreach (object item in A )

     Console.Write("\t {0}", item);

  Console.WriteLine();

}//PrintCollection

Звичайно, за все потрібно платити. Платою за універсальність процедури печатки є те, що багатомірний масив друкується як одномірний без поділу елементів на рядки.

На жаль, ситуація із читанням і записом елементів масиву не симетрична. Приведу варіант процедури CreateCollection:

public static void CreateCollection(Array A)

{

  int i=0;

  foreach (object item in A )

     //item = rnd.Next(1,10); //item read only

     A.SetValue(rnd.Next(1,10), i++);

}//CreateCollection

Помітьте, цю процедуру зробити універсальною не вдається, оскільки неможливо модифікувати елементи колекції. Тому цикл For Each тут нічого не дає, і розумніше використати звичайний цикл. Дана процедура не універсальна й дозволяє створювати елементи тільки для одномірних масивів.

Сортування й пошук. Статичні методи класу Array

Статичні методи класу Array дозволяють вирішувати найрізноманітніші завдання:

  1.  Copy - дозволяє копіювати весь масив або його частину в інший масив.
  2.  IndexOf, LastIndexOf - визначають індекси першого й останнього входження зразка в масив, повертаючи -1, якщо такого входження не виявлено.
  3.  Reverse - виконує обіг масиву, переставляючи елементи у зворотному порядку.
  4.  Sort - здійснює сортування масиву.
  5.  BinarySearch - визначає індекс першого входження зразка у відсортований масив, використовуючи алгоритм двійкового пошуку.

Всі методи перевантажені й мають ряд модифікацій. Більшість із цих методів застосовано тільки до одномірних масивів. Приведу приклади різних операцій, доступних при роботі з масивами, завдяки спадкуванню від класу Array:

public void TestCollection()

{

  //операції над масивами

  int nc = 7;

  int[] col1 = new int[nc], col2 = new int[nc];

  double[] col3 = new double[nc];

  int[,] col4 = new int[2,2];

  Arrs.CreateCollection(col1);

  Arrs.PrintCollection("col1",col1);

  Arrs.CreateCollection(col2);

  Arrs.PrintCollection("col2",col2);

  Arrs.CreateCollection(col3);

  Arrs.PrintCollection("col3",col3);

  Arrs.CreateTwoDimAr(col4);

  Arrs.PrintCollection("col4",col4);

  //сортування, пошук, копіювання

  // пошук елемента

  int first = Array.IndexOf(col1, 2);

  int last =  Array.LastIndexOf(col1,2);

  if (first == -1)

     Console.WriteLine("Немає входжень 2 у масив col1");

  else if (first ==last)

     Console.WriteLine("Одне входження 2 у масив col1");

  else

     Console.WriteLine("Кілька входжень 2 у масив col1");

  //first = Array.IndexOf(col4, 4);

  //тільки одномірний масив

  Array.Reverse(col1);

  Console.WriteLine("Обіг масиву col1:");

  Arrs.PrintCollection("col1",col1);

  //Копіювання

  Array.Copy(col1, col3, col1.Length);

  Console.WriteLine(" Масив col3 після копіювання масиву col1:");

  Arrs.PrintCollection("col3",col3);

  Array.Copy(col1,1,col2,1,2);

  Console.WriteLine("копіювання двох елементів col1 в col2:");

  Arrs.PrintCollection("col1",col1);

  Arrs.PrintCollection("col2",col2);

  //швидке сортування Хоара

  Array.Sort(col1);

  Console.WriteLine("Відсортований масив col1:");

  Arrs.PrintCollection("col1",col1);

  first = Array.BinarySearch(col1, 2);

  Console.WriteLine("Індекс входження 2 в col1: {0}",first);

  //Створення екземпляра (масиву)

  Array my2Dar = Array.CreateInstance(typeof(double), 2,3);

  Arrs.PrintCollection("my2Dar",my2Dar);

  //клонування

  my2Dar = (Array)col4.Clone();

  Console.WriteLine("Масив my2Dar після клонування

     col4:");

  Arrs.PrintCollection("my2Dar",my2Dar);

  //копіювання CopyTo

  col1.CopyTo(col2,0);

  Console.WriteLine("Масив col2 після копіювання col1:");

  Arrs.PrintCollection("col2",col2);

}

У цій процедурі продемонстровані виклики різних статичних методів класу Array. Для методу Copy показаний виклик двох реалізацій цього методу, коли копіюється весь масив і частина масиву. Закоментований оператор виклику методу IndexOf нагадує про неможливість використання методів пошуку при роботі з багатомірними масивами. Приведу результати виводу.

Рис. 14.3.  Результати застосування статичних методів класу Array


 

А также другие работы, которые могут Вас заинтересовать

21529. ОТРАВЛЯЮЩИЕ ВЕЩЕСТВА ОБЩЕТОКСИЧЕСКОГО ДЕЙСТВИЯ 126.5 KB
  Острые отравления: Руководство для врачей. НАГЛЯДНЫЕ ПОСОБИЯ Таблицы и слайды по теме: Отравления цианидами и монооксидом углерода. Известно также что в США применяется смертная казнь посредством отравления осужденных парами синильной кислоты в специальной камере. Могут быть и отравления цианидами вследствие употребления в пищу большого количества семян миндаля персика абрикоса вишни сливы и других растений семейства розовоцветных или настоек из их плодов.
21530. ПОРАЖЕНИЯ ОТРАВЛЯЮЩИМИ ВЕЩЕСТВАМИ ОБЩЕТОКСИЧЕСКОГО ДЕЙСТВИЯ: КЛИНИКА, ДИАГНОСТИКА, ЛЕЧЕНИЕ, ЭТАПНОЕ ЛЕЧЕНИЕ 127 KB
  К отравляющим веществам общетоксического действия относятся следующие вещества: синильная кислота цианистый калий натрий хлорциан бромциан моноОксид углерода. ОТРАВЛЕНИЯ МОНООКСИДОМ УГЛЕРОДА УГАРНЫМ ГАЗОМ. Монооксид углерода газ без цвета и запаха. Монооксид углерода относится к веществам общетоксического действия.
21531. ПРЕПАРАТЫ, ДЕЙСТВУЮЩИЕ НА СЕРДЕЧНО-СОСУДИСТУЮ СИСТЕМУ 140 KB
  Первое характеризуется увеличением сердечного индекса минутного объема сердца и массы циркулирующей крови при снижении общего периферического сопротивления второе снижением минутного объема сердца и массы циркулирующей крови при повышенном периферическом сопротивлении. В соматогенной фазе при отсутствии токсической концентрации химического вещества нарушения функции сердечнососудистой системы являются результатом развившегося повреждения ЦНС органов дыхания печени почек а также самого сердца. Развивается в результате...
21532. Общие принципы диагностики и лечения острых отравлений 203 KB
  Она складывается из трех основных направлений диагностических мероприятий: а клинической диагностики основанной на данных анамнеза результатах осмотра места происшествия и изучения клинической картины заболевания для выделения специфических симптомов отравления которое проводится врачом оказывающим больному медицинскую помощь на догоспитальном этапе или в стационаре; б лабораторной диагностики направленной на: Качественное и количественное определение идентификацию токсических веществ в биологических средах организма кровь моча...
21533. Анализ данных литературы по средствам и схемам неотложной терапии отравлений ФОС и веществами удушающего действия 72.5 KB
  Признаки поражения: небольшая одышка чувство стеснения в груди кашель головокружение тошнота общая слабость небольшое слюнотечение насморк не резко выраженная гиперемия слизистой оболочки зева и гортани; в легких возможны единичные сухие хрипы. В легких выслушивается значительное количество хрипов; при перкуссии обнаруживаются участки притупленнотимпанического звука. Развивается сравнительно благоприятно протекающий отек легких. Из осложнений могут быть: бронхопневмония плевропневмония тромбозы и эмфизема легких.
21534. КЛИНИКА, ДИАГНОСТИКА И ЛЕЧЕНИЕ ПОРАЖЕНИЙ ОТРАВЛЯЮЩИМИ ВЕЩЕСТВАМИ НЕРВНОПАРАЛИТИЧЕСКОГО ДЕЙСТВИЯ 166 KB
  28 12 99 10:43:23 Copyright to Meditox Pty Ltd 19992000 ПОРАЖЕНИЯ ФОВ: клиника диагностика лечение Введение. Прежде всего необходимо подчеркнуть что фосфорорганические отравляющие вещества ФОВ являются табельными ОВ стоящими на вооружениии армий США и стран НАТО. Поэтому военные врачи должны быть готовы к оказанию медицинской помощи пораженным ФОВ. Кроме того в практике военного врача возможны случаи отравлений фосфорорганическими инсектицидами ФОИ которые существенно отличаясь от поражений ФОВ темпами развития отравления...
21535. ФОСГЕН 32 KB
  В скрытый период интоксикации введение 100200 мг преднизолона внутривенно каждые 4 ч 50 мл 5 раствора аскорбиновой кислоты внутривенно или 2 г внутрь 10 мл 10 раствора кальция хлорида внутривенно кровопускание 250300 мл. При развитии отека легких оксигенотерапия с ингаляцией паров 70˚ этилового спирта пеногаситель введение 100200 мг метилпреднизолона внутривенно каждые 46 ч 50 мл 2 раствора фуросемида лазикса внутривенно 10001500 ЕД гепарина внутривенно каждые 115 ч 2 мл раствора кордиамина внутримышечно....
21536. Активная детоксикационная терапия 111.5 KB
  Методы детоксикационной терапии . При выраженных клинических проявлениях отравления после проведения мероприятий по стабилизации состояния больного обычно в комплекс терапии включают методы искусственной детоксикации. Свидетельством этого является возрастающая роль энтеросороции и активированного угля в терапии начальных этапов отравления и в предотвращении гепатоэнтеральной циркуляции токсина. Стимуляция выведения яда и его метаболитов почками Значительное число токсических веществ и их метаболитов элиминируются из организма почками...
21537. АММИАК (НАШАТЫРНЫЙ СПИРТ) 35.5 KB
  Внутрь 12 таблетки кодеина по 0015 10 г аскорбиновой кислоты подкожно 10 мл 01 раствора атропина 10 мл 2 раствора промедола внутримышечно 20 мл 1 раствора димедрола 20 мл кордиамина. В случае попадания в глаза – обильное промывание не менее 15 мин проточной водой с последующим закапыванием 30 раствора сульфацилнатрия альбуцид натрия. Введение 24 мл 2 раствора фуросемида лазикса внутривенно; 100200 мг метилпреднизолона каждые 46 часов гидрокортизона 150250 мг или преднизолона 100150 мг внутривенно медленно...