Example #1
0
        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();
        }