Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- /* Напишите функцию, которая из входного двумерного массива удаляет элемент по указанным индексам.
- * Необходимо предусмотреть необязательный аргумент, который показывает
- * направление сдвига следующих от удаляемой ячеек - по горизонтали влево или по вертикали вверх.
- * Возможные ошибки, связанные с входным аргументом обрабатывайте с помощью обработки исключительных ситуаций.
- */
- namespace RemoveFromArray
- {
- class Program
- {
- static void Main(string[] args)
- {
- int[,] arr ={
- { 1, 2, 3, 4, 5 },
- { 3, 4, 6, 7, 5 },
- { 6, 7, 9, 3, 2 }};
- int first;
- int second;
- Console.WriteLine("Введите в столбик индексы удаляемого элемента");
- //Запилим обработчик неверного формата ввода
- try
- {
- //Читаем, конвертируем в int
- first = Convert.ToInt32(Console.ReadLine());
- second = Convert.ToInt32(Console.ReadLine());
- //вызываем основную функцию
- RemoveAt(ref arr, first, second);
- }
- //Если введен, например символ
- catch (System.FormatException ex)
- {
- Console.WriteLine("Error! You entered an invalid character");
- }
- //Если функция выбросила ошибку IndexOutOfRangeException
- catch (System.IndexOutOfRangeException ex)
- {
- Console.WriteLine("Error! Index is out of bounds of array");
- }
- //На всякие другие случаи
- catch (System.Exception ex)
- {
- Console.WriteLine(ex.Message);
- Console.WriteLine(ex.GetType());
- }
- }
- //Основная функция
- static void RemoveAt(ref int[,] arr, int i, int j, string shift = "left") //последний сделала необязательным/по умолчанию
- {
- arr[i, j] = 0; //обнулим
- //Количество строк и столбцов массива. Я не ввожу эти переменные.
- //int n = arr.GetLength(0);
- //int m = arr.GetLength(1);
- //В цикле проходимся по массиву начиная с удаляемого элемента и меняем местами со следующим,
- //который определяется getNext и зависит от стратегии смещения
- while (true)
- {
- int icurrent = i;//сохраняем текущие значения в новых переменных
- int jcurrent = j;
- //с помощью аргумента-ссылки ref меняем значения i и j на следующий элемент
- GetNext(arr, ref i, ref j, shift);
- //Если следующий элемент уже за границей, значит до конца дошли, выходим из цикла
- if (i >= arr.GetLength(0) || j >= arr.GetLength(1))
- break;
- //Меняем current и next элементы (в C# нужно делать через переменную)
- int temp = arr[icurrent, jcurrent];
- arr[icurrent, jcurrent] = arr[i, j];
- arr[i, j] = temp;
- //current становится next - делаем в начале цикла, здесь нет необходимости
- }
- //Печатаем массив
- for (int k = 0; k < arr.GetLength(0); k++)
- {
- for (int g = 0; g < arr.GetLength(1); g++)
- {
- Console.Write(arr[k, g]);
- }
- Console.WriteLine();
- }
- }
- //Вспомогательная функция
- //С помощью аргументов по ссылкам ref меняем текущие индексы на следующие
- //стратегия зависит от shift
- static void GetNext(int[,] arr, ref int i, ref int j, string shift)
- {
- if (shift == "left")
- {
- i += (j + 1) / arr.GetLength(1);
- j = (j + 1) % arr.GetLength(1);
- }
- if (shift == "up")
- {
- j += (i + 1) / arr.GetLength(0);
- i = (i + 1) % arr.GetLength(0);
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment