/// <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(); }