Шаг 87.
Язык программирования C#. Начала
Знакомство с классами и объектами. Статические члены класса (окончание)

    На этом шаге мы приведем еще один пример использования статических методов класса.

    Еще один, на этот раз "математический" пример с использованием статических полей и методов представлен ниже. В программе описан класс MyMath, в котором есть статические методы для вычисления значений синуса и экспоненты. В классе также имеется константное статическое поле, значение которого определяет иррациональное число π.


Что касается статических полей, то нередко они используются как статические константы: для такого поля указывается идентификатор типа (и если нужно - спецификатор уровня доступа), но вместо ключевого слова static указывается идентификатор const. Причина в том, что константные поля по умолчанию реализуются как статические. Значение константного поля указывается при объявлении и впоследствии не может быть изменено.


Для вычисления экспоненты используется следующее выражение: ехр(х) ≈ 1 + х + x2/2! + x3/3! + ... + xn/n! = Σnk=0xk/k!. В программе описывается статический метод для вычисления суммы Σnk=0qk = q0 + q1 + ... + qn, где при заданном значении аргумента х слагаемые в сумме вычисляются как qk= xk/k! . Сумма вычисляется с помощью оператора цикла, в котором после прибавления к сумме очередного слагаемого рассчитывается слагаемое для следующей итерации. При этом мы исходим из того, что если вычислена добавка qk для текущей итерации, то добавка qk+1 для следующей итерации вычисляется как qk+1 = qk * x/(k+1) (легко проверить, что если qk = xk/k! и qk+1 = xk+1/(k+1)!, то qk+1/qk = x/(k+1)).

    Аналогичным образом вычисляется синус: используется формула 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. Несложно заметить, что совпадение более чем приемлемое.


Библиотечный класс Math (пространство имен System) содержит статические методы, через которые реализуются основные математические функции. Там также есть статические поля со значениями некоторых математических констант (основание натурального логарифма и число "пи").

    На следующем шаге мы рассмотрим ключевое слово this.




Предыдущий шаг Содержание Следующий шаг