/// <summary>
        /// Основные шаги
        /// </summary>
        public void Implementation()
        {
            try
            {
                //Прямой ход метода Гаусса для приведения к треугольному виду.
                Problem.Gauss();
                //Выражение базисных переменных и приведение к диагональному виду.
                Problem.HoistingMatrix();
                // Обновляем параметры в ячейках
                DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, false);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, $"Ошибка при решении системы методом Гаусса.", MessageBoxButtons.OK);
                return;
            }

            try
            {
                // Создаём симплекс таблицу
                Problem.TransformGridForSimplexTable(_dataGridViewProblem);
                Problem.SimplexTable = new SimplexTable(_dataGridViewProblem);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, $"Ошибка создания симплекс таблицы!", MessageBoxButtons.OK);
                return;
            }

            int responce;
            int step = 1;

            while (true)
            {
                // Проверяем симплекс таблицу на решённость
                if ((responce = Problem.SimplexTable.ResponseCheck()) == 0)
                {
                    try
                    {
                        //выбор любого опорного
                        Problem.SimplexTable.SelectFirstSupportElement();
                        //меняем местами переменные
                        Problem.SimplexTable.ChangeHeaders(_dataGridViewProblem);
                        // высчитывание по опорному
                        Problem.SimplexTable.CalculateSimplexTable();
                        // Обновление ячеек
                        DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.SimplexTable.SimplexTableElements, false);

                        step++;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, $"Ошибка при выборе опорных элементов на {step} шаге.", MessageBoxButtons.OK);
                        return;
                    }
                }
                else if (responce == 1)
                {
                    tabControl.TabPages[0].Text = "Ответ готов!";

                    if (Problem.Min == false)
                    {
                        labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response();
                    }
                    else
                    {
                        labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response() * (-1);
                    }

                    if (cornerDotAnswerWasAdded == false)
                    {
                        //добавляем угловую точку решения (X*)
                        DataGridWorker.SetParamToGrids(
                            _dataGridViewCornerDot,
                            Problem.ResponseCornerDot(_dataGridViewProblem),
                            true);
                        cornerDotAnswerWasAdded = true;
                    }

                    break;
                }

                else if (responce == -1)
                {
                    MessageBox.Show("Задача не разрешима!");
                    tabControl.TabPages[0].Text = "Задача не разрешима!";
                    break;
                }
            }
        }
        /// <summary>
        /// Кнопка "Далее"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonNext_Click(object sender, EventArgs e)
        {
            switch (Step)
            {
            case 0:
                try
                {
                    // Буферизируем данные
                    BufferingTableValues(Problem.ToFractionList(DataGridWorker.ReadGridsFrom(_dataGridViewProblem)));
                    // Прямой ход Гаусса
                    Problem.Gauss();
                    // Обновляем параметры
                    DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, false);
                    Step++;
                    tabControl.TabPages[0].Text = "Шаг 1: Прямой ход метода Гаусса.";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, $"Ошибка на {Step} шаге!", MessageBoxButtons.OK);
                }
                break;

            case 1:
                try
                {
                    // Буферизируем данные
                    BufferingTableValues(Problem.ToFractionList(DataGridWorker.ReadGridsFrom(_dataGridViewProblem)));
                    // Выражение базисных переменных + обратный ход Гаусса
                    Problem.HoistingMatrix();
                    // Обновляем параметры
                    DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, false);
                    Step++;
                    tabControl.TabPages[0].Text = "Шаг 2: Выражение базисных переменных.";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, $"Ошибка на {Step} шаге!", MessageBoxButtons.OK);
                }
                break;

            case 2:

                try
                {
                    // Буферизируем данные
                    BufferingTableValues(Problem.ToFractionList(DataGridWorker.ReadGridsFrom(_dataGridViewProblem)));
                    BufferingHeaders(_dataGridViewProblem);
                    if (simplexTableWasDraw == false)
                    {
                        Problem.TransformGridForSimplexTable(_dataGridViewProblem);
                        Problem.SimplexTable = new SimplexTable(_dataGridViewProblem);
                        simplexTableWasDraw  = true;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, $"Ошибка создания симплекс таблицы на {Step} шаге!", MessageBoxButtons.OK);
                    return;
                }

                // Если симплекс таблица создалась и отрисовалась успешно
                // Проверяеем её на ответ
                switch (Problem.SimplexTable.ResponseCheck())
                {
                case 0:
                    // Продолжаем искать решение
                    Step++;
                    tabControl.TabPages[0].Text = "Шаг 3: Симплекс-таблица.";
                    break;

                case 1:
                    // Если ответ готов сразу без выбора опорного элемента
                    tabControl.TabPages[0].Text = "Ответ готов!";
                    Step++;
                    labelAnswer.Visible       = true;
                    groupBoxCornerDot.Visible = true;
                    buttonNext.Enabled        = false;

                    // Подставляем ответ
                    if (Problem.Min == false)
                    {
                        labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response();
                    }
                    else
                    {
                        labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response() * (-1);
                    }

                    // Выводим угловую точку ответа (X*)
                    if (cornerDotAnswerWasAdded == false)
                    {
                        //добавляем точку
                        DataGridWorker.SetParamToGrids(
                            _dataGridViewCornerDot,
                            Problem.ResponseCornerDot(_dataGridViewProblem),
                            true);
                        cornerDotAnswerWasAdded = true;
                    }

                    break;

                case -1:
                    Step++;
                    MessageBox.Show("Задача не разрешима!");
                    tabControl.TabPages[0].Text = "Задача не разрешима!";
                    buttonNext.Enabled          = false;
                    break;
                }

                break;

            case 3:
                try
                {
                    BufferingTableValues(Problem.SimplexTable.SimplexTableElements);
                    //выбор опорного
                    Problem.SimplexTable.SelectionOfTheSupportElements(_dataGridViewProblem);
                    Step++;
                    tabControl.TabPages[0].Text = $"Шаг {Step}: Выбор опорного элемента";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, $"Ошибка при выборе опорных элементов на {Step} шаге.", MessageBoxButtons.OK);
                }
                break;

            default:

                try
                {
                    // Проверяем, выбран ли опорный элемент
                    Problem.SimplexTable.SupportElementPressedOrNot(_dataGridViewProblem);
                    // Меняем хэдэры колонки и строки местами
                    Problem.SimplexTable.ChangeHeaders(_dataGridViewProblem);
                    // Буферизируем симплекс таблицу
                    BufferingTableValues(Problem.SimplexTable.SimplexTableElements);
                    // Удаляем подсвеченные ячейки
                    UncolorGreenGrids(_dataGridViewProblem);
                    // Вычисление симплекс таблицы по выбранному опорному элементу
                    Problem.SimplexTable.CalculateSimplexTable();
                    // Обновление ячеек
                    DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.SimplexTable.SimplexTableElements, false);
                }

                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, $"Ошибка при выборе опорного элемента на шаге {Step}", MessageBoxButtons.OK);
                    return;
                }

                switch (Problem.SimplexTable.ResponseCheck())
                {
                case 0:
                    Step++;
                    tabControl.TabPages[0].Text = $"Шаг {Step}: Выбор опорного элемента";
                    //выбор опорного
                    Problem.SimplexTable.SelectionOfTheSupportElements(_dataGridViewProblem);
                    break;

                case 1:
                    tabControl.TabPages[0].Text = "Ответ готов!";
                    Step++;
                    labelAnswer.Visible       = true;
                    groupBoxCornerDot.Visible = true;
                    if (Problem.Min == false)
                    {
                        labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response();
                    }
                    else
                    {
                        labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response() * (-1);
                    }

                    if (cornerDotAnswerWasAdded == false)
                    {
                        //добавляем угловую точку решения (X*)
                        DataGridWorker.SetParamToGrids(
                            _dataGridViewCornerDot,
                            Problem.ResponseCornerDot(_dataGridViewProblem),
                            true);
                        cornerDotAnswerWasAdded = true;
                    }

                    buttonNext.Enabled = false;
                    break;

                case -1:
                    Step++;
                    MessageBox.Show("Задача не разрешима!");
                    tabControl.TabPages[0].Text = "Задача не разрешима!";
                    buttonNext.Enabled          = false;
                    break;
                }

                break;
            }
        }