- •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.1.4 Визначення основних термінів програмного продукту
- •1.2 Розробка sadt-діаграми
- •1.2.1 Виділення та опис бізнес-процесів програмного продукту
- •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.2 Діаграма класів
- •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 Розрахунок капітальних витрат на створення програмного продукту
- •3.2 Розрахунок річної економії поточних витрат
- •4 Розділ з охорони праці
- •4.1 Теоретична частина
- •4.1.1 Вимоги до освітлення
- •4.1.2 Вимоги до магнітних випромінювань
- •4.1.3 Організація робочого простору
- •4.1.4 Вимоги до електробезпеки
- •4.1.5 Вимоги до пожежної безпеки
- •4.1.6 Вимоги до режиму праці і відпочинку
- •4.2 Практична частина
- •4.2.1 Оцінка категорії важкості праці
- •4.2.2 Оздоровлення повітря робочої зони
- •4.2.3 Захист від шуму та вібрації
- •5 Результативний розділ
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», що описує головну форму програми. Цей модуль є своєрідним «скелетом» програми, тому що об’єднує всі модулі програми в один налагоджений механізм. В ньому описуються зв’язки між головною та іншими формами програми, описані компоненти, за допомогою яких вони викликаються, та інші елементи інтрефейсу форми.
На рисунку 2.4 представлена процедура для виклику форми, що призначена для вирішення систем лінійних рівнянь методом Гауса.
private void button1_Click(object sender, EventArgs e)
{
if (Control[0] == 0)
{
Gauss f2 = new Gauss();
f2.Show();
Control[0] = 1;
}
}
Рисунок 2.4 – Процедура виклику модуля з методом Гауса
На рисунку 2.5 представлена процедура, що викликає форму, що призначена для вирішення систем лінійних рівнянь методом Крамера.
private void button2_Click(object sender, EventArgs e)
{
if (Control[1] == 0)
{
Kramer f3 = new Kramer();
f3.Show();
Control[1] = 1;
}
}
Рисунок 2.5 – Процедура виклику з методом Крамера
На рисунку 2.6 представлена процедура, що викликає форму, яка призначена для вирішення систем лінійних рівнянь матричним методом.
private void button3_Click(object sender, EventArgs e)
{
if (Control[2] == 0)
{
Matrix f4 = new Matrix();
f4.Show();
Control[2] = 1;
}
}
Рисунок 2.6 – Процедура виклику з матричним методом
На рисунку 2.7 представлена процедура, яка забезпечуэ виклик форми, що призначена для знахождення визначника матриці.
private void button4_Click(object sender, EventArgs e)
{
if (Control[3] == 0)
{
Determinant f5 = new Determinant();
f5.Show();
Control[3] = 1;
}
}
Рисунок 2.7 – Процедура виклику модуля знаходження визначника
На рисунку 2.8 представлена процедура, для виклику форми, що призначена для знаходження зворотної матриці.
private void button5_Click(object sender, EventArgs e)
{
if (Control[4] == 0)
{
InventMatrix f6 = new InventMatrix();
f6.Show();
Control[4] = 1;
}
}
Рисунок 2.8 – Процедура виклику модуля знаходження зворотної матриці
На рисунку 2.9 представлена процедура виклику довідки про програму.
private void button6_Click(object sender, EventArgs e)
{
Process.Start(@"О программе.docx");
}
Рисунок 2.9 - Процедура виклику довідки про програму
На рисунку 2.10 представлена процедура виходу з програми.
private void MainMenu_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Вы точно хотите выйти?", "Выход из программы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.10 – Процедура виходу з програми
Інші модулі програми, ті, що призначені для обчислень, мають між собою схожу структуру. Після завантаження кожної форми для вирішення певного типу задачі користувач обирає розмірність матриці. В залежності від обраного розміру, що відповідає певному елементу випадаючого списку, на формі динамічно створюється необхідна кількість полів для вводу даних, що відповідає кількості коефіцієнтів матриці та, у випадку з системами лінійних рівнянь, до цієї кількості додається стовпець вільних членів. В залежності від кількості полів для вводу змінюється розмір поля для виводу рішення. Після вводу даних та кліку на кнопку «Решить» запускається метод з алгоритмом для вирішення цього типу задачі, в ході якого поле для виводу рішення заповнюється даними, що описують беспосередньо процес рішення. Якщо користувач натискає кнопку «Сохранить», то всі дані з поля для виведення рішення копіюються в файл формату «.rtf.». Якщо користувач натискає кнопку «Очистить», то викликається метод, що очищає всі текстові елементи на формі. При натисканні на кнопку «Справка» викликається метод, що відкріває довідку через програму «WordPad» або «Microsoft Office Word».
Модуль «Gauss» призначений для вирішення систем лінійних рівнянь методом Гауса. Цей модуль описує окрему форму, що містить алгоритм для вирішення рівнянь різної розмірності.
На рисунку 2.11 представлено процедуру зміни розмірності матриці. Вона однакова для модулів «Gauss», «Kramer» та «Matrix».
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;}
Рисунок 2.11 – Процедура зміни розмірності матриці
На рисунку 2.12 зображено процедуру очищення всіх текстових елементів форми. Вона однакова для модулів «Gauss», «Kramer» та «Matrix».
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 = "";
}
Рисунок 2.12 – Процедура очищення всіх текстових компонентів на формі
На рисунку 2.13 представлено процедуру завантаження форми «Gauss».
private void Gauss_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
Рисунок 2.13 – Процедура завантаження форми «Gauss».
На рисунку 2.14 представлена процедура вирішення системи лінійних рівнянь методом Гауса, в ході якого рішення виводиться в текстове поле.
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;}
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;}}}
for (Row = 0; Row < MatrixSize; Row++)
{try
{MatrixMembers[Row, MatrixSize] = Convert.ToSingle(Freemembers[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 + 1; 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)
{Cell1 = 0; Cell2 = 0;
for (Cell = 0; Cell < MatrixSize; Cell++)
{if (Cell == 0) { Cell1 = 1; Cell2 = 2; }
if (Cell == 1) { Cell1 = 0; Cell2 = 2; }
if (Cell == 2) { Cell1 = 0; Cell2 = 1; }
opr[0] += MatrixMembers[0, Cell] * Convert.ToSingle(Math.Pow(-1, Cell + 2)) * (MatrixMembers[1, Cell1] * MatrixMembers[2, Cell2] - MatrixMembers[2, Cell1] * MatrixMembers[1, Cell2]);}
if (opr[0] == 0)
{richTextBox1.Text += "\n\nОпределитель матрицы равен нулю. Решений нет";}}
………………………………………………………..
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";
if (Counterj == MatrixSize - 1) richTextBox1.Text += "|\t";}
richTextBox1.Text += "\n\n";}}}
for (Row = MatrixSize - 1; Row >= 0; Row--)
{for (Iteration = MatrixSize - 1; 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 + 1; 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 + 1; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";
if (Counterj == MatrixSize - 1) richTextBox1.Text += "|\t";}
richTextBox1.Text += "\n\n";}}}}
for (Row = 0; Row < MatrixSize; Row++)
{richTextBox1.Text += "\n\n\tx" + (Row + 1).ToString() + " = " + Math.Round(MatrixMembers[Row, MatrixSize], 3);}}}}
else MessageBox.Show("Заполните все поля!");}
Рисунок 2.14 – Процедура вирішення системи лінійних рівнянь методом Гауса
На рисунку 2.15 представлена процедура збереження результату рішення до текстового файлу. Ця процедура однакова для модулів «Gauss», «Kramer», «Matrix», «Determinant» та «InventMatrix».
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("Нечего сохранять!");}}
Рисунок 2.15 – Процедура збереження результату рішення
На рисунку 2.16 представлено процедуру закриття форми «Gauss».
private void Gauss_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.16 – Закриття форми «Gauss»
На рисунку 2.17 представлено процедуру виклику довідку про метод Гауса.
private void button3_Click(object sender, EventArgs e)
{
Process.Start(@"Метод Гаусса.docx");
}
Рисунок 2.17 – Процедура виклику довідки про метод Гауса
На рисунку 2.18 представлено процедуру, що викликається після закриття форми «Gauss» та знімає блокування її повторного виклику, що застосовується для уникнення відкриття безлічі дублікатів форми.
private void Gauss_FormClosed(object sender, FormClosedEventArgs e)
{
MainMenu.Control[0] = 0;
}
Рисунок 2.18 – Процедура, що знімає заборону на повторне відкриття форми «Gauss»
Модуль «Kramer» призначений для вирішення систем лінійних рівнянь методом Крамера. Цей модуль описує окрему форму, що містить алгоритм для вирішення рівнянь різної розмірності.
На рисунку 2.19 представлено процедуру завантаження форми «Kramer».
private void Kramer_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
Рисунок 2.19 – Процедура завантаження форми «Kramer».
На рисунку 2.20 представлена процедура вирішення системи лінійних рівнянь методом Крамера, в ході якого рішення виводиться в текстове поле.
private void button1_Click(object sender, EventArgs e)
{richTextBox1.Text = "";
float[,] MatrixMembers = new float[MatrixSize, MatrixSize];
float[] FreeMembersVector = new float[MatrixSize];
float[] Replace = new float[MatrixSize];
float[] Solution = new float[MatrixSize];
float[] opr = new float[MatrixSize + 1];
float[] opr4 = new float[MatrixSize + 1];
float[] opr5 = new float[MatrixSize + 1];
float[] x = new float[MatrixSize];
string[] Description = { "Общий", "Первый", "Второй", "Третий", "Четвертый", "Пятый" };
int Cell1, Cell2, Cell3, Cell4, Cell5, Iteration, IsEmptyM, IsEmptyF, Row1, Row2, Row3, Counter;
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;}
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;}}}
for (Row = 0; Row < MatrixSize; Row++)
{try
{FreeMembersVector[Row] = Convert.ToSingle(Freemembers[Row].Text);}
catch
{ExitOrNot = 1;}}
if (ExitOrNot == 1) MessageBox.Show("Неверный формат введенных чисел! Проверьте правильность введенных данных! Bводить можно только цифры от 0 до 9, знак минус и запятую");
if (ExitOrNot == 0)
{if (MatrixSize == 2)
{for (Iteration = 0; Iteration < MatrixSize + 1; Iteration++)
{if (Iteration > 0) richTextBox1.Text += "Заменим " + Iteration.ToString() + " столбец столбцом свободных членов\n\n";
richTextBox1.Text += Description[Iteration] + " определитель матрицы\n\n";
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{richTextBox1.Text += "\t" + MatrixMembers[Row, Cell].ToString() + "\t";}
richTextBox1.Text += "\n\n";}
opr[Iteration] = MatrixMembers[0, 0] * MatrixMembers[1, 1] - MatrixMembers[1, 0] * MatrixMembers[0, 1];
richTextBox1.Text += "равен " + MatrixMembers[0, 0].ToString() + "*" + MatrixMembers[1, 1].ToString() + "-" + MatrixMembers[1, 0].ToString() + "*" + MatrixMembers[0, 1].ToString() + " = " + opr[Iteration].ToString() + "\n\n";
………………………………………………………..
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("Заполните все поля!");}
Рисунок 2.20 – Процедура вирішення системи лінійних рівнянь методом Крамера
На рисунку 2.21 представлено процедуру закриття форми «Kramer».
private void Kramer_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.21 – Закриття форми «Kramer»
На рисунку 2.22 представлено процедуру виклику довідки про метод Крамера.
private void button3_Click(object sender, EventArgs e)
{
Process.Start(@"Метод Крамера.docx");
}
Рисунок 2.22 – Процедура виклику довідки про метод Гауса
На рисунку 2.23 представлено процедуру, що викликається після закриття форми «Kramer» та знімає блокування її повторного виклику, що застосовується для уникнення відкриття безлічі дублікатів форми.
private void Kramer_FormClosed(object sender, FormClosedEventArgs e)
{
MainMenu.Control[1] = 0;
}
Рисунок 2.23 – Процедура, що знімає заборону на повторне відкриття форми «Kramer»
Модуль «Matrix» призначений для вирішення систем лінійних рівнянь матричним методом. Цей модуль описує окрему форму, що містить алгоритм для вирішення рівнянь різної розмірності.
На рисунку 2.24 представлено процедуру завантаження форми «Matrix».
private void Matrix_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
Рисунок 2.24 – Процедура завантаження форми «Matrix».
На рисунку 2.25 представлена процедура вирішення системи лінійних рівнянь матричним методом, в ході якого рішення виводиться в текстове поле.
private void button1_Click(object sender, EventArgs e)
{richTextBox1.Text = "";
float[,] A = new float[MatrixSize, MatrixSize];
float[,] M = new float[MatrixSize, MatrixSize];
float[,] Temp = new float[MatrixSize, MatrixSize];
float[] B = new float[MatrixSize];
float[] Solution = new float[MatrixSize];
float[] opr = new float[MatrixSize + 1];
float[] opr4 = new float[MatrixSize + 1];
float[] opr5 = new float[MatrixSize + 1];
float[] x = new float[MatrixSize];
int []CellNumber=new int[MatrixSize];
int []RowNumber=new int[MatrixSize];
int Cell1, Cell2, Cell3, Cell4, Cell5, Iteration, IsEmptyM, IsEmptyF, Row1, Row2, Row3, Counter,i,j;
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;}
if (IsEmptyM == 0 && IsEmptyF == 0)
{ExitOrNot = 0;
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{
try
{A[Row, Cell] = Convert.ToSingle(Koefficients[Cell, Row].Text);}
catch
{
ExitOrNot = 1;
}
}
}
for (Row = 0; Row < MatrixSize; Row++)
{try
{B[Row] = Convert.ToSingle(Freemembers[Row].Text);}
catch
{ExitOrNot = 1;}}
if (ExitOrNot == 1) MessageBox.Show("Неверный формат введенных чисел! Проверьте правильность введенных данных! Bводить можно только цифры от 0 до 9, знак минус и запятую");
if (ExitOrNot == 0)
{richTextBox1.Text = "Матрица А равна\n\n";
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{richTextBox1.Text += "\t" + A[Row, Cell].ToString() + "\t";}
richTextBox1.Text += "\n\n";}
richTextBox1.Text += "Матрица B равна\n\n";
for (Row = 0; Row < MatrixSize; Row++) richTextBox1.Text += "\t" + B[Row].ToString() + "\n\n";
if (MatrixSize == 2)
{
opr[0] = A[0, 0] * A[1, 1] - A[1, 0] * A[0, 1];
richTextBox1.Text += "Определитель матрицы А равен " + opr[0].ToString();
if (opr[0] == 0)
{richTextBox1.Text += "\n\nОпределитель матрицы равен нулю. Решений нет";}
else
{
richTextBox1.Text += "\n\nНайдем по формуле алгебраические дополнения для матрицы А";
for (Row = 0; Row < MatrixSize; Row++)
{for (Cell = 0; Cell < MatrixSize; Cell++)
{for (i = 0; i < MatrixSize; i++)
{if (i != Row) RowNumber[0] = i;}
for (j = 0; j < MatrixSize; j++)
{if (j != Cell) CellNumber[0] = j;}
………………………………………………………..
richTextBox1.Text += "Найдем матрицу, обратную матрице А\n\n";
for (Row = 0; Row < MatrixSize; Row++)
{
for (Cell = 0; Cell < MatrixSize; Cell++)
{
A[Row, Cell] = M[Row, Cell] / opr[0];
richTextBox1.Text += "\t" + Math.Round(A[Row, Cell], 3).ToString() + "\t";
}
richTextBox1.Text += "\n\n";
}
richTextBox1.Text += "Для нахождения решения перемножим обратную матрицу и матрицу свободных членов В\n\n";
for (i = 0; i < MatrixSize; i++)
{
for (Row = 0; Row < MatrixSize; Row++) x[i] += A[i, Row] * B[Row];
richTextBox1.Text += "x" + (i + 1).ToString() + " = ";
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("Заполните все поля!");
}
Рисунок 2.25 – Процедура вирішення системи лінійних рівнянь матричним методом
На рисунку 2.26 представлено процедуру закриття форми «Matrix».
private void Matrix_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.26 – Закриття форми «Matrix»
На рисунку 2.27 представлено процедуру виклику довідку про матричний метод.
private void button3_Click(object sender, EventArgs e)
{
Process.Start(@"Матриный метод.docx");
}
Рисунок 2.27 – Процедура виклику довідки про матричний метод
На рисунку 2.28 представлено процедуру, що викликається після закриття форми «Matrix» та знімає блокування її повторного виклику, що застосовується для уникнення відкриття безлічі дублікатів форми.
private void Matrix _FormClosed(object sender, FormClosedEventArgs e)
{
MainMenu.Control[2] = 0;
}
Рисунок 2.28 – Процедура, що знімає заборону на повторне відкриття форми «Matrix»
Модуль «Determinant» призначений для знаходження визначника матриці. Цей модуль описує окрему форму, що містить алгоритм для знаходження визначника матриць різної розмірності.
На рисунку 2.29 зображено процедуру очищення всіх текстових елементів форми. Вона однакова для модулів «Determinant», та «InventMatrix».
private void button2_Click(object sender, EventArgs e)
{
for (Row = 0; Row < MatrixSize; Row++)
{
for (Cell = 0; Cell < MatrixSize; Cell++)
{
Koefficients[Cell, Row].Text = "";
}
}
richTextBox1.Text = "";
}
Рисунок 2.29 – Процедура очищення всіх текстових компонентів на формі
На рисунку 2.30 представлено процедуру завантаження форми «Determinant».
private void Determinant_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
Рисунок 2.30 – Процедура завантаження форми «Determinant».
На рисунку 2.31 представлена процедура знаходження визначника матриці та виведення ходу цього процесу в текстове поле.
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";}}}}
richTextBox1.Text += "Определитель матрицы равен ";
for (Row = 0; Row < MatrixSize; Row++)
{opr *= MatrixMembers[Row, Row];
richTextBox1.Text += Math.Round(MatrixMembers[Row, Row], 3).ToString();
if (Row != MatrixSize - 1) richTextBox1.Text += "*";}
richTextBox1.Text += " = " + Math.Round(opr, 0).ToString();}}
else MessageBox.Show("Заполните все поля!");}
Рисунок 2.31 – Процедура знаходження визначника матриці
На рисунку 2.32 представлено процедуру закриття форми «Determinant».
private void Determinant_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.32 – Закриття форми «Determinant»
На рисунку 2.33 представлено процедуру виклику довідки про знаходження визначника матриці.
private void button3_Click(object sender, EventArgs e)
{
Process.Start(@"Определитель.docx");
}
Рисунок 2.33 – Процедура виклику довідки про знаходження визначника
На рисунку 2.34 представлено процедуру, що викликається після закриття форми «Determinant» та знімає блокування її повторного виклику, що застосовується для уникнення відкриття безлічі дублікатів форми.
private void Determinant _FormClosed(object sender, FormClosedEventArgs e)
{
MainMenu.Control[3] = 0;
}
Рисунок 2.34 – Процедура, що знімає заборону на повторне відкриття форми «Determinant»
Модуль «InventMatrix» призначений для знаходження зворотної матриці. Цей модуль описує окрему форму, що містить алгоритм для знаходження зворотних матриць для матриць різної розмірності.
На рисунку 2.35 представлено процедуру завантаження форми «InventMatrix».
private void InventMatrix_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
}
Рисунок 2.35 – Процедура завантаження форми «InventMatrix».
На рисунку 2.36 представлено процедуру виклику довідки про знаходження зворотної матриці.
private void button3_Click(object sender, EventArgs e)
{
Process.Start(@"Обратная матрица.docx");
}
Рисунок 2.36 – Процедура виклику довідки про знаходження визначника
На рисунку 2.37 представлена процедура знаходження зворотної матриці та виведення ходу цього процесу в текстове поле.
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";}
………………………………………………………..
richTextBox1.Text += "\n\nУмножим " + (Iteration + 1).ToString() + " строку на " + Math.Round(Value, 3) + " и сложим ее с " + (Row + 1).ToString() + " строкой\n\n";
for (Cell = 0; Cell < MatrixSize * 2; 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 * 2; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";
if (Counterj == MatrixSize - 1) richTextBox1.Text += "|\t";}
richTextBox1.Text += "\n\n";
}}}}
richTextBox1.Text += "Обратная матрица равна\n\n";
for (Counteri = 0; Counteri < MatrixSize; Counteri++)
{richTextBox1.Text += "\t";
for (Counterj = MatrixSize; Counterj < MatrixSize * 2; Counterj++)
{richTextBox1.Text += Math.Round(MatrixMembers[Counteri, Counterj], 3).ToString() + "\t";}
richTextBox1.Text += "\n\n";}}}}
else MessageBox.Show("Заполните все поля!");
}
Рисунок 2.37 – Процедура знаходження зворотної матриці
На рисунку 2.38 представлено процедуру закриття форми «InventMatrix».
private void InventMatrix _FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть окно?", "Закрытие формы", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.38 – Закриття форми «InventMatrix»
На рисунку 2.39 представлено процедуру, що викликається після закриття форми «InventMatrix» та знімає блокування її повторного виклику, що застосовується для уникнення відкриття безлічі дублікатів форми.
private void InventMatrix_FormClosed(object sender, FormClosedEventArgs e)
{
MainMenu.Control[4] = 0;
}
Рисунок 2.39 – Процедура, що знімає заборону на повторне відкриття форми «Determinant»
