4. Описание контрольного примера
Справка программы (Рис.1):
Рис.1
Пункт меню «О программе» (Рис.2):
Рис.2
Пример заполнения формы и получения результата вычислений (Рис.3):
Рис.3
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;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
//Переменная для хранения размера таблицы
int n;
public Form1()
{
InitializeComponent();
//Блокировка элементов Button2, Button3
button2.Enabled = false;
button3.Enabled = false;
}
private void button1_Click(object sender, EventArgs e)
{
//Инициализация n ,
//читаем из numericUpDown
n = Convert.ToInt32(numericUpDown1.Value);
//Добавляем, соответствующие размеру n, число строк и столбцов для DataGridView,
//где пользователь сможет вводить значения коэффициентов
//перед неизвестным и свободные члены
for (int i = 0; i < n; i++)
{
dataGridView1.Columns.Add("Коэффициент при X", "Коэффициент при X"); //Колонка
dataGridView1.Rows.Add(); //Ряд
}
//Добавляем столбец для свободных членов в DataGridView1
dataGridView1.Columns.Add("Свободный член", "Свободный член"); //Колонка
//Блокировка элемента numericUpDown1, Button1
numericUpDown1.ReadOnly = true;
button1.Enabled = false;
//Разблокировка элементов Button2, Button3, DataGridView1
button2.Enabled = true;
button3.Enabled = true;
dataGridView1.Enabled = true;
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
//Завершение работы программы по выбору пункта меню <Файл/Выход>
Application.Exit();
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
//Вывод на экран формы AboutBox1 по выбору пункта меню <Справка/О Программе>
AboutBox1 about = new AboutBox1();
about.Show();
}
private void button2_Click(object sender, EventArgs e)
{
//очистка полей ввода и вывода,
//удаление строк и столбцов из DataGridView1
while (dataGridView1.Rows.Count != 0)
{
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
}
while (dataGridView1.Columns.Count != 0)
{
dataGridView1.Columns.RemoveAt(dataGridView1.Columns.Count - 1);
}
//Очистка поля ввода TextBox1
numericUpDown1.Value = 2;
textBox2.Clear();
//Сбрасывание счётчика
n = 0;
//Разблокировка
numericUpDown1.ReadOnly = false;
button1.Enabled = true;
//Блокировка
button3.Enabled = false;
button2.Enabled = false;
}
private void contentsToolStripMenuItem_Click(object sender, EventArgs e)
{
//Открытие файла руководства пользователя
string fileName = "Manual.chm";
try
{
System.Diagnostics.Process.Start(fileName);
}
catch (Win32Exception)
{
MessageBox.Show(String.Format("Отсутствует файл справки программы: {0}", fileName), "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
catch
{
MessageBox.Show(String.Format("Произошла ошибка при открытии файла справки"), "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
//Очистка полей ввода и вывода,
//удаление строк и столбцов из DataGridView1
while (dataGridView1.Rows.Count != 0)
{
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);
}
while (dataGridView1.Columns.Count != 0)
{
dataGridView1.Columns.RemoveAt(dataGridView1.Columns.Count - 1);
}
//Обновление numericUpDown1, значением по умолчанию
numericUpDown1.Value=2;
//Очистка поля ввода TextBox1
textBox2.Clear();
//Сбрасывание счётчика
n = 0;
//Блокировка
button3.Enabled = false;
button2.Enabled = false;
//Разблокировка
button1.Enabled = true;
numericUpDown1.ReadOnly = false;
dataGridView1.Enabled = true;
}
private void button3_Click(object sender, EventArgs e)
{
//Проверка на заполненность DataGridView1, иначе запрет на продолжение
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (dataGridView1.Rows[i].Cells[j].Value == null )
{
MessageBox.Show("Невозможно продолжить работу программы. \n\rЗаполните матрицу.",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
Form1.ActiveForm.Refresh();
return;
}
}
}
//Проверка на корректность входных данных для таблицы
//DataGridView1, иначе запрет на продолжение
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
try
{
Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);
}
catch(Exception)
{
MessageBox.Show("Невозможно продолжить работу программы. \n\rНекорректные данные.",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
return;
}
}
}
double[] a = new double[n]; //одномерный массив a[],для вывода решения
double[] b = new double[n]; //одномерный массив b[],для последней колонки из DataGridView1
double[,] matrix = new double[n, n]; //матрица matrix[n x n],для таблицы DataGridView1, кроме последней колонки
//Инициализция matrix[][] элементами из DataGridView1
//без учета последней колонки
for(int i=0; i<n; i++) //i-строка
for (int j = 0; j < n; j++) //j-столбец
{
matrix[i, j] = Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);
}
//Инициализация b[] элементами последней колонки DataGridView1
for (int i = 0; i < n; i++)
{
//По одной колонке, номер n
int j = n;
b[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value);
}
//Блокировка DataGridView1 после того как все необходимые элементы инициализированы
dataGridView1.Enabled = false;
//Основа программы
//Метод Гаусса для решения СЛАУ
double temp = 0;
for (int i = 0; i < n; i++)
{
if (matrix[i, i] == 0)
{
for (int j = 0; j < n; j++)
{
if (j == i)continue;
if (matrix[j, i] != 0 && matrix[i, j] != 0)
{
for (int k = 0; k < n; k++)
{
temp = matrix[j, k];
matrix[j, k] = matrix[i, k];
matrix[i, k] = temp;
}
temp = b[j];
b[j] = b[i];
b[i] = temp;
break;
}
}
}
}
//Результат действий над матрицей matrix[][]
//Результат помещается в одномерный массив a[]
double s = 0;
for (int i = n - 1; i >= 0; i--)
{
for (int j = i; j < n; j++)
s += matrix[i, j] * a[j];
a[i] = (b[i] - s) / matrix[i, i];
}
//Вывод a[] в элемент TextBox2
for (int i = 0; i < n; i++)
{
textBox2.Text +="X = "+ a[i] + "\r\n";
}
button3.Enabled = false;
}
private void numericUpDown1_KeyPress(object sender, KeyPressEventArgs e)
{
//Обработка нажатий клавиш, не соответствующих
//входным параметрам
if (e.KeyChar == '0')
{
MessageBox.Show("Система должна содержать \n\rне менее двух уравнений.",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
e.KeyChar = '2';
return;
}
if (e.KeyChar == '1')
{
MessageBox.Show("Система должна содержать \n\rне менее двух уравнений.",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
e.KeyChar = '2';
return;
}
if (e.KeyChar == '-')
{
MessageBox.Show("Система должна содержать \n\rне менее двух уравнений.",
"Ошибка",
MessageBoxButtons.OK,
MessageBoxIcon.Error,
MessageBoxDefaultButton.Button1);
e.KeyChar = '2';
return;
}
}
}
}