wikail

RemoveFromArray

Nov 30th, 2020 (edited)
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.11 KB | None | 0 0
  1. using System;
  2.  
  3. /* Напишите функцию, которая из входного двумерного массива удаляет элемент по указанным индексам.
  4. * Необходимо предусмотреть необязательный аргумент, который показывает
  5. * направление сдвига следующих от удаляемой ячеек - по горизонтали влево или по вертикали вверх.
  6. * Возможные ошибки, связанные с входным аргументом обрабатывайте с помощью обработки исключительных ситуаций.
  7. */
  8.  
  9. namespace RemoveFromArray
  10. {
  11.     class Program
  12.     {
  13.         static void Main(string[] args)
  14.         {
  15.             int[,] arr ={
  16.             { 1, 2, 3, 4, 5 },
  17.             { 3, 4, 6, 7, 5 },
  18.             { 6, 7, 9, 3, 2 }};
  19.  
  20.             int first;
  21.             int second;
  22.  
  23.             Console.WriteLine("Введите в столбик индексы удаляемого элемента");
  24.            
  25.             //Запилим обработчик неверного формата ввода
  26.             try
  27.             {
  28.                 //Читаем, конвертируем в int
  29.                 first = Convert.ToInt32(Console.ReadLine());
  30.                 second = Convert.ToInt32(Console.ReadLine());
  31.  
  32.                 //вызываем основную функцию
  33.                 RemoveAt(ref arr, first, second);
  34.             }
  35.  
  36.             //Если введен, например символ
  37.             catch (System.FormatException ex)
  38.             {
  39.                 Console.WriteLine("Error! You entered an invalid character");
  40.             }
  41.  
  42.             //Если функция выбросила ошибку IndexOutOfRangeException
  43.             catch (System.IndexOutOfRangeException ex)
  44.             {
  45.                 Console.WriteLine("Error! Index is out of bounds of array");
  46.             }
  47.  
  48.             //На всякие другие случаи
  49.             catch (System.Exception ex)
  50.             {
  51.                 Console.WriteLine(ex.Message);
  52.                 Console.WriteLine(ex.GetType());
  53.  
  54.             }
  55.         }
  56.  
  57.         //Основная функция
  58.         static void RemoveAt(ref int[,] arr, int i, int j, string shift = "left") //последний сделала необязательным/по умолчанию
  59.         {
  60.             arr[i, j] = 0; //обнулим
  61.             //Количество строк и столбцов массива. Я не ввожу эти переменные.
  62.             //int n = arr.GetLength(0);
  63.             //int m = arr.GetLength(1);
  64.  
  65.             //В цикле проходимся по массиву начиная с удаляемого элемента и меняем местами со следующим,
  66.             //который определяется getNext и зависит от стратегии смещения
  67.             while (true)
  68.             {
  69.                 int icurrent = i;//сохраняем текущие значения в новых переменных
  70.                 int jcurrent = j;
  71.  
  72.                 //с помощью аргумента-ссылки ref меняем значения i и j на следующий элемент
  73.                 GetNext(arr, ref i, ref j, shift);
  74.                 //Если следующий элемент уже за границей, значит до конца дошли, выходим из цикла
  75.                 if (i >= arr.GetLength(0) || j >= arr.GetLength(1))
  76.                     break;
  77.  
  78.                 //Меняем current и next элементы (в C# нужно делать через переменную)
  79.                 int temp = arr[icurrent, jcurrent];
  80.                 arr[icurrent, jcurrent] = arr[i, j];
  81.                 arr[i, j] = temp;
  82.  
  83.                 //current становится next - делаем в начале цикла, здесь нет необходимости
  84.             }
  85.  
  86.             //Печатаем массив
  87.             for (int k = 0; k < arr.GetLength(0); k++)
  88.             {
  89.                 for (int g = 0; g < arr.GetLength(1); g++)
  90.                 {
  91.                     Console.Write(arr[k, g]);
  92.                 }
  93.                 Console.WriteLine();
  94.             }
  95.         }
  96.  
  97.         //Вспомогательная функция
  98.         //С помощью аргументов по ссылкам ref меняем текущие индексы на следующие
  99.         //стратегия зависит от shift
  100.         static void GetNext(int[,] arr, ref int i, ref int j, string shift)
  101.         {
  102.             if (shift == "left")
  103.             {
  104.                 i += (j + 1) / arr.GetLength(1);
  105.                 j = (j + 1) % arr.GetLength(1);
  106.             }
  107.             if (shift == "up")
  108.             {
  109.                 j += (i + 1) / arr.GetLength(0);
  110.                 i = (i + 1) % arr.GetLength(0);
  111.             }
  112.         }
  113.     }
  114. }
Add Comment
Please, Sign In to add comment