КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Использование делегата для передачи метода в качестве параметра в другой метод
До сих пор в качестве параметров методов использовались простые переменные или массивы. Но параметром метода может быть также и другой метод. В качестве наглядного примера рассмотрим следующую задачу. Пусть требуется вычислить две суммы S1 = S2 = Вычисление суммы в методе оформим в общем виде, не конкретизируя зависимость члена суммы от его номера, т.е. оформим функцию для вычисления суммы S = . Функция f должна быть включена в список формальных параметров как переменная типа делегат, которая при каждом обращении должна быть заменена фактическим параметром, т.е. именем метода, описывающего вычисление конкретного члена суммы. Делегат могут вызывать только такие методы, у которых тип возвращаемого значения и список параметров совпадают с соответствующими элементами объявления делегата. Ключевое слово delegate используется для объявления ссылочного типа. Делегат это тип, который определяет подпись метода и его можно связать с любым методом с совместимой подписью. Пример 5.5. В качестве примера приводится программа для решения рассмотренной выше задачи вычисления двух сумм. using System; class Program { delegate int fi(int i); static int f1(int i) { return i * i; } static int f2(int i) { return i * i * i; } static int si(fi f, int n) { int s = 0; for (int i = 0; i <= n; i++) { s = s + f(i); } return s; } static void Main() { int s1 = si(f1,12); int s2 = si(f2,7); Console.WriteLine("{0} {1}", s1, s2); } }
Следующие примеры демонстрируют использование метода в качестве параметра, а также использование перечисления для вычисления определенного интеграла двумя различными методами. Пример 5.6. Оформить функцию для вычисления S = . Используя эту функцию, вычислить S 1= sin xdx и S 2= 1/ dx. Для вычисления определенного интеграла использовать метод трапеций. Разделим отрезок [ a, b ] на n отрезков длиной h =(b – a)/ n. Формула трапеций для вычисления интеграла в этом случае имеет вид
h /2(f (a)+ f (b)+2 ), где x 1 = a + h, x 2 = a +2 h,..., … Выберем n =20 для вычисления S 1 и n =30 для вычисления S 2. using System; class Program { delegate double fx(double i); static double f1(double x) { return Math.Sin(x)*Math.Sin(x); } static double f2(double x) { return 1/Math.Sqrt(9 + x * x); } static double sw(fx f, double a, double b, int n) { double c = 0, x = a, h = (b - a)/n; for (int i = 1; i < n; i++) { x += h; c += f(x); } return (2 * c + f(a) + f(b)) * h / 2; } static void Main() { double s1 = sw(f1, 0.0, Math.PI/2, 20); double s2 = sw(f2, 0.0, 2.0, 30); Console.WriteLine("{0:f4} {1:f4}", s1, s2); } } Пример 5.7. Оформить функцию для вычисления S = . Используя эту функцию, вычислить S 1= sin xdx и S 2= 1/ dx. Для вычисления определенного интеграла использовать метод трапеций и метод Симпсона. Для выбора метода использовать перечисление (см. п. 1.6). Разделим отрезок [ a, b ] на n отрезков (для метода Симпсона n должно быть четным) длиной h =(b – a)/ n. Формула трапеций для вычисления интеграла приведена выше. Формула Симпсона имеет вид h /3(f (a)+ f (b)+ (ci =(-1) i +1, вычисляется как c = - c). Выберем n =20 для вычисления S 1 и n =30 для вычисления S 2.
using System; class Program { enum Method { method1, method2 };//объявление перечисления delegate double fx(double i); static double f1(double x) { return Math.Sin(x) * Math.Sin(x); } static double f2(double x) { return 1 / Math.Sqrt(9 + x * x); } static double sw(fx f, double a, double b, int n, Method met) { double s = f(a) + f(b), x = a, h = (b - a) / n; if (met == Method.method1) { for (int i = 1; i < n; i++) { x += h; s += 2 * f(x); } s = s * h / 2; } if (met == Method.method2) { double c = 1.0; for (int i = 1; i < n; i++) { x += h; s += (3 + c) * f(x); c = -c; } s = s * h / 3; } return s; } static void Main() { double s1 = sw(f1, 0.0, Math.PI / 2, 20, Method.method1); double s11 = sw(f1, 0.0, Math.PI / 2, 20, Method.method2); double s2 = sw(f2, 0.0, 2.0, 30, Method.method1); double s22 = sw(f2, 0.0, 2.0, 30, Method.method2); Console.WriteLine("{0:f4} {1:f4} {2:f4} {3:f4}", s1, s11, s2, s22); Console.ReadKey(); } }
Замечание.Среди параметров метода sw для вычисления интеграла имеется параметр met типа Method. При вызове метода в качестве аргумента указывается конкретный элемент списка перечисления, объявленного в начале кода, в соответствии с чем и выбирается способ вычисления интеграла в методе sw.
Дата добавления: 2014-12-07; Просмотров: 372; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |