Массивы
Рассмотрим модификацию предыдущей программы, для случая, когда используется ступенчатый массив.
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-тый столбец, если их значения совпадают.
- Уплотнить массив, удалив из него все нулевые строки и столбцы.