Файл: Исследование вычислительной эффективности объектноориентированных приложений.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 05.05.2024

Просмотров: 72

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

ПОСТАНОВКА ЗАДАЧИ

2. РАЗРАБОТКА ТЕХНИЧЕСКОГО ЗАДАНИЯ

2.1. Анализ вариантов использования программы

2.2. Требования к приложениям

3.АНАЛИЗ АЛГОРИТМА РЕШЕНИЯ

3.1. Метод Монте-Карло

3.2. Определение попадания точки внутрь фигуры

4. ПРОЦЕДУРНОЕ ПРИЛОЖЕНИЕ НА БАЗЕ WPF/C#

4.1. Программные средства разработки

4.3. Системные требования

4.4. Структура приложения

4.5. Результаты работы

5. ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРИЛОЖЕНИЕ НА БАЗЕ WPF/C#

5.1. Программные средства разработки

5.2. Логическое проектирование

5.4. Руководство системного программиста

5.5. Руководство программиста

5.6. Руководство оператора

5.7. Результаты работы

6. АНАЛИЗ ВЫЧИСЛИТЕЛЬНОЙ ЭФФЕКТИВНОСТИ ПРИЛОЖЕНИЙ

7. УЛУЧШЕНИЕ ХАРАКТЕРИСТИК КАЧЕСТВА ПРИЛОЖЕНИЙ

7.1. Использование встроенной оптимизации кода

7.2. Профилирование

ЗАКЛЮЧЕНИЕ

СПИСОК ЛИТЕРАТУРЫ

ПРИЛОЖЕНИЕ

Файл MainWindow.xaml.cs (процедурное приложение)

Файл MainWindow.xaml

Файл MainWindow.xaml.cs (объектно-ориентированное приложение)

Файл MainWindow.xaml

Файл Figure.cs

Файл Rectangle.cs

Файл Triangle.cs

Файл MonteCarlo.cs

ЗАКЛЮЧЕНИЕ


При выполнении данной курсовой работы были приобретены навыки анализа вычислительной эффективности программ и закреплены знания по курсу «объектно-ориентированное программирование».

Были созданы две программы, выполняющие расчёт площади фигуры методом Монте-Карло, опираясь на две отличающиеся парадигмы: процедурная и объектно-ориентированная. Для создания приложений использовался язык C# и интерфейс WPF. После анализа вычислительной эффективности было определено преимущество процедурного приложения в скорости работы. ОО приложение было оптимизировано, что позитивно сказалось на скорости работы.

СПИСОК ЛИТЕРАТУРЫ


1. ГОСТ 19.401 – 78 ЕСПД. Текст программы. Требования к содержанию и оформлению.

2. ГОСТ 19.101 - 77 ЕСПД. Виды программ и программных документов.

3. ГОСТ 19.106 - 78 ЕСПД. Требования к программным документам, выполненным печатным способом.

4. ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные Обозначения и правила выполнения

5. ГОСТ 19.404 - 79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.

6. ООП – https://devcolibri.com/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BE%D0%BE%D0%BF-%D0%B8-%D1%81-%D1%87%D0%B5%D0%BC-%D0%B5%D0%B3%D0%BE-%D0%B5%D0%B4%D1%8F%D1%82/ (дата обращения 15-06-2021)

7. Метод Монте-Карло – URL https://ru.wikipedia.org/wiki/Метод_Монте-Карло (дата обращения 9-06-2021)

8. Метод Монте-Карло и его точность – URL https://habr.com/ru/post/274975/ (дата обращения 15-06-2021)

9. Шилдт И. Полный справочник по C#.: ООО «И.Д. Вильямс», 2007г.

10. Мак-Дональд М. WPF: Windows Presentation Foundation в .NET 4.5 с примерами на C# 5.0 для профессионалов. 4-е изд.: Вильямс, 2016. – 1024с.

11. Техническая документация C# – URL: https://docs.microsoft.com/. (дата обращения 13-06-2021

ПРИЛОЖЕНИЕ

Файл MainWindow.xaml.cs (процедурное приложение)


using System;

using System.Collections.Generic;

using System.Windows;

using System.Diagnostics;

using System.Data;
namespace oop_kurs_procedur

{

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

}
private Point[] coordinates;

private double square_full;
private void WindowLoaded(object sender, RoutedEventArgs e)

{

Result_dataGrid.CanUserAddRows = false;

Result_dataGrid.ColumnWidth = Result_dataGrid.Width / 5 - 2;


Start_Btn.IsEnabled = true;

Clear_Btn.IsEnabled = true;

}
private void Start_Btn_Click(object sender, RoutedEventArgs e)

{

Result_dataGrid.Columns.Clear();

Stopwatch watch = new Stopwatch();

Coordinates();

if (!(coordinates[4].X > coordinates[3].X || coordinates[4].X < coordinates[1].X ||

coordinates[4].Y < coordinates[3].Y || coordinates[4].Y > coordinates[1].Y ||

coordinates[2].Y < coordinates[0].Y || coordinates[2].X < coordinates[0].X))

{

int N = 1000;
DataTable dt = new DataTable();

string[] str = new string[5];

str[0] = "№ расчёта"; str[1] = "Кол-во точек"; str[2] = "Площадь"; str[3] = "Погрешность, %"; str[4] = "Время, мс";

for (int i = 0; i < str.Length; i++)

{

dt.Columns.Add(str[i]);

}
double real_S = RealSquare();

label_square.Content = "Площадь фигуры (математическая): " + Math.Round(real_S, 3);
for (int i = 1; i <= 5; i++)

{

watch.Restart();

List
points = Distribution(N);

double find_S = MonteKarlo(N, points);

watch.Stop();

double error = Error(real_S, find_S);

double time = watch.ElapsedMilliseconds;
str[0] = (i).ToString(); str[1] = (N).ToString();

str[2] = (find_S).ToString(); str[3] = (Math.Round(error, 3)).ToString(); str[4] = (time).ToString();

dt.Rows.Add(str);
N *= 10;

points.Clear();

}

Result_dataGrid.ItemsSource = dt.DefaultView;

GC.Collect();

}

else MessageBox.Show("Точки заданы неверно", "Ошибка координат", MessageBoxButton.OK, MessageBoxImage.Error);

}

private double RealSquare()

{

square_full = Math.Abs(coordinates[1].X - coordinates[3].X) * Math.Abs(coordinates[1].Y - coordinates[3].Y);

double Sq = (coordinates[6].X - coordinates[5].X) * (coordinates[6].X - coordinates[5].X);

double Sc = (Math.PI * Math.Pow((coordinates[6].X - coordinates[5].X), 2)) / 4;

double St = Math.Abs((coordinates[2].X - coordinates[4].X) * (coordinates[2].Y - coordinates[3].Y)) / 2;

return square_full - (Sq + Sc + St);

}

private double Error(double real_S, double S_MK)

{

return (Math.Abs(real_S - S_MK) / real_S) * 100;

}

private List
Distribution(int N)

{

List
points = new List
(N);

Random Rand = new Random();

double Ax = coordinates[1].X, Ay = coordinates[1].Y, Bx = coordinates[2].X, By = coordinates[0].Y;

Point point1 = new Point();

double rnd = 0;

for (int i = 0; i < N; i++)

{

rnd = Rand.NextDouble();

point1.X = Ax + (Bx - Ax) * rnd;

rnd = Rand.NextDouble();

point1.Y = Ay + (By - Ay) * rnd;

points.Add(point1);

}

return points;

} //равномерное распределение точек

private double MonteKarlo(int N, List
points)

{

double M = 0;

for (int i = 0; i < N; i++)

{

if (IsInFigure(points[i]))

M++;

}

return square_full * (M / N);

} //площадь методом Монте-Карло

private bool IsInFigure(Point p)

