Приклад розв‘язку задачі, що обчислює характеристики геометричних фігур з використанням делегатів

Приклад розв‘язку задачі, що обчислює характеристики геометричних фігур з використанням делегатів

Даний приклад демонструє використання делегатів мови C# для розв’язку задачі, в якій обчислюються характеристики геометричних фігур. Приклад призначений виключно для вивчення роботи делегатів.


Зміст


Умова задачі

У додатку типу Windows Forms Application оголосити тип делегату, що посилається на метод. Вимоги до сигнатури методу наступні:

  • метод отримує вхідним параметром змінну типу double;
  • метод повертає значення типу double, яке є результатом обчислення.

Реалізувати виклик методів з допомогою делегату, які отримують радіус кола R і обчислюють:

  • довжину кола за формулою D = 2 · π · R;
  • площу круга за формулою S = π · R²;
  • об‘єм кулі. Формула V = 4/3 · π · R³.

Методи мають бути оголошені як статичні (з ключовим словом static).

 

Міркування

Для роботи програми вибираємо такі імена:

  • назва типу делегату – CalcFigure;
  • назва делегату (об‘єкту) – CF;
  • назва методу, що обчислює довжину кола – Get_Length();
  • назва методу, що обчислює площу круга – Get_Area();
  • назва методу, що обчислює об‘єм кулі – Get_Volume().

Оголошення типу делегату та методів здійснюється в класі Form1 головної форми додатку типу Windows Forms Application.

 

Виконання

1. Завантажити Microsoft Visual Studio. Створити проект (додаток) за шаблоном Windows Forms Application

Створити проект за шаблоном Windows Forms Application. Ім‘я модуля головної форми “Form1.cs”. Ім’я проекту можна задати, наприклад, “Delegates01”. Ім’я екземпляру об’єкту форми додатку Form1.

Приклад створення проекту за шаблоном Windows Forms Application детально описується в темі:

Вікно новоствореної форми додатку зображено на рисунку 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 Delegates01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

 

2. Розробка форми додатку

Розмістити на формі додатку такі елементи управління:

  • чотири елементи управління типу Label. У результаті буде створено 4 екземпляри (об‘єкти) класу Label з іменами label1, label2, label3, label4;
  • елемент управління типу TextBox з іменем textBox1;
  • елемент управління типу Button з іменем button1.

З допомогою вікна Properties налаштувати наступні властивості елементів управління:

  • в елементі управління label1 властивість Text = “R = “ (label1.Text = “R = “);
  • label2.Text = “Довжина кола = “;
  • label3.Text = “Площа круга = “;
  • label4.Text = “Об’єм кулі = “;
  • в елементі управління Form1 (головна форма) властивість Text = “Розрахунок”;
  • у Form1 властивість StartPosition = CenterScreen;
  • в елементі управління button1 властивість Text = “Обчислити”.

Після виконаних дій, форма додатку матиме вигляд як зображено на рисунку 2.

Рис. 2. Форма додатку після налаштування та розміщення елементів управління

 

3. Написання програмного коду

3.1. Оголошення типу делегату

Згідно з міркуваннями, тип делегату має ім’я CalcFigure і оголошується в класі Form1 (файл “Form1.cs”) перед конструктором форми Form1(). Текст оголошення наступний:

// оголошення типу делегату CalcFigure
delegate double CalcFigure(double r);

При оголошенні типу делегату використовується ключове слово delegate.

 

3.2. Оголошення методів обчислення характеристик геометричних фігур

Методи оголошуються в класі форми після реалізації конструктора форми Form1(). Згідно з умовою задачі методи в класі оголошуються як статичні з ключовим словом static.

Після оголошення методів текст модуля “Form1.cs” має вигляд:

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 Delegates01
{
    public partial class Form1 : Form
    {
        // оголошення типу делегату CalcFigure
        delegate double CalcFigure(double r);

        public Form1()
        {
            InitializeComponent();
        }

        // оголошення статичних методів у класі
        // довжина кола
        public static double Get_Length(double r)
        {
            double length;
            length = 2 * 3.1415 * r;
            return length;
        }

        // площа круга
        public static double Get_Area(double r)
        {
            double area;
            area = 3.1415 * r * r;
            return area;
        }

        // об'єм кулі
        public static double Get_Volume(double r)
        {
            double volume;
            volume = 3.1415 * r * r * r * 4.0 / 3.0;
            return volume;
        }
    }
}

 

