/*Для тестирования C#-программы принят пример, приведенный в книге Шуп. Т. 
Решение инженерных задач на ЭВМ: Практическое ру-ководство: 
Пер. с англ. – М.: Мир, 1982. – С.32 - 35. */
using System; //C#-программа
using System.IO;
/* Метод Гаусса решения системы ЛАУ - 
Gauss method for solving a system of linear algebraic equations */

namespace ConsAppl_SLAE
{
    class DecisionSLAE
    {
        public DecisionSLAE() { }

        // Реализуется метод Гаусса
        private double[] GAUS(double[,] A, double[] B, double[] X, int n)
        {// Метод Гаусса решения системы ЛАУ
            double factor, temp, adding;
            int kp1, ip1, nm1, l, i;

            nm1 = n - 2;
            for (int k = 0; k <= nm1 + 1; k++)
            {
                kp1 = k + 1;
                // перестановка строк
                l = k;

                for (i = kp1; i < n; i++)
                {
                    if ((Math.Abs(A[i, k]) - Math.Abs(A[l, k])) > 0) l = i;
                }

                if ((l - k) > 0)
                {
                    for (int j = k; j < n; j++)
                    {
                        temp = A[k, j]; A[k, j] = A[l, j]; A[l, j] = temp;
                    }
                    temp = B[k]; B[k] = B[l]; B[l] = temp;
                }

                
                    // исключение неизвестных - приведение системы к треугольному виду; прямой ход

                    for (i = kp1; i < n; i++)
                    {
                        factor = A[i, k] / A[k, k]; A[i, k] = 0;
                        for (int j = kp1; j < n; j++)
                        {
                            A[i, j] = A[i, j] - factor * A[k, j];
                        }
                        B[i] = B[i] - factor * B[k];
                    }
                
            }

            // определение неизвестных; обратный ход
            X[n - 1] = B[n - 1] / A[n - 1, n - 1]; i = nm1;
            while (i >= 0)
            {
                ip1 = i + 1; adding = 0;
                for (int j = ip1; j < n; j++)
                {
                    adding = adding + A[i, j] * X[j];
                }
                X[i] = (B[i] - adding) / A[i, i]; i = i - 1;
            }
            return X;
        }

        private static void Main()
        {
            int n = 4; // int itmax = 50; double eps = 0.0001;

            double[] X = new double[4];
            double[] B = new double[4] { 2.0, 0.0, 9.0, 7.0 };
            double[,] A = new double[4, 4] { { 1.0, 1.0, 1.0, -1.0 },
                                                              { 1.0, -1.0, -1.0, 1.0 },
                                                              { 2.0,1.0, -1.0, 2.0 },
                                                              { 3.0, 1.0, 2.0, -1.0 } };

            DecisionSLAE metodG = new DecisionSLAE();

            FileStream file = new FileStream("result.txt", FileMode.Append);
            StreamWriter write = new StreamWriter(file);

            write.WriteLine("\n\tРешение системы {0}-x ЛАУ методом Гаусса.", n);
            write.WriteLine("\tИсходная система ЛАУ: ");
            write.WriteLine("1. Исходная матрица коэффициентов системы ЛАУ: ");
            for (int i = 0; i < n; i++)
            { 
            for (int j = 0; j < n; j++) write.Write("\tA({0 },{1})={2:F2}", i + 1, j + 1, A[i, j]); write.WriteLine();  
            }
            write.WriteLine("2. Исходный вектор-столбец свободных членов системы ЛАУ: ");
            for (int j = 0; j < n; j++) write.Write("\tB({0})={1:F3}", j + 1, B[j]); write.WriteLine();
            metodG.GAUS(A, B, X, n);
            write.WriteLine("\tРезультаты преобразования и решения системы {0}-x ЛАУ.", n);
            write.WriteLine("1. Преобразованная к треугольному виду матрица коэффициентов: ");
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++) write.Write("\tA({0 },{1})={2:F3}", i + 1, j + 1, A[i, j]); write.WriteLine();
            }
            write.WriteLine("2. Преобразованный вектор-столбец свободных членов: ");
            for (int j = 0; j < n; j++) write.Write("\tB({0})={1:F3}", j + 1, B[j]); write.WriteLine();
            write.WriteLine("3. Искомые корни системы ЛАУ: ");
            for (int j = 0; j < n; j++) write.Write("\tX({0})={1:F3}", j + 1, X[j]); write.WriteLine();
            write.Flush();
            write.Close();
            file.Close();
        }
    }
}

