Beispiel #1
0
        /// <summary>
        /// Метод ввода параметров для умножения матрицы на число. Вызывает метод умножения матрицы.
        /// Выводит число, исходную и умноженную матрицы на печать
        /// </summary>
        public void MenuMultiplyMatrixByNumber()
        {
            int  winHeight = 30;       // Высота экрана (для меню) 40 строк
            int  winWidth  = 120;      // Ширина экрана (для меню) 80 строк
            bool cursorVisibility;


            int num;             // вводимое число
            int m, n;            // размерности матрицы : m - число строк (1 х 10), n - число столбцов (1 х 10)

            windowM.newWindow(winWidth, winHeight);
            Console.SetBufferSize(200, 40);
            windowM.HeaderCenter("УМНОЖЕНИЕ МАТРИЦЫ НА ЧИСЛО", winWidth, 2, ConsoleColor.Yellow);
            Console.WriteLine();
            cursorVisibility      = Console.CursorVisible;
            Console.CursorVisible = true;

            m   = simpleParser.AskAndParse("Введите количество строк матрицы", "Введите число", 1, 10, 0, 4);
            n   = simpleParser.AskAndParse("Введите количество столбцов матрицы", "Введите число", 1, 10, 0, 5);
            num = simpleParser.AskAndParse("Введите число, на которое хотите умножить матрицу",
                                           "Введите число", -100, 100, 0, 6);

            Console.CursorVisible = cursorVisibility;

            // Создаём матрицу (m, n) и инициализируем случайными числами от -10 до 10 включительно
            int[,] matrix = RandomMatrix(m, n, -10, 10);

            // Выводим изначальную матрицу
            // 3 - ширина поля для вывода каждого элемента матрицы
            // 5 и 8  - координаты Х и У левого верхнего угла матрицы
            PrintMatrix(matrix, 3, 10, 8);

            // Умножаем матрицу на число. Результат храним в той же матрице
            matrix = MultiplyMatrixByNumber(num, matrix);

            Console.SetCursorPosition(2, 8 + m / 2);
            Console.Write($"{num} x".PadLeft(6));

            // Выводим * num =  между матрицами
            Console.SetCursorPosition(10 + 1 + n * 4 + 2 + 5, 8 + m / 2);
            Console.Write("=");

            // Выводим получившуюся матрицу
            // 5 - ширина поля для вывода каждого элемента матрицы
            // 5+1+n*4+2+20 и 8  - координаты Х и У левого верхнего угла матрицы
            PrintMatrix(matrix, 5, 10 + 1 + n * 4 + 2 + 9, 8);

            windowM.HeaderCenter("НАЖМИТЕ ЛЮБУЮ КЛАВИШУ", winWidth, Console.CursorTop + 2, ConsoleColor.DarkYellow);
            Console.ReadKey();
        }
        // *Задание 5
        // Функция Аккермана
        // Здесь https://ru.wikipedia.org/wiki/Функция_Аккермана написано,
        // что функция A(N, M) начинает стремительно расти при N >= 4
        // При N от 0 до 2 - результат умещается в int, если M умещается в int
        // т.е. линейная зависимость.
        // Зкспоненциальная зависимость начинается с N == 3.
        // В этом случае переполнение наступит при М == 29, т.к. в этом случае
        // значение функции Аккермана равно 2^(М+3) - 3 == 2^(29+3) - 3 == 2^32 - 3
        // Если A(N, M) возвращает int, в котором 31 разряд отведён под значение и ещё один под знак,
        // то при М == 29 значение будет занимать уже 32 разряда, что больше int

        // но в реальности прерывание Stack Overflow  появилось уже при М == 11 :((
        // Поэтому ограничим исходные параметры N от 0 до 3, и М от 0 до 10.

        /// <summary>
        /// Создаёт окно меню для ввода параметров для вызова метода FindShortestWord
        /// </summary>
        /// <param name="window">Окно, в котором будет осуществлён ввод данных</param>
        public void MenuAkkerman(WindowOutput window)
        {
            window.newWindow(winWidth, winHeight);
            window.HeaderCenter("ФУНКЦИЯ АККЕРМАНА", winWidth, 2, ConsoleColor.Yellow);
            window.HeaderCenter("A ( N, M)", winWidth, 3, ConsoleColor.Yellow);
            window.HeaderCenter("Так как эта функция растёт гигантскими шагами,", winWidth, 5, ConsoleColor.White);
            window.HeaderCenter("то диапазон вводимых параметров ограничен.", winWidth, 6, ConsoleColor.White);

            Console.CursorVisible = true;
            int a, b, akk;

            a = simpleParser.AskAndParse("Введите первый аргумен N", "Введите число", 0, 3,
                                         10, 8);
            b = simpleParser.AskAndParse("Введите второй аргумент M", "Введите число", 0, 10,
                                         10, 9);
            akk = Akkerman(a, b);

            Console.CursorVisible = false;
            window.HeaderCenter($"Результат функции Аккермана А ({a}, {b}) = {akk}", winWidth, Console.CursorTop + 2, ConsoleColor.White);

            window.HeaderCenter("НАЖМИТЕ ЛЮБУЮ КЛАВИШУ", winWidth, Console.CursorTop + 2, ConsoleColor.DarkYellow);
            Console.ReadKey();
        }