{

if (p.X > coordinates[4].X)

{

if (IsInTriangle(p))

return false;

}

if (p.X < coordinates[6].X)

{

if (p.Y <= coordinates[6].Y)

if (IsInCircle(p)) return false;

if (p.Y > coordinates[6].Y) return false;

}

return true;

}

private bool IsInCircle(Point P)

{

Point vect = new Point();

vect.X = P.X - coordinates[5].X;

vect.Y = P.Y - coordinates[5].Y;

double R = coordinates[6].X - coordinates[5].X;

double x_q = Math.Pow(vect.X, 2); double y_q = Math.Pow(vect.Y, 2);

double vect_length = Math.Pow((x_q + y_q), (double)1 / 2);

if (vect_length < R)

return true;

else return false;

} //точка P внутри круга с центром О (не на окружности)

private bool IsInTriangle(Point P)

{

double y_kc = (P.X - coordinates[4].X) * ((coordinates[2].Y - coordinates[4].Y) / (coordinates[2].X - coordinates[4].X)) + coordinates[4].Y;

double y_kd = (P.X - coordinates[4].X) * ((coordinates[3].Y - coordinates[4].Y) / (coordinates[3].X - coordinates[4].X)) + coordinates[4].Y;


if (P.Y < y_kc && P.Y > y_kd) return true;

else return false;

} //точка Р внутри треугольника CKD или на его стороне CD (не на CK или KD)

private void Coordinates()

{

if (textBox_Ax.Text == "" || textBox_Ay.Text == "" || textBox_Cx.Text == "" ||

textBox_Cy.Text == "" || textBox_Kx.Text == "" || textBox_Ky.Text == "")

{

MessageBox.Show("Точки заданы неверно. Будет рассчитан тестовый пример", "Ошибка координат", MessageBoxButton.OK, MessageBoxImage.Error);

textBox_Ax.Text = "0"; textBox_Ay.Text = "0";

textBox_Cx.Text = "200"; textBox_Cy.Text = "200";

textBox_Kx.Text = "150"; textBox_Ky.Text = "100";

coordinates = new Point[9];

coordinates[0].X = 0; coordinates[0].Y = 0; //A

coordinates[2].X = 200; coordinates[2].Y = 200; //C

coordinates[1].X = coordinates[0].X; coordinates[1].Y = coordinates[2].Y; //B

coordinates[3].X = coordinates[2].X; coordinates[3].Y = coordinates[0].Y; //D

coordinates[4].X = 150; coordinates[4].Y = 150; //K

coordinates[5].X = coordinates[1].X; coordinates[5].Y = coordinates[0].Y + (coordinates[1].Y - coordinates[0].Y) / 2; //O

coordinates[6].X = coordinates[5].X + (coordinates[1].Y - coordinates[0].Y) / 2; coordinates[6].Y = coordinates[5].Y; //F

coordinates[7].X = coordinates[6].X; coordinates[7].Y = coordinates[0].Y; //N

coordinates[8].X = coordinates[6].X; coordinates[8].Y = coordinates[1].Y; //M

}

else

{

coordinates = new Point[9];

coordinates[0].X = double.Parse(textBox_Ax.Text); coordinates[0].Y = double.Parse(textBox_Ay.Text); //A

coordinates[2].X = double.Parse(textBox_Cx.Text); coordinates[2].Y = double.Parse(textBox_Cy.Text); //C

coordinates[1].X = coordinates[0].X; coordinates[1].Y = coordinates[2].Y; //B

coordinates[3].X = coordinates[2].X; coordinates[3].Y = coordinates[0].Y; //D

coordinates[4].X = double.Parse(textBox_Kx.Text); coordinates[4].Y = double.Parse(textBox_Ky.Text); //K

coordinates[5].X = coordinates[1].X; coordinates[5].Y = coordinates[0].Y + (coordinates[1].Y - coordinates[0].Y) / 2; //O

coordinates[6].X = coordinates[5].X + (coordinates[1].Y - coordinates[0].Y) / 2; coordinates[6].Y = coordinates[5].Y; //F

coordinates[7].X = coordinates[6].X; coordinates[7].Y = coordinates[0].Y; //N

coordinates[8].X = coordinates[6].X; coordinates[8].Y = coordinates[1].Y; //M

}

}

