LoveRead.info » Книги » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Книгу Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория» читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

301 0 18:01, 17-10-2023

Книга Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория» читать онлайн бесплатно без регистрации

Большой и увлекательный, научно-прикладной, образовательный, некоммерческий интернет-журнал, созданный группой энтузиастов. Журнал содержит материалы, найденные в Интернет или написанные для Интернет. Основная тематика статей — то, что можно сделать самому, от садовых поделок до сверхпроводников, но есть и просто полезные материалы.

    1 ... 331 332 333 334 335 336 337 338 339 ... 415
    Перейти на страницу:
    приведу общую процедуру, формальный аргумент которой будет принадлежать родителю всех классов-массивов, что позволит передавать массив любого класса в качестве фактического аргумента:

    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, аr2 и аr3.

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

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

    Первое, на что следует обратить внимание: формальный аргумент процедуры принадлежит базовому классу Array, наследниками которого являются все массивы в CLR и, естественно, все массивы С#.

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

    К элементам массива а, имеющего класс 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. Сору — позволяет копировать весь массив или его часть в другой массив.

    2. IndexOf, Last IndexOf — определяют индексы первого и последнего вхождения образца в массив, возвращая -1, если такового вхождения не обнаружено.

    3. Reverse — выполняет обращение массива, переставляя элементы в обратном порядке.

    4. Sort — осуществляет сортировку массива.

    5. Binary Search — определяет индекс первого вхождения образца в отсортированный массив, используя алгоритм двоичного поиска.

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

    public void TestCollection ()

    {

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

         int nc = 7;

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

         int[nc]; doublet] col3 = new double[nc];

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

         Arrs.CreateCollection(col1);

         Arrs.PrintCollection("col1", col1);

         Arrs.CreateCollection(col2);

         Arrs.PrintCollection("соl2",соl2);

         Arrs.CreateCollection (col3);

         Arrs.PrintCollection("соl3",соl3);

         Arrs.CreateTwoDimAr (col4);

         Arrs.PrintCollection("соl4",соl4);

         // сортировка, поиск, копирование

         // поиск элемента

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

         int last = Array.LastlndexOf(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,соl2,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.Createlnstance(typeof(double), 2,3);

         Arrs.PrintCollection("my2Dar",my2Dar);

         //клонирование

         my2Dar = (Array)col4.Clone();

         Console.WriteLine("Массив my2Dar после клонирования col4: ");

         Arrs.PrintCollection("my2Dar",my2Dar);

         //копирование CopyTo col1.CopyTo (соl2, 0);

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

         Arrs.PrintCollection("col2",col2);

    }

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

    1 ... 331 332 333 334 335 336 337 338 339 ... 415
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Валентина Валентина04 июль 13:25 Большое спасибо за интересную тему.  Сюжет заманчиввй,интересный. Жду продолжения ... Лекарь Фамильяров. Том 7 - Александр Лиманский
    2. Наталья По Наталья По01 июль 10:12 Ужасный перевод:(... Аркадия - Эрин Дум
    3. Вика Вика29 июнь 21:56 Какая хрень с первых строк.  У ребенка в 14 месяце не может быть черепно мозговой травмы при падании с дивана ... Вернуть семью любой ценой - Чарли Ви
    Все комметарии
    Новинки бесплатной онлайн библиотеки