Дана матрица размера N×M. Поменять местами столбцы - C#
Формулировка задачи:
Есть такая вот задачка. На мой взгляд, должна работать.Компилятор выдает исключение(индекс за границы), да и сама прога работает неправильно. Что я не так делаю? Просьба объяснять поподробнее, тк я новичок и мне важно понять смысл моих ошибок.
* Дана матрица размера N×M. Поменять местами столбец с номером 1|M и первый|последний из столбцов,
* содержащих только положительные элементы. */
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Show(int[,] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) Console.Write("{0}\t", arr[i, j]); Console.WriteLine(); } } static void ExchangeColumn1(int[,]arr, int j)//меняем местами столбцы { int t; for (int i = 0; i < arr.GetLength(0); i++) { t = arr[i, j]; arr[i, j] = arr[i, 1]; arr[i, 1] = t; } } static void SearchFirst(int i, int j, int[,]arr)//поиск первого положительного столбца { int k1; bool first; for (j = 0; j < arr.GetLength(0); j++) { first = true; for (i = 0; i < arr.GetLength(1); i++) { if (arr[i, j] < 0) { first = false; break; } } if (first) break; } if (j == 0) Console.WriteLine("Требуемых столбцов не нашлось."); else k1 = j; //переменная k1 служит для запоминания первого положительного столбца ExchangeColumn1(arr, j); } static void SearchLast(int i, int j, int[,]arr)//ищем последний положительный столбец { int k2; bool last; for (j = arr.GetLength(1); j > 0; --j) { last = true; for (i = 0; i < arr.GetLength(0); i++) { if (arr[i, j] < 0) { last = false; break; } } if (last) break; } if (j == 0) Console.WriteLine("Требуемых столбцов не нашлось."); else k2 = j; ExchangeColumn1(arr, j); } static void ExchangeColumn3(int[,]arr, int m, int k1)//меняем столбец с номером М и первый положительный { int t; for (int i = 0; i < arr.GetLength(0); i++) { t = arr[i, m]; arr[i, m] = arr[i, k1]; arr[i, k1] = t; } } static void ExchangeColumn4(int[,]arr, int m, int k2)//меняем столбец с номером М и последний положительный { int t; for (int i = 0; i < arr.GetLength(0); i++) { t = arr[i, m]; arr[i, k2] = arr[i, k2]; arr[i, m] = t; } } static void ValueM (int m, int [,] arr)//вводим переменную М { Random r = new Random(); m = r.Next(arr.GetLength(1)); Console.WriteLine("Столбец M={0}", m); } static void Main() { int m=0; int k1=0; int k2=0; int i = 5; int j = 7; int[,] arr = new int[i, j]; Random rand = new Random(); for (i = 0; i < arr.GetLength(0); i++) for (j = 0; j < arr.GetLength(1); j++) arr[i, j] = rand.Next(-1, 15); Console.WriteLine("Исходный массив: "); Show(arr); Console.WriteLine(); Console.WriteLine("Полученный массив 1"); SearchFirst(i, j, arr); Show(arr); Console.WriteLine("Полученный массив 2"); SearchLast(i, j, arr); Show(arr); Console.WriteLine("Полученный массив 3"); ValueM(m, arr); ExchangeColumn3(arr, m, k1); Show(arr); Console.WriteLine("Полученный массив 4"); ExchangeColumn4(arr, m, k2); Show(arr); Console.ReadKey(); } } }
Решение задачи: «Дана матрица размера N×M. Поменять местами столбцы»
textual
Листинг программы
static int n = 5; static int m = 7; // Размерность матрицы N * M static void Main() { int[,] arr = new int[n,m]; int stolbec1 = 0; int stolbec_end=0; Random rand = new Random(); Console.WriteLine("Исходный массив: \n"); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { arr[i, j] = rand.Next(-2, 15); Console.Write("{0}\t", arr[i,j]); } Console.WriteLine(); } Console.WriteLine(); Console.WriteLine("Меняем первый столбец и первый положительный\n"); stolbec1 = FindFirst(arr); // находим первый положительный столбец Reverse(arr, 0, stolbec1); // меняем первый и певый положительный столбцы Show(arr, n, m); // выводим массив Console.WriteLine("\n"); Console.WriteLine("Меняем первый столбец и последний положительный столбец\n"); stolbec_end = FindEnd(arr, stolbec1); // находим последний положительный столбец Reverse(arr, 0, stolbec_end); // меняем первый стобец и последний положительный столбец Show(arr, n, m); //выводим массив Console.WriteLine("\n"); //меняем столбец с номером М и последний положительный Console.WriteLine("Меняем стобец М и последний положительный столбец, M={0} \n", m); stolbec_end = FindEnd(arr, stolbec1); // находим последний положительный столбец Reverse(arr, m-1, stolbec_end); // меняем M стобец и последний положительный столбец Show(arr, n, m); //выводим массив Console.ReadKey(); } static void Show(int[,]mass, int n, int m) // Вывод массива на экран { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) Console.Write("{0}\t", mass[i, j]); Console.WriteLine(); } } static void Reverse(int[,] arr, int chto, int nachto) // Функция замены { for (int i = 0; i < n; i++) // меняем стобцы i|j+ { int k0 = arr[i, chto]; int k6 = arr[i, nachto]; arr[i, chto] = k6; arr[i, nachto] = k0; } } static int FindFirst(int[,] arr) //находим первый столбец с положительным элементом; { int i; int stolbec=0; for (int j = 0; j < m; j++) { for (i = 0; i < n; i++) if (arr[i, j] < 0) break; if (i == n) { stolbec = j; // Это будет номер первого положительного столбца break; } } return stolbec; } static int FindEnd(int [,]arr, int stolb) { int i; int stolbec = 0; for (int j = stolb; j < m; j++) //находим последний столбец с положительным элементом; { for (i = 0; i < n; i++) if (arr[i, j] < 0) break; if (i == n) stolbec = j; // это будет номер последнего положительного столбца } return stolbec; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д