private void Clear_Btn_Click(object sender, RoutedEventArgs e)

{

textBox_Ax.Clear(); textBox_Ay.Clear();

textBox_Cx.Clear(); textBox_Cy.Clear();

textBox_Kx.Clear(); textBox_Ky.Clear();

Result_dataGrid.Columns.Clear();

label_square.Content = "Площадь фигуры: ";

Example_CheckBox.IsChecked = false;

Start_Btn.IsEnabled = true;

Clear_Btn.IsEnabled = true;

}

private void Example_click(object sender, RoutedEventArgs e)

{

if (Example_CheckBox.IsChecked == true)

{
textBox_Ax.Text = "0"; textBox_Ay.Text = "0";

textBox_Cx.Text = "200"; textBox_Cy.Text = "200";

textBox_Kx.Text = "150"; textBox_Ky.Text = "100";

Start_Btn.IsEnabled = true;

Clear_Btn.IsEnabled = true;

}

if (Example_CheckBox.IsChecked == false)

{

Example_CheckBox.IsChecked = false;

textBox_Ax.Clear(); textBox_Ay.Clear();

textBox_Cx.Clear(); textBox_Cy.Clear();

textBox_Kx.Clear(); textBox_Ky.Clear();

textBox_Ax.IsEnabled = true; textBox_Ay.IsEnabled = true;

textBox_Cx.IsEnabled = true; textBox_Cy.IsEnabled = true;

textBox_Kx.IsEnabled = true; textBox_Ky.IsEnabled = true;

}

}

}

}

Файл MainWindow.xaml



xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:oop_kurs_procedur"

mc:Ignorable="d"

Title="ProcedurMonteCarlo" Height="231.196" Width="580.5" Loaded="WindowLoaded">



















































Файл MainWindow.xaml.cs (объектно-ориентированное приложение)


using System;

using System.Windows;

using System.Data;
namespace Application2

{

///

/// Логика взаимодействия для MainWindow.xaml

///


public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

}
private void Start_Btn_Click(object sender, RoutedEventArgs e)

{

if (!(string.IsNullOrEmpty(textBox_Ax.Text) || string.IsNullOrWhiteSpace(textBox_Ax.Text) ||

string.IsNullOrEmpty(textBox_Cx.Text) || string.IsNullOrWhiteSpace(textBox_Cx.Text) ||


string.IsNullOrEmpty(textBox_Kx.Text) || string.IsNullOrWhiteSpace(textBox_Kx.Text) ||

string.IsNullOrEmpty(textBox_Ay.Text) || string.IsNullOrWhiteSpace(textBox_Ay.Text) ||

string.IsNullOrEmpty(textBox_Cy.Text) || string.IsNullOrWhiteSpace(textBox_Cy.Text) ||

string.IsNullOrEmpty(textBox_Ky.Text) || string.IsNullOrWhiteSpace(textBox_Ky.Text)))

{

Point a = new Point(double.Parse(textBox_Ax.Text), double.Parse(textBox_Ay.Text));

Point c = new Point(double.Parse(textBox_Cx.Text), double.Parse(textBox_Cy.Text));

Point k = new Point(double.Parse(textBox_Kx.Text), double.Parse(textBox_Ky.Text));
if (a.X < c.X && a.Y < c.Y &&

k.X < c.X && k.X > a.X &&

k.Y < c.Y && k.Y > a.Y)

{

int N = 1000;

string[] str = new string[5];

DataTable dt = new DataTable();

str[0] = "#"; str[1] = "N"; str[2] = "Площадь"; str[3] = "Погрешность, %"; str[4] = "Время, мс";

for (int j = 0; j < str.Length; j++)

{

dt.Columns.Add(str[j]);

}

Result_dataGrid.Columns.Clear();
MonteCarlo mc = new MonteCarlo(a, c, k);

label_square.Content = "Площадь фигуры: " + Math.Round(mc.S_real, 3);

for (int i = 1; i <= 5; i++)

{

mc.Start(N);

str = mc.Print();

str[0] = i.ToString();

str[1] = N.ToString();

dt.Rows.Add(str);

N = N * 10;

}

Result_dataGrid.ItemsSource = dt.DefaultView;

GC.Collect();

}

else

{

MessageBox.Show("Точки заданы неверно", "Ошибка координат", MessageBoxButton.OK, MessageBoxImage.Error);

}

}

else

{

MessageBox.Show("Заданы не все координаты", "Ошибка координат", MessageBoxButton.OK, MessageBoxImage.Error);

}

}
private void Clear_Btn_Click(object sender, RoutedEventArgs e)

{

textBox_Ax.Clear(); textBox_Ay.Clear();

textBox_Cx.Clear(); textBox_Cy.Clear();

textBox_Kx.Clear(); textBox_Ky.Clear();

Result_dataGrid.Columns.Clear();

label_square.Content = "Площадь фигуры: ";

Enter_CheckBox.IsChecked = false;

Example_CheckBox.IsChecked = false;

Start_Btn.IsEnabled = false;

Clear_Btn.IsEnabled = false;

}

private void Example_click(object sender, RoutedEventArgs e)

{

if (Example_CheckBox.IsChecked == true)

{

Enter_CheckBox.IsChecked = false;

textBox_Ax.Text = "0"; textBox_Ay.Text = "0";

textBox_Cx.Text = "400"; textBox_Cy.Text = "200";

textBox_Kx.Text = "300"; textBox_Ky.Text = "150";

textBox_Ax.IsEnabled = false; textBox_Ay.IsEnabled = false;

textBox_Cx.IsEnabled = false; textBox_Cy.IsEnabled = false;

textBox_Kx.IsEnabled = false; textBox_Ky.IsEnabled = false;

Start_Btn.IsEnabled = true;

Clear_Btn.IsEnabled = true;

}

if (Example_CheckBox.IsChecked == false)

{

Enter_CheckBox.IsChecked = true;

Example_CheckBox.IsChecked = false;

textBox_Ax.Clear(); textBox_Ay.Clear();

textBox_Cx.Clear(); textBox_Cy.Clear();

textBox_Kx.Clear(); textBox_Ky.Clear();

textBox_Ax.IsEnabled = true; textBox_Ay.IsEnabled = true;

textBox_Cx.IsEnabled = true; textBox_Cy.IsEnabled = true;

textBox_Kx.IsEnabled = true; textBox_Ky.IsEnabled = true;

}

}
private void Enter_click(object sender, RoutedEventArgs e)

{

if (Enter_CheckBox.IsChecked == true)

{

Example_CheckBox.IsChecked = false;

textBox_Ax.Clear(); textBox_Ay.Clear();

textBox_Cx.Clear(); textBox_Cy.Clear();

textBox_Kx.Clear(); textBox_Ky.Clear();

textBox_Ax.IsEnabled = true; textBox_Ay.IsEnabled = true;

textBox_Cx.IsEnabled = true; textBox_Cy.IsEnabled = true;

textBox_Kx.IsEnabled = true; textBox_Ky.IsEnabled = true;

Start_Btn.IsEnabled = true;

Clear_Btn.IsEnabled = true;

}

if (Enter_CheckBox.IsChecked == false)

{

Example_CheckBox.IsChecked = true;

Enter_CheckBox.IsChecked = false;

textBox_Ax.Text = "0";

textBox_Ay.Text = "0";

textBox_Cx.Text = "400";

textBox_Cy.Text = "200";

textBox_Kx.Text = "300";

textBox_Ky.Text = "150";

textBox_Ax.IsEnabled = false; textBox_Ay.IsEnabled = false;