3. Масиви
• Какво е „масив“?
– Структура от данни
– Множество от елементи от един и същи тип
– Константна големина
• Няма възможност за вмъкване или изваждане на елементи
– Едно или повече измерения
– Индексиране на елемент
5. Едномерни масиви
• Едномерни масиви в C#
– Брой на елементите (дължина/големина на масива) – цяло
неотрицателно число n
– Индекси на елементите – целите числа от 0 до n-1 включително
6. Едномерни масиви
• Деклариране на променлива от
тип масив
– Тип на елементите
– Квадратни скоби
– Наименование
• Инстанциране на масив
– Оператор new
– Тип на елементите
– Брой на елементите в квадратни скоби
• Деклариране на променлива и
инициализиране с масив
// Деклариране на масиви
int[] numbers;
byte[] bytes;
// Инстанциране на масиви
numbers = new int[10];
bytes = new byte[0];
// Деклариране с инициализация
// с празен масив
string[] lines = new string[50];
7. Едномерни масиви
• Инстанциране на масив с
инициализация на елементите
// Инициализиране на масив
// със стойности
string[] names = new string[3]
– Оператор new
{ "Иван", "Валери",
– Тип на елементите
"Александър" };
– Брой на елементите в квадратни скоби 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 =
{ 'а', 'ъ', 'е', 'и', 'о', 'у' };
9. Едномерни масиви
• Достъпване на елементи на масив // Достъпване на елемент на масив
names[2]
– Идентификатор на променливата// Прочитане на стойността на елемент
масив
Console.WriteLine(temperatures[0]);
– Индекс на елемента в квадратни скоби
// Записване на стойност в елемент
• Прочитане на стойността на
greetings[1] = "Good morning";
елемент на масива
• Записване на стойност в елемент
на масива
11. Едномерни масиви
• Обхождане на елементите на
масив
// Достъпване на дължината на масив
byte[] bytes = new byte[250];
Console.WriteLine(bytes.Length);
– Дължина на масива
// Обхождане на елементите на масив
int[] numbers = new int[10];
– Цикъл for
for (int i = 0; i < numbers.Length; i++)
– Индексиране на всеки от елементите с
{
помощта на брояча на цикъла
Console.Write(
"Input number #{0}: ", i);
numbers[i] =
int.Parse(Console.ReadLine());
}
13. Едномерни масиви
• Масивите като изброими колекции // Обхождане на масив като изброима
– Предоставят елементите един по
един, започвайки от нулевия
– Цикъл foreach
– Не се индексират елементите на
масива явно
// колекция
string[] nouns = new string[]
{ "cat", "dog", "boy", "job",
"tip", "lap", "cup", "mop" };
foreach (string noun in nouns)
{
Console.WriteLine(noun);
}
15. Особености на масивите
• Масивите са референтни типове – няколко променливи
могат да реферират един и същи масив
• Елементите на масивите могат да бъдат референтни или
нереферентни типове
– Ако типът на елементите е референтен, е възможно повече от един
елемента на един или повече масива да реферират едно и също
място в паметта
17. Многомерни масиви
• Многомерни масиви
Двумерни масиви (матрици) – две измерения
Масиви с повече от две измерения
Всяко от измеренията може да има различна дължина
Измеренията са наредени – елементът с индекси m, n не съвпада с
елемента с индекси n, m
– Индексирането на елемент винаги е пълно – указва се индекс за
всяко от измеренията
– Хомогенност на измеренията - дължината на всяко измерение е
независима от индексите по другите измерения
–
–
–
–
18. Многомерни масиви
• Деклариране на променлива от
тип многомерен масив
– Тип на елементите
– Квадратни скоби с i-1 на брой запетаи
• Инстанциране на многомерен
масив
– Оператор new
– Тип на елементите
– Списък с дължините на измеренията в
квадратни скоби
// Деклариране на двумерен масив
int[,] matrix;
// Деклариране на тримерен масив
double[,,] values;
// Инстанциране на многомерни масиви
matrix = new int[8, 6];
values = new double[5, 5, 4];
// Деклариране с инициализация с
// празен многомерен масив
char[,] tiles = new char[10, 10];
21. Многомерни масиви
• Достъпване на елемент на
многомерен масив
– Идентификатор на променливатамасив
– Списък с индекси на елемента в
квадратни скоби
• Прочитане на стойността на
елемент на многомерен масив
• Записване на стойност в елемент
на многомерен масив
// Достъпване на елемент на двумерен
// масив
ticTacToe[0, 1]
// Прочитане на стойността на елемент
// на двумерен масив
Console.Write(truthTable[1, 2]);
// Записване на стойност в елемент
// на двумерен масив
ticTacToe[2, 0] = 'X';
23. Многомерни масиви
• Обхождане на елементите на
многомерен масив
– Дължина на всяко от измеренията
– Вложени цикли for
– Елементът се индексира в тялото на
най-вътрешния цикъл с помощта на
броячите на всички цикли
// Достъпване на дължината на измерение
// на двумерен масив
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();
}
25. Масиви от масиви
• Масиви от масиви
–
–
–
–
–
Наричат се още назъбени масиви (jagged arrays)
Тип на елементите – масив (едномерен, многомерен или назъбен)
Външният масив може да бъде едномерен или многомерен
Индексирането на елемент се извършва на стъпки
Нехомогенност на измеренията – възможно е два елемента на
външния масив да реферират масиви с различни дължини на
измеренията
26. Масиви от масиви
• Деклариране на променлива от
тип масив от масиви
– Тип на елементите на вътрешния масив
– Два или повече чифта квадратни скоби
• Инстанциране на масив от масиви
– Оператор new
– Тип на елементите на вътрешния масив
– Дължина на външния масив в квадратни
скоби
– Един или повече чифта празни
квадратни скоби
– Всеки от елементите на външния масив
е null
// Деклариране на масиви от масиви
string[][] families;
int[][][] sets;
// Инстанциране на масиви от масиви
families = new string[2][];
sets = new int[10][][];
// Деклариране с инициализиране с
// празен масив
byte[][] byteGroups = new byte[10][];
27. Масиви от масиви
• Инстанциране на масив от масиви
с инициализация на елементите
// Инициализиране на масив от масиви
// със стойности
string[][] employees = new string[4][]
{
new string[2] { "Sue", "Peter" },
new string[1] { "Bonnie" },
new string[] { "Ivan", "Kosta" },
new[] { "Max", "Sarah", "John" },
};
29. Масиви от масиви
• Достъпване на елемент на масив
от масиви
// Достъпване на елемент на външния
// масив
families[0]
– Идентификатор на променливата// Достъпване на вътрешен елемент
масив
employees[2][1]
– Индекс на елемента на външния масив
// Прочитане на стойността на вътрешен
• Достъпване на вътрешен елемент в // елемент
Console.Write(sets[5][2][7]);
масив от масиви
// Записване на стойност във вътрешен
– Идентификатор на променливата// елемент
масив
– Индекс на елемента на външния масив employees[0][1] = "Miranda";
– Индекс на елемента на вътрешния
масив
31. Масиви от масиви
• Обхождане на вътрените елементи
на масив от масиви
– Дължина на външния масив
– Дължина на всеки от вътрешните
масиви
– Вложени цикли for
– Елементът може да се индексира на
стъпки
// Достъпване на дължината на външния масив
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]);
}
}
33. Масиви от масиви
• Масивите от масиви като вложени
изброими колекции
– Вложени цикли foreach
– Не се индексират елементите явно
// Обхождане на масив от масиви като
// вложени изброими колекции
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("}");
34. Масивите от масиви като вложени изброими
колекции - демо
// Демонстрация
35. Приложения на масивите
• Сортиране на информация – метод на пряката селекция
– Масив с n на брой елемента
– n-1 стъпки
– На стъпка i се разглеждат елементите с индекси от i до n-1
(включително)
– Най-малкият от тях се разменя с елемента с индекс i (в случай че
това не е самият той)
– След всяка стъпка, елементите с индекси от 0 до i (включително) са
сортирани във възходящ ред
37. Приложения на масивите
• Откриване на прости числа – сито на Ератостен
– Масив с n на брой елемента от булев тип
– Всички елементи с индекси, по-големи от 1, се инициализират с
true
– Открива се първият индекс, който е по-голям от предишното
намерено просто число и на който съответства елемент със
стойност true
– Този индекс е следващото просто число
– За всички индекси, които са по-големи и са кратни на него, се
присвоява стойност false на съответните им елементи
– Изпълнението продължава, докато може да бъде намерено ново
просто число, по-малко от n
39. Приложения на масивите
• Лабиринт
– Двумерен масив с елементи от символен тип
– Всеки елемент представлява квадратно поле от лабиринта (може
да бъде празно пространство или стена)
– Координати на играча спрямо горния ляв ъгъл
– Безкраен цикъл:
• Изчаква се натискане на клавиш
• Ако е натиснат клавиш за движение, се прави опит за преместване в
съответната посока
• Ако е натиснат клавиш Escape, цикълът се прекратява
• Ако преместването е невъзможно или е натиснат друг клавиш, не се случва
нищо
41. Задачи за упражнение
• Създайте програма, в която се въвежда масив от цели
числа и се извеждат най-голямото число, най-малкото
число и средното аритметично на всички числа в масива.
• Създайте програма, в която се въвежда масив от дробни
числа, масивът се сортира във възходящ ред по метода на
мехурчето и след това се извеждат сортираните числа.
Допълнителни условия:
– Потребителят да може да избере дължината на въвеждания масив;
– Потребителят да може да избере между възходящ и низходящ ред
на сортирането.
42. Задачи за упражнение
• Създайте програма, в която се въвежда масив от цели
числа и се извежда броят на инверсиите. Два елемента с
индекси i и j се намират в инверсия, точно когато i < j и
елементът с индекс i е по-голям от елементa с индекс j.
• Създайте програма, в която се въвежда двумерна
квадратна матрица от дробни числа и се извеждат сумата
на всички елементи по главния диагонал, сумата на всички
елементи над него и сумата на всички елементи под него.
Главен диагонал наричаме елементите с равни първи и
втори индекси.
43. Задачи за упражнение
• Създайте програма, в която се въвежда правоъгълна
матрица от температури (дробни числа) със 7 реда и 6
колони. Всеки от редовете съответства на ден от
седмицата, започвайки с понеделник. Колоните
съответстват на 00:00, 04:00, 08:00, 12:00, 16:00 и 20:00 часа.
Всяка клетка от матрицата съдържа температурата в
съответния час и ден за една седмица. Програмата трябва
да пресметне и изведе средната температура за всеки от
седемте дни, както и средната температура за всеки от
шестте момента от денонощието.
44. Задачи за упражнение
• Създайте програма, в която се въвеждат текущите оценки
(дробни числа между 2 и 6) по един учебен предмет на
учениците от един клас. Възможно е всеки от учениците да
има различен брой текущи оценки по предмета.
Програмата трябва да пресмята и извежда срочната
оценка на всеки от учениците (като средно аритметично от
текущите му оценки), както и средния успех на целия клас
по предмета (като средно аритметично от всички срочни
оценки).
45. Задачи за упражнение
• В една местност има n на брой градове (номерирани от 0
до n-1) и някои от тях са свързани с пътища. Създайте
програма, в която се въвежда n и след това за всеки от
градовете последователно се въвеждат номерата на
градовете, които са свързани с него чрез директен път.
Програмата трябва да пресметне и изведе двойките
градове, които са свързани с най-кратък път, минаващ
през точно един друг град, точно два други града и т.н. За
простота приемете, че пътищата са еднопосочни
(наличието на път от град i до град j не гарантира наличие
на обратен път от град j към град i).