public void Save(String filename)
        {
            StreamWriter f = null;

            try
            {
                f = new StreamWriter(filename);
            }
            catch
            {
                return;
            }
            int n = number;

            String[]        stringArr = new string[n];
            History_message p         = this;

            while (p != null)
            {
                stringArr[n - 1] = (p.Text);
                p = p.msg_next;
                n--;
            }
            for (int i = 0; i < number; i++)
            {
                f.WriteLine((i + 1).ToString() + ". " + stringArr[i]);
                stringArr[i] = null;
            }
            stringArr = null;
            f.Close();
        }
//-------------- Функция нахождения определителя матрицы --------------
// Предупреждение: История сообщений передается по ссылке, так как она изменяется
// Принимает на вход матрицы A, историю сообщений
// Возвращает определитель матрицы, если тип не nonе и V равно 0
// Возвращает Nan, если не известен тип или V не равно 0

        public static double DeterminantReverseMatrix(Matrix A, ref History_message history)
        {
            double Det = 1;

            if (A.V != 0)
            {
                history = history.Add("Операция прервана. Значение V должно быть равно 0");
                return(Double.NaN);
            }
            else
            {
                if (A.Type == Category.bot_left || A.Type == Category.top_right)
                {
                    for (int i = 0; i < A.N; i++)
                    {
                        Det *= getElement(i, i, A);
                    }
                }
                else
                {
                    for (int i = 0; i < A.N; i++)
                    {
                        Det *= getElement(A.N - 1 - i, i, A);
                    }
                    Det = -Det;
                }
                history = history.Add("Определитель равен " + Det.ToString());
                return(Det);
            }
        }
Esempio n. 3
0
        private void очиститьВсеМатрицыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            A = new Matrix('A', 0, 0, Category.none, null);
            B = new Matrix('B', 0, 0, Category.none, null);
            C = new Matrix('C', 0, 0, Category.none, null);

            // А
            this.GridView_A.Rows.Clear();  // удаление всех строк
            int count = this.GridView_A.Columns.Count;

            for (int i = 0; i < count; i++)     // цикл удаления всех столбцов
            {
                this.GridView_A.Columns.RemoveAt(0);
            }
            // В
            this.GridView_B.Rows.Clear();   // удаление всех строк
            count = this.GridView_B.Columns.Count;
            for (int i = 0; i < count; i++) // цикл удаления всех столбцов
            {
                this.GridView_B.Columns.RemoveAt(0);
            }
            // С
            this.GridView_C.Rows.Clear();   // удаление всех строк
            count = this.GridView_C.Columns.Count;
            for (int i = 0; i < count; i++) // цикл удаления всех столбцов
            {
                this.GridView_C.Columns.RemoveAt(0);
            }

            ourHistory = ourHistory.Add("Все матрицы были очищены!");
            UpdateInfo();
        }
//-------------- Функция перестановки матриц --------------
// Предупреждение: История сообщений и матрицы передаются по ссылке, так как они изменяются
// Принимает на вход 2 матрицы, историю сообщений
// Возвращает определитель матрицы, если тип не nonе и V равно 0
// Возвращает Nan, если не известен тип или V не равно 0
        public static void Replace_A_B(ref Matrix A, ref Matrix B, ref History_message history)
        {
            Matrix C = A;

            A       = new Matrix(A.Name, B.N, B.V, B.Type, B.Packed_form);
            B       = new Matrix(B.Name, C.N, C.V, C.Type, C.Packed_form);
            history = history.Add("Операция успешно выполнена");
        }
        // Методы

        // *******Добавление нового сообщения в начало стека*******
        // Принимает на вход текст нового сообщения
        // Возвращает ссылку на стек с сообщениями
        // Пример вызова: myHistory = myHistory.Add();
        public History_message Add(String text)
        {
            number++;
            History_message newMessage = new History_message(text);

            newMessage.msg_next = this;
            return(newMessage);
        }
        //*******Очистка истории*******
        // Не принимает на вход параметров
        // Возвращает указатель на конец стека (начало работы с программой)
        // Пример вызова: myHistory = myHistory.Clear_history();
        public History_message Clear_history()
        {
            History_message.number = 1;
            History_message p = this;

            while (p.msg_next != null)
            {
                p = p.msg_next;
            }
            return(p);
        }
Esempio n. 7
0
        // Сохранение матрицы в файл
        // На вход принимает матрицу и историю сообщений
        // На выходе ничего не возвращает
        // Пример вызова: Save_m(A, ourHistory)
        private void Save_m(Matrix M, ref History_message ourHistory)
        {
            saveFileDialog1.FileName = "";
            // Если отменено сохранение, то выходит из функции
            if (saveFileDialog1.ShowDialog() == DialogResult.Cancel)
            {
                MometalShowMessage("Сохранение приостановлено");
                return;
            }
            string filename = saveFileDialog1.FileName;

            M.Save(filename, ref ourHistory);
        }
