예제 #1
0
        /// <summary>
        /// Вывод ответа
        /// </summary>
        private List <SimpleFractions> PrintAnswer(List <List <SimpleFractions> > table, List <int> basis, List <SimpleFractions> F)
        {
            List <SimpleFractions> answer = new List <SimpleFractions>();
            string str = "";

            for (int j = 1; j < table[0].Count; j++)
            {
                str += "x" + j + " = ";
                var id = basis.FindIndex(a => a == j - 1);
                if (id >= 0)
                {
                    str += table[id][0].toString() + "\n";
                    answer.Add(table[id][0]);
                }
                else
                {
                    str += "0\n";
                    answer.Add(new SimpleFractions(0, 1));
                }
            }
            SimpleFractions fAnswer = new SimpleFractions(0, 1);

            for (int i = 0; i < answer.Count; i++)
            {
                fAnswer = sFM.Sum(fAnswer, sFM.Multiplication(answer[i], F[i]));
            }
            fAnswer = sFM.Sum(fAnswer, F[F.Count - 1]);
            answer.Add(fAnswer);
            str += "Z = " + fAnswer.toString();
            if (Notify != null)
            {
                Notify(str);
            }
            return(answer);
        }
예제 #2
0
        /// <summary>
        /// Сложение строк. True - удачно, False - невозможно
        /// </summary>
        /// <param name="num1">Строка, к которой прибалять и в которую записывается ответ</param>
        /// <returns></returns>
        public bool LineDifference(MatrixFractions matrix, int num1, int num2, SimpleFractions koeff)
        {
            MatrixFractions matrixFractions = matrix;

            if (num1 > matrixFractions.N || num2 > matrixFractions.N || num1 < 0 || num2 < 0)
            {
                return(false);
            }
            SimpleFractionsMeneger sFM = new SimpleFractionsMeneger();

            for (int j = 0; j < matrixFractions.M; j++)
            {
                matrixFractions.Matrix[num1, j] = sFM.Sum(matrixFractions.Matrix[num1, j],
                                                          sFM.Multiplication(koeff, matrixFractions.Matrix[num2, j]));
            }
            matrix = matrixFractions;
            return(true);
        }
예제 #3
0
        public bool RectangleMetod(MatrixFractions matrix)
        {
            List <int> banIndexStrList = new List <int>();

            if (matrix.M < matrix.N)
            {
                if (Notify != null)
                {
                    Notify($"Строк больше столбцов! Невозможно решить! (Код 1.0)\n");
                }
                return(false);
            }
            for (int nowStr = 0, nowCol = 0; nowStr < matrix.N || nowCol < matrix.N; nowStr++, nowCol++)
            {
                if (_mFM.Norm(matrix))
                {
                    if (Notify != null)
                    {
                        Notify("Сокращение:\n" + matrix.toString() + "\n");
                    }
                }
                //блок проверки
                var check = CheckExceptions(matrix);
                if (check == null)
                {
                    if (Notify != null)
                    {
                        Notify($"Ошибка! \n");
                    }
                    return(false);
                }
                if (check.SingleOrDefault() == -1)
                {
                    if (Notify != null)
                    {
                        Notify($"Противоречие! \n");
                    }
                    return(false);
                }
                if (check.Count > 0)
                {
                    foreach (var ch in check)
                    {
                        banIndexStrList.Add(ch);
                    }
                }
                if (Notify != null)
                {
                    Notify($"Пока что все идет по плану... наверное! \n");
                }
                //проверка банлиста
                int strNullCount = CheckBanlist(check, nowStr, matrix.N);
                if (strNullCount > 0)
                {
                    nowStr += strNullCount - 1;
                    if (nowStr >= matrix.N)
                    {
                        if (Notify != null)
                        {
                            Notify("Зануленная строка!\n" + matrix.toString() + "\n");
                        }
                    }
                }
                if (nowStr >= matrix.N)
                {
                    return(true);
                }
                //проверка на 0-вой элемент
                if (matrix.Matrix[nowStr, nowCol].Numerator == 0)
                {
                    int Str = nowStr;
                    Str++;
                    if (Str >= matrix.N)
                    {
                        if (Notify != null)
                        {
                            Notify($"Ведущий элемент 0, а строки закончились. Упс... \n");
                        }
                        return(true);
                    }
                    while (matrix.Matrix[Str, nowCol].Numerator == 0)
                    {
                        Str++;
                        if (Str >= matrix.N)
                        {
                            if (Notify != null)
                            {
                                Notify($"Ведущий элемент 0, а строки закончились. Упс... \n");
                            }
                            return(true);
                        }
                    }
                    ObmenStrok(matrix, Str, nowStr);
                    if (Notify != null)
                    {
                        Notify($"Обмен: ({nowStr} и {Str})\n"); Notify(matrix.toString() + "\n");
                    }
                }
                //приводим к 1
                if (matrix.Matrix[nowStr, nowCol].Numerator != matrix.Matrix[nowStr, nowCol].Denominator)
                {
                    SimpleFractions kof = matrix.Matrix[nowStr, nowCol];
                    for (int j1 = 0; j1 < matrix.M; j1++)
                    {
                        matrix.Matrix[nowStr, j1] = _sFM.Division(matrix.Matrix[nowStr, j1], kof);
                    }
                    if (Notify != null)
                    {
                        Notify($"Приведение: ({nowStr + 1}) : {kof.toString()} \n"); Notify(matrix.toString() + "\n");
                    }
                }
                //прямоугольники
                for (int j1 = nowStr + 1; j1 < matrix.M; j1++)
                {
                    for (int i1 = 0; i1 < matrix.N; i1++)
                    {
                        if (i1 != nowCol)
                        {
                            matrix.Matrix[i1, j1] =
                                _sFM.Difference(matrix.Matrix[i1, j1],
                                                _sFM.Multiplication(matrix.Matrix[nowStr, j1], matrix.Matrix[i1, nowCol]));
                        }
                    }
                }
                for (int i = 0; i < matrix.N; i++)
                {
                    if (i != nowStr)
                    {
                        matrix.Matrix[i, nowCol].Denominator = 1;
                        matrix.Matrix[i, nowCol].Numerator   = 0;
                    }
                }
                if (Notify != null)
                {
                    Notify("После прямоугольников: \n" + matrix.toString() + "\n");
                }
            }
            return(true);
        }