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); } }
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); }
// Сохранение матрицы в файл // На вход принимает матрицу и историю сообщений // На выходе ничего не возвращает // Пример вызова: 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); }
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); } }
private void очиститьИсториюСообщений_Click(object sender, EventArgs e) { ourHistory = ourHistory.Clear_history(); message_history.Text = ourHistory.Print(n_sms); }
// показать новое сообщение 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(); }