Массивы
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
МАССИВЫ
Массив – набор элементов одного и того же типа, объединенных общим
именем. Массивы в С# можно использовать по аналогии с тем, как они
используются в других языках программирования, например, в C++ или Pascal.
Однако С#-массивы имеют существенные отличия. Во-первых, они относятся к
ссылочным типам данных. При этом имя массива является ссылкой на область
кучи (динамической памяти), в которой последовательно размещается набор
элементов определенного типа. Выделение памяти под элементы происходит на
этапе объявления или инициализации массива, а за освобождением памяти следит
сборщик мусора. Во-вторых, массивы реализуются в С# как объекты, для которых
разработан большой набор методов, реализующих различные алгоритмы
обработки элементов массива.
Рассмотрим следующие типы массивов: одномерные, многомерные и
ступенчатые (разрывные).
Одномерные массивы
Одномерный массив – это фиксированное количество элементов одного и
того же типа, объединенных общим именем, где каждый элемент имеет свой
номер. Нумерация элементов массива в С# начинается с нуля, то есть, если массив
состоит из 10 элементов, то они будут иметь следующие номера: 0, 1, 2, 3, 4, 5, 6,
7, 8, 9.
Одномерный массив в С# реализуется как объект, поэтому его создание
представляет собой двухступенчатый процесс. Сначала объявляется ссылочная
переменная типа массив, затем выделяется память под требуемое количество
элементов базового типа, и ссылочной переменной присваивается адрес нулевого
элемента в массиве. Базовый тип определяет тип данных каждого элемента
массива. Количество элементов, которые будут храниться в массиве, определяется
размером массива.
При необходимости, этапы объявления переменной типа массив, и выделения
необходимого объема памяти могут быть объединены в один. Кроме того, на
этапе объявления массива можно произвести его инициализацию. Поэтому, для
объявления одномерного массива может использоваться одна из следующих форм
записи:
1. Базовый_тип [] имя_массива;
Например:
char [] a;
Объявлена ссылка на одномерный массив символов (имя ссылки а), которая в
дальнейшем может быть использована для: адресации на уже существующий
массив; передачи массива в метод в качестве параметра; отсроченного выделения
памяти под элементы массива.
2. Базовый_тип [] имя_массива = new базовый_тип [размер];
Например:
int [] b=new int [10];
Объявлена ссылка b на одномерный массив целых чисел. Выделена память для
10 элементов целого типа, адрес этой области памяти записан в ссылочную
переменную b. Элементы массива инициализируются по умолчанию нулями.
Замечание. Надо отметить, что в C# элементам массива присваиваются
начальные значения по умолчанию в зависимости от базового типа. Для
арифметических типов – нули, для ссылочных типов – null, для символов – символ
с кодом ноль.
3. Базовый_тип [] имя_массива={список инициализации};
Например:
double [] c={0.3, 1.2, -1.2, 31.5};
Объявлена ссылка c на одномерный массив вещественных чисел. Выделена
память под одномерный массив, размерность которого соответствует количеству
элементов в списке инициализации – четырем. Адрес этой области памяти
записан в ссылочную переменную с. Значение элементов массива соответствует
списку инициализации.
Обращение к элементу массива происходит с помощью индекса: указывается
имя массива и, в квадратных скобках, номер данного элемента. Например, a[0],
b[8], c[i].
Так как массив представляет собой набор элементов, объединенных общим
именем, то обработка массива обычно производится в цикле. Рассмотрим
несколько основных примеров работы с одномерными массивами.
Вывод массива на экран
static void Main()
{
int[] myArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i< 10; i++)
{
Console.WriteLine(myArray[i]);
}
}
Задание. Измените программу так, чтобы элементы массива выводились в
строчку через пробел.
Для вывода одномерного массива на экран очень удобно использовать
оператор foreach. Оператор foreach применяется для перебора элементов в
специальном образом организованной группе данных, в том числе, и в массиве.
Удобство этого вида цикла заключается в том, что нам не требуется определять
количество элементов в группе и выполнять перебор по индексу – мы просто
указываем элементы какой группы необходимо перебрать. Синтаксис оператора:
foreach (<тип><имя>in<группа>) <тело цикла>;
где имя определяет локальную по отношению к циклу переменную, которая будет
по очереди перебирать все значения из указанной группы; ее тип соответствует
базовому типу элементов группы.
Ограничением оператора foreach является то, что с его помощью можно
только просматривать значения элементов в группе данных. Никаких изменений
ни с самой группой, ни с находящимися в ней данными проводить нельзя.
В нашем случае осуществить вывод массива на экран можно следующим
образом:
static void Main()
{
int[] myArray = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
foreach (intelem in myArray)
{
Console.WriteLine(elem);
}
}
Задание. Измените программу так, чтобы на экран выводились квадраты
элементов массива в строчку через пробел.
Ввод элементов массива
static void Main()
{
int[] myArray;
//создаем ссылку на массив
Console.Write("n= ");
int n=int.Parse(Console.ReadLine());
myArray=new int [n]; // выделяем память под массив требуемой длины
for (int i=0; i 0)
{
a[i] = 0;
}
}
}
Таким образом, информация о длине массива передается в метод Change
неявным образом вместе с массивом, и мы избавились от необходимости вводить
дополнительную переменную для хранения размерности массива.
Наиболее важные члены класса Array приведены в следующей таблице:
Элемент
BinarySearch
Clear
Copy
CopyTo
IndexOf
LastIndexOf
Вид
статический
метод
статический
метод
Описание
Осуществляет двоичный поиск в отсортированном
массиве.
Присваивает
элементам
массива
значения,
определенные
по
умолчанию,
т.е
для
арифметических типов нули, для ссылочных типов
null.
статический
Копирует элементы одного массива в другой
метод
массив.
экземплярный Копирует все элементы текущего одномерного
метод
массива в другой массив.
статический
Осуществляет поиск первого вхождения элемента
метод
в одномерный массив. Если элемент найден, то
возвращает его индекс, иначе возвращает значение
-1.
статический
Осуществляет поиск последнего вхождения
метод
элемента в одномерный массив. Если элемент
найден, то возвращает его индекс, иначе
возвращает значение -1.
Length
Rank
свойство
свойство
Возвращает количество элементов в массиве
Возвращает число размерностей массива. Для
одномерного массива Rank возвращает 1, для
двумерного – 2 и т.д.
Reverse
статический
метод
статический
метод
Изменяет порядок следования элементов в массиве
на обратный.
Упорядочивает элементы одномерного массива.
Sort
Замечание. Обратите внимание на то, что для перечисленных членов класса
Array не указываются параметры. Это связано с тем, что большинство из них
имеют несколько перегруженных версий, поэтому при их использовании следует
обращать внимание на подсказки VS и пользоваться справочной информацией.
Вызов статических методов происходит через обращение к имени класса,
например, Array.Sort(myArray). В данном случае мы обращаемся к статическому
методу Sort класса Array и передаем данному методу в качестве параметра объект
myArray – экземпляр класса Array.
Обращение к свойству или вызов экземплярного метода производится через
обращение
к
экземпляру
класса,
например,
myArray.Length
или
myArray.GetValue(i).
Пример:
class Program
{
static void Print(int[] a)
{
foreach (int elem in a)
{
Console.Write("{0} ", elem);
}
Console.WriteLine();
}
{0}",
static void Main()
{
int[] one={2,4,6,1,-5,2,9,-2};
Console.Write("Первый массив:");
Print(one);
Console.WriteLine("Первый раз значение 2 встречается в нем в позиции
Array.IndexOf(one,2));
Console.WriteLine("Последний раз значение 2
позиции {0}",
Array.LastIndexOf(one,2));
Array.Sort(one);
Console.Write("отсортирован по возрастанию:");
Print(one);
Array.Reverse(one);
Console.Write("отсортирован по убыванию:");
Print(one);
встречается
в
нем
//создаем новый массив, копируя в него все элементы массива myArray
int [] two=new int[one. Length];
Array.Copy(one, two, one.Length);
Console.Write("\nВторой массив: ");
Print(two);
в
//копируем в середину массива newArray фрагмент массива myArray
Array.Copy(one,2, two,4,4);
Console.Write("Вставка элементов в него: ");
Print(two);
Console.WriteLine("\nИтоговые массивы ");
Console.Write("Первый: ");
Print(one);
Console.Write("Второй: ");
Print(two);
}
}
Результат работы программы:
Замечание. Обратите внимание на то, что myArray и newArray это ссылки на
разные массивы, а не на один и тот же.
Использование спецификатора params
Иногда бывает необходимо создавать метод, в который можно передавать
различное количество аргументов. Язык С# предоставляет такую возможность.
Для этого параметр метода помечается спецификатором params, размещается в
списке параметров последним и является массивом требуемого типа
неопределенной длины. Следует отметить, что в методе может быть только один
параметр помеченный спецификатором params.
Рассмотрим следующий пример:
class Program
{
static int F(params int []a)
{
int s=0;
foreach (int x in a)
{
s+=x;
}
return s;
}
static void Main()
{
int a = 1, b = 2, c = 3, d=4;
Console.WriteLine(F());
Console.WriteLine(F(a));
Console.WriteLine(F(a, b));
Console.WriteLine(F(a, b, c));
Console.WriteLine(F(a, b, c, d));
}
}
Результат работы программы:
Как видим, в метод F может быть передано различное количество аргументов,
в том числе, и нулевое.
Рассмотрим следующий пример:
class Program
{
static void F(int a, out int s, params int []b)
{
s=0;
if (b.Length!=0) //1
{
foreach (int x in b)
{
if (x==a)
{
s+=x;
}
}
}
}
static void Main()
{
int a=1;
int []x={0,1,2,1,0};
int z;
F(a,out z,x);
Console.WriteLine(z);
int []y={};
F(a,out z,y);
Console.WriteLine(z);
}
}
Результат работы программы:
В данном случае, в метод F должно быть передано три параметра: параметр
значение а, выходной параметр s и непустой массив b. Если мы попытаемся
передать меньшее количество параметров, то компилятор выдаст сообщение об
ошибке.
Двумерные массивы
Многомерные массивы имеют более одного измерения. Чаще всего
используются двумерные массивы, которые представляют собой таблицы.
Каждый элемент массива имеет два индекса, первый определяет номер строки,
второй – номер столбца, на пересечении которых находится элемент. Нумерация
строк и столбцов начинается с нуля.
Объявить двумерный массив можно одним из предложенных способов:
1. Базовый_тип [,] имя_массива;
Например:
int [,] a;
Объявлена ссылка на двумерный массив целых чисел (имя ссылки а), которая
в дальнейшем может быть использована: для адресации на уже существующий
массив; передачи массива в метод в качестве параметра; отсроченного выделения
памяти под элементы массива.
2. Базовый тип [,] имя_массива = new базовый_тип [размер1, размер2];
Например
float [,] a= new float [3, 4];
Объявлена ссылка b на двумерный массив вещественных чисел. Выделена
память для 12 элементов вещественного типа, адрес данной области памяти
записан в ссылочную переменную b. Элементы массива инициализируются по
умолчанию нулями.
3. Базовый_тип [,] имя_массива=={{элементы 1-ой строки}, … ,
{элементы n-ой строки}};
Например:
int [,] a= new int [,]{{0, 1, 2}, {3, 4, 5}};
Объявлена ссылка на двумерный массив целых чисел. Выделена память под
двумерный массив, размерность которого 2×3. Адрес этой области памяти
записан в ссылочную переменную с. Значение элементов массива соответствует
списку инициализации.
Обращение к элементу массива происходит с помощью индексов: указывается
имя массива и, в квадратных скобках, номер строки и через запятую номер
столбца, на пересечении которых находится данный элемент. Например, a[0, 0],
b[2, 3], c[i, j].
Так как массив представляет собой набор элементов, объединенных общим
именем, то обработка массива обычно производится с помощью вложенных
циклов. Заметим также, что при обращении к свойству Length для двумерного
массива мы получим общее количество элементов в массиве. Чтобы получить
количество строк, нужно обратиться к методу GetLength с параметром 0. Чтобы
получить количество столбцов – к методу GetLength с параметром 1.
В качестве примера рассмотрим программу, в которой сразу будем учитывать
два факта: 1) двумерные массивы относятся к ссылочным типам данных; 2)
двумерные массивы реализованы как объекты.
class Program
{
static void Print(int[,] a)
{
for (int i = 0; i
Тебе могут подойти лекции
А давай сэкономим
твое время?
твое время?
Дарим 500 рублей на первый заказ,
а ты выбери эксперта и расслабься
Включи камеру на своем телефоне и наведи на Qr-код.
Кампус Хаб бот откроется на устройстве
Не ищи – спроси
у ChatGPT!
у ChatGPT!
Боты в Telegram ответят на учебные вопросы, решат задачу или найдут литературу
Попробовать в Telegram
Оставляя свои контактные данные и нажимая «Попробовать в Telegram», я соглашаюсь пройти процедуру
регистрации на Платформе, принимаю условия
Пользовательского соглашения
и
Политики конфиденциальности
в целях заключения соглашения.
Пишешь реферат?
Попробуй нейросеть, напиши уникальный реферат
с реальными источниками за 5 минут
с реальными источниками за 5 минут
Массивы
Хочу потратить еще 2 дня на работу и мне нужен только скопированный текст,
пришлите в ТГ