static void Main(string[] args) { Test(); Console.WriteLine(); TestTime log = new TestTime(); if (TestTime.Load(logFilename, ref log) == false) { Console.WriteLine("Не получилось загрузить лог; будет создан пустой лог."); Console.WriteLine(); } Console.WriteLine("Данная программа сравнивает время решения линейных уравнений с блочной трёхдиагональной матрицей в коде на C# и на C++."); Console.WriteLine(); bool continueTests = true; while (continueTests) { Console.WriteLine("Провести тест? Введите 'y' для продолжения, 'n' для выхода из программы"); string userInput = Console.ReadLine(); Console.WriteLine(); if (userInput == "n") { continueTests = false; } else if (userInput != "y") { Console.WriteLine("Команда введена с ошибками; возврат в главное меню."); Console.WriteLine(); continue; } else { int matDim, bloDim; // Dimensions Console.WriteLine("Введите блочный порядок матрицы (количество блоков вдоль каждой из сторон матрицы):"); try // Getting matrix dimension { matDim = int.Parse(Console.ReadLine()); if (matDim < 2) { throw new ArgumentException("Порядок матрицы должен быть натуральным числом, не меньшим 2."); } } catch (Exception e) { Console.WriteLine("Порядок блочной матрицы введён с ошибками"); Console.WriteLine(); Console.WriteLine($"Сообщение об ошибке: {e.Message}"); Console.WriteLine(); continue; } Console.WriteLine("Введите порядок блока (количество чисел вдоль каждой из сторон блока):"); try // Getting block dimension { bloDim = int.Parse(Console.ReadLine()); if (bloDim < 1) { throw new ArgumentException("Порядок блока должен быть натуральным числом, не меньшим 1."); } } catch (Exception e) { Console.WriteLine("Порядок блока введён с ошибками"); Console.WriteLine(); Console.WriteLine($"Сообщение об ошибке: {e.Message}"); Console.WriteLine(); continue; } // Preparations double[] rightSide = null; double csTime = 0, cppTime = 0; double[] csResult = null; double[] cppResult = null; try // Allocating memory { rightSide = new double[matDim * bloDim]; for (int i = 0; i < rightSide.Length; ++i) { rightSide[i] = 1; } csResult = new double[rightSide.Length]; cppResult = new double[rightSide.Length]; } catch (Exception e) { Console.WriteLine("Не удалось выделить память под массивы правой части/решений. Вероятно, были указаны слишком большие размеры матрицы."); Console.WriteLine(); Console.WriteLine($"Сообщение об ошибке: {e.Message}"); Console.WriteLine(); continue; } BlockMatrix mat; try // C# solution { mat = new BlockMatrix(matDim, bloDim); Stopwatch watch = new Stopwatch(); try { watch.Start(); BlockMatrix.SolveSystem(mat, rightSide, csResult); watch.Stop(); } catch (ArithmeticException e) { Console.WriteLine("К сожалению, к данной матрице метод прогонки неприменим. Попробуйте взять матрицу с диагональным преобладанием."); Console.WriteLine(); Console.WriteLine($"Сообщение об ошибке: {e.Message}"); Console.WriteLine(); continue; } catch (Exception e) { Console.WriteLine(e); continue; } finally { watch.Stop(); } csTime = watch.ElapsedMilliseconds; Console.WriteLine($"Решение на C# успешно завершилось за {csTime} миллисекунд."); Console.WriteLine(); } catch (Exception e) { Console.WriteLine($"Something broke unexpectedly: {e.Message}"); if (e.InnerException != null) { Console.WriteLine(e.InnerException.Message); } continue; } try // CPP solution { SolveEquationCpp(matDim, bloDim, mat.ToPlainArray(), rightSide, cppResult, ref cppTime); } catch (Exception e) { Console.WriteLine($"Something broke unexpectedly: {e.Message}"); if (e.InnerException != null) { Console.WriteLine(e.InnerException.Message); } continue; } double ratio = (cppTime > 0) ? ((double)csTime) / cppTime : -1; log.Add(TestTime.FormatString(matDim, bloDim, csTime, cppTime, ratio)); } } if (TestTime.Save(logFilename, log) == false) { Console.WriteLine("Не получилось сохранить лог; результаты данного запуска программы не сохранены."); } Console.WriteLine("Завершаем работу программы. Содержимое журнала:"); Console.WriteLine(); Console.WriteLine(log); Console.WriteLine("Нажмите ENTER для завершения..."); Console.ReadLine(); }