- •1 Загальна частина
- •1.1 Аналіз предметної області
- •1.1.1 Аналіз інформаційного забезпечення
- •1.1.2 Постановка задачі
- •1.1.3 Аналіз існуючих програмних продуктів
- •1.1.3.1 Тестувальна програма з інформатики InfTest
- •1.1.3.2 Навчальна програма «Тела вращения» («Rotation bodies»)
- •1.1.3.3 Онлайн – сервіси
- •1.2 Розробка sadt-діаграми
- •1.2.1 Виділення та опис бізнес-процесів програмного продукту
- •1.1.4 Визначення основних термінів програмного продукту
- •1.2.2 Документування бізнес-процесу програмного продукту на основі sadt-діаграм
- •1.3 Технічне завдання на розробку програмного продукту
- •1.3.1 Введення
- •1.3.2 Підстави для розробки
- •1.3.3 Призначення розробки
- •1.3.4 Вимоги до програми або програмного продукту
- •1.3.5 Вимоги до програмної документації
- •1.3.6 Техніко-економічні показники
- •1.3.7 Стадії і етапи розробки
- •1.3.8 Порядок контролю і приймання
- •1.4 Розробка засобів моделювання програмного продукту
- •1.4.1 Розробка логічної моделі
- •1.4.1.1 Діаграма прецедентів
- •1.4.1.3 Діаграма послідовності
- •1.4.1 Опис мови (середовища) програмування
- •1.4.1.1 Загальні відомості мови c#
- •1.4.2.2 Елементи мови c#
- •2 Спеціальна частина
- •2.1 Структура програмного продукту
- •2.2 Структура і функціональне призначення модулів програмного продукту
- •2.3 Елементи інтерфейсу програмного продукту
- •3 Економічний розділ
- •3.1 Розрахунок капітальних витрат на створення програмного продукту
2 Спеціальна частина
2.1 Структура програмного продукту
«Есть решение!» - це програма, яка була розроблена як посібник для вивчення тем з дисципліни «Чисельні методи», що стосуються розв’язання систем лінійних рівнянь та виконання операцій над матрицями. Програма «Есть решение!» пропонує автоматичне вирішення вищеописаних задач.
Користувач має можливість за допомогою зручного інтерфейсу одним кліком миші вирішувати системи лінійних рівнянь методом Гауса, Крамера та матричним методом, знаходити визначник матриці та знаходити для заданої матриці зворотну. Тип задачі обирається на головній сторінці програми «Есть решение!» (рис. 2.1). Після вибору типу задачі відкривається окрема форма з вибраним модулем.
Для кожного з типу задач розроблена можливість обирати розмірність матриці від 2х2 до 5х5. Користувач може заповнювати, змінювати та очищувати поля, що призначені для вводу коефіцієнтів матриці та, у випадку систем лінійних рівнянь, вільних членів рівняння. Якщо користувач допустить помилку при заповненні даних для задачі, або залишить певні поля порожніми, програма сповістить його про це.
Рисунок 2.1 – Головна сторінка програми «Есть решение!»
Після заповнення даних для задачі користувач одним кліком миші отримує рішення у зручній формі, яке виводиться у додаток, але за бажанням користувач для підвищення сприйняття може зберегти рішення в форматі текстового документу.
Для кожного типу задач, що представлені в програмі «Есть решение!», користувач може отримати довідкову інформацію, що викликається у модулі кожного типу задач та надається у формі текстового документу.
При виході з програми та кожного модуля користувач попереджається відповідним повідомленням задля уникнення втрати даних.
Дана розробка є відправною точкою на шляху до полегшення навчання студентів з дисципліни «Чисельні методи» з тем, що стосуються методів вирішення систем лінійних рівнянь та виконання операцій над матрицями.
Основна структура програмного продукту представлена на рисунку 2.2.
Рисунок 2.2 – Структура програмного продукту
Ключові переваги програми «Есть решение!»:
надійність розрахунків;
простота інтерфейсу користувача;
висока швидкість виконання розрахунків;
висока деталізація відображення ходу розв’язання задач.
Загальні обмеження:
5 мб вільного місця на диску;
від 256 Мб оперативної пам’яті;
відео-карта з підтримкою DirectX 9 і 64 Мб графічної пам'яті;
монітор, з розширенням не менш 800х600;
клавіатура, миша;
операційні система Windows 7 і вище;
Microsoft .Net Framework 4.5;
Microsoft Visual C++ Redistributable.
2.2 Структура і функціональне призначення модулів програмного продукту
Програма «Есть решение!» складається з декількох модулів, які показані на рисунку 2.3.
Рисунок 2.3 – Модулі програми «Есть решение!»
Головний модуль програми – модуль «MainMenu», що описує головну форму програми. Цей модуль є своєрідним «скелетом» програми, тому що об’єднує всі модулі програми в один налагоджений механізм. В ньому описуються зв’язки між головною та іншими формами програми, описані компоненти, за допомогою яких вони викликаються, та інші елементи інтрефейсу форми. Код форми «MainMenu» показаний на рисунку 2.4.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;
using System.Diagnostics;
namespace Диплом
{public partial class MainMenu : Form
{static public int[] Control = new int[6];
public MainMenu()
{InitializeComponent();}
private void button1_Click(object sender, EventArgs e)
{if (Control[0] == 0)
{Gauss f2 = new Gauss();
f2.Show();
Control[0] = 1; } }
private void button2_Click(object sender, EventArgs e)
{if (Control[1] == 0)
{Kramer f3 = new Kramer();
f3.Show();
Control[1] = 1; }}
private void button3_Click(object sender, EventArgs e)
{if (Control[2] == 0)
{Matrix f4 = new Matrix();
f4.Show();
Control[2] = 1;} }
private void button4_Click(object sender, EventArgs e)
{if (Control[3] == 0)
{Determinant f5 = new Determinant();
f5.Show();
Control[3] = 1;}}
private void button5_Click(object sender, EventArgs e)
{if (Control[4] == 0)
{InventMatrix f6 = new InventMatrix();
f6.Show();
Control[4] = 1;} }
private void MainMenu_FormClosing(object sender, FormClosingEventArgs e)
{DialogResult result = MessageBox.Show("Вы точно хотите выйти?", "Выход из программы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{e.Cancel = true;} }
private void button6_Click(object sender, EventArgs e)
{Process.Start(@"О программе.docx");}}}
Рисунок 2.4 – Код форми MainMenu
Інші модулі програми, що призначені для обчислень, мають між собою схожу структуру. Після завантаження кожної форми для вирішення певного типу задачі користувач обирає розмірність матриці. В залежності від обраного розміру, що відповідає певному елементу випадаючого списку, на формі динамічно створюється необхідна кількість полів для вводу даних, що відповідає кількості коефіцієнтів матриці та, у випадку з системами лінійних рівнянь, до цієї кількості додається стовпець вільних членів. В залежності від кількості полів для вводу змінюється розмір поля для виводу рішення. Після вводу даних та кліку на кнопку «Решить» запускається метод з алгоритмом для вирішення цього типу задачі, в ході якого поле для виводу рішення заповнюється даними, що описують беспосередньо процес рішення. Якщо користувач натискає кнопку «Сохранить», то всі дані з поля для виведення рішення копіюються в файл формату «.rtf.». Якщо користувач натискає кнопку «Очистить», то викликається метод, що очищає всі текстові елементи на формі. При натисканні на кнопку «Справка» викликається метод, що відкріває довідку через програму «WordPad» або «Microsoft Office Word».
Модуль «Gauss» призначений для вирішення систем лінійних рівнянь методом Гауса. Цей модуль описує окрему форму, що містить алгоритм для вирішення рівнянь різної розмірності. Лістинг форми показаний на рисунку 2.5.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Диплом
{public partial class Gauss : Form
{int MatrixSize = 2, Row, Cell, PreviousMatrixSize, Control = 1, BeginXPosition, ExitOrNot;
float[,] MatrixMembers;
TextBox[,] Koefficients = new TextBox[5, 5];
TextBox[] Freemembers = new TextBox[5];
public Gauss()
{InitializeComponent();}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{MatrixSize = comboBox1.SelectedIndex + 2;
if (MatrixSize != PreviousMatrixSize)
{richTextBox1.Text = "";
if (Control == 1)
{for (Row = 0; Row < PreviousMatrixSize; Row++)
{for (Cell = 0; Cell < PreviousMatrixSize; Cell++)
{this.Controls.Remove(Koefficients[Row, Cell]);
Koefficients[Row, Cell].Dispose();}}
for (Row = 0; Row < PreviousMatrixSize; Row++)
{this.Controls.Remove(Freemembers[Row]);
Freemembers[Row].Dispose();}}
BeginXPosition = 125 - ((30 * MatrixSize + 15 * (MatrixSize - 1)) / 2);
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{Koefficients[Row, Cell] = new TextBox();
Koefficients[Row, Cell].Width = 30;
Koefficients[Row, Cell].Height = 30;
Koefficients[Row, Cell].Location = new Point(45 * Row + BeginXPosition, 35 * Cell + 45);
Koefficients[Row, Cell].Name = "Textbox " + Row.ToString() + Cell.ToString();
Koefficients[Row, Cell].TextAlign = HorizontalAlignment.Center;
this.Controls.Add(Koefficients[Row, Cell]);} }
for (Row = 0; Row < MatrixSize; Row++)
{Freemembers[Row] = new TextBox();
Freemembers[Row].Width = 30;
Freemembers[Row].Height = 30;
Freemembers[Row].Location = new Point(265, 35 * Row + 45);
Freemembers[Row].Name = "Textbox " + Row.ToString() + Cell.ToString();
Freemembers[Row].TextAlign = HorizontalAlignment.Center;
this.Controls.Add(Freemembers[Row]);}
label4.Location = new Point(240, 35 * MatrixSize + 45);
richTextBox1.Location = new Point(5, 35 * MatrixSize + 65);
richTextBox1.Size = new Size(525, 490 - (35 * MatrixSize + 105)); }
label2.Location = new Point(125 - 42, 5);
Control = 1;
PreviousMatrixSize = MatrixSize;}
private void button2_Click(object sender, EventArgs e)
{for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{Koefficients[Cell, Row].Text = "";
Freemembers[Row].Text = "";}}
richTextBox1.Text = "";}
private void Gauss_Load(object sender, EventArgs e)
{comboBox1.SelectedIndex = 0; }
private void button1_Click(object sender, EventArgs e)
{richTextBox1.Text = "";
float[,] MatrixMembers = new float[MatrixSize, MatrixSize + 1];
float Value;
float[] Temp = new float[MatrixSize + 1];
string[] Description = { "Общий", "Первый", "Второй", "Третий", "Четвертый", "Пятый" };
int Iteration, IsEmptyM, IsEmptyF, Counteri, Counterj;
int Cell1, Cell2, Cell3, Cell4, Cell5, Row1, Row2, Row3, Counter;
float[] opr = new float[MatrixSize + 1];
float[] opr4 = new float[MatrixSize + 1];
float[] opr5 = new float[MatrixSize + 1];
IsEmptyM = 0;
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{if (Koefficients[Cell, Row].Text == "") IsEmptyM = 1;} }
IsEmptyF = 0;
for (Row = 0; Row < MatrixSize; Row++)
{if (Freemembers[Row].Text == "") IsEmptyF = 1; }
………………………………………………………….
private void button3_Click(object sender, EventArgs e)
{Process.Start(@"Метод Гаусса.docx");}
private void Gauss_FormClosing(object sender, FormClosingEventArgs e)
{DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{e.Cancel = true;}}}}
Рисунок 2.5 – Лістинг форми «Gauss»
Модуль «Kramer» призначений для вирішення систем лінійних рівнянь методом Крамера. Цей модуль описує окрему форму, що містить алгоритм для вирішення рівнянь різної розмірності. Лістинг форми показаний на рисунку 2.6.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Диплом
{public partial class Kramer : Form
{int MatrixSize = 2, Row, Cell, PreviousMatrixSize, Control = 1, BeginXPosition, ExitOrNot;
TextBox[,] Koefficients = new TextBox[5, 5];
TextBox[] Freemembers = new TextBox[5];
public Kramer()
{InitializeComponent();}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{MatrixSize = comboBox1.SelectedIndex + 2;
if (MatrixSize != PreviousMatrixSize)
{richTextBox1.Text = "";
if (Control == 1)
{for (Row = 0; Row < PreviousMatrixSize; Row++)
{for (Cell = 0; Cell < PreviousMatrixSize; Cell++)
{this.Controls.Remove(Koefficients[Row, Cell]);
Koefficients[Row, Cell].Dispose();}}
for (Row = 0; Row < PreviousMatrixSize; Row++)
{this.Controls.Remove(Freemembers[Row]);
Freemembers[Row].Dispose();}}
BeginXPosition = 125 - ((30 * MatrixSize + 15 * (MatrixSize - 1)) / 2);
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{Koefficients[Row, Cell] = new TextBox();
Koefficients[Row, Cell].Width = 30;
Koefficients[Row, Cell].Height = 30;
Koefficients[Row, Cell].Location = new Point(45 * Row + BeginXPosition, 35 * Cell + 45);
Koefficients[Row, Cell].Name = "Textbox " + Row.ToString() + Cell.ToString();
Koefficients[Row, Cell].TextAlign = HorizontalAlignment.Center;
this.Controls.Add(Koefficients[Row, Cell]);}}
for (Row = 0; Row < MatrixSize; Row++)
{Freemembers[Row] = new TextBox();
Freemembers[Row].Width = 30;
Freemembers[Row].Height = 30;
Freemembers[Row].Location = new Point(265, 35 * Row + 45);
{
for (Row = 0; Row < MatrixSize; Row++)
{
Solution[Row] = MatrixMembers[Row, 0];
MatrixMembers[Row, 0] = FreeMembersVector[Row];}}
if (Iteration > 0 && Iteration < MatrixSize)
{for (Row = 0; Row < MatrixSize; Row++)
{MatrixMembers[Row, Iteration - 1] = Solution[Row];
Solution[Row] = MatrixMembers[Row, Iteration];
MatrixMembers[Row, Iteration] = FreeMembersVector[Row];}}}
if (opr5[0] != 0)
{for (Iteration = 1; Iteration < MatrixSize + 1; Iteration++)
{x[Iteration - 1] = opr5[Iteration] / opr5[0];
richTextBox1.Text += "\n\nx" + Iteration.ToString() + " = " + opr5[Iteration].ToString() + " / " + opr5[0].ToString() + " = " + Math.Round(x[Iteration - 1], 3) + "\n";}}}}}
……………………………………………………………
else MessageBox.Show("Заполните все поля!");}
private void button2_Click(object sender, EventArgs e)
{for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{Koefficients[Cell, Row].Text = "";
Freemembers[Row].Text = "";}}
richTextBox1.Text = "";}
private void Kramer_Load(object sender, EventArgs e)
{comboBox1.SelectedIndex = 0;}
private void button4_Click(object sender, EventArgs e)
{if (richTextBox1.Text != "")
{SaveFileDialog saveFile1 = new SaveFileDialog();
saveFile1.DefaultExt = "*.rtf";
saveFile1.Filter = "RTF Files|*.rtf";
if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK && saveFile1.FileName.Length > 0)
{richTextBox1.SaveFile(saveFile1.FileName, RichTextBoxStreamType.PlainText);}}
else
{MessageBox.Show("Нечего сохранять!");}}
private void Kramer_FormClosed(object sender, FormClosedEventArgs e)
{MainMenu.Control[1] = 0;}
private void button3_Click(object sender, EventArgs e)
{Process.Start(@"Метод Крамера.docx");}
private void Kramer_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{e.Cancel = true;}}}}
Рисунок 2.6 – Лістинг форми «Kramer»
Модуль «Matrix» призначений для вирішення систем лінійних рівнянь матричним методом. Цей модуль описує окрему форму, що містить алгоритм для вирішення рівнянь різної розмірності. Лістинг форми показаний на рисунку 2.7.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Диплом
{
public partial class Matrix : Form
{
int MatrixSize = 2, Row, Cell, PreviousMatrixSize, Control = 1, BeginXPosition, ExitOrNot;
TextBox[,] Koefficients = new TextBox[5, 5];
TextBox[] Freemembers = new TextBox[5];
public Matrix()
{InitializeComponent();}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{MatrixSize = comboBox1.SelectedIndex + 2;
if (MatrixSize != PreviousMatrixSize)
{
richTextBox1.Text = "";
if (Control == 1)
{for (Row = 0; Row < PreviousMatrixSize; Row++)
{for (Cell = 0; Cell < PreviousMatrixSize; Cell++)
{this.Controls.Remove(Koefficients[Row, Cell]);
Koefficients[Row, Cell].Dispose();}}
for (Row = 0; Row < PreviousMatrixSize; Row++)
{this.Controls.Remove(Freemembers[Row]);
Freemembers[Row].Dispose();}}
BeginXPosition = 125 - ((30 * MatrixSize + 15 * (MatrixSize - 1)) / 2);
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{Koefficients[Row, Cell] = new TextBox();
Koefficients[Row, Cell].Width = 30;
Koefficients[Row, Cell].Height = 30;
Koefficients[Row, Cell].Location = new Point(45 * Row + BeginXPosition,
35 * Cell + 45);
Koefficients[Row, Cell].Name = "Textbox " + Row.ToString() + Cell.ToString();
Koefficients[Row, Cell].TextAlign = HorizontalAlignment.Center;
this.Controls.Add(Koefficients[Row, Cell]);}}
for (Row = 0; Row < MatrixSize; Row++)
{
Freemembers[Row] = new TextBox();
Freemembers[Row].Width = 30;
Freemembers[Row].Height = 30;
Freemembers[Row].Location = new Point(265, 35 * Row + 45);
Freemembers[Row].Name = "Textbox " + Row.ToString() + Cell.ToString();
Freemembers[Row].TextAlign = HorizontalAlignment.Center;
this.Controls.Add(Freemembers[Row]);}
label4.Location = new Point(240, 35 * MatrixSize + 45);
richTextBox1.Location = new Point(5, 35 * MatrixSize + 65);
richTextBox1.Size = new Size(525, 490 - (35 * MatrixSize + 105));}
label2.Location = new Point(125 - 42, 5);
Control = 1;
PreviousMatrixSize = MatrixSize;}
……………………………………………………………
for (j = 0; j < MatrixSize; j++)
{
richTextBox1.Text += Math.Round(A[i, j], 3).ToString() + "*" + B[j].ToString();
if (j != MatrixSize - 1) richTextBox1.Text += "+";}
richTextBox1.Text += " = " + Math.Round(x[i], 3).ToString() + "\n\n";}}}}
else MessageBox.Show("Заполните все поля!");}
private void button4_Click(object sender, EventArgs e)
{
if (richTextBox1.Text != "")
{SaveFileDialog saveFile1 = new SaveFileDialog();
saveFile1.DefaultExt = "*.rtf";
saveFile1.Filter = "RTF Files|*.rtf";
if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK && saveFile1.FileName.Length > 0)
{richTextBox1.SaveFile(saveFile1.FileName,RichTextBoxStreamType.PlainText);}}
else{MessageBox.Show("Нечего сохранять!");}}
private void Matrix_FormClosed(object sender, FormClosedEventArgs e)
{MainMenu.Control[2] = 0;}
private void button3_Click(object sender, EventArgs e)
{Process.Start(@"Матричный метод.docx");}
private void Matrix_FormClosing(object sender, FormClosingEventArgs e)
{DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;}}}}
Рисунок 2.7 – Лістинг форми «Matrix»
Модуль «Determinant» призначений для знаходження визначника матриці. Цей модуль описує окрему форму, що містить алгоритм для знаходження визначника матриць різної розмірності. Лістинг форми показаний на рисунку 2.8.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Диплом
{public partial class Determinant : Form
{TextBox[,] Koefficients = new TextBox[5, 5];
int MatrixSize = 2, Row, Cell, PreviousMatrixSize, Control = 1, BeginXPosition, ExitOrNot;
public Determinant(){InitializeComponent();}
private void Form5_Load(object sender, EventArgs e)
{comboBox1.SelectedIndex = 0;}
private void button4_Click(object sender, EventArgs e)
{if (richTextBox1.Text != "")
{SaveFileDialog saveFile1 = new SaveFileDialog();
saveFile1.DefaultExt = "*.rtf";
saveFile1.Filter = "RTF Files|*.rtf";
if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK && saveFile1.FileName.Length > 0)
{richTextBox1.SaveFile(saveFile1.FileName, RichTextBoxStreamType.PlainText);}}
else{MessageBox.Show("Нечего сохранять!");}}
private void button1_Click(object sender, EventArgs e)
{richTextBox1.Text = "";
float[,] MatrixMembers = new float[MatrixSize, MatrixSize + 1];
float Value, opr = 1;
int Iteration, IsEmptyM, Counteri, Counterj;
IsEmptyM = 0;
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{if (Koefficients[Cell, Row].Text == "") IsEmptyM = 1;}}
if (IsEmptyM == 0)
{ExitOrNot = 0;
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{try
{MatrixMembers[Row, Cell] = Convert.ToSingle(Koefficients[Cell, Row].Text);}
catch
{ExitOrNot = 1;}}}
if (ExitOrNot == 1) MessageBox.Show("Неверный формат введенных чисел! Проверьте правильность введенных данных! Bводить можно только цифры от 0 до 9, знак минус и запятую");
if (ExitOrNot == 0)
{richTextBox1.Text += "Имеем матрицу\n\n";
for (Counteri = 0; Counteri < MatrixSize; Counteri++)
{richTextBox1.Text += "\t";
for (Counterj = 0; Counterj < MatrixSize; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";}
richTextBox1.Text += "\n\n";}
for (Row = 0; Row < MatrixSize; Row++)
{for (Iteration = 0; Iteration < Row; Iteration++)
{if (MatrixMembers[Row, Iteration] != 0)
{Value = (-MatrixMembers[Row, Iteration]) / MatrixMembers[Iteration, Iteration];
richTextBox1.Text += "\n\nУмножим " + (Iteration + 1).ToString() + " строку на " + Math.Round(Value, 3) + " и сложим ее с " + (Row + 1).ToString() + " строкой\n\n";
for (Cell = 0; Cell < MatrixSize; Cell++)
{MatrixMembers[Row, Cell] = MatrixMembers[Row, Cell] + MatrixMembers[Iteration, Cell] * Value;}
for (Counteri = 0; Counteri < MatrixSize; Counteri++)
{richTextBox1.Text += "\t";
for (Counterj = 0; Counterj < MatrixSize; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";}
richTextBox1.Text += "\n\n";}}}}
……………………………………………………………
Koefficients[Row, Cell].TextAlign = HorizontalAlignment.Center;
this.Controls.Add(Koefficients[Row, Cell]);}}
label4.Location = new Point(240, 35 * MatrixSize + 45);
richTextBox1.Location = new Point(5, 35 * MatrixSize + 65);
richTextBox1.Size = new Size(525, 490 - (35 * MatrixSize + 105));}
label2.Location = new Point(157 - 42, 5);
Control = 1;
PreviousMatrixSize = MatrixSize;}
private void Determinant_FormClosed(object sender, FormClosedEventArgs e) {MainMenu.Control[3] = 0;}
private void button3_Click(object sender, EventArgs e)
{Process.Start(@"Нахождение определителя.docx");}
private void Determinant_FormClosing(object sender, FormClosingEventArgs e)
{DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{e.Cancel = true;}}}}
Рисунок 2.8 – Лістинг форми «Determinant»
Модуль «InventMatrix» призначений для знаходження зворотної матриці. Цей модуль описує окрему форму, що містить алгоритм для знаходження зворотних матриць для матриць різної розмірності. Лістинг форми показаний на рисунку 2.9.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
namespace Диплом
{public partial class InventMatrix : Form
{TextBox[,] Koefficients = new TextBox[5, 5];
int MatrixSize = 2, Row, Cell, PreviousMatrixSize, Control = 1, BeginXPosition, ExitOrNot;
public InventMatrix()
{InitializeComponent();}
private void button1_Click(object sender, EventArgs e)
{richTextBox1.Text = "";
float[,] MatrixMembers = new float[MatrixSize, MatrixSize*2];
float Value;
float[] Temp = new float[MatrixSize + 1];
string[] Description = { "Общий", "Первый", "Второй", "Третий", "Четвертый", "Пятый" };
int Iteration, IsEmptyM, IsEmptyF, Counteri, Counterj;
int Cell1, Cell2, Cell3, Cell4, Cell5, Row1, Row2, Row3, Counter;
float[] opr = new float[MatrixSize + 1];
float[] opr4 = new float[MatrixSize + 1];
float[] opr5 = new float[MatrixSize + 1];
IsEmptyM = 0;
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{if (Koefficients[Cell, Row].Text == "") IsEmptyM = 1;}}
IsEmptyF = 0;
if (IsEmptyM == 0 && IsEmptyF == 0)
{ExitOrNot = 0;
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{try
{MatrixMembers[Row, Cell] = Convert.ToSingle(Koefficients[Cell, Row].Text);}
catch {ExitOrNot = 1;}}}
if (ExitOrNot == 1) MessageBox.Show("Неверный формат введенных чисел! Проверьте правильность введенных данных! Bводить можно только цифры от 0 до 9, знак минус и запятую");
if (ExitOrNot == 0)
{richTextBox1.Text += "Имеем начальную матрицу\n\n";
for (Counteri = 0; Counteri < MatrixSize; Counteri++)
{richTextBox1.Text += "\t";
for (Counterj = 0; Counterj < MatrixSize; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";}
richTextBox1.Text += "\n\n";}
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = MatrixSize; Cell < MatrixSize * 2; Cell++)
{MatrixMembers[Row, Cell] = 0;
if (Row == Cell - MatrixSize) MatrixMembers[Row, Cell] = 1;}}
richTextBox1.Text += "Чтобы найти обратную матрицу, допишем к данной матрице справа единичную\n\n";
for (Counteri = 0; Counteri < MatrixSize; Counteri++)
{richTextBox1.Text += "\t";
for (Counterj = 0; Counterj < MatrixSize * 2; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";
if (Counterj == MatrixSize - 1) richTextBox1.Text += "|\t";}
richTextBox1.Text += "\n\n";}
if (MatrixSize == 2)
{opr[0] = MatrixMembers[0, 0] * MatrixMembers[1, 1] - MatrixMembers[1, 0] * MatrixMembers[0, 1];
if (opr[0] == 0)
{richTextBox1.Text += "\n\nОпределитель матрицы равен нулю, соответственно данная матрица вырожденная и не имеет обратной";}}
if (MatrixSize == 3)
……………………………………………………………
richTextBox1.Location = new Point(5, 35 * MatrixSize + 65);
richTextBox1.Size = new Size(525, 490 - (35 * MatrixSize + 105));}
label2.Location = new Point(157 - 42, 5);
Control = 1;
PreviousMatrixSize = MatrixSize;}
private void InventMatrix_FormClosed(object sender, FormClosedEventArgs e){MainMenu.Control[4] = 0;}
private void button3_Click(object sender, EventArgs e)
{Process.Start(@"Нахождение обратной матрицы.docx");}
private void InventMatrix_FormClosing(object sender, FormClosingEventArgs e)
{DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{e.Cancel = true;}}}}
Рисунок 2.9 – Лістинг форми «InventMatrix»
