В квадратной матрица [NxN] найти наибольший элемент на главной и побочной диагоналях - C#
Формулировка задачи:
Дана действительная квадратная матрица порядка N (N – нечетное),
все элементы которой различны. Найти наибольший элемент среди стоящих на
главной и побочной диагоналях и поменять его местами с элементом, стоящим
на пересечении этих диагоналей.
вот код матрицы,как сделать чтобы все элементы были различны и вторая часть задания(Найти наибольший элемент среди стоящих на
главной и побочной диагоналях и поменять его местами с элементом, стоящим
на пересечении этих диагоналей.)
буду очень благодарен за помощь.
string str;
str = "";
Random rnd = new Random();
int n = Convert.ToInt32(textBox2.Text);
int[,] arr = new int[n, n];
for (int i = 0; i <= arr.GetUpperBound(0); i++)
{
for (int j = 0; j <= arr.GetUpperBound(1); j++)
{
arr[i, j] = rnd.Next(Convert.ToInt32(textBox3.Text), Convert.ToInt32(textBox4.Text) + 1);
str += arr[i, j] + "\t";
}
str += "\r\n";
textBox1.Text = str;
}Решение задачи: «В квадратной матрица [NxN] найти наибольший элемент на главной и побочной диагоналях»
textual
Листинг программы
//Класс, представляющий элемент массива
class MElement
{
public int Value { get; set; }
public int Row { get; set; }
public int Column { get; set; }
}
class Program
{
static Random rnd = new Random();
//Проверяет есть ли в матрице заданное цисло
static bool ContainsValue(int[,] m, int value)
{
for (int i = 0; i < m.GetLength(0); i++)
{
for (int j = 0; j < m.GetLength(1); j++)
{
if (m[i, j] == value)
return true;
}
}
return false;
}
//Возвращает матрицу размера size, заполненную случайными, неповторяющимися числами
static int[,] GetMatrix(int size)
{
int[,] matrix = new int[size, size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
int r;
while (ContainsValue(matrix, r = rnd.Next(1, 10*size*size)));
matrix[i, j] = r;
}
}
return matrix;
}
//Выводит матрицу на консоль
static void PrintMatrix(int[,] m)
{
for (int i = 0; i < m.GetLength(0); i++)
{
for (int j = 0; j < m.GetLength(1); j++)
{
Console.Write("{0,5} ", m[i,j]);
}
Console.WriteLine();
}
}
//Поиск максимального элемента на гл. и поб. диагоналях
static MElement MaxDiagonalValue(int[,] m)
{
int size = m.GetLength(0);
if (size != m.GetLength(1))
throw new ArgumentException("Матрица должна быть квадратной!");
if(size % 2 == 0)
throw new ArgumentException("Матрица должна иметь нечетную размерность!");
MElement max = new MElement() { Value = int.MinValue };
//Проходимся по главной диагонали
for (int i = 0; i < size; i++)
{
if (m[i, i] > max.Value)
{
max.Value = m[i, i];
max.Row = i;
max.Column = i;
}
}
//По побочной диагонали
for (int i = size - 1, j = 0; i >= 0; i--, j++)
{
if (m[i, j] > max.Value)
{
max.Value = m[i, j];
max.Row = i;
max.Column = j;
}
}
return max;
}
//Vеняет местами элемент е и находящийся на пересечении диагоналей
static void SwapWithCentr(int[,] m, MElement e)
{
if (m.GetLength(0) % 2 == 0 || m.GetLength(1) % 2 == 0)
throw new ArgumentException("Матрица должна иметь нечетную размерность!");
int tmp = m[m.GetLength(0) / 2, m.GetLength(1) / 2];
m[m.GetLength(0) / 2, m.GetLength(1) / 2] = e.Value;
m[e.Row, e.Column] = tmp;
}
static void Main(string[] args)
{
Console.WriteLine("Матрица до: ");
var m = GetMatrix(5);
PrintMatrix(m);
var max = MaxDiagonalValue(m);
Console.WriteLine("\nМаксисальное значение {0}", max.Value);
Console.WriteLine("\nМатрица после: ");
SwapWithCentr(m, max);
PrintMatrix(m);
Console.ReadKey();
}
}