//-------------- Функция умножения матриц А и В--------------
// Предупреждение: История сообщений передается по ссылке, так как она изменяется
// Принимает на вход матрицы A, B, C, историю сообщений
// Возвращает результат умножения двух матриц, если равны размерности и типы матриц A, B и при этом значения V равны 0
// Возвращает матрицу С, если не совпадают размерности или типы матриц A, B

        public static Matrix Multiply(Matrix A, Matrix B, Matrix C, ref History_message history)
        {
            if (A.N == B.N)
            {
                Category ourType = Category.none;
                Matrix   Result  = new Matrix('C', A.N, A.V, Category.none, null);

                for (Category type = Category.top_left; type <= Category.bot_right && ourType == Category.none; type++)
                {
                    Result.Type = type;
                    ourType     = TypeCorrect(A, B, Result);
                }
                if (ourType == Category.none)
                {
                    history = history.Add("Операция прервана. Матрица не будет треугольной формы");
                    return(C);
                }
                int sizePackedForm = A.N * (A.N + 1) / 2;
                Result.Packed_form = new double[sizePackedForm];
                for (int i = 0; i < Result.N; i++)
                {
                    for (int j = 0; j < Result.N; j++)
                    {
                        if (!isV(i, j, Result))
                        {
                            Result.Packed_form[getIndexK(i, j, Result)] = 0;
                            for (int k = 0; k < Result.N; k++)
                            {
                                double aik = 0, bkj = 0;
                                if (!isV(i, k, A))
                                {
                                    aik = getElement(i, k, A);
                                }
                                if (!isV(k, j, B))
                                {
                                    bkj = getElement(k, j, B);
                                }
                                Result.Packed_form[getIndexK(i, j, Result)] += aik * bkj;
                            }
                        }
                    }
                }
                history = history.Add("Операция успешно выполнена");
                return(Result);
            }
            else
            {
                history = history.Add("Не совпадают размерности матриц");
                return(C);
            }
        }
        // Сохранение матрицы частично реализовано в коде формы начального окна
        public void Save(string filename, ref History_message ourHistory)
        {
            StreamWriter f = null;

            try
            {
                f = new StreamWriter(filename);
            }
            catch
            {
                ourHistory = ourHistory.Add("Ошибка при сохранении");
                return;
            }
            f.WriteLine(Convert.ToString(n));
            f.WriteLine(Convert.ToString(v));
            f.WriteLine(type);

            int a = 0;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    double temp;
                    if (Operations.isV(i, j, this))
                    {
                        temp = V;
                        if (Math.Abs(V) <= 1E-12)
                        {
                            temp = 0;
                        }
                    }
                    else
                    {
                        temp = Packed_form[a];
                        if (Math.Abs(Packed_form[a]) <= 1E-12)
                        {
                            temp = 0;
                        }
                        a++;
                    }
                    f.Write(String.Format("{0:F13}", temp));
                    f.Write("\t");
                }
                f.WriteLine();
            }

            f.Close();
            ourHistory = ourHistory.Add("Матрица сохранена по адресу " + filename);
        }
        // *******Вывод последних k сообщений*******
        // Принимает на вход число сообщений, которы нужно вывести
        // Возвращает строку, состоящую из последних k сообщений
        // Пример вызова: myHistory.Print(4);
        public String Print(int k)
        {
            int             n      = number;
            History_message p      = this;
            String          result = "";

            while ((p != null) && (k > 0))
            {
                result = n.ToString() + ". " + p.text + "\r\n" + result;
                p      = p.msg_next;
                k--;
                n--;
            }
            return(result);
        }
Esempio n. 11
0
        private void очиститьМатрицуАToolStripMenuItem_Click(object sender, EventArgs e)
        {
            A = new Matrix('A', 0, 0, Category.none, null);

            // А
            this.GridView_A.Rows.Clear();  // удаление всех строк
            int count = this.GridView_A.Columns.Count;

            for (int i = 0; i < count; i++)     // цикл удаления всех столбцов
            {
                this.GridView_A.Columns.RemoveAt(0);
            }

            ourHistory = ourHistory.Add("Матрица А была очищена!");
            ShowMatrixA();
            labelMatrixShow();
        }
//-------------- Функция разности матриц А и В--------------
// Предупреждение: История сообщений передается по ссылке, так как она изменяется
// Принимает на вход матрицы A, B, C, историю сообщений
// Возвращает результат вычитания двух матриц, если равны размерности и типы матриц A, B
// Возвращает матрицу С, если не совпадают размерности или типы матриц A, B

        public static Matrix Subtraction(Matrix A, Matrix B, Matrix C, ref History_message history)
        {
            if (A.Type == B.Type && A.N == B.N)
            {
                int    sizePackedForm = A.N * (A.N + 1) / 2;
                Matrix Result         = new Matrix('C', A.N, A.V - B.V, A.Type, new double[sizePackedForm]);

                for (int i = 0; i < sizePackedForm; i++)
                {
                    Result.Packed_form[i] = A.Packed_form[i] - B.Packed_form[i];
                }
                history = history.Add("Операция успешно выполнена");
                return(Result);
            }
            else
            {
                history = history.Add("Не совпадают типы или размерности матриц");
                return(C);
            }
        }
