2013Copyright © 2013 DAVID Holding Company
Курс по програмиране на C#
Занятие №3Масиви. Многомерни масиви
Copyright © 2013 DAVID Holding Company
Съдържание
• Масиви• Едномерни масиви• Особености на масивите• Многомерни масиви• Масиви от масиви• Приложения на масивите
Copyright © 2013 DAVID Holding Company
Масиви
• Какво е „масив“?– Структура от данни– Множество от елементи от един и същи тип– Константна големина
• Няма възможност за вмъкване или изваждане на елементи
– Едно или повече измерения– Индексиране на елемент
Copyright © 2013 DAVID Holding Company
Масиви
• Характеристики на масивите в C#– Референтен тип данни– Тип на елементите– Размерност(и)
Copyright © 2013 DAVID Holding Company
Едномерни масиви
• Едномерни масиви в C#– Брой на елементите (дължина/големина на масива) – цяло
неотрицателно число n– Индекси на елементите – целите числа от 0 до n-1 включително
Copyright © 2013 DAVID Holding Company
Едномерни масиви
// Деклариране на масивиint[] numbers;byte[] bytes;// Инстанциране на масивиnumbers = new int[10];bytes = new byte[0];// Деклариране с инициализация// с празен масивstring[] lines = new string[50];
• Деклариране на променлива от тип масив– Тип на елементите– Квадратни скоби– Наименование
• Инстанциране на масив– Оператор new– Тип на елементите– Брой на елементите в квадратни
скоби
• Деклариране на променлива и инициализиране с масив
Copyright © 2013 DAVID Holding Company
Едномерни масиви
// Инициализиране на масив// със стойностиstring[] names = new string[3] { "Иван", "Валери", "Александър" };double[] temperatures = new double[] { -3.3, 0.2, 7.7, 10.0, 14.5, 11.3 };string[] greetings = new[] { "Hello", "Hi", "Good afternoon" };char[] vowels = { 'а', 'ъ', 'е', 'и', 'о', 'у' };
• Инстанциране на масив с инициализация на елементите– Оператор new– Тип на елементите– Брой на елементите в квадратни
скоби– Списък от стойности на елементите
във фигурни скоби
• Съкратени записи (синтактична захар)
Copyright © 2013 DAVID Holding Company
Деклариране и инстанциране на масиви - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Едномерни масиви
// Достъпване на елемент на масивnames[2]// Прочитане на стойността на елементConsole.WriteLine(temperatures[0]);// Записване на стойност в елементgreetings[1] = "Good morning";
• Достъпване на елементи на масив– Идентификатор на променливата-
масив– Индекс на елемента в квадратни
скоби
• Прочитане на стойността на елемент на масива
• Записване на стойност в елемент на масива
Copyright © 2013 DAVID Holding Company
Достъпване на елементи на масив - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Едномерни масиви
// Достъпване на дължината на масивbyte[] bytes = new byte[250];Console.WriteLine(bytes.Length);// Обхождане на елементите на масивint[] numbers = new int[10];for (int i = 0; i < numbers.Length; i++){ Console.Write( "Input number #{0}: ", i); numbers[i] = int.Parse(Console.ReadLine());}
• Обхождане на елементите на масив– Дължина на масива– Цикъл for– Индексиране на всеки от елементите
с помощта на брояча на цикъла
Copyright © 2013 DAVID Holding Company
Обхождане на елементите на масив - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Едномерни масиви
// Обхождане на масив като изброима// колекцияstring[] nouns = new string[] { "cat", "dog", "boy", "job", "tip", "lap", "cup", "mop" };foreach (string noun in nouns){ Console.WriteLine(noun);}
• Масивите като изброими колекции– Предоставят елементите един по
един, започвайки от нулевия– Цикъл foreach– Не се индексират елементите на
масива явно
Copyright © 2013 DAVID Holding Company
Масивите като изброими колекции - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Особености на масивите
• Масивите са референтни типове – няколко променливи могат да реферират един и същи масив
• Елементите на масивите могат да бъдат референтни или нереферентни типове– Ако типът на елементите е референтен, е възможно повече от
един елемента на един или повече масива да реферират едно и също място в паметта
Copyright © 2013 DAVID Holding Company
Особености на масивите - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Многомерни масиви
• Многомерни масиви– Двумерни масиви (матрици) – две измерения– Масиви с повече от две измерения– Всяко от измеренията може да има различна дължина– Измеренията са наредени – елементът с индекси m, n не
съвпада с елемента с индекси n, m– Индексирането на елемент винаги е пълно – указва се индекс за
всяко от измеренията– Хомогенност на измеренията - дължината на всяко измерение е
независима от индексите по другите измерения
Copyright © 2013 DAVID Holding Company
Многомерни масиви
// Деклариране на двумерен масивint[,] matrix;// Деклариране на тримерен масивdouble[,,] values;// Инстанциране на многомерни масивиmatrix = new int[8, 6];values = new double[5, 5, 4];// Деклариране с инициализация с// празен многомерен масивchar[,] tiles = new char[10, 10];
• Деклариране на променлива от тип многомерен масив– Тип на елементите– Квадратни скоби с i-1 на брой
запетаи
• Инстанциране на многомерен масив– Оператор new– Тип на елементите– Списък с дължините на измеренията
в квадратни скоби
Copyright © 2013 DAVID Holding Company
Многомерни масиви
// Инициализиране на двумерен масив// със стойностиbool[,] truthTable = new bool[4, 3] { { false, false, false }, { false, true, false }, { true, false, false }, { true, true, true } };char[,] ticTacToe = { { 'X', 'O', ' ' }, { ' ', 'X', ' ' }, { ' ', ' ', 'O' } };
• Инстанциране на многомерен масив с инициализация на елементите
Copyright © 2013 DAVID Holding Company
Деклариране и инстанциране на многомерни масиви - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Многомерни масиви
// Достъпване на елемент на двумерен// масивticTacToe[0, 1]// Прочитане на стойността на елемент// на двумерен масивConsole.Write(truthTable[1, 2]);// Записване на стойност в елемент// на двумерен масивticTacToe[2, 0] = 'X';
• Достъпване на елемент на многомерен масив– Идентификатор на променливата-
масив– Списък с индекси на елемента в
квадратни скоби
• Прочитане на стойността на елемент на многомерен масив
• Записване на стойност в елемент на многомерен масив
Copyright © 2013 DAVID Holding Company
Достъпване на елементи на многомерен масив - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Многомерни масиви
// Достъпване на дължината на измерение// на двумерен масивdouble[,] temperatures = new double[7, 24];Console.WriteLine(temperatures.GetLength(0));// Обхождане на елементите на двумерен// масивfor (int i = 0; i < truthTable.GetLength(0); i++){ for (int j = 0; j < truthTable.GetLength(1); j++) { Console.Write( "{0,5} ", truthTable[i, j]); } Console.WriteLine();}
• Обхождане на елементите на многомерен масив– Дължина на всяко от измеренията– Вложени цикли for– Елементът се индексира в тялото на
най-вътрешния цикъл с помощта на броячите на всички цикли
Copyright © 2013 DAVID Holding Company
Обхождане на елементите на многомерен масив - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Масиви от масиви
• Масиви от масиви– Наричат се още назъбени масиви (jagged arrays)– Тип на елементите – масив (едномерен, многомерен или
назъбен)– Външният масив може да бъде едномерен или многомерен– Индексирането на елемент се извършва на стъпки– Нехомогенност на измеренията – възможно е два елемента на
външния масив да реферират масиви с различни дължини на измеренията
Copyright © 2013 DAVID Holding Company
Масиви от масиви
// Деклариране на масиви от масивиstring[][] families;int[][][] sets;// Инстанциране на масиви от масивиfamilies = new string[2][];sets = new int[10][][];// Деклариране с инициализиране с// празен масивbyte[][] byteGroups = new byte[10][];
• Деклариране на променлива от тип масив от масиви– Тип на елементите на вътрешния
масив– Два или повече чифта квадратни
скоби
• Инстанциране на масив от масиви– Оператор new– Тип на елементите на вътрешния
масив– Дължина на външния масив в
квадратни скоби– Един или повече чифта празни
квадратни скоби– Всеки от елементите на външния
масив е null
Copyright © 2013 DAVID Holding Company
Масиви от масиви
// Инициализиране на масив от масиви// със стойностиstring[][] employees = new string[4][] { new string[2] { "Sue", "Peter" }, new string[1] { "Bonnie" }, new string[] { "Ivan", "Kosta" }, new[] { "Max", "Sarah", "John" }, };
• Инстанциране на масив от масиви с инициализация на елементите
Copyright © 2013 DAVID Holding Company
Деклариране и инстанциране на масиви от масиви - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Масиви от масиви
// Достъпване на елемент на външния// масивfamilies[0]// Достъпване на вътрешен елементemployees[2][1]// Прочитане на стойността на вътрешен// елементConsole.Write(sets[5][2][7]);// Записване на стойност във вътрешен// елементemployees[0][1] = "Miranda";
• Достъпване на елемент на масив от масиви– Идентификатор на променливата-
масив– Индекс на елемента на външния
масив
• Достъпване на вътрешен елемент в масив от масиви– Идентификатор на променливата-
масив– Индекс на елемента на външния
масив– Индекс на елемента на вътрешния
масив
Copyright © 2013 DAVID Holding Company
Достъпване на елементи на масив от масиви - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Масиви от масиви
// Достъпване на дължината на външния масивConsole.WriteLine(sets.Length);// Достъпване на дължината на вътрешен масивConsole.WriteLine(families[1].Length);// Обхождане на масив от масивиfor (int i = 0; i < employees.Length; i++){ Console.WriteLine("Department {0}:", i); string[] department = employees[i]; for (int j = 0; j < department.Length; j++) { Console.WriteLine(department[j]); }}
• Обхождане на вътрените елементи на масив от масиви– Дължина на външния масив– Дължина на всеки от вътрешните
масиви– Вложени цикли for– Елементът може да се индексира на
стъпки
Copyright © 2013 DAVID Holding Company
Обхождане на елементите на масив от масиви - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Масиви от масиви
// Обхождане на масив от масиви като// вложени изброими колекцииConsole.Write("{ ");foreach (int[][] outerSet in sets){ Console.Write("{ "); foreach (int[] innerSet in outerSet) { Console.Write("{ "); foreach (int n in innerSet) { Console.Write("{0}, ", n); } Console.Write("} "); } Console.Write("} ");}Console.WriteLine("}");
• Масивите от масиви като вложени изброими колекции– Вложени цикли foreach– Не се индексират елементите явно
Copyright © 2013 DAVID Holding Company
Масивите от масиви като вложени изброими колекции - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Приложения на масивите
• Сортиране на информация – метод на пряката селекция– Масив с n на брой елемента– n-1 стъпки– На стъпка i се разглеждат елементите с индекси от i до n-1
(включително)– Най-малкият от тях се разменя с елемента с индекс i (в случай
че това не е самият той)– След всяка стъпка, елементите с индекси от 0 до i
(включително) са сортирани във възходящ ред
Copyright © 2013 DAVID Holding Company
Сортиране по метода на пряката селекция - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Приложения на масивите
• Откриване на прости числа – сито на Ератостен– Масив с n на брой елемента от булев тип– Всички елементи с индекси, по-големи от 1, се инициализират с
true– Открива се първият индекс, който е по-голям от предишното
намерено просто число и на който съответства елемент със стойност true
– Този индекс е следващото просто число– За всички индекси, които са по-големи и са кратни на него, се
присвоява стойност false на съответните им елементи– Изпълнението продължава, докато може да бъде намерено
ново просто число, по-малко от n
Copyright © 2013 DAVID Holding Company
Сито на Ератостен - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Приложения на масивите
• Лабиринт– Двумерен масив с елементи от символен тип– Всеки елемент представлява квадратно поле от лабиринта
(може да бъде празно пространство или стена)– Координати на играча спрямо горния ляв ъгъл– Безкраен цикъл:
• Изчаква се натискане на клавиш• Ако е натиснат клавиш за движение, се прави опит за преместване в
съответната посока• Ако е натиснат клавиш Escape, цикълът се прекратява• Ако преместването е невъзможно или е натиснат друг клавиш, не се
случва нищо
Copyright © 2013 DAVID Holding Company
Лабиринт - демо
// Демонстрация
Copyright © 2013 DAVID Holding Company
Задачи за упражнение
• Създайте програма, в която се въвежда масив от цели числа и се извеждат най-голямото число, най-малкото число и средното аритметично на всички числа в масива.
• Създайте програма, в която се въвежда масив от дробни числа, масивът се сортира във възходящ ред по метода на мехурчето и след това се извеждат сортираните числа. Допълнителни условия:– Потребителят да може да избере дължината на въвеждания
масив;– Потребителят да може да избере между възходящ и низходящ
ред на сортирането.
Copyright © 2013 DAVID Holding Company
Задачи за упражнение
• Създайте програма, в която се въвежда масив от цели числа и се извежда броят на инверсиите. Два елемента с индекси i и j се намират в инверсия, точно когато i < j и елементът с индекс i е по-голям от елементa с индекс j.
• Създайте програма, в която се въвежда двумерна квадратна матрица от дробни числа и се извеждат сумата на всички елементи по главния диагонал, сумата на всички елементи над него и сумата на всички елементи под него. Главен диагонал наричаме елементите с равни първи и втори индекси.
Copyright © 2013 DAVID Holding Company
Задачи за упражнение
• Създайте програма, в която се въвежда правоъгълна матрица от температури (дробни числа) със 7 реда и 6 колони. Всеки от редовете съответства на ден от седмицата, започвайки с понеделник. Колоните съответстват на 00:00, 04:00, 08:00, 12:00, 16:00 и 20:00 часа. Всяка клетка от матрицата съдържа температурата в съответния час и ден за една седмица. Програмата трябва да пресметне и изведе средната температура за всеки от седемте дни, както и средната температура за всеки от шестте момента от денонощието.
Copyright © 2013 DAVID Holding Company
Задачи за упражнение
• Създайте програма, в която се въвеждат текущите оценки (дробни числа между 2 и 6) по един учебен предмет на учениците от един клас. Възможно е всеки от учениците да има различен брой текущи оценки по предмета. Програмата трябва да пресмята и извежда срочната оценка на всеки от учениците (като средно аритметично от текущите му оценки), както и средния успех на целия клас по предмета (като средно аритметично от всички срочни оценки).
Copyright © 2013 DAVID Holding Company
Задачи за упражнение
• В една местност има n на брой градове (номерирани от 0 до n-1) и някои от тях са свързани с пътища. Създайте програма, в която се въвежда n и след това за всеки от градовете последователно се въвеждат номерата на градовете, които са свързани с него чрез директен път. Програмата трябва да пресметне и изведе двойките градове, които са свързани с най-кратък път, минаващ през точно един друг град, точно два други града и т.н. За простота приемете, че пътищата са еднопосочни (наличието на път от град i до град j не гарантира наличие на обратен път от град j към град i).
Copyright © 2013 DAVID Holding Company
Въпроси?
Copyright © 2013 DAVID Holding Company
Благодаря!
• Александър Далемски– [email protected]– Skype: musasho– https://facebook.com/adalemski
• ДАВИД академия– [email protected]– http://acad.david.bg/– @david_academy– https://facebook.com/DavidAcademy