{RE
{int a = 0, b;void Read(int ind, Cache ch)
{en = Encoding.GetEncoding(1251);[] ca = { ' ', ','};[] strarray;strline;<string> mas = new List<string>();myStream = null;openFileDialog1 = new OpenFileDialog();
.InitialDirectory = "c:\\";.Filter = "matr files (*.matr)|*.matr|All files (*.*)|*.*";.FilterIndex = 1;.RestoreDirectory = true;vrem = 0;(openFileDialog1.ShowDialog() != null)
{
{((myStream = openFileDialog1.OpenFile()) != null)
{(myStream)
{sr = new StreamReader(myStream, en);= sr.ReadLine();k = 0;(strline != null)
{= strline.Split(ca);= strarray.Length;.Add(strline);= sr.ReadLine();(k == 0)
{= b;(vrem < 3)
{[] strarray2 = mas[0].Split(ca);.name = strarray2[0];.fam = strarray2[1];-;++;
}
{.name = "Автор";
ch.fam = "отсутствует";++;
}
}++;
}
}.Close();
}
}
{.Show("Ошибка! Вы не выбрали файл.");
}
}l = 0;
double[,] matr = new double[a, b];(int i = 0; i < a+l; i++)
{(vrem < 3&&l==0)
{= 1;++;
}= (mas[i].Split(ca));(int j = 0; j < b; j++)
{(vrem < 3)
{[i - 1, j] = Convert.ToDouble(strarray[j]);
}
{[i, j] = Convert.ToDouble(strarray[j]);
}
}
}(ind == 1)
{.c = a;.d = b;.matr1 = matr;
}(ind == 2)
{.e = a;.f = b;.matr2 = matr;
}
}
}
}
.6 Класс записи результатов вычислений в файл
(WR.cs)
using System;System.Text;System.IO;System.Windows;Microsoft.Win32;Матрица_1_0
{WR
{void Save(Cache ch)
{save = new SaveFileDialog();.InitialDirectory = "c:\\";.Filter = "matr files (*.matr)|*.matr|All files (*.*)|*.*";.FilterIndex = 1;.RestoreDirectory = true;(save.ShowDialog() == true)
{[] zap = new string[ch.g+1];(int i = 0; i < ch.g+1; i++)
{add=null;(int j = 0; j < ch.h; j++)
{(i == 0)
{= ch.name2 + " " + ch.fam2;
}
{(j == ch.h - 1)
{+= ch.res[i - 1, j].ToString();
}
{+= (ch.res[i - 1, j].ToString() + " ");
}
}
}[i] = add;
}en=Encoding.GetEncoding(1251);.WriteAllLines(save.FileName, zap, en);
}
}
}
}
.7Класс произведения матриц (Umn.cs)
using System;System.Collections.Generic;System.Linq;System.Text;System.Windows;Матрица_1_0
{Umn
{void Umn2(Cache ch)
{(ch.d == ch.e)
{[,] matr = new double[ch.c, ch.f];.g = ch.c;.h = ch.f;(int i = 0; i < ch.c; i++)
{(int j = 0; j < ch.f; j++)
{(int k = 0; k < ch.d; k++)
{[i, j] += ch.matr1[i, k] * ch.matr2[k, j];
}
}
}.res = matr;
}
{.Show("Ошибка! Количество столбцов и строк в матрицах не совпадает.");
}(int i = 0; i < ch.g; i++)
{(int j = 0; j < ch.h; j++)
{.res[i, j] = Math.Round(ch.res[i, j]);
}
}
}
}
}
2.8 ласс сложения матриц (Plus.cs)
using System;System.Windows;Матрица_1_0
{Plus
{void Sum(Cache ch)
{(ch.c == ch.e)
{(ch.d == ch.f)
{.g = ch.e;.h = ch.f;[,] matr = new double[ch.g, ch.f];(int i = 0; i < ch.c; i++)
{(int j = 0; j < ch.d; j++)
{[i, j] = (ch.matr1[i, j] + ch.matr2[i, j]);
}
}.res = matr;
}
{.Show("Ошибка! Количество столбцов в матрицах не совпадает.");
}
}
{.Show("Ошибка! Количество строк в матрицах не совпадает.");
}
}
}
}
.9 Класс проверки входа в программу (Parol.cs)
using System;System.Collections.Generic;System.Windows;Матрица_1_0
{Parol
{bool Dostup(string login, string parol)
{<string> log=new List<string>();.Add("Абхаликов");.Add("Булавский");.Add("Булыга");.Add("Горбенко"); .Add("Дядичкин");.Add("Занько");.Add("Казак");.Add("Ким");.Add("Козлова");.Add("Кузнецов");.Add("Кульчик");.Add("Мурашко");.Add("Мусаев");.Add("Озолин");.Add("Рябчинская");.Add("Шаченок");
log.Add("Романовский");.Add("Якимович");.Add("Ходар");.Add("Сокольников");.Add("Рутковский");.Add("Серебренников");.Add("Скоробогатый");.Add("Чашинский");
List<string> par = new List<string>();.Add("Руслан");.Add("Иван");.Add("Владимир");.Add("Алла");.Add("Дмитрий");.Add("Роман");.Add("Алексей");.Add("Дмитрий");
par.Add("Виктория");.Add("Валерий");.Add("Сергей");.Add("Михаил");.Add("Эльдар");.Add("Никита");.Add("Надежда");.Add("Татьяна");.Add("Антон");.Add("Павел");.Add("Максим");.Add("Максим");.Add("Алексей");.Add("Владимир");.Add("Дмитрий");.Add("Александр");
for (int i = 0; i < log.Count; i++)
{(login == log[i])
{(parol == par[i])
{.Show("Вход выполнен!");.Show("Здравствуйте "+par[i]);
return true;
}
}
}.Show("Вы ввели неправильные данные!");false;
}
}
}
2.10Класс получения определителя матрицы
(Opr.cs)
using System;System.Collections.Generic;System.Windows;Матрица_1_0
{Opr
{n = 0;<List<double>> M = new List<List<double>>();[,] matr;double DetGauss(int ind, Cache ch)
{(ind == 1)
{(ch.c == ch.d)
{= ch.c;= ch.matr1;(int i = 0; i < n; i++)
{<double> Mr = new List<double>();(int j = 0; j < n; j++)
{.Add (matr[i, j]);
}.Add(Mr);
}
}
{.Show("Выбранная матрица не является квадратной!");
}
}(ind == 2)
{(ch.e == ch.f)
{= ch.e;= ch.matr2;(int i = 0; i < n; i++)
{<double> Mr = new List<double>();(int j = 0; j < n; j++)
{.Add(matr[i, j]);
}.Add(Mr);
}
}
{.Show("Выбранная матрица не является квадратной!");
}
}(ind == 3)
{(ch.g == ch.h)
{= ch.h;= ch.res;(int i = 0; i < n; i++)
{<double> Mr = new List<double>();(int j = 0; j < n; j++)
{.Add(matr[i, j]);
}.Add(Mr);
}
}
{.Show("Выбранная матрица не является квадратной!");
}
}det = 1; k = 0;double E = 1E-9;
(int i = 0; i < n; i++)
{= i;(int j = i + 1; j < n; j++)
{(Math.Abs(M[j][i]) > Math.Abs(M[k][i]))
{= j;
}
}(Math.Abs(M[k][i]) < E)
{= 0;;
}(ref M, i, k);
(i != k) det *= -1;
{*= M[i][i];
}(int j = i + 1; j < n; j++)
{[i][j] /= M[i][i];
}(int j = 0; j < n; j++)
{((j != i) && (Math.Abs(M[j][i]) > E))
{(k = i + 1; k < n; k++)
{[j][k] -= M[i][k] * M[j][i];
}
}
}
}det;
}void Swap(ref List<List<double>> M, int row1, int row2)
{s = 0;(int i = 0; i < M[row1].Count; i++)
{= M[row1][i];[row1][i] = M[row2][i];
M[row2][i] = s;
}
}
}
}
.11Класс получения разности матрицы (Minus.cs)
using System;System.Collections.Generic;System.Text;System.Windows;Матрица_1_0
{Minus
{void Min(Cache ch)
{(ch.c == ch.e)
{(ch.d == ch.f)
{.g = ch.e;.h = ch.f;[,] matr = new double[ch.g, ch.f];(int i = 0; i < ch.c; i++)
{(int j = 0; j < ch.d; j++)
{[i, j] = (ch.matr1[i, j] - ch.matr2[i, j]);
}
}.res = matr;
}
{.Show("Ошибка! Количество столбцов в матрицах не совпадает.");
}
}
{.Show("Ошибка! Количество строк в матрицах не совпадает.");
}
}
}
.12 Класс получения минора матрицы (Mab.cs)
using System;System.Collections.Generic;System.Windows;System.Windows.Controls;Матрица_1_0
{Mab
{double Min(int ind, int a, int b, Cache ch)
{min = 0;(ind == 1)
{[,] vrem1 = new double[ch.c - 1, ch.d];[,] vrem2 = new double[ch.c - 1, ch.d-1];(a < ch.c && b < ch.d)
{.g = ch.c-1;.h = ch.d-1;(int i = 0; i < ch.c; i++)
{(int j = 0; j < ch.d; j++)
{(i<a)
{[i,j]=ch.matr1[i,j];
}(i>a)
{[i-1,j]=ch.matr1[i,j];
}
}
}(int i = 0; i < ch.c-1; i++)
{(int j = 0; j < ch.d; j++)
{(j < b)
{[i, j] = vrem1[i, j];
}(j > b)
{[i, j - 1] = vrem1[i, j];
}
}
}.res = vrem2;z = 0;y = 0;= Math.DivRem((a+b), 2, out y);delta = new Opr();(y == 0)
{= delta.DetGauss(3, ch);
}
{= delta.DetGauss(3, ch)*(-1);
}
}
{
MessageBox.Show("Вы ввели число большее чем размер матрицы!");
}
}(ind == 2)
{[,] vrem1 = new double[ch.e - 1, ch.f];[,] vrem2 = new double[ch.e - 1, ch.f - 1];(a < ch.e || b < ch.f)
{.g = ch.e - 1;.h = ch.f - 1;(int i = 0; i < ch.e; i++)
{(int j = 0; j < ch.f; j++)
{(i < a)
{[i, j] = ch.matr2[i, j];
}(i > a)
{[i - 1, j] = ch.matr2[i, j];
}
}
}(int i = 0; i < ch.e - 1; i++)
{(int j = 0; j < ch.f; j++)
{(j < b)
{[i, j] = vrem1[i, j];
}(j > b)
{[i, j - 1] = vrem1[i, j];
}
}
}.res = vrem2;z = 0;y = 0;= Math.DivRem((a + b), 2, out y);delta = new Opr();(y == 0)
{= delta.DetGauss(3, ch);
}
{= delta.DetGauss(3, ch) * (-1);
}
}
else
{.Show("Вы ввели число большее чем размер матрицы!");
}
}min;
}
}
}
.13Класс копирования результата в матрицу
(Copir.cs)
using System;System.Collections.Generic;System.Linq;System.Text;Матрица_1_0
{Copir
{void C(int ind, Cache ch)
{(ind == 1)
{.c = ch.g;.d = ch.h;.matr1 = ch.res;
}(ind == 2)
{.e = ch.g;.f = ch.h;.matr2 = ch.res;
}
}
}
}
2.14Класс хранения матричных данных (Cache.cs)
using System;System.Collections.Generic;Матрица_1_0
{Cache
{int c, d, e, f, g, h;double[,] matr1, matr2, res;string fam, fam2, name, name2;void Zap(int a, int b, int ind, double[,] matr)
{(ind == 1)
{= a;= b;= matr;
}(ind == 2)
{= a;= b;= matr;
}(ind == 3)
{= a;= b;= matr;
}
}
}
}
3. Описание кода программы
.1Класс обработчиков главного окна
(MainWindow.xaml.cs)
Данный класс содержит следующие блоки кода:ch = new Cache();
Объявление нового элемента класса Cache который используется во всех классах для доступа к сохраненным из файла матрицам.
public void Show(int ind) { … }
Эта функция используется для вывода на экран в соответствующее место соответствующую матрицу: она определяется параметром ind, затем перечисляется в цикле for и записывается в соответствующий Textbloc.
Данный обработчик записывает в переменные введенные логин и пароль, вызывает класс Parol.cs и проверяет на возможность входа в программу. Если вход выполнен введенные логин и пароль записываются в переменные для использования их при сохранении.login = Логин.Text.ToString(); - получение введенного логина.parol =Пароль.Password.ToString(); - получение введенного пароля.
Авторизация.Visibility = Visibility.Collapsed; - закрытие формы авторизации.
private void New_Click(object sender, RoutedEventArgs e) { … }
Создание нового экземпляра программы без формы авторизации.
private void AT_Click(ob ject sender, RoutedEventArgs e) { … }
Обработчик создает новый элемент класса AT.cs и вызывает функцию транспонирования матрицы, передавая номер матрицы элемент Cache ch для доступа к матрице, и затем вызывает вывод результата на экран. То же самое делает обработчик private void AT_2_Click(object sender, RoutedEventArgs e), а обработчик private void T_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void Cl_Click(object sender, RoutedEventArgs e) { … }
Обработчик закрывает приложение.void Op_M1_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса чтения (Re.cs) и вызывает вывод матрицы на экран. То же самое для второй матрицы делает обработчик private void Op_M2_Click_1(object sender, RoutedEventArgs e) { … }.
private void a_k_GotFocus(object sender, RoutedEventArgs e) и private void b_GotFocus(object sender, RoutedEventArgs e)
Обработчики перехватывают получение фокуса текстовыми полями и очищают текст перед вводом (b_b.Text = null;).
private void kop1_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса Copir.cs и вызывает функцию копирования результата в первую матрицу. То же самое делает для второй матрицы обработчик private void kop2_Click(object sender, RoutedEventArgs e). А обработчик private void Copy_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void Ak1_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса Axk.cs, получает значение числа k из Textbox (k = Convert.ToDouble(a_k.Text.ToString());) и вызывает функцию умножения. После чего вызывает вывод результата на экран. То же самое делает для второй матрицы обработчик private void Ak2_Click(object sender, RoutedEventArgs e). А обработчик private void K_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void obr1_Click(object sender, RoutedEventArgs e)
Обработчик выполняет необходимые операции для получения обратной матрицы:
получает и задает необходимые значения;
создает новый объект класса Opr.cs и получает определитель матрицы вызвав соответствующую функцию;
если определитель не равен нулю, то вычисляется матрица согласная матрице исходной, затем она транспонируется и умножается на единицу, деленную на определитель матрицы;
вызывается вывод на экран результата.
То же самое для второй матрицы делает обраротчик private void obr2_Click(object sender, RoutedEventArgs e). А обработчик private void Obr_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void Zakr_Click(object sender, RoutedEventArgs e)
Обработчик закрывает работу с данными матрицами без закрытия программы путем очистки всех использующихся полей и очистки данных в классе Cache.cs кроме имени и фамилии вошедшего пользователя.
private void S_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса WR.cs и вызывает соответствующий метод для записи полученных результатов в файл.
private void Sum_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса Plus.cs и вызывается соответствующая функция позволяющая сложить две матрицы, после чего вызывается вывод на экран результатов. На этот обработчик ссылается обработчик функции сложения private void sl_Click(object sender, RoutedEventArgs e) доступный из меню «Функции».void Razn_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса вычитания матриц (private void Razn_Click(object sender, RoutedEventArgs e)), вызывает соответствующую функцию и вызывает вывод результата на экран. На этот обработчик ссылается обработчик того же действия функции доступной из меню «Функции» (private void Minus_Click(object sender, RoutedEventArgs e)).void Del_Click(object sender, RoutedEventArgs e)
Обработчик делит первую матрицу на вторую. Для этого:
вызывает функцию получения обратной матрицы от второй;
записывает вторую матрицу во временные переменные;
вызывает обработчик умножения матриц;
возвращает вторую матрицу на место;
вызывает вывод результата на экран.
Обработчик функции деления из меню «Функции» также ссылается на этот обработчик (private void razd_Click(object sender, RoutedEventArgs e)).
private void Umn_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса призведения матриц (Umn.cs) и вызывает соответствующую функцию умножения, Затем вызывает вывод результата на экран. Обработчик функции умножения из меню «Функции» также ссылается на этот обработчик (private void umn_Click_1(object sender, RoutedEventArgs e)).
private void О_программе_Click(object sender, RoutedEventArgs e)
Обработчик открывает дополнительно окно со сведениями о программе.
private void Opred1_Click(object sender, RoutedEventArgs e) и private void Opred2_Click(object sender, RoutedEventArgs e)
Обработчики создают новые объекты класса определителя (Opr.cs) и вызывают соответствующую функцию подсчета определителя, а затем вызывают вывод результата на экран. А обработчик private void Delta_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void Min1_Click(object sender, RoutedEventArgs e) и private void Min2_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса Mab.cs, получает значения чисел a и b и вызывая соответствующую функцию получает значение выбранного минора и записывает в поле результата. А обработчик private void M_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void Пароль_KeyDown(object sender, KeyEventArgs e)
Обработчик перехватывает нажатие клавиши Enter в поле Пароль и вызывает обработчик клавиши вход (Button_Click(sender, e);).
private void Логин_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
Обработчик перехватывает нажатие клавиши Enter в поле Логин и передает фокус полю Пароль.void Логин_Initialized(object sender, EventArgs e)
Обработчик передает фокус полю логин во время запуска программы.
private void Kan1_Click(object sender, RoutedEventArgs e) и private void Kan2_Click(object sender, RoutedEventArgs e)
Обработчики создают новые объекты класса Kan.cs, вызывают соответствующую функцию, а затем вызывают вывод на экран результата. А обработчик private void KV_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void R1_Click(object sender, RoutedEventArgs e) и private void R2_Click(object sender, RoutedEventArgs e)
Обработчики создают новые объекты класса Kan.cs и вызывают соответствующую функцию ранга матрицы, а полученный результат записывают в соответствующие текстовые блоки. А обработчик private void R_Click(object sender, RoutedEventArgs e) проверяет радио клавиши и вызывает один из этих обработчиков или выдает сообщение об ошибке.
private void R_Click(object sender, RoutedEбоventArgs e)
Обработчик при нажатии в меню «Справка» клавиши
Справка запускает chm справку по программе.
3.2Класс транспонирования матрицы (AT.cs)
Класс транспонирования матрицы содержит одну функцию (public void ATR(int ind, Cache ch)) позволяющую получить транспонированную матрицу из исходной. Данная функция принимает индекс транспонируемой матрицы и элемент ch класса Cache для доступа к выбранной матрице.
Для транспонирования создаются временные
переменные, в которые записываются данные исходной матрицы. Затем создается
пустая временная транспонированная матрица, которая заполняется путем
перечисления в цикле for. Полученная матрица записывается в матрицу-результат,
которую можно будет вывести на экран.
.3Класс умножения матрицы на число k (Axk.cs)
Класс умножения матрицы на число k позволяет получить матрицу, каждый элемент которой умножен на число k. Данная функция принимает индекс транспонируемой матрицы, число k и элемент ch класса Cache для доступа к выбранной матрице.