Федеральное Агентство Связи Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования «Московский технический университет связи и информатики»
Центр заочного обучения по программам бакалавриата
Кафедра информатики
Выполнил: Иванов Иван, студент группы БСТ17хх
Содержание
1. Задание на разработку проекта и вариант задания 3
2. Формализация и уточнение задания 4
3. Разработка приложения 5
3.1. Графический интерфейс пользователя 5
3.2. Составление таблицы используемых объектов и их свойств 6
3.3. Схемы алгоритмов процедур пользователя 9
3.4. Программный код с использованием процедур 13
4. Результаты выполнения проекта с доказательством правильности работы программы 16
5. Выводы 18
Постройте таблицу значений функции z(x,y) при изменении x на отрезке [a;b] с шагом h1 и y на отрезке [c;d] с шагом h2.
a = 0 b = 3 h1 = 0.1 c = 1 d = 4 h2 = 0.2
x+y-1,
если x € [1;2] и y € [2;3]
z(x,y)= x-y, если 0<x<1 и 3<y<4
Исходные данные: начало и конец отрезка, шаг для x; начало и конец отрезка, шаг для y.
Требуется построить двумерную таблицу значений функции z(x, y). Для визуализации таблицы будет использоваться DataGridView.
Обработка исходных данных будет проходить в следующем порядке: расчет количества строк и столбцов, создание строк и столбцов, заполнение ячеек таблицы.
Также, в соответствии с заданием, на форму будет выводиться время выполнения программы.
Используемые элементы:
label - для поясняющих надписей
textBox - для ввода исходных данных и для вывода времени работы программы
button - для запуска и окончания программы
dataGridView - для отображения результата в виде таблицы
Интерфейс представлен на Рисунок 1.
Рисунок 1 - Графический интерфейс пользователя
Используемые объекты и их свойства представлены в Таблица 1.
Таблица 1- Используемые объекты и их свойства
Объект |
Имя объекта |
Свойство |
Значение свойства |
Форма |
Form1 |
Text |
Учебная практика. Программирование алгоритмов регулярных циклических структур и циклических структур цикл в цикле. |
Метка |
labelStep1 |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Отрезок [a;b] |
||
Метка |
labelA |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
a = |
||
Метка |
labelB |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
b = |
||
Метка |
labelStep1 |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Шаг: |
||
Метка |
labelH1 |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
h1 = |
||
Метка |
labelC |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
c = |
||
Метка |
labelD |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
d = |
||
Метка |
labelStep2 |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Шаг: |
||
Метка |
labelH2 |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
h2 = |
||
Метка
|
labelMS |
BackColor |
Control |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Время выполнения расчётов в ms: |
||
Кнопка |
startButton |
Text |
Выполнить |
Кнопка |
clearButton |
Text |
Очистить |
Кнопка |
exitButton |
Text |
Выйти |
Таблица |
tableOutputDGV |
BackgroundColor |
AppWorkspace |
CellBorderStyle |
Single |
||
ReadOnly |
True |
||
AutoSizeColumnsMode |
ColumnHeader |
||
ColumnHeadersHeightSizeMode |
AutoSize |
||
RowHeadersWidthSizeMode |
AutoSizeToFirstHeader |
||
Текстовые поля |
aInputTB, bInputTB, h1InputTB, cInputTB, dInputTB, h2InputTB |
Font |
Microsoft Sans Serif; 8,25pt |
Метод startButton_Click ().
Метод обрабатывает нажатие кнопки «Нарисовать таблицу». Блок-схема этого метода представлена на Рисунок 2.
Рисунок 2 - Блок-схема метода startButton_Click ()
Метод void createTable(double a, double b, double c, double d, double h1, double h2, DataGridView tableDGV).
Метод строит таблицу значений функции func(x, y) для x, изменяющегося в отрезке [a, b] с шагом h1 и y, изменяющегося в отрезке [c, d] с шагом h2 в указанном DataGridView. Блок-схема этого метода представлена на Рисунок 3.
Рисунок 3 - Блок-схема метода createTable ()
Метод double cleverFunc(double x, double y).
Метод проверяет значения x и y и, исходя из этих значений делает выбор в пользу одной из конечных формул для расчета. Блок-схема этого метода представлена на Рисунок 4.
Рисунок 4 - Блок-схема метода cleverFunc()
Метод double func1(double x, double y).
Метод возвращает значение x + y - 1. Блок-схема этого метода представлена на Рисунок 5.
Рисунок 5 - Блок-схема метода func1()
Метод double func2(double x, double y).
Метод возвращает значение x - y. Блок-схема этого метода представлена на Рисунок 6.
Рисунок 6 - Блок-схема метода func2()
Программный код приложения Windows Forms:
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 Practics
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void startButton_Click(object sender, EventArgs e)
{
tableOutputDGV.Columns.Clear();
worktimeTB.Clear();
DateTime t1 = DateTime.Now;
TimeSpan t2;
bool check = false; //Переменная для выполнения проверки ввода, которая осуществляется при каждом вызове функции Input()
double a = Input(aInputTB, ref check),
b = Input(bInputTB, ref check),
c = Input(cInputTB, ref check),
d = Input(dInputTB, ref check),
h1 = Input(h1InputTB, ref check),
h2 = Input(h2InputTB, ref check);
if (check)
MessageBox.Show("Проверьте правильность ввода исходных данных", "Ошибка!", MessageBoxButtons.OK);
else
{
createTable(a, b, c, d, h1, h2, tableOutputDGV);
}
t2 = DateTime.Now - t1;
worktimeTB.Text = Convert.ToString(t2.TotalMilliseconds);
}
private void clearButton_Click(object sender, EventArgs e)
{
tableOutputDGV.Columns.Clear();
worktimeTB.Clear();
}
private void exitButton_Click(object sender, EventArgs e)
{
Application.Exit();
}
private double Input(TextBox t, ref bool check)
{
double d;
try
{
d = Convert.ToDouble(t.Text);
return d;
}
catch
{
//Флаг об ошибке ввода
check = true;
return Double.NaN;
}
}
private void createTable(double a, double b, double c, double d, double h1, double h2, DataGridView tableDGV)
{
double x, y;
x = a;
y = c;
if ((x > b) | (y > d))
{
tableDGV.Columns.Add("empty", "Нечего отображать");
return;
}
int step1, step2; //Количество шагов в цикле
step1 = Convert.ToInt32(Math.Floor((b - a) / h1));
step2 = Convert.ToInt32(Math.Floor((d - c) / h2));
//Создание столбцов таблицы
for (int i = 0; i <= step1; i++)
{
tableDGV.Columns.Add(Convert.ToString(i), Convert.ToString(Math.Round(x, 5)));
x += h1;
}
//Создание строк таблицы
for (int i = 0; i <= step2; i++)
{
tableDGV.Rows.Add();
tableDGV.Rows[i].HeaderCell.Value = Convert.ToString(Math.Round(y, 5));
y += h2;
}
x = a;
//Заполнение ячеек таблицы
for (int i = 0; i <= step1; i++)
{
y = c;
for (int j = 0; j <= step2; j++)
{
tableDGV.Rows[j].Cells[i].Value = Convert.ToString(cleverFunc(x, y));
y += h2;
}
x += h1;
}
}
private double cleverFunc(double x, double y) //Общая функция рассчетов, обращается к конечным функциям в зависимости от условий
{
if ( ((x >= 1) && (x <= 2)) && ((y >= 2) && (y <= 3)) )
return Math.Round(func1(x, y), 5);
else if ( ((x > 0) && (x < 1)) && ((y > 3) && (y < 4)) )
return Math.Round(func2(x, y), 5);
else
return 12.3;
}
private double func1(double x, double y)
{
return (x + y - 1);
}
private double func2(double x, double y)
{
return (x - y);
}
}
}
Тестовые данные, предложенные в задании: а = 0, b = 3, h1 = 0.1, c = 1, d = 4, h2 = 0.2.
Результат запуска программы с этими тестовыми данными представлен на Рисунок 7.
Рисунок 7 - Результат работы программы
Полученные результаты проверены расчетом вручную.
Результаты испытаний работоспособности программы для различных размерностей расчетных данных приведены в Таблица 2.
Таблица 2
|
a |
b |
h1 |
c |
d |
h2 |
Количество ячеек в таблице |
Время выполнения, мс |
1 |
0 |
3 |
0,5 |
1 |
4 |
0,5 |
49 |
14 |
2 |
0 |
3 |
0,3 |
1 |
4 |
0,3 |
121 |
35 |
3 |
0 |
3 |
0,25 |
1 |
4 |
0,25 |
169 |
45 |
4 |
0 |
3 |
0,1 |
1 |
4 |
0,2 |
496 |
139 |
5 |
0 |
3 |
0,13 |
1 |
4 |
0,13 |
576 |
129 |
6 |
0 |
3 |
0,05 |
1 |
4 |
0,1 |
1891 |
550 |
По проведенным тестам видно, что время выполнения программы зависит от количества ячеек в элементе DataGridView. Большая часть времени тратится не на подсчет значений функции, а на визуализацию самой таблицы.