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

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


Содержание


Условие задачи

Разработать приложение, которое находит площадь треугольника по формуле Герона. В приложении реализовать вызов анонимного метода с помощью делегата. Метод должен осуществлять вычисление площади треугольника. Приложение реализовать в 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 Application. Форма приложения после создания проекта

Рис. 1. Форма приложения после создания проекта

 

2. Разработка формы приложения

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

Разместить на форме следующие элементы управления:

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

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

C#. Windows Forms Application. Форма приложения после размещения элементов управления

Рис. 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 Application. Главная форма приложения после настройки

Рис. 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. Запуск программы на выполнение

После выполненных действий можно запускать программу на выполнение и тестировать ее работу.

 


Связанные темы