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