//-------------- Функция нахождения обратной матрицы --------------
// Предупреждение: История сообщений передается по ссылке, так как она изменяется
// Принимает на вход 2 матрицы, историю сообщений
        public static Matrix Reverse(Matrix A, Matrix C, ref History_message history, double detA)
        {
            if (Math.Abs(detA) == 0)
            {
                history = history.Add("Операция прервана. Матрица невырожденная!");
                return(C);
            }
            else
            {
                double[, ] TempMatrica = getObrMatrica(getMatricaFromMatrix(A), A.N);
                Matrix TempMatrix = new Matrix('C', A.N, A.V, A.Type, null);
                history = history.Add("Операция успешно выполнена");
                if (A.Type == Category.top_left)
                {
                    TempMatrix.Type = Category.bot_right;
                }
                else if (A.Type == Category.bot_right)
                {
                    TempMatrix.Type = Category.top_left;
                }
                TempMatrix.Packed_form = PackMatrica(TempMatrix, TempMatrica);
                return(TempMatrix);
            }
        }
Esempio n. 14
0
 private void очиститьИсториюСообщений_Click(object sender, EventArgs e)
 {
     ourHistory           = ourHistory.Clear_history();
     message_history.Text = ourHistory.Print(n_sms);
 }
Esempio n. 15
0
 // показать новое сообщение
 private void MometalShowMessage(String message)
 {
     ourHistory           = ourHistory.Add(message);
     message_history.Text = ourHistory.Print(n_sms);
 }
 // Конструктор
 public History_message(String text)
 {
     this.text     = text;
     this.msg_next = null;
 }
        // Методы

        // Создание матрицы с помощью файла
        public void OpenFromFileToDataTransfer(string filename, ref History_message ourHistory)
        {
            StreamReader f = null;

            try
            {
                f = new StreamReader(filename);
            }
            catch
            {
                ourHistory = ourHistory.Add("При открытии файла произошла ошибка " + filename);
                return;
            }
            int      N;
            double   V;
            Category Type;

            double[] PackedForm;
            bool     success;

            success = Int32.TryParse(f.ReadLine().Trim(), out N);
            if (!success)
            {
                ourHistory = ourHistory.Add("Неверный формат размерности");
                f.Close();
                return;
            }
            if (N <= 1)
            {
                ourHistory = ourHistory.Add("Размерность должна быть больше 1");
                f.Close();
                return;
            }
            DataTransfer.data[0] = N;
            success = Double.TryParse(f.ReadLine().Trim(), out V);
            if (!success)
            {
                ourHistory = ourHistory.Add("Неверный формат значения V");
                f.Close();
                return;
            }
            DataTransfer.data[1] = V;
            success = Category.TryParse(f.ReadLine().Trim(), out Type);
            if (!success || Type == Category.none)
            {
                ourHistory = ourHistory.Add("Неверный формат типа");
                f.Close();
                return;
            }
            DataTransfer.data[2] = Type;
            PackedForm           = new double[N * (N + 1) / 2];
            int    k    = 0;
            Matrix Temp = new Matrix('_', N, V, Type, null);

            for (int i = 0; i < N; i++)
            {
                string line = f.ReadLine();
                if (line == null)
                {
                    ourHistory = ourHistory.Add("Недостаточно строк в файле");
                    f.Close();
                    return;
                }
                line = line.Trim();
                line = System.Text.RegularExpressions.Regex.Replace(line, @"\s+", " ");
                string[] splittedStroka = line.Split(' ');
                for (int j = 0; j < N; j++)
                {
                    String strElement;
                    try
                    {
                        strElement = splittedStroka[j];
                    }
                    catch
                    {
                        ourHistory = ourHistory.Add("Недостаточно значений в строке " + (4 + i).ToString());
                        f.Close();
                        return;
                    }
                    success = Double.TryParse(strElement, out V);
                    if (!success)
                    {
                        ourHistory = ourHistory.Add("Обнаружено значение, не являющееся числом: " + strElement + " в строке " + (4 + i).ToString());
                        f.Close();
                        return;
                    }
                    else
                    {
                        if (Operations.isV(i, j, Temp))
                        {
                            if ((double)DataTransfer.data[1] == V)
                            {
                                // пропустить
                            }
                            else
                            {
                                ourHistory = ourHistory.Add("Ожидалось значение V, равное " +
                                                            ((double)DataTransfer.data[1]).ToString() + ", а получено значение V, равное " +
                                                            V.ToString() + " в строке: " + (4 + i).ToString());
                                f.Close();
                                return;
                            }
                        }
                        else
                        {
                            if (Math.Abs(V) <= 1E-12)
                            {
                                V = 0;
                            }
                            PackedForm[k] = V;
                            k++;
                        }
                    }
                }
                success = false;
                try
                {
                    String _ = splittedStroka[N];
                }
                catch
                {
                    success = true;
                }
                if (!success)
                {
                    ourHistory = ourHistory.Add("Имеются лишние значения в строке " + (4 + i).ToString());
                    f.Close();
                    return;
                }
            }
            if (f.ReadLine() != null)
            {
                ourHistory = ourHistory.Add("Имеются лишние строки в конце файла");
                f.Close();
                return;
            }
            DataTransfer.data[3] = PackedForm;
            f.Close();
        }