Создание для отдела логистики набора функций для работы с матрицами
Проектирование программы для работы с матрицами, обладающей некоторым уровнем защиты, интуитивно понятным интерфейсом и легкостью управления. Набор функций в программе. Класс хранения матричных данных. Описание интерфейса, форма входа и главное окно.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.03.2015 |
Размер файла | 2,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Курсовая работа
По дисциплине
«Информатика»
«Создание для отдела логистики набора функций для работы с матрицами»
Содержание
Введение
1.Условие задания
2.Текст программы
2.1Класс обработчиков главного окна (MainWindow.xaml.cs)
2.2Класс транспонирования матрицы (AT.cs)
2.3Класс умножения матрицы на число k (Axk.cs)
2.4Класс получения канонического вида и ранга матрицы (Kan.cs)
2.5Класс чтения матриц из файла (Re.cs)
2.6Класс записи результатов вычислений в файл (WR.cs)
2.7Класс произведения матриц (Umn.cs)
2.8Класс сложения матриц (Plus.cs)
2.9Класс проверки входа в программу (Parol.cs)
2.10Класс получения определителя матрицы (Opr.cs)
2.11Класс получения разности матрицы (Minus.cs)
2.12Класс получения минора матрицы (Mab.cs)
2.13Класс копирования результата в матрицу (Copir.cs)
2.14Класс хранения матричных данных (Cache.cs)
3.Описание кода программы
3.1Класс обработчиков главного окна (MainWindow.xaml.cs)
3.2Класс транспонирования матрицы (AT.cs)
3.3Класс умножения матрицы на число k (Axk.cs)
3.4Класс получения канонического вида и ранга матрицы (Kan.cs)
3.5Класс чтения матриц из файла (Re.cs)
3.6Класс записи результатов вычислений в файл (WR.cs)
3.7Класс произведения матриц (Umn.cs)
3.8Класс сложения матриц (Plus.cs)
3.9Класс проверки входа в программу (Parol.cs)
3.10Класс получения определителя матрицы (Opr.cs
3.11Класс получения разности матрицы (Minus.cs)
3.12Класс получения минора матрицы (Mab.cs)
3.13Класс копирования результата в матрицу (Copir.cs)
3.14Класс хранения матричных данных (Cache.cs)
4.Описание интерфейса
4.1Форма входа (рис. 3)
4.2Главное окно (рис. 4)
5.Результаты работы программы
Заключение
Список литературы
Введение
Windows Presentation Foundation. Windows Presentation Foundation (WPF, кодовое название -- Avalon) -- система для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем, графическая (презентационная) подсистема в составе .NET Framework (начиная с версии 3.0), имеющая прямое отношение к XAML (ЗАМЛ).
WPF вместе с .NET Framework 3.0 предустановлена в Windows Vista и Windows 7(.NET Framework 3.5 SP1). С помощью WPF можно создавать широкий спектр как автономных, так и запускаемых в браузере приложений.
Особенности технологии. В основе WPF лежит векторная система визуализации, не зависящая от разрешения устройства вывода и созданная с учетом возможностей современного графического оборудования. WPF предоставляет средства для создания визуального интерфейса, включая Язык XAML (Extensible Application Markup Language), элементы управления, привязку данных, макеты, двухмерную и трехмерную графику, анимацию, стили, шаблоны, документы, текст, мультимедиа и оформление.
Графической технологией, лежащей в основе WPF, является DirectX, в отличие от Windows Forms, где используется GDI/GDI+. Производительность WPF выше, чем у GDI+ за счет использования аппаратного ускорения графики через DirectX. Также существует урезанная версия CLR, называющаяся WPF/E, она же известна как Silverlight.
Использование разметки XAML. XAML представляет собой XML, в котором фактически реализованы классы .NET Framework. Так же реализована модель разделения кода и дизайна, позволяющая кооперироваться программисту и дизайнеру. Кроме того, есть встроенная поддержка стилей элементов, а сами элементы легко разделить на элементы управления второго уровня, которые, в свою очередь, разделяются до уровня векторных фигур и свойств/действий. Это позволяет легко задать стиль для любого элемента, например, Button (кнопка).
Средства разработки. Для работы с WPF требуется любой .NET-совместимый язык. В этот список входит множество языков: C#, VB, C++, Ruby, Python, Delphi (Prism) и многие другие. Для полноценной работы может быть использованы такие программные продукты как Visual Studio, так и Expression Blend. Первая ориентирована на программирование, а вторая -- на дизайн и позволяет делать многие вещи, не прибегая к ручному редактированию XAML. Примеры этому -- анимация, стилизация, состояния, создание элементов управления и так далее.
Microsoft Expression Blend. Microsoft Expression Blend (рис. 1) направлен на разработку дизайна веб-интерфейсов и графических настольных приложений.
Рис. 1. Microsoft Expression Blend
Ключевая особенность продукта в том, что Expression Blend и Visual Studio используют одно и то же расширение файла проекта. А значит теперь у разработчиков и дизайнеров будет существенно меньше конфликтов и противоречий.
К тому же, теперь не составит труда сразу же открыть созданный в Visual Studio проект в Expression Blend и, естественно, наоборот, на одном компьютере. Рассмотрим некоторые возможности продукта.
В Blend включен полный дизайнер WYSIWYG (свойство прикладных программ, в которых содержание отображается в процессе редактирования). При открытых страницах и элементах управления можно переключаться в режим дизайна, в режим XAML источника, либо совместить эти два режима на одном экране и работать с ними одновременно.
Expression Blend поддерживает редактирование при помощи векторной графики. Также у него есть поддержка добавления и редактирования множества элементов управления. Есть специальная иконка на панели инструментов дизайна (Grid, Stack, Canvas, Border, Scroll Viewer, и т.д.), инструментов редактирования текста (Text Box, Text Block, и т. д.) и многое другое.
Выбрав любой объект можно поиграть с его свойствами (вкладка Properties). Например, с цветовым представлением элементов и фона. Можно раскрасить объекты не только в интересные цвета, но и представить цвет в виде градиента (рис. 2).
А что вы скажете на то, что градиент может изменяться динамически во время того или иного действия? И это далеко не все возможности. Можно добавлять сколь угодно много различных сценариев анимации, накладывать звук, менять форму и стиль элементов. Expression Blend предоставляет максимум возможностей и гибкости для быстрой настройки под себя всех элементов. Что позволяет пофантазировать и поэкспериментировать с проектом.
Рис. 2. Использование градиента в проекте
Приятным дополнением является возможность разрабатывать приложения для Windows Phone 7. Теперь создавать приложений на основе панорам (panorama) или пайвотов (pivot) гораздо удобнее. Наглядно отображаются необходимые размеры и границы.
1.Условие задания
Программа для работы с матрицами должна обладать некоторым уровнем защиты, обладать интуитивно понятным интерфейсом и легкостью управления, а также обеспечивать должный функционал. В функционале должны присутствовать меню, панель функций и формы отображения информации. Набор функций в программе должен быть следующим: умножение, сложение, деление и вычитание матриц; подсчет определителя матрицы; подсчет минора матрицы; транспонирование матрицы и др.
2. Текст программы
2.1 Класс обработчиков главного окна (MainWindow.xaml.cs)
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using Microsoft.Win32;
using System.Diagnostics;
namespace Матрица_1_0
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
// Insert code required on object creation below this point.
}
Cache ch = new Cache();
public void Show(int ind)
{
if (ind == 1)
{
Mm1.Text = null;
for (int i = 0; i < ch.c; i++)
{
for (int j = 0; j < ch.d; j++)
{
Mm1.Text += (ch.matr1[i, j].ToString()+" ");
}
Mm1.Text += "\n";
}
}
if (ind == 2)
{
Mm2.Text = null;
for (int i = 0; i < ch.e; i++)
{
for (int j = 0; j < ch.f; j++)
{
Mm2.Text += (ch.matr2[i, j].ToString()+" ");
}
Mm2.Text += "\n";
}
}
if (ind == 3)
{
Mr.Text = null;
for (int i = 0; i < ch.g; i++)
{
for (int j = 0; j < ch.h; j++)
{
Mr.Text += (ch.res[i, j].ToString()+" ");
}
Mr.Text += "\n";
}
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string login = Логин.Text.ToString();
string parol = Пароль.Password.ToString();
Parol par = new Parol();
bool v = par.Dostup(login, parol);
if (v == true)
{
Авторизация.Visibility = Visibility.Collapsed;
ch.fam2 = login;
ch.name2 = parol;
}
}
private void New_Click(object sender, RoutedEventArgs e)
{
MainWindow Wind = new MainWindow();
Wind.Visibility = Visibility.Visible;
Wind.Авторизация.Visibility = Visibility.Collapsed;
}
private void AT_Click(object sender, RoutedEventArgs e)
{
AT n = new AT();
n.ATR(1, ch);
Show(3);
}
private void T_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
AT_Click(sender, e);
}
if (M2.IsChecked == true)
{
AT_2_Click(sender, e);
}
if (M1.IsChecked == true) { }
else
{
if (M2.IsChecked == true) { }
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void AT_2_Click(object sender, RoutedEventArgs e)
{
AT n = new AT();
n.ATR(2, ch);
Show(3);
}
private void Cl_Click(object sender, RoutedEventArgs e)
{
WIND.Close();
}
private void Op_M1_Click(object sender, RoutedEventArgs e)
{
RE read = new RE();
read.Read(1, ch);
Show(1);
MessageBox.Show("Автор файла: "+ch.name+" "+ch.fam);
}
private void Op_M2_Click_1(object sender, RoutedEventArgs e)
{
RE read = new RE();
read.Read(2, ch);
Show(2);
MessageBox.Show("Автор файла: " + ch.name + " " + ch.fam);
}
private void a_k_GotFocus(object sender, RoutedEventArgs e)
{
a_k.Text = null;
}
private void b_GotFocus(object sender, RoutedEventArgs e)
{
b_b.Text = null;
}
private void Copy_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
kop1_Click(sender, e);
}
if (M2.IsChecked == true)
{
kop2_Click(sender, e);
}
if (M1.IsChecked == true) { }
else
{
if (M2.IsChecked == true) { }
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void Ak1_Click(object sender, RoutedEventArgs e)
{
double k=0;
Axk ak = new Axk();
try
{
k = Convert.ToDouble(a_k.Text.ToString());
ak.Axk2(1, k, ch);
}
catch
{
MessageBox.Show("Ошибка! Вы не ввели число k");
}
Show(3);
}
private void Ak2_Click(object sender, RoutedEventArgs e)
{
double k = 0;
Axk ak = new Axk();
try
{
k = Convert.ToDouble(a_k.Text.ToString());
ak.Axk2(2, k, ch);
}
catch
{
MessageBox.Show("Ошибка! Вы не ввели число k");
}
Show(3);
}
private void K_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
Ak1_Click(sender, e);
}
else
{
if (M2.IsChecked == true)
{
Ak2_Click(sender, e);
}
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void Obr_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
obr1_Click(sender, e);
}
else
{
if (M2.IsChecked == true)
{
obr2_Click(sender, e);
}
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void obr1_Click(object sender, RoutedEventArgs e)
{
double opr = 0;
if (ch.c == ch.d)
{
ch.g = ch.c;
ch.h = ch.d;
Opr chislo = new Opr();
opr = chislo.DetGauss(1, ch);
if (opr != 0)
{
double k = 1 / opr;
double[,] Soglmatr = new double[ch.c, ch.d];
for (int i = 0; i < ch.c; i++)
{
for (int j = 0; j < ch.d; j++)
{
Mab mab = new Mab();
Soglmatr[i, j] = mab.Min(1, i, j, ch);
}
}
ch.g++;
ch.h++;
ch.res = Soglmatr;
AT tr = new AT();
tr.ATR(3, ch);
Axk axk = new Axk();
axk.Axk2(3, k, ch);
Show(3);
}
else
{
MessageBox.Show("Ошибка! Данная матрица является вырожденной и не может иметь обратной матрицы!");
}
}
else
{
MessageBox.Show("Выбранная матрица не является квадратной!");
}
}
private void obr2_Click(object sender, RoutedEventArgs e)
{
double opr = 0;
if (ch.e == ch.f)
{
ch.g = ch.e;
ch.h = ch.f;
Opr chislo = new Opr();
opr = chislo.DetGauss(2, ch);
if (opr != 0)
{
double k = 1 / opr;
double[,] Soglmatr = new double[ch.e, ch.f];
for (int i = 0; i < ch.e; i++)
{
for (int j = 0; j < ch.f; j++)
{
Mab mab = new Mab();
Soglmatr[i, j] = mab.Min(2, i, j, ch);
}
}
ch.g++;
ch.h++;
ch.res = Soglmatr;
AT tr = new AT();
tr.ATR(3, ch);
Axk axk = new Axk();
axk.Axk2(3, k, ch);
Show(3);
}
else
{
MessageBox.Show("Ошибка! Данная матрица является вырожденной и не может иметь обратной матрицы!");
}
}
else
{
MessageBox.Show("Выбранная матрица не является квадратной!");
}
}
private void Zakr_Click(object sender, RoutedEventArgs e)
{
Mm1.Text = null;
Mm2.Text = null;
Mr.Text = null;
a_k.Text = "a(k)";
b_b.Text = "b";
status_M1.Text = status_M2.Text = status_rM.Text = "Результат";
M1.IsChecked = false;
M2.IsChecked = false;
ch.c = ch.d = ch.e = ch.f = ch.g = ch.h = 0;
ch.fam = ch.name = "";
ch.matr1 = ch.matr2 = ch.res = null;
}
private void S_Click(object sender, RoutedEventArgs e)
{
WR sav = new WR();
sav.Save(ch);
}
private void Sum_Click(object sender, RoutedEventArgs e)
{
Plus sum = new Plus();
sum.Sum(ch);
Show(3);
}
private void sl_Click(object sender, RoutedEventArgs e)
{
Sum_Click(sender, e);
}
private void Razn_Click(object sender, RoutedEventArgs e)
{
Minus m = new Minus();
m.Min(ch);
Show(3);
}
private void Minus_Click(object sender, RoutedEventArgs e)
{
Razn_Click(sender, e);
}
private void Del_Click(object sender, RoutedEventArgs e)
{
obr2_Click(sender, e);
double[,] vrem = ch.matr2;
int vrem1 = ch.e;
int vrem2 = ch.f;
ch.e = ch.g;
ch.f = ch.h;
ch.matr2 = ch.res;
Umn_Click(sender, e);
ch.e = vrem1;
ch.g = vrem2;
ch.matr2 = vrem;
Show(2);
}
private void razd_Click(object sender, RoutedEventArgs e)
{
Del_Click(sender, e);
}
private void Umn_Click(object sender, RoutedEventArgs e)
{
Umn umn = new Umn();
umn.Umn2(ch);
Show(3);
}
private void umn_Click_1(object sender, RoutedEventArgs e)
{
Umn_Click(sender, e);
}
private void О_программе_Click(object sender, RoutedEventArgs e)
{
Window1 win = new Window1();
win.Visibility = Visibility.Visible;
}
private void Delta_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
Opred1_Click(sender, e);
}
else
{
if (M2.IsChecked == true)
{
Opred2_Click(sender, e);
}
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void M_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
Min1_Click(sender, e);
}
else
{
if (M2.IsChecked == true)
{
Min2_Click(sender, e);
}
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void Пароль_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key.Equals( Key.Enter))
{
Button_Click(sender, e);
}
}
private void Логин_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key.Equals(Key.Enter))
{
Пароль.Focus();
}
}
private void Opred1_Click(object sender, RoutedEventArgs e)
{
Opr delta = new Opr();
double opr = delta.DetGauss(1, ch);
status_M1.Text = ("Определитель матрицы равен " + opr.ToString());
Show(3);
}
private void Opred2_Click(object sender, RoutedEventArgs e)
{
Opr delta = new Opr();
double opr = delta.DetGauss(2, ch);
status_M2.Text =("Определитель матрицы равен "+ opr.ToString());
Show(3);
}
private void Min1_Click(object sender, RoutedEventArgs e)
{
Mab minor2=new Mab();
double minor=0;
int a = 0;
int b = 0;
try
{
a = Convert.ToInt32(a_k.Text) - 1;
b = Convert.ToInt32(b_b.Text) - 1;
}
catch
{
MessageBox.Show("Поля a(k) и b не заполнены");
goto u;
}
minor = minor2.Min(1, a, b, ch);
status_M1.Text =("Минор равен " +minor.ToString());
u: status_rM.Text = "Результат";
}
private void Min2_Click(object sender, RoutedEventArgs e)
{
Mab minor2 = new Mab();
double minor = 0;
int a = 0;
int b = 0;
try
{
a = Convert.ToInt32(a_k.Text) - 1;
b = Convert.ToInt32(b_b.Text) - 1;
}
catch
{
MessageBox.Show("Поля a(k) и b не заполнены");
goto u;
}
minor = minor2.Min(2, a, b, ch);
status_M2.Text = ("Минор равен " + minor.ToString());
u: status_rM.Text = "Результат";
}
private void Логин_Initialized(object sender, EventArgs e)
{
Логин.Focus();
}
private void kop1_Click(object sender, RoutedEventArgs e)
{
Copir cop = new Copir();
cop.C(1, ch);
Show(1);
}
private void kop2_Click(object sender, RoutedEventArgs e)
{
Copir cop = new Copir();
cop.C(2, ch);
Show(2);
}
private void Kan1_Click(object sender, RoutedEventArgs e)
{
Kan kan = new Kan();
kan.KV(1, ch);
Show(3);
}
private void Kan2_Click(object sender, RoutedEventArgs e)
{
Kan kan = new Kan();
kan.KV(2, ch);
Show(3);
}
private void KV_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
Kan1_Click(sender, e);
}
else
{
if (M2.IsChecked == true)
{
Kan2_Click(sender, e);
}
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void R1_Click(object sender, RoutedEventArgs e)
{
Kan rang = new Kan();
int r=rang.Rang(1, ch);
status_M1.Text=("Ранг матрицы равен "+r.ToString());
}
private void R2_Click(object sender, RoutedEventArgs e)
{
Kan rang = new Kan();
int r = rang.Rang(2, ch);
status_M2.Text = ("Ранг матрицы равен " + r.ToString());
}
private void R_Click(object sender, RoutedEventArgs e)
{
if (M1.IsChecked == true)
{
R1_Click(sender, e);
}
else
{
if (M2.IsChecked == true)
{
R2_Click(sender, e);
}
else
{
MessageBox.Show("Ошибка! Вы не выбрали матрицу!");
}
}
}
private void Справка1_Click(object sender, RoutedEventArgs e)
{
string path = @"D:\Работа\4 семместр\Курсовая\Матрица 1.0_Copy1\Матрица 1.0\Справка";
Process pr = new Process();
pr.StartInfo.FileName = path + "\\Справка.chm";
pr.Start();
}
}
}
2.2Класс транспонирования матрицы (AT.cs)
using System;
namespace Матрица_1_0
{
class AT
{
public void ATR(int ind, Cache ch)
{
int a=0, b=0;
double[,] matr=new double[a,b];
if (ind == 1)
{
a = ch.c;
b = ch.d;
matr = ch.matr1;
}
if (ind==2)
{
a = ch.e;
b = ch.f;
matr = ch.matr2;
}
if (ind == 3)
{
a = ch.g;
b = ch.h;
matr = ch.res;
}
double[,] res = new double[b, a];
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
res[j,i] = matr[i, j];
}
}
ch.g = b;
ch.h = a;
ch.res = res;
}
}
}
2.3Класс умножения матрицы на число k (Axk.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Матрица_1_0
{
class Axk
{
public void Axk2(int ind, double k, Cache ch)
{
int a = 0, b = 0;
double[,] matr = new double[a, b];
if (ind == 1)
{
a = ch.c;
b = ch.d;
matr=ch.matr1;
}
if (ind == 2)
{
a = ch.e;
b = ch.f;
matr = ch.matr2;
}
if (ind == 3)
{
a = ch.g;
b = ch.h;
matr = ch.res;
ch.res = null;
}
double[,] res = new double[a, b];
for (int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
res[i, j] = Math.Round( matr[i, j]*k, 3);
}
}
ch.g = a;
ch.h = b;
ch.res = res;
}
}
}
2.4 Класс получения канонического вида и ранга матрицы (Kan.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Матрица_1_0
{
class Kan
{
public void KV(int ind, Cache ch)
{
int a=0,b=0,n=0;
int uchet = 0;
double[,] matr=new double[a,b];
if (ind==1)
{
a=ch.c;
b=ch.d;
matr=ch.matr1;
}
if (ind == 2)
{
a=ch.e;
b=ch.f;
matr=ch.matr2;
}
q:
if (n < a && n < b)
{
double del = matr[n, n];
if (del != 0)
{
double[] str = new double[b - n];
double umn = 0;
for (int i = n; i < b; i++)
{
matr[n, i] = matr[n, i] / del;
str[i - n] = matr[n, i];
}
for (int i = n + 1; i < a; i++)
{
umn = matr[i, n];
for (int j = n; j < b; j++)
{
matr[i, j] = matr[i, j] - str[j - n] * umn;
}
}
for (int i = n + 1; i < b; i++)
{
matr[n, i] = 0;
}
for (int i = n; i < a; i++)
{
for (int j = n; j < b; j++)
{
if (i == n || j == n)
{
if (matr[i, j] == 0)
{
uchet++;
}
}
}
}
}
}
if (uchet == ((a + b) - 2)-2*n && uchet!=0)
{
uchet=0;
n++;
goto q;
}
else
{
ch.g = a;
ch.h = b;
ch.res = matr;
}
}
public int Rang(int ind, Cache ch)
{
KV(ind, ch);
int rang = 0;
int n = ch.g;
int m = ch.h;
q:
int vrem = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (i == n - 1 && ch.res[i,j]==0)
{
vrem++;
}
}
}
if (vrem == m)
{
n--;
goto q;
}
else
{
rang = n;
}
return rang;
}
}
}
2.5Класс чтения матриц из файла (Re.cs)
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Windows;
using Microsoft.Win32;
namespace Матрица_1_0
{
class RE
{
public int a = 0, b;
public void Read(int ind, Cache ch)
{
Encoding en = Encoding.GetEncoding(1251);
char[] ca = { ' ', ','};
string[] strarray;
string strline;
List<string> mas = new List<string>();
Stream myStream = null;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "matr files (*.matr)|*.matr|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
int vrem = 0;
if (openFileDialog1.ShowDialog() != null)
{
try
{
if ((myStream = openFileDialog1.OpenFile()) != null)
{
using (myStream)
{
StreamReader sr = new StreamReader(myStream, en);
strline = sr.ReadLine();
int k = 0;
while (strline != null)
{
strarray = strline.Split(ca);
b = strarray.Length;
mas.Add(strline);
strline = sr.ReadLine();
if (k == 0)
{
vrem = b;
if (vrem < 3)
{
string[] strarray2 = mas[0].Split(ca);
ch.name = strarray2[0];
ch.fam = strarray2[1];
a--;
k++;
}
else
{
ch.name = "Автор";
ch.fam = "отсутствует";
k++;
}
}
a++;
}
}
myStream.Close();
}
}
catch
{
MessageBox.Show("Ошибка! Вы не выбрали файл.");
}
}
int l = 0;
double[,] matr = new double[a, b];
for (int i = 0; i < a+l; i++)
{
if (vrem < 3&&l==0)
{
i = 1;
l++;
}
strarray = (mas[i].Split(ca));
for (int j = 0; j < b; j++)
{
if (vrem < 3)
{
matr[i - 1, j] = Convert.ToDouble(strarray[j]);
}
else
{
matr[i, j] = Convert.ToDouble(strarray[j]);
}
}
}
if (ind == 1)
{
ch.c = a;
ch.d = b;
ch.matr1 = matr;
}
if (ind == 2)
{
ch.e = a;
ch.f = b;
ch.matr2 = matr;
}
}
}
}
2.6 Класс записи результатов вычислений в файл (WR.cs)
using System;
using System.Text;
using System.IO;
using System.Windows;
using Microsoft.Win32;
namespace Матрица_1_0
{
class WR
{
public void Save(Cache ch)
{
SaveFileDialog save = new SaveFileDialog();
save.InitialDirectory = "c:\\";
save.Filter = "matr files (*.matr)|*.matr|All files (*.*)|*.*";
save.FilterIndex = 1;
save.RestoreDirectory = true;
if (save.ShowDialog() == true)
{
string[] zap = new string[ch.g+1];
for (int i = 0; i < ch.g+1; i++)
{
string add=null;
for (int j = 0; j < ch.h; j++)
{
if (i == 0)
{
add = ch.name2 + " " + ch.fam2;
}
else
{
if (j == ch.h - 1)
{
add += ch.res[i - 1, j].ToString();
}
else
{
add += (ch.res[i - 1, j].ToString() + " ");
}
}
}
zap[i] = add;
}
Encoding en=Encoding.GetEncoding(1251);
File.WriteAllLines(save.FileName, zap, en);
}
}
}
}
2.7Класс произведения матриц (Umn.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
namespace Матрица_1_0
{
class Umn
{
public void Umn2(Cache ch)
{
if (ch.d == ch.e)
{
double[,] matr = new double[ch.c, ch.f];
ch.g = ch.c;
ch.h = ch.f;
for (int i = 0; i < ch.c; i++)
{
for (int j = 0; j < ch.f; j++)
{
for (int k = 0; k < ch.d; k++)
{
matr[i, j] += ch.matr1[i, k] * ch.matr2[k, j];
}
}
}
ch.res = matr;
}
else
{
MessageBox.Show("Ошибка! Количество столбцов и строк в матрицах не совпадает.");
}
for (int i = 0; i < ch.g; i++)
{
for (int j = 0; j < ch.h; j++)
{
ch.res[i, j] = Math.Round(ch.res[i, j]);
}
}
}
}
}
2.8 ласс сложения матриц (Plus.cs)
using System;
using System.Windows;
namespace Матрица_1_0
{
class Plus
{
public void Sum(Cache ch)
{
if (ch.c == ch.e)
{
if (ch.d == ch.f)
{
ch.g = ch.e;
ch.h = ch.f;
double[,] matr = new double[ch.g, ch.f];
for (int i = 0; i < ch.c; i++)
{
for (int j = 0; j < ch.d; j++)
{
matr[i, j] = (ch.matr1[i, j] + ch.matr2[i, j]);
}
}
ch.res = matr;
}
else
{
MessageBox.Show("Ошибка! Количество столбцов в матрицах не совпадает.");
}
}
else
{
MessageBox.Show("Ошибка! Количество строк в матрицах не совпадает.");
}
}
}
}
2.9 Класс проверки входа в программу (Parol.cs)
using System;
using System.Collections.Generic;
using System.Windows;
namespace Матрица_1_0
{
class Parol
{
public bool Dostup(string login, string parol)
{
List<string> log=new List<string>();
log.Add("Абхаликов");
log.Add("Булавский");
log.Add("Булыга");
log.Add("Горбенко");
log.Add("Дядичкин");
log.Add("Занько");
log.Add("Казак");
log.Add("Ким");
log.Add("Козлова");
log.Add("Кузнецов");
log.Add("Кульчик");
log.Add("Мурашко");
log.Add("Мусаев");
log.Add("Озолин");
log.Add("Рябчинская");
log.Add("Шаченок");
log.Add("Романовский");
log.Add("Якимович");
log.Add("Ходар");
log.Add("Сокольников");
log.Add("Рутковский");
log.Add("Серебренников");
log.Add("Скоробогатый");
log.Add("Чашинский");
List<string> par = new List<string>();
par.Add("Руслан");
par.Add("Иван");
par.Add("Владимир");
par.Add("Алла");
par.Add("Дмитрий");
par.Add("Роман");
par.Add("Алексей");
par.Add("Дмитрий");
par.Add("Виктория");
par.Add("Валерий");
par.Add("Сергей");
par.Add("Михаил");
par.Add("Эльдар");
par.Add("Никита");
par.Add("Надежда");
par.Add("Татьяна");
par.Add("Антон");
par.Add("Павел");
par.Add("Максим");
par.Add("Максим");
par.Add("Алексей");
par.Add("Владимир");
par.Add("Дмитрий");
par.Add("Александр");
for (int i = 0; i < log.Count; i++)
{
if (login == log[i])
{
if (parol == par[i])
{
MessageBox.Show("Вход выполнен!");
MessageBox.Show("Здравствуйте "+par[i]);
return true;
}
}
}
MessageBox.Show("Вы ввели неправильные данные!");
return false;
}
}
}
2.10Класс получения определителя матрицы (Opr.cs)
using System;
using System.Collections.Generic;
using System.Windows;
namespace Матрица_1_0
{
class Opr
{
int n = 0;
List<List<double>> M = new List<List<double>>();
double[,] matr;
public double DetGauss(int ind, Cache ch)
{
if (ind == 1)
{
if (ch.c == ch.d)
{
n = ch.c;
matr = ch.matr1;
for (int i = 0; i < n; i++)
{
List<double> Mr = new List<double>();
for (int j = 0; j < n; j++)
{
Mr.Add (matr[i, j]);
}
M.Add(Mr);
}
}
else
{
MessageBox.Show("Выбранная матрица не является квадратной!");
}
}
if (ind == 2)
{
if (ch.e == ch.f)
{
n = ch.e;
matr = ch.matr2;
for (int i = 0; i < n; i++)
{
List<double> Mr = new List<double>();
for (int j = 0; j < n; j++)
{
Mr.Add(matr[i, j]);
}
M.Add(Mr);
}
}
else
{
MessageBox.Show("Выбранная матрица не является квадратной!");
}
}
if (ind == 3)
{
if (ch.g == ch.h)
{
n = ch.h;
matr = ch.res;
for (int i = 0; i < n; i++)
{
List<double> Mr = new List<double>();
for (int j = 0; j < n; j++)
{
Mr.Add(matr[i, j]);
}
M.Add(Mr);
}
}
else
{
MessageBox.Show("Выбранная матрица не является квадратной!");
}
}
double det = 1;
int k = 0;
const double E = 1E-9;
for (int i = 0; i < n; i++)
{
k = i;
for (int j = i + 1; j < n; j++)
{
if (Math.Abs(M[j][i]) > Math.Abs(M[k][i]))
{
k = j;
}
}
if (Math.Abs(M[k][i]) < E)
{
det = 0;
break;
}
Swap(ref M, i, k);
if (i != k) det *= -1;
{
det *= M[i][i];
}
for (int j = i + 1; j < n; j++)
{
M[i][j] /= M[i][i];
}
for (int j = 0; j < n; j++)
{
if ((j != i) && (Math.Abs(M[j][i]) > E))
{
for (k = i + 1; k < n; k++)
{
M[j][k] -= M[i][k] * M[j][i];
}
}
}
}
return det;
}
private void Swap(ref List<List<double>> M, int row1, int row2)
{
double s = 0;
for (int i = 0; i < M[row1].Count; i++)
{
s = M[row1][i];
M[row1][i] = M[row2][i];
M[row2][i] = s;
}
}
}
}
2.11Класс получения разности матрицы (Minus.cs)
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
namespace Матрица_1_0
{
class Minus
{
public void Min(Cache ch)
{
if (ch.c == ch.e)
{
if (ch.d == ch.f)
{
ch.g = ch.e;
ch.h = ch.f;
double[,] matr = new double[ch.g, ch.f];
for (int i = 0; i < ch.c; i++)
{
for (int j = 0; j < ch.d; j++)
{
matr[i, j] = (ch.matr1[i, j] - ch.matr2[i, j]);
}
}
ch.res = matr;
}
else
{
MessageBox.Show("Ошибка! Количество столбцов в матрицах не совпадает.");
}
}
else
{
MessageBox.Show("Ошибка! Количество строк в матрицах не совпадает.");
}
}
}
2.12 Класс получения минора матрицы (Mab.cs)
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace Матрица_1_0
{
class Mab
{
public double Min(int ind, int a, int b, Cache ch)
{
double min = 0;
if (ind == 1)
{
double[,] vrem1 = new double[ch.c - 1, ch.d];
double[,] vrem2 = new double[ch.c - 1, ch.d-1];
if (a < ch.c && b < ch.d)
{
ch.g = ch.c-1;
ch.h = ch.d-1;
for (int i = 0; i < ch.c; i++)
{
for (int j = 0; j < ch.d; j++)
{
if (i<a)
{
vrem1[i,j]=ch.matr1[i,j];
}
if(i>a)
{
vrem1[i-1,j]=ch.matr1[i,j];
}
}
}
for (int i = 0; i < ch.c-1; i++)
{
for (int j = 0; j < ch.d; j++)
{
if (j < b)
{
vrem2[i, j] = vrem1[i, j];
}
if (j > b)
{
vrem2[i, j - 1] = vrem1[i, j];
}
}
}
ch.res = vrem2;
int z = 0;
int y = 0;
z = Math.DivRem((a+b), 2, out y);
Opr delta = new Opr();
if (y == 0)
{
min = delta.DetGauss(3, ch);
}
else
{
min = delta.DetGauss(3, ch)*(-1);
}
}
else
{
MessageBox.Show("Вы ввели число большее чем размер матрицы!");
}
}
if (ind == 2)
{
double[,] vrem1 = new double[ch.e - 1, ch.f];
double[,] vrem2 = new double[ch.e - 1, ch.f - 1];
if (a < ch.e || b < ch.f)
{
ch.g = ch.e - 1;
ch.h = ch.f - 1;
for (int i = 0; i < ch.e; i++)
{
for (int j = 0; j < ch.f; j++)
{
if (i < a)
{
vrem1[i, j] = ch.matr2[i, j];
}
if (i > a)
{
vrem1[i - 1, j] = ch.matr2[i, j];
}
}
}
for (int i = 0; i < ch.e - 1; i++)
{
for (int j = 0; j < ch.f; j++)
{
if (j < b)
{
vrem2[i, j] = vrem1[i, j];
}
if (j > b)
{
vrem2[i, j - 1] = vrem1[i, j];
}
}
}
ch.res = vrem2;
int z = 0;
int y = 0;
z = Math.DivRem((a + b), 2, out y);
Opr delta = new Opr();
if (y == 0)
{
min = delta.DetGauss(3, ch);
}
else
{
min = delta.DetGauss(3, ch) * (-1);
}
}
else
{
MessageBox.Show("Вы ввели число большее чем размер матрицы!");
}
}
return min;
}
}
}
2.13Класс копирования результата в матрицу (Copir.cs)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Матрица_1_0
{
class Copir
{
public void C(int ind, Cache ch)
{
if (ind == 1)
{
ch.c = ch.g;
ch.d = ch.h;
ch.matr1 = ch.res;
}
if (ind == 2)
{
ch.e = ch.g;
ch.f = ch.h;
ch.matr2 = ch.res;
}
}
}
}
2.14Класс хранения матричных данных (Cache.cs)
using System;
using System.Collections.Generic;
namespace Матрица_1_0
{
class Cache
{
public int c, d, e, f, g, h;
public double[,] matr1, matr2, res;
public string fam, fam2, name, name2;
public void Zap(int a, int b, int ind, double[,] matr)
{
if (ind == 1)
{
c = a;
d = b;
matr1 = matr;
}
if (ind == 2)
{
e = a;
f = b;
matr2 = matr;
}
if (ind == 3)
{
g = a;
h = b;
res = matr;
}
}
}
}
3. Описание кода программы
3.1Класс обработчиков главного окна (MainWindow.xaml.cs)
Данный класс содержит следующие блоки кода:
Cache ch = new Cache();
Объявление нового элемента класса Cache который используется во всех классах для доступа к сохраненным из файла матрицам.
public void Show(int ind) { … }
Эта функция используется для вывода на экран в соответствующее место соответствующую матрицу: она определяется параметром ind, затем перечисляется в цикле for и записывается в соответствующий Textbloc.
private void Button_Click(object sender, RoutedEventArgs e) { … }
Данный обработчик записывает в переменные введенные логин и пароль, вызывает класс Parol.cs и проверяет на возможность входа в программу. Если вход выполнен введенные логин и пароль записываются в переменные для использования их при сохранении.
string login = Логин.Text.ToString(); - получение введенного логина.
string 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) { … }
Обработчик закрывает приложение.
private 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) доступный из меню «Функции».
private void Razn_Click(object sender, RoutedEventArgs e)
Обработчик создает новый объект класса вычитания матриц (private void Razn_Click(object sender, RoutedEventArgs e)), вызывает соответствующую функцию и вызывает вывод результата на экран. На этот обработчик ссылается обработчик того же действия функции доступной из меню «Функции» (private void Minus_Click(object sender, RoutedEventArgs e)).
private 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 в поле Логин и передает фокус полю Пароль.
private 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.3Класс умножения матрицы на число k (Axk.cs)
Класс умножения матрицы на число k позволяет получить матрицу, каждый элемент которой умножен на число k. Данная функция принимает индекс транспонируемой матрицы, число k и элемент ch класса Cache для доступа к выбранной матрице.
Для умножения матрицы на число k создаются временные переменные, в которые записываются данные исходной матрицы. Затем создается пустая временная матрица, которая заполняется в цикле for путем умножения каждого элемента матрицы на число k. Полученная матрица записывается в матрицу-результат, которую можно будет вывести на экран.
3.4Класс получения канонического вида и ранга матрицы (Kan.cs)
В данном классе содержатся две матричные функции:
public void KV(int ind, Cache ch) - функция получения канонического вида выбранной матрицы:
В данной функции создаются временные переменные для записи в них исходной матрицы. Затем проверяется условие возможного выхода за пределы матрицы справа и снизу, после чего функция получает делитель для первой строки, и затем вычитает ее из ниже лежащих строк. И цикл повторяется так до последней строки.
public int Rang(int ind, Cache ch) - функция получения ранга выбранной матрицы:
В данной функции, прежде чем получить ранг матрицы функция вызывает функцию получения канонического вида данной матрицы. И затем при помощи перечисления канонической матрицы определяется ранг матрицы путем подсчета не нулевых рядов.
3.5Класс чтения матриц из файла (Re.cs)
В этом классе исходная матрица считывается из файла. Для этого:
создаются временные переменные для хранения открываемой матрицы, а также методы разделения элементов в строках открываемого файла;
создается декодер для русского текста (Encoding en = Encoding.GetEncoding(1251););
Создается окно для выбора открываемой матрицы и путем перечисления строк в открытом файле эти строки записываются во временное хранилище (List<string> mas = new List<string>();). Одновременно с записью матрицы происходит запись имени и фамилии автора создавшего эту матрицу, а также ее размер;
Затем полученный лист строк читается, и каждая строка разбивается на элементы по разделителю, которые затем записываются во временную матрицу. И эта матрица переносится в матрицу, которую можно вывести на экран.
3.6Класс записи результатов вычислений в файл (WR.cs)
Функция записи результатов принимает объект ch класса Cache для доступа к записываемой матрице. Создается окно сохранения данных где выбирается место хранения файла. После выбора места хранения в файл записывается автор и матрица переписанная в массив строк ().
3.7Класс произведения матриц (Umn.cs)
Функция произведения матриц принимает объект ch класса Cache для доступа к умножаемым матрицам. Перед умножением проверяется условие равенства количества столбцов первой матрицы строкам второй матрицы. Если это условие не выполняется, то выдается сообщение об ошибке. После это матрицы умножаются путем суммирования умножения соответствующих элементов в строках и столбцах. Полученная матрица записывается в матрицу которую можно вывести на экран.
3.8Класс сложения матриц (Plus.cs)
Функция сложения матриц принимает объект ch класса Cache для доступа к слаживаемым матрицам. Матрицы слаживаются путем перечисления всех элементов матрицы и сложения соответствующих элементов. Результат записывается в матрицу доступную для вывода на экран. Также проверяется условие равности размеров слаживаемых матриц.
3.9Класс проверки входа в программу (Parol.cs)
Функция проверки входа в программу принимает строковые данные введенных логина пароля. Эти данные проверяются по двум листам возможных логинов и вращается подтверждение входа.
3.10Класс получения определителя матрицы (Opr.cs)
Функция создает временное хранилище другого формата для вычисления определителя выбранной матрицы. Функция принимает индекс матрицы и объект класса Cache для доступа к матрице. Затем выбранная матрица записывается во временное хранилище которое используется в вычислении определителя методом Гаусса:
Используем перечисление листа, а число k приравниваем к числу i;
Через второе перечисление проверяем, какое из соответствующих чисел в соседних рядах больше, если первое - число k приравнивается к числу j.
Если второе число меньше установленной точности определитель обнуляется.
Вызывается функция перестановки строк местами (Swap(ref M, i, k););
После проверки остальных условий определитель умножается на минус единицу или на другой элемент.
Цикл повторяется до получения результата и определитель возвращается в вызвавший его обработчик.
3.11Класс получения разности матрицы (Minus.cs)
Функция принимает объект класса Cache для доступа к матрицам. После проверки равности матриц путем перечисления соответствующие элементы матрицы два отнимаются от соответствующих элементов матрицы один. Результат записывается в матрицу доступную для вывода результата на экран.
3.12Класс получения минора матрицы (Mab.cs)
Функция принимает индекс матрицы, положение вычисляемого минора и объект класса Cache для доступа к выбранной матрице. Создаются одна временная матрица с удаленной строкой, и вторая с удаленным потом столбцом. Получившуюся матрицу записываем в результирующую матрицу и вызываем функцию подсчета определителя через объект класса Opr.cs. Если сумма номеров строки и столбца четная - минор равен определителю, если нечетная - минор равен минус определителю. Полученный минор возвращается в обработчик его вызвавший.
3.13Класс копирования результата в матрицу (Copir.cs)
Функция принимает индекс матрицы и объект класса Cache для доступа к выбранной матрице. Выбранная матрица приравнивает свои значения к матрице-результату полученную после вычислений.
3.14 Класс хранения матричных данных (Cache.cs)
Класс содержит переменные для хранения открытых матриц и результатов их вычислений. Также класс имеет функцию для записи этих переменных доступную из класса чтения файла (Re.cs).
4.Описание интерфейса
4.1Форма входа (рис. 3)
Рис. 3. Форма входа
На форме входа расположены следующие элементы:
Текстовый блок «Логин», в которое пользователь вводит свой логин, и который получает фокус при загрузке.
Форма для ввода пароля, вводимого пользователем. Эта форма получает фокус при нажатии клавиши Enter в поле «Логин». При нажатии клавиши Enter в этом поле вызывается обработчик нажатия клавиши «Войти».
Клавиша «Войти». При ее нажатии выполняется вход в программу (при правильно введенных данных).
4.2 Главное окно (рис. 4)
Рис. 4. Главное окно
программа матрица данные интерфейс
В главном окне расположены следующие элементы:
В верхней части расположено меню программы, содержащее меню «Документ», «Функции» и «Справка»:
Меню «Документ» (рис. 5) содержит следующие элементы: «Новый» - открытие нового окно программы для работы с другими матрицами; «Открыть» - позволяет открыть первую или вторую матрицу, причем для некоторых функций важен порядок матриц; «Сохранить как…» - позволяет сохранить полученный результат с выбором места хранения и выбором формата файла; «Закрыть» - закрывает текущие вычисления; «Выход» - выход и закрытие программы.
Меню «Функции» (рис. 6) содержит следующие элементы: одинаковые функции для первой и второй матриц: «Транспонировать» - производит транспонирование матрицы; «Умножить на число k» - умножение матрицы на число k; «Обратить» - вычисление обратной матрицы; «Определитель» - вычисление определителя матрицы; «Минор» - вычисление минора матрицы по введенным числам a и b; «Ранг» - подсчет ранга матрицы; «Канонический вид» - получение канонического вида матрицы; «Копировать из результата» - заполнение матрицы результатами предыдущих вычислений.
А также в меню «Функции» присутствуют такие элементы как «Сложение» - сложение матриц, «Вычитание» - вычитание второй матрицы из первой, «Произведение» - умножение первой матрицы на вторую, «Частное» - деление первой матрицы на вторую.
Меню «Справка» (рис. 7) содержит следующие элементы: «О программе» - вызов окна информации о программе (рис. 8); «Справка» - вызов справки по программе (рис. 9).
Рис. 5. Меню «Документ»
Рис. 6. Меню «Функции»
Рис. 7. Меню «Справка»
Рис. 8. О программе
Рис. 9. Справка по программе
Ниже расположена панель функций (рис. 10), которая полностью повторяет меню «Функции» плюс возможность выбора матрицы, к которой применяется действие и поля для ввода чисел a, b, k. Вся панель функций представлена в графическом виде.
Рис. 10. Панель функций
В средней части расположены блоки отображения исходных и результирующей матриц.
В нижней части расположены поля «Результат» в которых выводятся результаты подсчета определителя, минора и ранга матрицы.
5. Результаты работы программы
В результатах работы покажем результаты выполнения некоторых функций:
Произведение матриц (рис. 11);
Рис. 11. Произведение матриц
Деление матриц (рис. 12);
Обратная матрица плюс определитель (рис. 13) и другие функции.
Рис. 12. Деление матриц
Рис. 13. Определитель плюс обратная матрица
Заключение
В результате выполнения курсовой работы была создана программа названная «Матрица 1.0» - набор функций для работы с матрицами. Эта программа позволяет выполнять следующие функции: открытие и сохранение файла плюс авторство файла. Подсчет таких матричных функций как транспонирование, умножение на число k, подсчет обратной матрицы, определитель, минор, ранг, канонический вид, копирование из результата в матрицу, сложение матриц, вычитание, произведение и частное матриц. Также в программе содержится окно «О программе» и справка по программе. Были использованы различные техники при работе с функциями, переменными, массивами. Приложение содержит различные виды форм технологии Windows Presentation Foundation. Программа отличается простотой интерфейса, интуитивно понятным меню и лёгкостью управления.
Список литературы
1.C#: учебный курс. Герберт Шилдт. - СПб.: Питер; К.: Издательская группа BHV, 2011. - 512с.
2.Мэтью Мак-Дональд WPF: Windows Presentation Foundation в .NET 4.0 с примерами на C# 2010 для профессионалов = Pro WPF in C# 2010: Windows Presentation Foundation with .NET 4.0. -- М.: «Вильямс», 2011. -- С. 1024.
3.С# 2008: ускоренный курс для профессионалов. Трей Неш. - ООО «ИД Вильямс», 2008. - 576с.
Размещено на Allbest.ru
Подобные документы
Основные операции с матрицами. Проектирование объектно-ориентированного модуля для работы с матрицами в среде Delphi 7. Разработка программы, которая позволяет выполнять различные действия над матрицами. Описание интерфейса программы, исходный код модуля.
курсовая работа [1014,2 K], добавлен 15.01.2013Обзор некоторых сведений о матрицах. Описание этапов работы с функциями. Проектирование программы для выполнения вычислений над матрицами в среде программирования MSVisualStudio 2008, при помощи языка программирования C++. Проверка результатов в Mathcad.
курсовая работа [182,0 K], добавлен 06.04.2013Описание разрабатываемой программы с точки зрения пользователя и программиста. Поэтапная разработка программной системы. Создание базы данных в Access. Разработка структуры классов. Создание структуры для хранения данных. Проектирование интерфейса.
курсовая работа [1,4 M], добавлен 07.08.2013Основные действия над матрицами. Последовательность умножения вектора на матрицу. Спецификаторы доступа, которые используют для ограничения доступа к элементам класса. Перегрузка операций. Создание программы, реализующей работу с классом Matrix.
курсовая работа [321,7 K], добавлен 26.01.2013Создание на языке C базы данных "Стадионы города", требования к программе. Осуществление загрузки базы данных в массив и вывод главного меню в основной программе. Алгоритм работы программы в виде блок-схемы. Описание функций программы и ее листинг.
курсовая работа [183,6 K], добавлен 06.10.2010Практика построения графиков с использованием функций и работа с мастером диаграмм в ПП Microsoft Excel. Применение встроенных функций работы с матрицами для решения системы линейных уравнений. Практика создания запросов при работе с базами данных.
контрольная работа [436,1 K], добавлен 08.08.2011Описание классов данных. Основное меню программы. Добавление и удаление объектов. Вывод устройств хранения в указанном ПК. Устройство хранения, класс ноутбук, класс жёсткий диск, класс персональный компьютер, класс планшет и класс Flash-память.
курсовая работа [1,8 M], добавлен 30.03.2014Анализ предметной области. Предположительный набор необходимых функций. Даталогическое и инфологическое проектирование. Реляционная модель данных. Создание запросов и атрибутов. Физическая модель данных. Разработка приложения для работы с базой данных.
курсовая работа [720,8 K], добавлен 26.04.2015Требования к программе или программному изделию, к информационной и программной совместимости. Проектирование программного продукта. Процедура установки и удаления. Описание интерфейса, главное окно приложения. Основные возможности пользователя.
курсовая работа [678,1 K], добавлен 15.02.2016Принципы разработки и пример работы программы, реализующей основные операции алгебры матриц: сложение, вычитание, умножение, транспонирование, а также умножение матрицы на число. Функциональные модели и блок-схемы решения задачи операций над матрицами.
курсовая работа [956,7 K], добавлен 25.01.2010