Приклад використання делегату для виклику анонімного методу. Розробка програми знаходження площі трикутника за формулою Герона

Приклад використання делегату для виклику анонімного методу. Розробка програми знаходження площі трикутника за формулою Герона


Зміст


Умова задачі

Розробити додаток, що знаходить площу трикутника за формулою Герона. В додатку реалізувати виклик анонімного методу з допомогою делегату. Метод повинен здійснювати обчислення площі трикутника. Додаток реалізувати в Microsoft Visual Studio за шаблоном Windows Forms Application.

 

Математична постановка задачі

Формула Герона має вигляд:

Формула Герона,

де

  • S – площа трикутника;
  • a, b, c – довжини сторін трикутника;
  • p – півпериметр, який обчислюється за формулою:

Півпериметер - формула

 

Виконання

1. Створення проекту

Завантажити систему Microsoft Visual Studio. Створити проект за шаблоном Windows Forms Application. Зберегти проект в довільній папці, наприклад:

D:\Programs\C_Sharp\TrainDelegates03

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

У результаті буде створена нова форма додатку, як показано на рисунку 1.

C# - Windows Forms. Пуста форма додатку

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

 

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

2.1. Розміщення елементів управління на формі

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

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

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

C# - Windows Forms. Форма додатку після розміщення елементів управління

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

 

2.2. Налаштування елементів управління

Більш детальний приклад того, як здійснюється налаштування елементів управління типів Button, Label, TextBox описано в темі:

Налаштувати такі властивості елементів управління:

  • в елементі управління label1 властивість Text = “a = “ (label1.Text = “a = “);
  • label2.Text = “b = “;
  • label3.Text = “c = “;
  • в елементі управління button1 властивість Text = “Обчислити” (button1.Text = “b = “);
  • в об’єкті, що відповідає формі Form1, властивість Text = “Площа трикутника”.

C# - Windows Forms. Головна форма додатку після налаштуванняРис. 3. Головна форма додатку після налаштування

 

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

Для написання програмного коду потрібно перейти у файл Form1.cs, що відповідає головній формі додатку (програми).

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

У тілі класу форми Form1 оголосити тип делегату:

// оголошення типу делегату
delegate float SquareTriangle(float a, float b, float c);

Про оголошений тип делегату можна сказати наступне:

  • тип делегату має ім’я SquareTriangle;
  • делегат цього типу буде отримувати три параметри типу float і повертати значення типу float.


Після оголошення типу, текст модуля “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 TrainDelegates03
{
    public partial class Form1 : Form
    {
        // оголошення типу делегату
        delegate float SquareTriangle(float a, float b, float c);

        public Form1()
        {
            InitializeComponent();
        }
    }
}

 

3.2. Програмування обробника події кліку на кнопці “Обчислити”

Детальний приклад програмування події кліку на кнопці описано в темі:

Текст обробника події кліку на кнопці button1:

private void button1_Click(object sender, EventArgs e)
{
    // Оголошення делегату з іменем ST, що обчислює площу трикутника
    SquareTriangle ST;

    ST = delegate(float a, float b, float c)
    {
        float s, p, d;

        p = (a + b + c) / 2.0f;
        d = p * (p - a) * (p - b) * (p - c);
        if (d < 0) return -1.0f;
        s = (float)Math.Sqrt(p * (p - a) * (p - b) * (p - c));

        return (float)s;
    };

    // взяти значення довжин a, b, c
    float aa, bb, cc;
    aa = (float)Convert.ToDouble(textBox1.Text);
    bb = (float)Convert.ToDouble(textBox2.Text);
    cc = (float)Double.Parse(textBox3.Text); // і так можна конвертувати

    // виклик делегату
    float area;
    area = (float)ST(aa, bb, cc);

    // вивід результату на форму
    label4.Text = "S = " + area.ToString();
}

Пояснимо деякі фрагменти коду. В обробнику події оголошується делегат з іменем ST типу SquareTriangle. Делегат ST посилається на анонімний метод, який отримує вхідними 3 параметри типу float. В анонімному методі здійснюється обчислення площі трикутника за формулою Герона. Результат (площа) повертається з допомогою оператора return.

Довжини сторін, які вводяться з клавіатури (елементи управління textBox1, textBox2, textBox3) розміщуються у змінних aa, bb, cc. Згідно синтаксису С#, змінні, що оголошені в анонімному методі мають видимість на весь блок коду обробника події button1_Click(). Тому, не може бути однакових імен в обробнику події та анонімному методі, що описаний в цьому обробнику. Тобто, оголошення

 float aa, bb, cc;

є вірним. Якщо в тексті обробника події спробувати написати

float a, b, c;

то вийде помилка компіляції. Тому що такі імена вже використовуються в анонімному методі.

 

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

Весь програмний код модуля 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 TrainDelegates03
{
    public partial class Form1 : Form
    {
        // оголошення типу делегату
        delegate float SquareTriangle(float a, float b, float c);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Оголошення делегату з іменем ST, що обчислює площу трикутника
            SquareTriangle ST;
            ST = delegate(float a, float b, float c)
            {
                float s, p, d;
                p = (a + b + c) / 2.0f;
                d = p * (p - a) * (p - b) * (p - c);
                if (d < 0) return -1.0f;
                s = (float)Math.Sqrt(p * (p - a) * (p - b) * (p - c));
                return (float)s;
            };

            // взяти значення довжин a, b, c
            float aa, bb, cc;

            aa = (float)Convert.ToDouble(textBox1.Text);
            bb = (float)Convert.ToDouble(textBox2.Text);
            cc = (float)Double.Parse(textBox3.Text); // і так можна конвертувати

            // виклик делегату
            float area;
            area = (float)ST(aa, bb, cc);

            // вивід результату на форму
            label4.Text = "S = " + area.ToString();
        }
    }
}

 

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

Після цього можна запускати програму на виконання та тестувати її роботу.

 


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