3.3. Програмування події Click, яка викликається при кліку на кнопці button1 (варіант 1)

Наступний крок – програмування події кліку на кнопці “Обчислити” (елемент управління button1).
Текст обробника події кліку на кнопці button1 наступний:

private void button1_Click(object sender, EventArgs e)
{
    double radius, length, area, volume;

    // зчитати радіус
    radius = Convert.ToDouble(textBox1.Text);

    // виклик делегату
    // збудувати делегат
    CalcFigure CF = new CalcFigure(Get_Length);

    length = CF(radius); // 1. Виклик методу Get_Length()

    CF = new CalcFigure(Get_Area);
    area = CF(radius); // 2. Виклик методу Get_Area()

    CF = new CalcFigure(Get_Volume);
    volume = CF(radius); // 3. Виклик методу Get_Volume()

    // вивід результату на форму
    label2.Text = "Довжина кола = " + length.ToString();
    label3.Text = "Площа круга = " + area.ToString();
    label4.Text = "Об\'єм кулі = " + volume.ToString();
}

Пояснимо деякі фрагменти коду.

Радіус кола зчитується у внутрішню змінну radius. Перетворення з рядка в текст здійснюється з допомогою класу Convert (метод ToDouble()).

Наступним кроком будується делегат з іменем CF. Цей делегат ініціалізується значенням Get_Length. Це означає, що делегат посилається на метод Get_Length().

На наступних кроках відбувається перевизначення делегату CF відповідно методами Get_Area() та Get_Volume().

Наступний пункт відображає інший варіант реалізації обробника події.

 

3.4. Програмування події Click, яка викликається при кліку на кнопці button1 (варіант 2)

Обробник події кліку на кнопці button1 може мати й іншу реалізацію, яка є більш наглядною.

private void button1_Click(object sender, EventArgs e)
{
    double radius, length, area, volume;

    // зчитати радіус
    radius = Convert.ToDouble(textBox1.Text);

    // виклик делегату
    // збудувати делегат
    CalcFigure CF = Get_Length;

    length = CF(radius); // 1. Виклик методу Get_Length()

    CF = Get_Area;
    area = CF(radius); // 2. Виклик методу Get_Area()

    CF = Get_Volume;
    volume = CF(radius); // 3. Виклик методу Get_Volume()

    // вивід результату на форму
    label2.Text = "Довжина кола = " + length.ToString();
    label3.Text = "Площа круга = " + area.ToString();
    label4.Text = "Об\'єм кулі = " + volume.ToString();
}

У цьому випадку відбувається так зване групове перетворення делегованих методів. При такому перетворенні ключове слово new опускається. Програмний код спрощується.

 

3.5. Текст модуля Form1.cs

Текст всього модуля Form1.cs розв‘язку даної задачі (варіант 2) має вигляд:

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 Delegates01
{
    public partial class Form1 : Form
    {
        // оголошення типу делегату CalcFigure
        delegate double CalcFigure(double r);

        public Form1()
        {
            InitializeComponent();
        }

        // оголошення статичних методів у класі
        // довжина кола
        public static double Get_Length(double r)
        {
            double length;
            length = 2 * 3.1415 * r;
            return length;
        }

        // площа круга
        public static double Get_Area(double r)
        {
            double area;
            area = 3.1415 * r * r;
            return area;
        }

        // об'єм кулі
        public static double Get_Volume(double r)
        {
            double volume;
            volume = 3.1415 * r * r * r * 4.0 / 3.0;
            return volume;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double radius, length, area, volume;

            // зчитати радіус
            radius = Convert.ToDouble(textBox1.Text);

            // виклик делегату
            // збудувати делегат
            CalcFigure CF = Get_Length;

            length = CF(radius); // 1. Виклик методу Get_Length()

            CF = Get_Area;
            area = CF(radius); // 2. Виклик методу Get_Area()

            CF = Get_Volume;
            volume = CF(radius); // 3. Виклик методу Get_Volume()

            // вивід результату на форму
            label2.Text = "Довжина кола = " + length.ToString();
            label3.Text = "Площа круга = " + area.ToString();
            label4.Text = "Об\'єм кулі = " + volume.ToString();
        }
    }
}

 

 

4. Запуск програми на виконання

Вікно програми після запуску зображено на рисунку 3.

Рис. 3. Виконання програми

 


Зв’язані теми