Опубликован: 19.02.2009 | Доступ: свободный | Студентов: 3059 / 791 | Оценка: 4.35 / 4.11 | Длительность: 16:28:00
ISBN: 978-5-94774-401-9
Лекция 8:

Массивы

< Лекция 7 || Лекция 8: 123456 || Лекция 9 >

Рассмотрим модификацию предыдущей программы, для случая, когда используется ступенчатый массив.

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. В этом случае массив будет выглядеть следующим образом:

k=3 0 1 2 3 4 5 6 7 8 9
а 0 1 4 9 9 16 0 0 0 0

Теперь в позицию с номером 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);
    }
  }
}
Задания.
  1. Подумайте, какие исключительные ситуации могут возникнуть в данной программе и добавьте в нее соответствующие обработки исключительных ситуаций.
  2. Измените программу так, чтобы она добавляла 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);
    }
  }
}

Практические задания

  1. В одномерном массиве, элементы которого - целые числа, произвести следующие действия:
    1. Удалить из массива все четные числа.
    2. Вставить новый элемент после всех элементов, которые заканчиваются на данную цифру.
    3. Удалить из массива повторяющиеся элементы, оставив только их первые вхождения.
    4. Вставить новый элемент между всеми парами элементов, имеющими разные знаки.
    5. Уплотнить массив, удалив из него все нулевые значения.
  2. В двумерном массиве, элементы которого - целые числа, произвести следующие действия:
    1. Вставить новую строку после строки, в которой находится первый встреченный минимальный элемент.
    2. Вставить новый столбец перед всеми столбцами, в которых встречается заданное число.
    3. Удалить все строки, в которых нет ни одного четного элемента.
    4. Удалить все столбцы, в которых все элементы положительны.
    5. Удалить из массива k-тую строку и j-тый столбец, если их значения совпадают.
    6. Уплотнить массив, удалив из него все нулевые строки и столбцы.
< Лекция 7 || Лекция 8: 123456 || Лекция 9 >