Пример использования делегата для вызова анонимного метода. Разработка программы нахождения площади треугольника по формуле Герона
Содержание
- Условие задачи
- Математическая постановка задачи
- Выполнение
- Связанные темы
Поиск на других ресурсах:
Условие задачи
Разработать приложение, которое находит площадь треугольника по формуле Герона. В приложении реализовать вызов анонимного метода с помощью делегата. Метод должен осуществлять вычисление площади треугольника. Приложение реализовать в 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.
Рис. 1. Форма приложения после создания проекта
⇑
2. Разработка формы приложения
2.1. Размещение элементов управления на форме
Разместить на форме следующие элементы управления:
- 4 элемента управления типа Label. В результате будет создано 4 объекта (переменные) с именами label1, label2, label3, label4;
- 1 элемент управления типа Button. Будет создан объект с именем button1;
- 3 элемента управления типа TextBox. В результате будет создано 3 объекта с именами textBox1, textBox2, textBox3.
После размещения элементов управления, форма приложения будет иметь приблизительный вид, как показано на рисунке 2.
Рис. 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 = «Площадь треугольника».
Рис. 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. Запуск программы на выполнение
После выполненных действий можно запускать программу на выполнение и тестировать ее работу.
Связанные темы
- Понятие делегата. Объявление типа делегата. Использование делегата в программе. Групповое преобразование методов
- Анонимные функции. Анонимные методы. Возврат значения. Передача параметров
- Примеры передачи массивов, структур, классов анонимному методу
⇑