Справочник от Автор24
Поделись лекцией за скидку на Автор24

Массивы

  • 👀 378 просмотров
  • 📌 291 загрузка
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Массивы» pdf
МАССИВЫ Массив – набор элементов одного и того же типа, объединенных общим именем. Массивы в С# можно использовать по аналогии с тем, как они используются в других языках программирования, например, в 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
«Массивы» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Помощь с рефератом от нейросети
Написать ИИ

Тебе могут подойти лекции

Смотреть все 462 лекции
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot