47
2013 Copyright © 2013 DAVID Holding Company Курс по програмиране на C# Занятие №3 Масиви. Многомерни масиви

Училищен курс по програмиране на C# (2013/2014), занятие №3

Embed Size (px)

DESCRIPTION

Училищен курс по програмиране на C# (2013/2014) Занятие №3: Масиви. Многомерни масиви

Citation preview

Page 1: Училищен курс по програмиране на C# (2013/2014), занятие №3

2013Copyright © 2013 DAVID Holding Company

Курс по програмиране на C#

Занятие №3Масиви. Многомерни масиви

Page 2: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Съдържание

• Масиви• Едномерни масиви• Особености на масивите• Многомерни масиви• Масиви от масиви• Приложения на масивите

Page 3: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масиви

• Какво е „масив“?– Структура от данни– Множество от елементи от един и същи тип– Константна големина

• Няма възможност за вмъкване или изваждане на елементи

– Едно или повече измерения– Индексиране на елемент

Page 4: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масиви

• Характеристики на масивите в C#– Референтен тип данни– Тип на елементите– Размерност(и)

Page 5: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Едномерни масиви

• Едномерни масиви в C#– Брой на елементите (дължина/големина на масива) – цяло

неотрицателно число n– Индекси на елементите – целите числа от 0 до n-1 включително

Page 6: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Едномерни масиви

// Деклариране на масивиint[] numbers;byte[] bytes;// Инстанциране на масивиnumbers = new int[10];bytes = new byte[0];// Деклариране с инициализация// с празен масивstring[] lines = new string[50];

• Деклариране на променлива от тип масив– Тип на елементите– Квадратни скоби– Наименование

• Инстанциране на масив– Оператор new– Тип на елементите– Брой на елементите в квадратни

скоби

• Деклариране на променлива и инициализиране с масив

Page 7: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Тип на елементите– Брой на елементите в квадратни

скоби– Списък от стойности на елементите

във фигурни скоби

• Съкратени записи (синтактична захар)

Page 8: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Деклариране и инстанциране на масиви - демо

// Демонстрация

Page 9: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Едномерни масиви

// Достъпване на елемент на масивnames[2]// Прочитане на стойността на елементConsole.WriteLine(temperatures[0]);// Записване на стойност в елементgreetings[1] = "Good morning";

• Достъпване на елементи на масив– Идентификатор на променливата-

масив– Индекс на елемента в квадратни

скоби

• Прочитане на стойността на елемент на масива

• Записване на стойност в елемент на масива

Page 10: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Достъпване на елементи на масив - демо

// Демонстрация

Page 11: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Индексиране на всеки от елементите

с помощта на брояча на цикъла

Page 12: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Обхождане на елементите на масив - демо

// Демонстрация

Page 13: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Не се индексират елементите на

масива явно

Page 14: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масивите като изброими колекции - демо

// Демонстрация

Page 15: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Особености на масивите

• Масивите са референтни типове – няколко променливи могат да реферират един и същи масив

• Елементите на масивите могат да бъдат референтни или нереферентни типове– Ако типът на елементите е референтен, е възможно повече от

един елемента на един или повече масива да реферират едно и също място в паметта

Page 16: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Особености на масивите - демо

// Демонстрация

Page 17: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Многомерни масиви

• Многомерни масиви– Двумерни масиви (матрици) – две измерения– Масиви с повече от две измерения– Всяко от измеренията може да има различна дължина– Измеренията са наредени – елементът с индекси m, n не

съвпада с елемента с индекси n, m– Индексирането на елемент винаги е пълно – указва се индекс за

всяко от измеренията– Хомогенност на измеренията - дължината на всяко измерение е

независима от индексите по другите измерения

Page 18: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Тип на елементите– Списък с дължините на измеренията

в квадратни скоби

Page 19: Училищен курс по програмиране на C# (2013/2014), занятие №3

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' } };

• Инстанциране на многомерен масив с инициализация на елементите

Page 20: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Деклариране и инстанциране на многомерни масиви - демо

// Демонстрация

Page 21: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Многомерни масиви

// Достъпване на елемент на двумерен// масивticTacToe[0, 1]// Прочитане на стойността на елемент// на двумерен масивConsole.Write(truthTable[1, 2]);// Записване на стойност в елемент// на двумерен масивticTacToe[2, 0] = 'X';

• Достъпване на елемент на многомерен масив– Идентификатор на променливата-

масив– Списък с индекси на елемента в

квадратни скоби

• Прочитане на стойността на елемент на многомерен масив

• Записване на стойност в елемент на многомерен масив

Page 22: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Достъпване на елементи на многомерен масив - демо

// Демонстрация

Page 23: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Елементът се индексира в тялото на

най-вътрешния цикъл с помощта на броячите на всички цикли

Page 24: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Обхождане на елементите на многомерен масив - демо

// Демонстрация

Page 25: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масиви от масиви

• Масиви от масиви– Наричат се още назъбени масиви (jagged arrays)– Тип на елементите – масив (едномерен, многомерен или

назъбен)– Външният масив може да бъде едномерен или многомерен– Индексирането на елемент се извършва на стъпки– Нехомогенност на измеренията – възможно е два елемента на

външния масив да реферират масиви с различни дължини на измеренията

Page 26: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масиви от масиви

// Деклариране на масиви от масивиstring[][] families;int[][][] sets;// Инстанциране на масиви от масивиfamilies = new string[2][];sets = new int[10][][];// Деклариране с инициализиране с// празен масивbyte[][] byteGroups = new byte[10][];

• Деклариране на променлива от тип масив от масиви– Тип на елементите на вътрешния

масив– Два или повече чифта квадратни

скоби

• Инстанциране на масив от масиви– Оператор new– Тип на елементите на вътрешния

масив– Дължина на външния масив в

квадратни скоби– Един или повече чифта празни

квадратни скоби– Всеки от елементите на външния

масив е null

Page 27: Училищен курс по програмиране на C# (2013/2014), занятие №3

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" }, };

• Инстанциране на масив от масиви с инициализация на елементите

Page 28: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Деклариране и инстанциране на масиви от масиви - демо

// Демонстрация

Page 29: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масиви от масиви

// Достъпване на елемент на външния// масивfamilies[0]// Достъпване на вътрешен елементemployees[2][1]// Прочитане на стойността на вътрешен// елементConsole.Write(sets[5][2][7]);// Записване на стойност във вътрешен// елементemployees[0][1] = "Miranda";

• Достъпване на елемент на масив от масиви– Идентификатор на променливата-

масив– Индекс на елемента на външния

масив

• Достъпване на вътрешен елемент в масив от масиви– Идентификатор на променливата-

масив– Индекс на елемента на външния

масив– Индекс на елемента на вътрешния

масив

Page 30: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Достъпване на елементи на масив от масиви - демо

// Демонстрация

Page 31: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Елементът може да се индексира на

стъпки

Page 32: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Обхождане на елементите на масив от масиви - демо

// Демонстрация

Page 33: Училищен курс по програмиране на C# (2013/2014), занятие №3

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– Не се индексират елементите явно

Page 34: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Масивите от масиви като вложени изброими колекции - демо

// Демонстрация

Page 35: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Приложения на масивите

• Сортиране на информация – метод на пряката селекция– Масив с n на брой елемента– n-1 стъпки– На стъпка i се разглеждат елементите с индекси от i до n-1

(включително)– Най-малкият от тях се разменя с елемента с индекс i (в случай

че това не е самият той)– След всяка стъпка, елементите с индекси от 0 до i

(включително) са сортирани във възходящ ред

Page 36: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Сортиране по метода на пряката селекция - демо

// Демонстрация

Page 37: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Приложения на масивите

• Откриване на прости числа – сито на Ератостен– Масив с n на брой елемента от булев тип– Всички елементи с индекси, по-големи от 1, се инициализират с

true– Открива се първият индекс, който е по-голям от предишното

намерено просто число и на който съответства елемент със стойност true

– Този индекс е следващото просто число– За всички индекси, които са по-големи и са кратни на него, се

присвоява стойност false на съответните им елементи– Изпълнението продължава, докато може да бъде намерено

ново просто число, по-малко от n

Page 38: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Сито на Ератостен - демо

// Демонстрация

Page 39: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Приложения на масивите

• Лабиринт– Двумерен масив с елементи от символен тип– Всеки елемент представлява квадратно поле от лабиринта

(може да бъде празно пространство или стена)– Координати на играча спрямо горния ляв ъгъл– Безкраен цикъл:

• Изчаква се натискане на клавиш• Ако е натиснат клавиш за движение, се прави опит за преместване в

съответната посока• Ако е натиснат клавиш Escape, цикълът се прекратява• Ако преместването е невъзможно или е натиснат друг клавиш, не се

случва нищо

Page 40: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Лабиринт - демо

// Демонстрация

Page 41: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Създайте програма, в която се въвежда масив от цели числа и се извеждат най-голямото число, най-малкото число и средното аритметично на всички числа в масива.

• Създайте програма, в която се въвежда масив от дробни числа, масивът се сортира във възходящ ред по метода на мехурчето и след това се извеждат сортираните числа. Допълнителни условия:– Потребителят да може да избере дължината на въвеждания

масив;– Потребителят да може да избере между възходящ и низходящ

ред на сортирането.

Page 42: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Създайте програма, в която се въвежда масив от цели числа и се извежда броят на инверсиите. Два елемента с индекси i и j се намират в инверсия, точно когато i < j и елементът с индекс i е по-голям от елементa с индекс j.

• Създайте програма, в която се въвежда двумерна квадратна матрица от дробни числа и се извеждат сумата на всички елементи по главния диагонал, сумата на всички елементи над него и сумата на всички елементи под него. Главен диагонал наричаме елементите с равни първи и втори индекси.

Page 43: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Създайте програма, в която се въвежда правоъгълна матрица от температури (дробни числа) със 7 реда и 6 колони. Всеки от редовете съответства на ден от седмицата, започвайки с понеделник. Колоните съответстват на 00:00, 04:00, 08:00, 12:00, 16:00 и 20:00 часа. Всяка клетка от матрицата съдържа температурата в съответния час и ден за една седмица. Програмата трябва да пресметне и изведе средната температура за всеки от седемте дни, както и средната температура за всеки от шестте момента от денонощието.

Page 44: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• Създайте програма, в която се въвеждат текущите оценки (дробни числа между 2 и 6) по един учебен предмет на учениците от един клас. Възможно е всеки от учениците да има различен брой текущи оценки по предмета. Програмата трябва да пресмята и извежда срочната оценка на всеки от учениците (като средно аритметично от текущите му оценки), както и средния успех на целия клас по предмета (като средно аритметично от всички срочни оценки).

Page 45: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Задачи за упражнение

• В една местност има n на брой градове (номерирани от 0 до n-1) и някои от тях са свързани с пътища. Създайте програма, в която се въвежда n и след това за всеки от градовете последователно се въвеждат номерата на градовете, които са свързани с него чрез директен път. Програмата трябва да пресметне и изведе двойките градове, които са свързани с най-кратък път, минаващ през точно един друг град, точно два други града и т.н. За простота приемете, че пътищата са еднопосочни (наличието на път от град i до град j не гарантира наличие на обратен път от град j към град i).

Page 46: Училищен курс по програмиране на C# (2013/2014), занятие №3

Copyright © 2013 DAVID Holding Company

Въпроси?

Page 47: Училищен курс по програмиране на C# (2013/2014), занятие №3

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