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