Объектно-ориентированное программирование на С#. Андрианова А.А - 72 стр.

UptoLike

72
// решение уравнения F(x) = 0 на отрезке [a; b]
// с точностью eps>0 методом деления отрезка пополам
public static double Root(double a, double b,
double eps, FunctionDelegate f)
{
// корень гарантировано существует,
// если на концах отрезка
// функция принимает значения различных знаков.
if(f(a) * f(b) > 0)
throw new Exception("Возможно, корней на этом
отрезке не существует");
// обеспечиваем выполнение условия:
// a левый конец отрезка, b – правый
if(a > b)
{
double t = a;
a = b;
b = t;
}
// цикл метода деления отрезка пополам
while(b - a > eps)
{
double c = (a + b) / 2;
if(f(c) == 0)
return c;
if(f(a)*f(c) < 0)
b = c;
else
a = c;
}
return (a + b) / 2;
}
Как и все в С#, делегаты являются классами. В пространстве имен
System определены два класса: Delegate и MulticastDelegate. При
определении делегата в качестве базового компилятором назначается один из
этих классов в зависимости от типа возвращаемого значения: для типа void
базовым является MulticastDelegate, для остальных типов
Delegate. Существенным отличием этих двух типов делегатов является
возможность сохранения в одном делегате типа MulticastDelegate
указателей сразу на несколько функций. Эти указатели хранятся в виде
списка, который называют списком вызова. При обращении к такому
делегату функции будут выполняться по очереди в порядке их помещения в
список вызова.
Добавить функцию в список вызова можно с помощью статического
метода Combine(), который сцепляет списки вызовов или массивы
     // решение уравнения F(x) = 0 на отрезке [a; b]
     // с точностью eps>0 методом деления отрезка пополам
     public static double Root(double a, double b,
                                double eps, FunctionDelegate f)
     {
        // корень гарантировано существует,
        // если на концах отрезка
        // функция принимает значения различных знаков.
        if(f(a) * f(b) > 0)
           throw new Exception("Возможно, корней на этом
                                отрезке не существует");
        // обеспечиваем выполнение условия:
        // a – левый конец отрезка, b – правый
        if(a > b)
        {
           double t = a;
           a = b;
           b = t;
        }
        // цикл метода деления отрезка пополам
        while(b - a > eps)
        {
           double c = (a + b) / 2;
           if(f(c) == 0)
              return c;
           if(f(a)*f(c) < 0)
              b = c;
           else
              a = c;
        }
        return (a + b) / 2;
     }

      Как и все в С#, делегаты являются классами. В пространстве имен
System определены два класса: Delegate и MulticastDelegate. При
определении делегата в качестве базового компилятором назначается один из
этих классов в зависимости от типа возвращаемого значения: для типа void
базовым является MulticastDelegate, для остальных типов –
Delegate. Существенным отличием этих двух типов делегатов является
возможность сохранения в одном делегате типа MulticastDelegate
указателей сразу на несколько функций. Эти указатели хранятся в виде
списка, который называют списком вызова. При обращении к такому
делегату функции будут выполняться по очереди в порядке их помещения в
список вызова.
      Добавить функцию в список вызова можно с помощью статического
метода Combine(), который сцепляет списки вызовов или массивы

72