Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНА РОБОТА №1.doc
Скачиваний:
4
Добавлен:
12.08.2019
Размер:
543.23 Кб
Скачать
  1. Практична частина

Завдання

  1. Відтворити розв’язок, наведений у прикладі (в середовищі Excel)

  2. Створити реалізацію методу Монте-Карло, використовуючи парадигму ООП (на платформі DOT.NET) та протестувати за допомогою цієї реалізації розв’язок, наведений у прикладі. Реалізація методу повинна задовольняти наступним вимогам:

Створіть інтерфейс, в якому опишіть методи, що задають рівняння ліній, які описують фігуру. В нашому випадку, це рівняння кола: . Відповідно метод, повинен отримати в якості вхідних параметрів дві змінних, які задають координати і :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

interface Interface1

{

double R(double x, double y);

}

}

Створіть клас, який успадковує даний інтерфейс :

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

class funk:Interface1

{

//Метод, що задає рівняння кола

public double R(double x, double y)

{

return (Math.Pow(x,2) + Math.Pow(y,2));

}

}

}

Створіть абстрактний клас, в якому опишіть делегат с сигнатурою функції, яка відповідає сигнатурі функції, що буде використовуватися для опису ліній, що обмежують фігуру, для якої необхідно знайти площу. Делегат потрібно використати для того, щоб можна було передавати адресу методу (або списку методів), в якості параметрів. Створіть об’єкт класу funk, для використання його всіма класами, які будуть успадковувати Class1. Опишіть абстрактний метод Sraw, метою, якого є підрахування кількості точок, що попали всередину фігури, обмеженої заданими лініями із всіх точок згенерованих випадковим чином. Відповідно, для проведення обрахунків, метод повинен отримати масив X_Y координат цих точок, адресу методу, який задає лінії, що обмежують фігуру, та додаткові параметри, в даному випадку,радіуси двох кіл що обмежують кільце.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

abstract class Class1

{

public delegate double Fun1 (double x, double y);

public funk F2 = new funk();

public abstract int Sraw(double[,] X_Y, Fun1 F1, double r, double r1);

}

}

Для генерації координат точок, створіть окремий клас Gener. Необхідні для генерації чисел дані (мінімальне та максимальне значення координат прямокутника, що описує задану фігуру Xmin, Xmax, Ymin, Ymax та необхідна кількість точок KOL), клас отримує через конструктор класу. Для збереження координат точок використовується двовимірний масив MAS_XY, а для генерації метод Next, класу Random бібліотеки класів .NET.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

class Gener

{

double Xmin,Xmax,Ymin,Ymax;

int KOL;

public Gener ()

{

}

public Gener(double Xmin,double Xmax,double Ymin,double Ymax, int KOL)

{

this.Xmin = Xmin;

this.Xmax = Xmax;

this.Ymin = Ymin;

this.Ymax = Ymax;

this.KOL = KOL;

}

// Метод генерування координат Х,У)

public double [,] Generator()

{

double [,] MAS_XY = new double [this.KOL,2];

Random ob3 = new Random();

for (int i = 0; i < this.KOL; i++)

{

MAS_XY[i, 0] = ob3.Next((Int32)this.Xmin, (Int32)this.Xmax);

MAS_XY[i, 1] = ob3.Next((Int32)this.Ymin, (Int32)this.Ymax);

}

return MAS_XY;

}

}

}

Створіть клас Analiz. Він є спадкоємцем абстрактного класу Class1. В ньому реалізуйте метод Sraw, який описано, як абстрактний в Class1. Також реалізуйте віртуальний метод Area для підрахунку площі базового прямокутника, що описує фігуру.

Значення координат точок, отриманих з двовимірного масиву X_Y почергово передаються методу F1, адресу якого метод Sraw отримав через делегата Fun1 в якості одного із вхідних параметрів. Результат роботи методу F1 ( ) порівнюється з і і всі точки для яких виконується умова вважаються такими, що попали в середину кільця обмеженого колами з радіусами і відповідно враховуються змінною kol_p.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

class Analiz:Class1

{

// Метод визначення кількості точок, координати яких знаходяться в середині фігури

override public int Sraw(double[,] X_Y, Fun1 F1, double r, double r1)

{

int kol_p=0;

int dl = X_Y.GetLength(0);

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

{

if (F1(X_Y[i, 1], X_Y[i, 0]) <= Math.Pow(r, 2) && F1(X_Y[i, 1], X_Y[i, 0]) > Math.Pow(r1, 2))

{

kol_p++;

}

}

return kol_p;

}

// Розрахунок площі базового прямокутника

public virtual double Area(double Xmax,double Xmin, double Ymax, double Ymin)

{

return (Xmax-Xmin)*(Ymax-Ymin);

}

}

}

