Реализовать класс квадратных матриц, методы: умножение, возведение в степень, произведение элементов на 2 диагоналях - C#
Формулировка задачи:
Задание:
Реализовать класс квадратных матриц. Размер задаёт пользователь.Методы: умножение,возведение в степень, произведение элементов на 2 диагоналях, сумма элементов матрицы.Должно показывать ся время выполнения каждого из методов.
Вопросы:
1)При вводе ,например, размера матрицы в виде: 0000,5 или 0,00000000 или 0000,000000
ввод следует считать неправильным или нет?Если да, то как лучше реализовать
a)регулярные выражения
б)TryParse
в)другое
2)Ребят проверьте пожалуйста программа где что не так и где следует что исправить или где код написать можно было бы покомпактнее и получге и сообщите обязательно.К понедельнику нужна.
Вот код:
Класс матриц
Главный класс:
Используемые библиотеки:
class Matrix{
uint size;
double[,] mtx;
//конструктор
public Matrix(uint size) {
this.size = size;
mtx = new double[size, size];
}
//устанавливает значения элементов матрицы вручную
public void SetElements(){
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
do
{
Console.Write("Введите элемент [{0},{1}]: ", i, j);
} while (!Double.TryParse(Console.ReadLine(), out mtx[i, j]));
}
//умножение матриц
public Matrix Mul(Matrix MtxOp2){
Matrix MtxResult = new Matrix(size);
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
for (int k = 0; k < size; k++)
MtxResult.mtx[i, j] += mtx[i, k] * MtxOp2.mtx[k, j];
return MtxResult;
}
//показать матрицу
public void ShowMtx(){
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
Console.Write(this.mtx[i, j] + "\t");
Console.WriteLine();
}
}
//возвести матрицы в степень
public Matrix Pow(uint deg) {
Matrix MtxResult = this;
for (int i = 2; i <= deg; i++)
MtxResult = Mul(MtxResult);
return MtxResult;
}
//сумма элементов матрицы
public double SumElements() {
double sum = 0.0;
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
sum += mtx[i, j];
return sum;
}
//возвращает размер
public uint GetSize(){
return size;
}
//произведение элементов на диагоналях
public double[] MulDiag(){
int i,j;
double []MulResult=new double[2];
MulResult[0] = MulResult[1] = 1;
for (i = 0; i < size; i++)
MulResult[0] *= mtx[i, i];
for (j = 0; j < size; j++)
MulResult[1] *= mtx[size-1 -j, size - (size - j) ];
return MulResult;
}
}lass TryMatrix {
static void Main() {
char ch;
uint size,deg;
double sum;
for (; ; ){
do{
Console.WriteLine("Menu:\n" +
" 1.Умножить матрицы.\n" +
" 2.Возвести в степень.\n" +
" 3.Сумма всех элементов.\n" +
" 4.Произведение элементов на диагоналях.\n" +
" 0.Выход.");
Console.Write("Ваш выбор: ");
} while (!Char.TryParse(Console.ReadLine(), out ch) || ch < '0' || ch > '4');
if (ch == '0') Environment.Exit(0);
do
{
Console.Write("Введите размер матрицы: ");
} while (!uint.TryParse(Console.ReadLine(), out size) || size == 0);
Matrix Mtx1 = new Matrix(size);
Matrix Mtx2 = new Matrix(size);
Matrix MtxResult = new Matrix(size);
Console.WriteLine();
Stopwatch sWatch = new Stopwatch();
TimeSpan ts;
switch (ch)
{
case '1':
Console.WriteLine("Матрица 1:");
Mtx1.SetElements();
Mtx1.ShowMtx();
Console.WriteLine();
Console.WriteLine("Матрица 2:");
Mtx2.SetElements();
Mtx2.ShowMtx();
Console.WriteLine();
sWatch.Start();
MtxResult = Mtx1.Mul(Mtx2);
sWatch.Stop();
ts = sWatch.Elapsed;
Console.WriteLine("Результат:");
MtxResult.ShowMtx();
Console.WriteLine("\nЗатраченное время " + ts.TotalMilliseconds);
break;
case '2':
Console.WriteLine("Матрица:");
Mtx1.SetElements();
Mtx1.ShowMtx();
Console.WriteLine();
do
{
Console.Write("Введите степень: ");
} while (!uint.TryParse(Console.ReadLine(), out deg));
sWatch.Start();
MtxResult = Mtx1.Pow(deg);
sWatch.Stop();
ts = sWatch.Elapsed;
Console.WriteLine("Результат:");
MtxResult.ShowMtx();
Console.WriteLine("\nЗатраченное время " + ts.TotalMilliseconds);
break;
case '3':
Console.WriteLine("Матрица:");
Mtx1.SetElements();
Mtx1.ShowMtx();
Console.WriteLine();
sWatch.Start();
size = Mtx1.GetSize();
sum = Mtx1.SumElements();
sWatch.Stop();
ts = sWatch.Elapsed;
Console.Write("Размер матрицы {0}, сумма элементов {1}.", size,sum);
Console.WriteLine("\nЗатраченное время " + ts.TotalMilliseconds);
break;
case '4':
double[] MulResult = new double[2];
Console.WriteLine("Матрица:");
Mtx1.SetElements();
Mtx1.ShowMtx();
Console.WriteLine();
sWatch.Start();
MulResult = Mtx1.MulDiag();
sWatch.Stop();
ts = sWatch.Elapsed;
Console.WriteLine("Произведение элементов на 1 диагонали {0}, на 2 диагонали {1}",
MulResult[0], MulResult[1]);
Console.WriteLine("\nЗатраченное время " + ts.TotalMilliseconds + " мс.");
break;
}
Console.WriteLine();
do{
Console.Write("Ещё разок ?(1-да,2-нет): ");
} while (!Char.TryParse(Console.ReadLine(), out ch) && (ch != '1' || ch != '2'));
if (ch == '2') Environment.Exit(0);
Console.WriteLine();
}
}
}using System; using System.Diagnostics; using System.Threading;
Решение задачи: «Реализовать класс квадратных матриц, методы: умножение, возведение в степень, произведение элементов на 2 диагоналях»
textual
Листинг программы
using System;
using System.Diagnostics;
namespace lab2
{
public class Matrix
{
private double[,] mtr1; private double[,] mtr2; private double[,] mtr;
private int n1, n2; string StDigit; double dSumma1 = 0; double dSumma2 = 0; int N;
double dPr1 = 0, dPr2 = 0; double dPrO1 = 0, dPrO2 = 0;
public void matr()
{
Console.WriteLine("Операции с двумя матрицами");
do
{
do
{
Console.WriteLine("Введите размер 1-ой матрицы");
StDigit = Convert.ToString(Console.ReadLine());
if (!provInt(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!provInt(StDigit));
n1 = Convert.ToInt32(StDigit);
if (n1 < 0) Console.WriteLine("Ошибка ввода");
else mtr1 = new double[n1, n1];
} while (n1 < 0);
int p = 0;
do
{
Console.WriteLine("Выберите метод заполнения:\n[1] - случайным образом\n[2] - вручную\n[3] - единичная матрица");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
{
Random r = new Random();
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
mtr1[i, j] = r.Next(10);
}
}
p = 1;
break;
}
case ConsoleKey.NumPad1:
{
Random r = new Random();
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
mtr1[i, j] = r.Next(10);
}
}
p = 1;
break;
}
case ConsoleKey.D2:
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
Console.WriteLine("Введите элемент: " + (i + 1) + (j + 1));
do
{
StDigit = Console.ReadLine();
if (!prov(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!prov(StDigit));
mtr1[i, j] = Convert.ToDouble(StDigit);
}
}
p = 1;
break;
}
case ConsoleKey.NumPad2:
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
Console.WriteLine("Введите элемент: " + (i + 1) + (j + 1));
do
{
StDigit = Console.ReadLine();
if (!prov(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!prov(StDigit));
mtr1[i, j] = Convert.ToDouble(StDigit);
}
}
p = 1;
break;
}
case ConsoleKey.D3:
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
if (i == j)
mtr1[i, j] = 1;
else
mtr1[i, j] = 0;
}
}
p = 1;
break;
}
case ConsoleKey.NumPad3:
{
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
if (i == j)
mtr1[i, j] = 1;
else
mtr1[i, j] = 0;
}
}
p = 1;
break;
}
default:
Console.Clear();
continue;
}
} while (p == 0);
do
{
do
{
Console.WriteLine("Введите размер 2-ой матрицы");
StDigit = Convert.ToString(Console.ReadLine());
if (!provInt(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!provInt(StDigit));
n2 = Convert.ToInt32(StDigit);
if (n2 < 0) Console.WriteLine("Ошибка ввода");
else mtr2 = new double[n2, n2];
} while (n2 < 0);
do
{
Console.WriteLine("Выберите метод заполнения:\n[1] - случайным образом\n[2] - вручную\n[3] - единичная матрица");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
{
Random r = new Random();
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
mtr2[i, j] = r.Next(10);
}
}
p = 1;
break;
}
case ConsoleKey.NumPad1:
{
Random r = new Random();
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
mtr2[i, j] = r.Next(10);
}
}
p = 1;
break;
}
case ConsoleKey.D2:
{
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
Console.WriteLine("Введите элемент: " + (i + 1) + (j + 1));
do
{
StDigit = Console.ReadLine();
if (!prov(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!prov(StDigit));
mtr2[i, j] = Convert.ToDouble(StDigit);
}
}
p = 1;
break;
}
case ConsoleKey.NumPad2:
{
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
Console.WriteLine("Введите элемент: " + (i + 1) + (j + 1));
do
{
StDigit = Console.ReadLine();
if (!prov(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!prov(StDigit));
mtr2[i, j] = Convert.ToDouble(StDigit);
}
}
p = 1;
break;
}
case ConsoleKey.D3:
{
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
if (i == j)
mtr2[i, j] = 1;
else
mtr2[i, j] = 0;
}
}
p = 1;
break;
}
case ConsoleKey.NumPad3:
{
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
if (i == j)
mtr2[i, j] = 1;
else
mtr2[i, j] = 0;
}
}
p = 1;
break;
}
default:
Console.Clear();
continue;
}
} while (p == 0);
Console.Clear();
Console.WriteLine("Матрица 1");
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
Console.Write("{0:F2} ", mtr1[i, j]);
}
Console.WriteLine("");
}
Console.WriteLine("Матрица 2");
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
Console.Write("{0:F2} ", mtr2[i, j]);
}
Console.WriteLine("");
}
int exit = 1;
for (; ; )
{
if (exit == 0) break;
Console.WriteLine("Выберите операцию:\n[1] - умножить матрицы\n[2] - возвести в степень 1-ую матрицу\n[3] - возвести в степень 2-ую матрицу\n[4] - вывод суммы элементов и размера каждой матрицы\n[5] - умножение элементов на диагоналях\n[ESC] - Назад\n");
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.D1:
{
if (n1 != n2) { Console.WriteLine("Размеры матриц не совпадают"); }
else
{
Stopwatch time;
time = Stopwatch.StartNew();
umnozh();
print();
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ",ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
}
break;
}
case ConsoleKey.NumPad1:
{
if (n1 != n2) { Console.WriteLine("Размеры матриц не совпадают"); }
else
{
Stopwatch time;
time = Stopwatch.StartNew();
umnozh();
print();
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
}
break;
}
case ConsoleKey.D2:
{
Stopwatch time;
time = Stopwatch.StartNew();
stepen(1);
print();
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.NumPad2:
{
Stopwatch time;
time = Stopwatch.StartNew();
stepen(1);
print();
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.D3:
{
Stopwatch time;
time = Stopwatch.StartNew();
stepen(2);
print();
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.NumPad3:
{
Stopwatch time;
time = Stopwatch.StartNew();
stepen(2);
print();
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.D4:
{
Stopwatch time;
time = Stopwatch.StartNew();
N = n1; mtr = mtr1;
Console.WriteLine("Размер 1-ой матрицы равен: " + GetSizeAndSumm(ref dSumma1));
Console.WriteLine("Сумма элементов 1-ой матрицы равна: " + dSumma1);
N = n2; mtr = mtr2;
Console.WriteLine("Размер 2-ой матрицы равен: " + GetSizeAndSumm(ref dSumma2));
Console.WriteLine("Сумма элементов 2-ой матрицы равна: " + dSumma2);
mtr = null; time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.NumPad4:
{
Stopwatch time;
time = Stopwatch.StartNew();
N = n1; mtr = mtr1;
Console.WriteLine("Размер 1-ой матрицы равен: " + GetSizeAndSumm(ref dSumma1));
Console.WriteLine("Сумма элементов 1-ой матрицы равна: " + dSumma1);
N = n2; mtr = mtr2;
Console.WriteLine("Размер 2-ой матрицы равен: " + GetSizeAndSumm(ref dSumma2));
Console.WriteLine("Сумма элементов 2-ой матрицы равна: " + dSumma2);
mtr = null; time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.D5:
{
Stopwatch time;
time = Stopwatch.StartNew();
N = n1; mtr = mtr1; dProizv(ref dPr1); dProizvO(ref dPrO1);
Console.WriteLine("Произведение элементов на главной диагонали 1-ой матрицы: " + dPr1);
Console.WriteLine("Произведение элементов на побочной диагонали 1-ой матрицы: " + dPrO1);
N = n2; mtr = mtr2; dProizv(ref dPr2); dProizvO(ref dPrO2);
Console.WriteLine("Произведение элементов на диагонали 2-ой матрицы: " + dPr2);
Console.WriteLine("Произведение элементов на побочной диагонали 2-ой матрицы: " + dPrO2);
mtr = null;
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.NumPad5:
{
Stopwatch time;
time = Stopwatch.StartNew();
N = n1; mtr = mtr1; dProizv(ref dPr1); dProizvO(ref dPrO1);
Console.WriteLine("Произведение элементов на главной диагонали 1-ой матрицы: " + dPr1);
Console.WriteLine("Произведение элементов на побочной диагонали 1-ой матрицы: " + dPrO1);
N = n2; mtr = mtr2; dProizv(ref dPr2); dProizvO(ref dPrO2);
Console.WriteLine("Произведение элементов на диагонали 2-ой матрицы: " + dPr2);
Console.WriteLine("Произведение элементов на побочной диагонали 2-ой матрицы: " + dPrO2);
mtr = null;
time.Stop();
long ticksThisTime = time.ElapsedMilliseconds;
Console.WriteLine("Время вычислений= {0} миллисекунд ", ticksThisTime);
Console.WriteLine("\n\n\nНажмите любую клавишу . . .");
Console.ReadKey();
Console.Clear();
matrX();
break;
}
case ConsoleKey.Escape:
Console.Clear();
exit = 0;
break;
default:
Console.Clear();
continue;
}
}
}
private static bool prov(string text)
{
double t;
if (double.TryParse(text, out t))
{
return true;
}
else
{
return false;
}
}
public static bool provInt(string text)
{
int t;
if (int.TryParse(text, out t))
{
return true;
}
else
{
return false;
}
}
public void umnozh()
{
mtr = new double[n1, n1];
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
for (int k = 0; k < n1; k++)
{
mtr[i, j] += mtr1[i, k] * mtr2[k, j];
}
}
}
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++) mtr1[i, j] = mtr[i, j];
}
}
public void print()
{
Console.WriteLine("Ответ:");
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
Console.Write("{0:F2} ", mtr[i, j]);
}
Console.WriteLine("");
}
Console.WriteLine("");
}
public void stepen(int a)
{
int m;
do
{
do
{
Console.WriteLine("Введите степень: ");
StDigit = Convert.ToString(Console.ReadLine());
if (!provInt(StDigit)) Console.WriteLine("Ошибка ввода");
} while (!provInt(StDigit));
m = Convert.ToInt32(StDigit);
if (m < 0) Console.WriteLine("Ошибка ввода");
} while (m < 0);
double[,] b = null;
double[,] t = null;
if (a == 1) { t = mtr1; }
if (a == 2) { t = mtr2; }
for (int z = 0; z < m - 1; z++)
{
b = new double[n1, n1];
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
for (int k = 0; k < n1; k++)
{
b[i, j] += t[i, k] * t[k, j];
}
}
}
mtr = b;
}
}
public int GetSizeAndSumm(ref double dSumm)
{
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
dSumm += mtr[i, j];
return N;
}
public int dProizv(ref double dPr)
{
dPr = 1;
for (int i = 0; i < N; i++)
{
dPr = dPr * mtr[i, i];
}
return N;
}
public int dProizvO(ref double dPrO)
{
int j = N-1;
dPrO = 1;
for (int i = 0; i < N; i++)
{
dPrO = dPrO * mtr[i, j];
j--;
}
return N;
}
public void matrX()
{
Console.WriteLine("Матрица 1");
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < n1; j++)
{
Console.Write("{0:F2} ", mtr1[i, j]);
}
Console.WriteLine("");
}
Console.WriteLine("Матрица 2");
for (int i = 0; i < n2; i++)
{
for (int j = 0; j < n2; j++)
{
Console.Write("{0:F2} ", mtr2[i, j]);
}
Console.WriteLine("");
}
Console.WriteLine("");
}
}
}