Россия |
Массивы
Самостоятельная работа
Теоретический материал
Вставка и удаление элементов в массивах
При объявлении массива мы определяем его максимальную размерность, которая в дальнейшем изменена быть не может. Однако с помощью вспомогательной переменной можно контролировать текущее количество элементов, которое не может быть больше максимального.
Пример. Рассмотрим фрагмент программы:
int []a=new int [10]; int n=5; for (int i=0; i<5;i++) a[i]:=i*i;
В этом случае массив можно представить следующим образом:
Так как во время описания был определен массив из 10 элементов, а заполнено только первые 5, то оставшиеся элементы будут заполнены нулями.
Что значит удалить из одномерного массива элемент с номером 3? Удаление должно привести к физическому "уничтожению" элемента с номером 3 из массива, при этом общее количество элементов должно быть уменьшено. В этом понимании удаления элемента итоговый массив должен выглядеть следующем образом
Такое удаление для массивов невозможно, поскольку элементы массива располагаются в памяти последовательно друг за другом, что позволяет организовать индексный способ обращения к массиву.
Однако "удаление" можно смоделировать сдвигом элементов влево и уменьшением значения переменной, которая отвечает за текущее количество элементов в массиве, на единицу:
В общем случае, если мы хотим удалить элемент массива с номером k (всего в массиве n элементов, а последний элемент имеет индекс n-1 ), то нам необходимо произвести сдвиг элементов, начиная с k+1 -го на одну позицию влево. Т.е. на k -ое место поставить k+1 -й элемент, на место k+1 - k+2 -й элемент, …, на место n-2 - n-1 -й элемент. После чего значение n уменьшить на 1. В этом случае размерность массива не изменится, изменится лишь текущее количество элементов, и у нас создастся ощущение, что элемент с номером k удален. Рассмотрим данный алгоритм на примере:
using System; namespace ConsoleApplication { class Class { static int [] Input () { Console.WriteLine("введите размерность массива"); int n=int.Parse(Console.ReadLine()); int []a=new int[n]; for (int i = 0; i < n; ++i) { Console.Write("a[{0}]= ", i); a[i]=int.Parse(Console.ReadLine()); } return a; } static void Print(int[] a, int n) { for (int i = 0; i < n; ++i) Console.Write("{0} ", a[i]); Console.WriteLine(); } static void DeleteArray(int[] a, ref int n, int m) { for (int i = m; i < n-1; ++i) a[i] = a[i+1]; --n; } static void Main() { int[] myArray=Input(); int n=myArray.Length; Console.WriteLine("Исходный массив:"); Print(myArray, n); Console.WriteLine("Введите номер элемента для удаления:"); int m=int.Parse(Console.ReadLine()); DeleteArray(myArray, ref n,m); Console.WriteLine("Измененный массив:"); Print(myArray, n); } } }
Рассмотрим теперь операцию удаления в двумерном массиве. Размерность двумерного массива также зафиксирована на этапе объявления массива. Однако при необходимости можно "смоделировать" удаление целой строки в массиве, выполняя сдвиг всех строк, начиная с k -той на единицу вверх. В этом случае размерность массива не изменится, а текущее количество строк будет уменьшено на единицу. В качестве примера удалим из двумерного массива, строку с номером k.
using System; namespace ConsoleApplication { class Class { static int [,] Input (out int n, out int m) { Console.WriteLine("введите размерность массива"); Console.Write("n = "); n=int.Parse(Console.ReadLine()); Console.Write("m = "); m=int.Parse(Console.ReadLine()); int [,]a=new int[n, m]; for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { Console.Write("a[{0},{1}]= ", i, j); a[i, j]=int.Parse(Console.ReadLine()); } return a; } static void Print(int[,] a, int n, int m) { for (int i = 0; i < n; ++i,Console.WriteLine() ) for (int j = 0; j < m; ++j) Console.Write("{0,5} ", a[i, j]); } static void DeleteArray(int[,] a, ref int n, int m, int k) { for (int i = k; i < n-1; ++i) for (int j = 0; j < m; ++j) a[i, j] = a[i+1, j]; --n; } static void Main() { int n,m; int[,] myArray=Input(out n, out m); Console.WriteLine("Исходный массив:"); Print(myArray, n, m); Console.WriteLine("Введите номер строки для удаления:"); int k=int.Parse(Console.ReadLine()); DeleteArray(myArray, ref n, m, k); Console.WriteLine("Измененный массив:"); Print(myArray, n, m); } } }
- Подумайте, какие исключительные ситуации могут возникнуть в данной программе и добавьте в нее соответствующие обработки исключительных ситуаций.
- Измените программу так, чтобы она удаляла k -тый столбец в двумерном массиве.