Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Атрибут params

Передача массивов в методы, массивы как возвращаемые значения

Цикл foreach

Структуры в языке С #.

Тема: Многомерные массивы. Массивы как параметры методов.

Лекция №8

Массивы – это индексированный набор объектов одного типа. Индексация начинается от 0 и не может быть изменена. Для их реализации в C# предназначен класс System.Array. Для этого класса реализована встроенная поддержка.

Одномерные массивы.

тип [] имя_переменной

int[] a1 = new int[10];

int[] a2 = {1, 2, 3, 4};

int[] a3 = new int[]{1, 2, 3, 4};

int[] a4 = new int[4]{1, 2, 3, 4};

 

 

MyClass[] ac1 = new MyClass[3]{new MyClass(), new MyClass(), new MyClass()};

 

Для работы с массивами может использоваться цикл foreach, который перебирает все элементы массива. Его синтаксис:

foreach(тип_элемента имя_тек_эл in имя_массива)

тело цикла

для одномерного массива

foreach(int e in a4)

Console.WriteLine(e);

для прямоугольного массива

foreach(int e in aa7)

Console.WriteLine(e);

Для невыровненных массивов должны использоваться вложенные циклы:

foreach(int[] e1 in ja)

foreach(int e2 in e1)

Console.WriteLine(e2);

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

void M1(int [] a)

void M2(int [,] a)

void M3(int [][] a)

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

void M1(int [] a)

{

a[2] = 5;

}

void M1(int [] a)

{

a = new int[4]{5, 6, 7, 8};

}

и то же для атрибута ref. Массив также может быть возвращаемым значением.

int[] NewArray(int i)

{

return new int[i];

}

Предположим нам требуется определить метод, который выводит на экран произвольное количество целых чисел. Можно воспользоваться предыдущим способом. Но можно обойтись и без явного создания массива. Для этого параметр должен быть описан с атрибутом params

void Print(params int[] nums)

{

foreach(int e in nums)

Console.WriteLine(e);

}

Данный параметр это обязательно одномерный массив, такой параметр у метода может быть только один, и если он есть, то в списке параметров указывается последним. Почему?

Массив задает способ организации данных. Массивом называют упорядоченную совокупность элементов одного типа. Каждый элемент массива имеет индексы, определяющие порядок элементов. Число индексов характеризует размерность массива. Каждый индекс изменяется в некотором диапазоне [a,b]. В языке C#, как и во многих других языках, индексы задаются целочисленным типом. В других языках, например, в языке Паскаль, индексы могут принадлежать счетному конечному множеству, на котором определены функции, задающие следующий и предыдущий элемент. Диапазон [a,b] называется граничной парой, a - нижней границей, b - верхней границей индекса. При объявлении массива границы задаются выражениями. Если все границы заданы константными выражениями, то число элементов массива известно в момент его объявления и ему может быть выделена память еще на этапе трансляции. Такие массивы называются статическими. Если же выражения, задающие границы, зависят от переменных, то такие массивы называются динамическими, поскольку память им может быть отведена только динамически в процессе выполнения программы, когда становятся известными значения соответствующих переменных. Массиву, как правило, выделяется непрерывная область памяти.

В языке C++ все массивы являются статическими; более того, все массивы являются 0-базируемыми. Это означает, что нижняя граница всех индексов массива фиксирована и равна нулю. Введение такого ограничения имеет свою логику, поскольку здесь широко используется адресная арифметика. Так, несколько странное выражение mas + i, где mas - это имя массива, а i - индексное выражение, имеет вполне определенный смысл для C++ программистов. Имя массива интерпретируется как адрес первого элемента массива, к этому адресу прибавляется число, равное произведению i на размер памяти, необходимой для одного элемента массива. В результате сложения в такой адресной арифметике эффективно вычисляется адрес элемента mas[i].

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

В языке C++ "классических" многомерных массивов нет. Здесь введены одномерные массивы и массивы массивов. Последние являются более общей структурой данных и позволяют задать не только многомерный куб, но и изрезанную, ступенчатую структуру. Однако использование массива массивов менее удобно, и, например, классик и автор языка C++ Бьерн Страуструп в своей книге "Основы языка C++" пишет: "Встроенные массивы являются главным источником ошибок - особенно когда они используются для построения многомерных массивов. Для новичков они также являются главным источником смущения и непонимания. По возможности пользуйтесь шаблонами vector, valarray и т.п.".

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

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

<== предыдущая лекция | следующая лекция ==>
Цилиндрические функции | Объявление одномерных массивов
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 452; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.