oop курсовая. Исследование вычислительной эффективности объектноориентированных приложений
Скачать 0.82 Mb.
|
ЗАКЛЮЧЕНИЕПри выполнении данной курсовой работы были приобретены навыки анализа вычислительной эффективности программ и закреплены знания по курсу «объектно-ориентированное программирование». Были созданы две программы, выполняющие расчёт площади фигуры методом Монте-Карло, опираясь на две отличающиеся парадигмы: процедурная и объектно-ориентированная. Для создания приложений использовался язык 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; } } } } |