Главная страница

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


Скачать 0.82 Mb.
НазваниеИсследование вычислительной эффективности объектноориентированных приложений
Дата12.01.2023
Размер0.82 Mb.
Формат файлаdocx
Имя файлаoop курсовая.docx
ТипИсследование
#883628
страница8 из 9
1   2   3   4   5   6   7   8   9

ЗАКЛЮЧЕНИЕ


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

Были созданы две программы, выполняющие расчёт площади фигуры методом Монте-Карло, опираясь на две отличающиеся парадигмы: процедурная и объектно-ориентированная. Для создания приложений использовался язык 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;

}

}

}

}
1   2   3   4   5   6   7   8   9


написать администратору сайта