Дана матрица размера 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;
}