Для визначення площі заданої фігури створіть клас Area_P, який є спадкоємцем класу Analiz. Кількість точок kol_p, які попали в середину кільця, обмеженого радіусами , та кількість всіх згенерованих точок kol_G, клас отримує через конструктор класу. В класі перевизначено віртуальний метод Area батьківського класу Analiz. Для визначення площі базового прямокутника, який в ходить в формулу обрахунку площі, в методі викликається метод Area батьківського класу: base.Area(Xmax, Xmin, Ymax, Ymin).

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

class Area_P:Analiz

{

double kol_p, kol_G;

public Area_P()

{

}

public Area_P(double kol_p, double kol_G)

{

this.kol_p = kol_p;

this.kol_G = kol_G;

}

// Метод визначення площі фігури

public override double Area(double Xmax, double Xmin, double Ymax, double Ymin)

{

return (this.kol_p/this.kol_G)*base.Area(Xmax, Xmin, Ymax, Ymin);

}

}

}

Створіть клас Graf, який є спадкоємцем класу Analiz і призначений для побудови графіків функцій. Його можна реалізувати, з використанням компоненти TeeChart, або будь-якої іншої, призначеної для побудови графіків. Необхідні дані для побудови передаються через конструктор класу, а також, при необхідності, отримуються шляхом спадкування.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Barmak1

{

class Graf:Analiz

{

double Xmin,Xmax,Ymin,Ymax;

public Graf ()

{

}

public Graf(double Xmin,double Xmax,double Ymin,double Ymax)

{

this.Xmin = Xmin;

this.Xmax = Xmax;

this.Ymin = Ymin;

this.Ymax = Ymax;

}

//Делегат з сигнатурою функцій класу funk

public Fun1 FF ;

//Метод побудови графіків

void Grafik(double Xmin, double Xmax, double Ymin, double Ymax)

{

// Формування списку функцій (при необхідності)

FF += F2.R;

//Побудова графіків

}

}

}

Всі вхідні данні для роботи програми повинні отримуватися з форми, а результати розрахунків відображаються на ній (рис. 1).

Рис 1 – Форма

Клас Form1:

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 Barmak1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

// Розрахунок

private void button2_Click(object sender, EventArgs e)

{

Gener ob2 = new Gener(double.Parse(textBox1.Text), double.Parse(textBox2.Text), double.Parse(textBox3.Text), double.Parse(textBox4.Text), int.Parse(textBox5.Text));

double [,] X_Y = ob2.Generator();

Analiz ob4 = new Analiz();

funk F1 = new funk();

int KOl_p = ob4.Sraw(X_Y, F1.R, double.Parse(textBox2.Text), double.Parse(textBox8.Text));

textBox6.Text = KOl_p.ToString();

Area_P ob5 = new Area_P(KOl_p, int.Parse(textBox5.Text));

textBox7.Text = (ob5.Area(double.Parse(textBox1.Text), double.Parse(textBox2.Text), double.Parse(textBox3.Text), double.Parse(textBox4.Text))).ToString();

}

// Побудова графіків

private void button1_Click(object sender, EventArgs e)

{

Graf ob1 = new Graf(double.Parse(textBox1.Text), double.Parse(textBox2.Text), double.Parse(textBox3.Text), double.Parse(textBox4.Text));

}

}

}

Послідовність проведення необхідних розрахунків показано в методі button2_Click, процес побудови графіків - button1_Click.

Діаграма класів програмного продукту представлена на рис.2.

Завдання

  1. Реалізувати самостійно метод побудови графіків функцій, використовуючи компонент TeeChart, або будь-який інший подібного типу.

  2. Реалізувати генерацію, збереження та використання координат точок використовуючи структуру PointF, взамін масивів, які використовувалися в прикладі.

  3. Реалізувати генерацію, збереження та використання координат точок використовуючи клас ArrayList (або List), взамін масивів, які використовувалися в прикладі.

  4. Обчислити площу фігури, обмеженої лініями (згідно варіантів), використовуючи Excel та створену реалізацію

Варіанти:

Фігура, обмежена лініями