Задачи с массивами


Познакомившись с циклами, переменными, условными конструкциями и массивами, рассмотрим несколько задач для работы с массивами.

Количество положительных чисел
Найдем количество положительных чисел в массиве:

int[] numbers = { -4, -3, -2, -1, 0, 1, 2, 3, 4 };
int result = 0;
foreach(int number in numbers)
{
if(number > 0)
{
result++;
}
}
Console.WriteLine($"Число элементов больше нуля: {result}");
Здесь создаем вспомогательную переменную result, которая будет содержать количество положительных чисел. В цикле прохожим по массиву и, если его элемент больше нуля, добавляем к переменной result единицу.

Инверсия массива
Вторая задача - инверсия массива, то есть переворот его в обратном порядке:

int[] numbers = { -4, -3, -2, -1,0, 1, 2, 3, 4 };

int n = numbers.Length; // длина массива
int k = n / 2; // середина массива
int temp; // вспомогательный элемент для обмена значениями
for(int i=0; i < k; i++)
{
temp = numbers[i];
numbers[i] = numbers[n - i - 1];
numbers[n - i - 1] = temp;
}
foreach(int i in numbers)
{
Console.Write($"{i} \t");
}
Поскольку нам надо изменять элементы массива, то для этого используется цикл for. Алгоритм решения задачи подразумевает перебор элементов до середины массива, которая в программе представлена переменной k, и обмен значений элемента, который имеет индекс i, и элемента с индексом n-i-1.

Программа сортировки массива
Теперь возьмем задачу посложнее - простейшую сортировку массива:

int[] nums = { 54, 7, -41, 2, 4, 2, 89, 33, -5, 12 };

// сортировка
int temp;
for (int i = 0; i < nums.Length - 1; i++)
{
for (int j = i + 1; j < nums.Length; j++)
{
if (nums[i] > nums[j])
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}

// вывод
Console.WriteLine("Вывод отсортированного массива");
for (int i = 0; i < nums.Length; i++)
{
Console.WriteLine(nums[i]);
}
Для сортировки массива выполняем проходы по массиву и сравниваем элементы. Поскольку нам надо последовательно сравнивать каждый элемент массива с каждым (за исключением сравния с самим собой), то здесь применятся вложенный цикл.

Во внешнем цикле мы берем элемент, который будем сравнивать:

for (int i = 0; i < nums.Length - 1; i++)
Далее запускаем вложенный цикл, который начинается, со следующего элемента, и из которого извлекаем элементы, с которыми будем сравнивать тот элемент, которые берется из массива во внешнем цикле:

for (int j = i + 1; j < nums.Length; j++)
Если элемент с меньшим индексом больше элемента с большим индексом, то меняем элементы местами.

if (nums[i] > nums[j])
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
В конце выводим все элементы.