Дана матрица размера 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д