Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 1 · Урок 7

Масиви

Едномерни и двумерни масиви — деклариране, индексиране, обхождане, типични задачи (търсене, сума, минимум/максимум).

Какво е масив

Масивът е поредица от стойности от един и същ тип, подредени в паметта една след друга. Достъпваш ги по индекс — пореден номер, започващ от 0.

int[] numbers = { 3, 7, 1, 9, 4, 2 };3[0]7[1]1[2]9[3]4[4]2[5]Length = 6 · последен индекс = 5
Фиг. 1 — Масив от 6 числа. Първият елемент е на индекс 0, последният — на индекс Length−1.

Ключово

В C# индексите започват от 0, а не от 1! Това е най-честата грешка в началото.

Деклариране и инициализация

// Празен масив с определен размер (всички стойности = 0)
int[] numbers = new int[5];

// Със стойности веднага
int[] grades = { 6, 5, 4, 6, 3 };
int[] grades2 = new int[] { 6, 5, 4, 6, 3 };

// Друг тип
string[] names = { "Иван", "Мария", "Петър" };
double[] prices = new double[10];

Достъп и промяна:

int first = grades[0];     // 6
int last = grades[4];      // 3
grades[2] = 5;             // променяме третия елемент

int count = grades.Length;   // 5  (винаги взимай дължината така)

IndexOutOfRangeException

Ако опиташ grades[5] на горния масив — ще получиш грешка по време на изпълнение. Валидните индекси са 0 .. Length - 1.

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

С for (когато ти трябва индексът)

int[] grades = { 6, 5, 4, 6, 3 };

for (int i = 0; i < grades.Length; i++)
{
    Console.WriteLine($"Оценка #{i + 1}: {grades[i]}");
}

С foreach (когато ти трябват само стойностите)

foreach (int grade in grades)
{
    Console.WriteLine(grade);
}

foreach е по-кратък и по-четим, но не можеш да променяш елементите чрез него.

Типични задачи

Сума и средно аритметично

int[] grades = { 6, 5, 4, 6, 3 };
int sum = 0;

foreach (int g in grades)
    sum += g;

double avg = (double)sum / grades.Length;
Console.WriteLine($"Сума: {sum}, средно: {avg:F2}");

Намиране на максимум

int[] numbers = { 3, 7, 1, 9, 4, 2 };
int max = numbers[0];

for (int i = 1; i < numbers.Length; i++)
{
    if (numbers[i] > max) max = numbers[i];
}

Console.WriteLine($"Максимум: {max}");

Съвет

Започваме max от numbers[0], не от 0! Иначе няма да работи за масиви само с отрицателни числа.

Търсене (linear search)

int[] arr = { 5, 12, 7, 21, 3 };
int target = 7;
int foundAt = -1;

for (int i = 0; i < arr.Length; i++)
{
    if (arr[i] == target)
    {
        foundAt = i;
        break;
    }
}

Console.WriteLine(foundAt == -1 ? "Не намерих" : $"На индекс {foundAt}");

Обръщане на масив

int[] arr = { 1, 2, 3, 4, 5 };

for (int i = 0; i < arr.Length / 2; i++)
{
    int temp = arr[i];
    arr[i] = arr[arr.Length - 1 - i];
    arr[arr.Length - 1 - i] = temp;
}

// или най-простото:
Array.Reverse(arr);

Двумерни масиви — таблици

За работа с матрици, шахматни дъски, таблици с оценки и т.н.:

int[,] matrix = new int[3, 4];   // 3 реда, 4 колони

// Със стойности
int[,] grid = {
    { 1, 2, 3, 4 },
    { 5, 6, 7, 8 },
    { 9, 10, 11, 12 }
};

int value = grid[1, 2];   // 7  — ред 1, колона 2
int rows = grid.GetLength(0);   // 3
int cols = grid.GetLength(1);   // 4

Обхождане с вложени цикли:

for (int r = 0; r < grid.GetLength(0); r++)
{
    for (int c = 0; c < grid.GetLength(1); c++)
    {
        Console.Write($"{grid[r, c],4}");
    }
    Console.WriteLine();
}

Какво трябва да запомниш

  • Масив = поредица от стойности с фиксиран размер и един тип.
  • Индекси започват от 0, валидни са [0 .. Length - 1].
  • for когато ти трябва индексът, foreach за просто обхождане.
  • За намиране на min/max — започвай от първия елемент, не от 0.
  • Двумерни масиви: int[,], достъп с grid[r, c].