На этом шаге мы приведем еще один пример использования статических методов класса.
Еще один, на этот раз "математический" пример с использованием статических полей и методов представлен ниже. В программе описан класс MyMath, в котором есть статические методы для вычисления значений синуса и экспоненты. В классе также имеется константное статическое поле, значение которого определяет иррациональное число π.
Аналогичным образом вычисляется синус: используется формула sin(x) = x - x3/3! + x5/5! - x7/7! + ... + (-1)nx2n+1/(2n+1)! = Σnk=0(-1)kx2k+1/(2k+1)!. Подход используем тот же, что и при вычислении экспоненты - то есть вычисляется сумма вида Σnk=0qk = q0 + q1 + ... + qn, но на этот раз qk= (-1)kx2k+1/(2k+1)!, qk+1= (-1)(k+1)x2k+3/(2k+3)!, qk+1/qk = -x2/((2k+2)(2k+3)) и тогда qk+1 = qk*(-1)x2/((2k+2)(2k+3)).
Для определения значения параметра n (верхняя граница в суммах, через которые вычисляется синус и экспонента) в программе (в соответствующем классе) объявлено статическое целочисленное поле. А значение π=3,141592 определяется через статическую константу.
Проанализируем представленный ниже программу.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr87_1 { // Класс со статическими методами и полями: class MyMath { // Константное поле (число "пи"): public const double Pi = 3.141592; // Закрытое статическое поле (граница суммы): private static int N = 100; // Статический метод для вычисления экспоненты: public static double exp(double x) { // Сумма и добавка к сумме: double s = 0, q = 1; // Вычисление суммы: for(int k = 0; k <= N; k++) { s += q; // Прибавление добавки к сумме q *= x/(k + 1); // Добавка для следующей итерации } // Результат: return s; } // Статический метод для вычисления синуса: public static double sin(double x) { // Сумма и добавка к сумме: double s = 0, q = x; // Вычисление суммы: for(int k = 0; k <= N; k++) { s += q; // Прибавление добавки к сумме // Добавка для следующей итерации: q *= (-1) * x * x / ( 2 * k + 2) / (2 * k + 3); } // Результат: return s; } } // Главный класс: class Program { static void Main() { // Аргумент для статических методов: double z = 1; // Вычисление экспоненты: Console.WriteLine("ехр({0}) = {1}", z, MyMath.exp(z)); // Контрольное значение: Console.WriteLine("Контрольное значение: {0}", Math.Exp(z)); // Новое значение аргумента: z = MyMath.Pi/4; // Вычисление синуса: Console.WriteLine("sin({0}) = {1}", z, MyMath.sin(z)); // Контрольное значение: Console.WriteLine("Контрольное значение: {0}", Math.Sin(z)); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой.
Рис.1. Результат выполнения программы
Мы описываем класс MyMath, в котором описаны статические методы ехр() и sin() для вычисления соответственно экспоненты и синуса. Оба метода реализованы по общему принципу: объявляются две локальные числовые переменные s и q. В первую записывается значение для суммы, через которую вычисляется экспонента или синус, а во вторую заносится значение добавки к сумме. Начальное значение суммы в обоих случаях нулевое. При вычислении экспоненты первая добавка единичная, а для синуса первая добавка к сумме равна значению аргумента, переданного методу.
Сумма вычисляется с помощью констркуции цикла, в котором за каждую итерацию к сумме прибавляется очередная добавка, а затем вычисляется добавка для следующей итерации. Количество слагаемых в сумме определяется значением статического целочисленного поля N (значение поля равно 100). Поле описано со спецификатором уровня доступа private. Поэтому поле является закрытым и доступно только внутри кода класса MyMath. Поле Pi описано с идентификатором const. Это означает, что поле константное (его значение изменить нельзя). Константные поля автоматически реализуются как статические. Поэтому в главном методе программы доступ к этому полю получаем с помощью инструкции MyMath.Pi.
Там (в главном методе) вычисляются значения для экспоненты и синуса. Для сравнения приведены контрольные значения, которые вычисляются с помощью статических методов Ехр() и Sin() класса Math. Несложно заметить, что совпадение более чем приемлемое.
На следующем шаге мы рассмотрим ключевое слово this.