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

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

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

301 0 18:01, 17-10-2023

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

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

    1 ... 330 331 332 333 334 335 336 337 338 ... 415
    Перейти на страницу:
    нужно будет выполнять программным путем. Стоит заметить, что в конструкторе верхнего уровня константу 3 можно опустить и писать просто new int [] []. Самое забавное, что вызов этого конструктора можно вообще опустить — он будет подразумеваться:

    int [] [] j agger2 =

    {

          new int [4],

          new int [2],

          new int [3]

    };

    А вот конструкторы нижнего уровня необходимы. Еще одно важное замечание — динамические массивы возможны и здесь. В общем случае, границы на любом уровне могут быть выражениями, зависящими от переменных. Более того, допустимо, чтобы массивы на нижнем уровне были многомерными. Но это уже "от лукавого" — вряд ли стоит пользоваться такими сложными структурами данных, ведь с ними предстоит еще и работать.

    Приведу теперь чуть более реальный пример, описывающий простое генеалогическое дерево, которое условно назову "отцы и дети":

    //массив массивов — "Отцы и дети"

    int Fcount =3;

    string[] Fathers = new string[Fcount];

    Fathers[0] ="Николай"; Fathers[1] = "Сергей";

          Fathers[2] = "Петр";

    string[][] Children = new string[Fcount][];

    Children[0] = new string[] {"Ольга", "Федор"};

    Children[1] = new string[]

           {"Сергей","Валентина","Ира","Дмитрий"};

    Children[2] = new string[]{"Мария","Ирина","Надежда"};

    myar.PrintAr3(Fathers,Children);

    Здесь отцов описывает обычный динамический одномерный массив Fathers. Для описания детей этих отцов необходим уже массив массивов, который также является динамическим на верхнем уровне, поскольку число его элементов совпадает с числом элементов массива Fathers. Здесь показан еще один способ создания таких массивов. Вначале конструируется массив верхнего уровня, содержащий ссылки со значением void. А затем на нижнем уровне конструктор создает настоящие массивы в динамической памяти, с которыми и связываются ссылки.

    Я не буду демонстрировать работу с генеалогическим деревом, ограничусь лишь печатью этого массива. Здесь есть несколько поучительных моментов. В классе Arrs для печати массива создан специальный метод PrintAr3, которому в качестве аргументов передаются массивы Fathers и children. Вот текст данной процедуры:

    public void PrintAr3(string [] Fathers, string[][] Children)

    {

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

         {

             Console.WriteLine("Отец: {0}; Его дети: ", Fathers[i]);

             for (int j = 0; j < Children[i].Length; j++)

                 Console.Write(Children[i][j] + " ");

             Console.WriteLine ();

         }

    }//PrintAr3

    Приведу некоторые комментарии к этой процедуре:

    • Внешний цикл по i организован по числу элементов массива Fathers. Заметьте, здесь используется свойство Length, в отличие от ранее применяемого метода GetLength.

    • В этом цикле с тем же успехом можно было бы использовать и имя массива children. Свойство Length для него возвращает число элементов верхнего уровня, совпадающее, как уже говорилось, с числом элементов массива Fathers.

    • Во внутреннем цикле свойство Length вызывается для каждого элемента children [i], который является массивом.

    • Остальные детали, надеюсь, понятны.

    Приведу вывод, полученный в результате работы процедуры PrintAr3

    Рис. 11.3. Дерево "Отцы и дети"

    Процедуры и массивы

    В наших примерах массивы неоднократно передавались процедурам в качестве входных аргументов и возвращались в качестве результатов.

    В лекции 9 подробно описывались особенности передачи аргументов в процедуру. Остается подчеркнуть только некоторые детали:

    • В процедуру достаточно передавать только сам объект — массив. Все его характеристики {размерность, границы) можно определить, используя свойства и методы этого объекта.

    • Когда массив является выходным аргументом процедуры, как аргумент C в процедуре MuitMatr, выходной аргумент совсем не обязательно снабжать ключевым словом ref или out (хотя и допустимо). Передача аргумента по значению в таких ситуациях так же хороша, как и передача по ссылке. В результате вычислений меняется сам массив в динамической памяти, а ссылка на него остается постоянной. Процедура и ее вызов без ключевых слов выглядит проще, поэтому обычно они опускаются. Заметьте, в процедуре Getsizes, где определялись границы массива, ключевое слово out, сопровождающее аргументы, совершенно необходимо.

    • Может ли процедура-функция возвращать массив в качестве результата? В C# ответ на этот вопрос положителен. В следующей лекции будет приведен пример подобной функции.

    12. Класс Array и новые возможности массивов

    Семейство классов-массивов. Родительский класс Array и наследуемые им интерфейсы. Новые возможности массивов в С#. Как корректно работать с массивами объектов?

    Класс Array

    Нельзя понять многие детали работы с массивами в С#, если не знать устройство класса Array из библиотеки FCL, потомками которого являются все классы-массивы. Рассмотрим следующие объявления:

    //Класс Array

         int[] ar1 = new int [5];

         doublet] ar2 ={5.5, 6.6, 7.7};

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

    Зададимся естественным вопросом: к какому или к каким классам принадлежат объекты ar1, аr2 и аr3? Ответ прост: все они принадлежат к разным классам. Переменная ar1 принадлежит к классу int [] — одномерному массиву значений типа int, ar2 — double[] — одномерному массиву значений типа double, аr3 — двумерному массиву значений типа int. Следующий закономерный вопрос: а что общего есть у этих трех объектов? Прежде всего, все три класса этих объектов, как и другие классы, являются потомками класса object, а потому имеют общие методы, наследованные от класса object и доступные объектам этих классов.

    У всех классов, являющихся массивами, много общего, поскольку все они являются потомками класса System.Array. Класс System.Array наследует ряд интерфейсов: ICIoneable, IList, ICollection, Innumerable, а, следовательно, обязан реализовать все их методы и свойства. Помимо наследования свойств и методов класса Object и вышеперечисленных интерфейсов, класс Array имеет довольно большое число собственных методов и свойств. Взгляните, как выглядит отношение наследования на семействе классов, определяющих массивы.

    Рис. 12.1. Отношение наследования на классах-массивах

    Благодаря такому мощному родителю, над массивами определены самые разнообразные операции — копирование, поиск, обращение, сортировка, получение различных характеристик. Массивы можно рассматривать как коллекции и устраивать циклы For Each для перебора всех элементов. Важно и то, что когда у семейства классов есть общий родитель, то можно иметь общие процедуры обработки различных потомков этого родителя. Для общих процедур работы с массивами характерно, что один или несколько формальных аргументов имеют родительский тип Array. Естественно, внутри такой процедуры может понадобиться анализ — какой реальный тип массива передан в процедуру.

    Рассмотрим пример подобной процедуры. Ранее я для печати элементов массива использовал различные процедуры PrintAr1, PrintAr2 и так далее, по одной для каждого класса массива. Теперь я

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

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


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

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

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


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

    Новые отзывы

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