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

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

    В тексте ниже представлена программа, в которой описываются и используются достаточно несложные статические методы.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr65_1
{
    class Program
    {
        // Статический метод для отображения текста,
        // переданного аргументом методу: 
        static void show(string txt)
        {
            Console.WriteLine(txt);
        }

        // Статический метод для вычисления факториала числа,
        // переданного аргументом методу: 
        static int factorial(int n)
        {
            // Локальная переменная: 
            int s = 1;
            // Вычисление произведения: 
            for (int k = 1; k <= n; k++)
            {
                // Умножение произведения на число: 
                s *= k;
            }
            // Результат метода: 
            return s;
        }

        // Статический метод для возведения числа в степень.
        // Число и степень передаются аргументами методу: 
        static double power(double x, int n)
        {
            // Локальная переменная: 
            double s = 1;
            // Вычисление результата (число в степени): 
            for (int k = 1; k <= n; k++)
            {
                // Текущее значение умножается на число: 
                s *= x;
            }
            // Результат метода: 
            return s;
        }

        // Главный метод программы: 
        static void Main()
        {
            // Вызываем статический метод для отображения
            // сообщения в консольном окне:
            show("Начинаем вычисления:");
            int m = 5;  // Целочисленные переменные
            double z = 3, num; // Действительные переменные
            // Вычисление факториала числа:
            show(m + "!=" + factorial(m));
            // Число в степени: 
            num = power(z, m);
            // Отображение сообщения вызовом статического метода: 
            show(z + " в степени " + m + ": " + num);
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

    Результат выполнения программы такой (рисунок 1).


Рис.1. Результат работы приложения

    В этой программе, кроме главного метода, описывается еще и три статических метода. Эти статические методы затем вызываются в методе Main(). Проанализируем их программные коды.

    Статический метод show() не возвращает результат (ключевое слово void перед названием метода в его описании), и у него один текстовый аргумент (описан как string txt). В теле метода всего одна команда

  Console.WriteLine (txt);   , 
которой значение текстового аргумента метода отображается в консольном окне. Поэтому при вызове метода в консольном окне будет отображаться значение (текст), переданное методу аргументом.

    Статический метод factorial() предназначен для вычисления факториала числа, переданного аргументом методу. Поэтому аргумент n метода factorial() объявлен как целочисленный (тип int). Вычисленное значение возвращается результатом метода. Тип результата определяется как целочисленный (тип int).


Факториал (обозначается как n!) числа n - это произведение чисел от 1 до данного числа включительно. Другими словами, по определению n! = 1 * 2 *3 * ... * n. Например, 5! = 1*2*3*4*5 = 120.

    В теле метода командой объявляется целочисленная локальная переменная s с начальным значением 1. После этого запускается цикл, в котором индексная переменная к пробегает значения от 1 до n включительно (напомним, что n - это аргумент метода). За каждую итерацию цикла командой

  s *= k;
текущее значение переменной s умножается на значение индексной переменной k. В результате после завершения цикла значение переменной s равно произведению натуральных чисел от 1 до n. Это именно то значение, которое нам нужно вычислить. Командой
  return s; 
оно возвращается как результат метода.


В теле метода factorial () объявлена переменная s. Также в конструкции цикла (в теле метода) объявлена переменная k. У этих переменных разная область доступности и разное время существования. Под переменную s место в памяти выделяется при вызове метода. Переменная (после объявления) доступна везде в теле метода. Существует переменная, пока выполняется метод.

    Переменная k доступна только в цикле. Под нее память выделяется при запуске на выполнение конструкции цикла. После того как конструкция цикла завершает работу, переменная k удаляется из памяти (освобождается место в памяти, выделенное под эту переменную).


    Еще один статический метод, описанный в программе, предназначен для вычисления результата возведения числа в целочисленную степень. Метод называется power(), у него два аргумента (первый типа double и второй типа int). Результатом метод возвращает значение типа double.


Речь идет о вычислении значения выражения вида хn. По определению хn= х * х * ... * х (всего n множителей). Значения х и n передаются аргументом методу power(), а результатом возвращается значение хn.

    Код метода power() немного напоминает код метода factorial(). В теле метода power() объявляется переменная s типа double с начальным значением 1. Затем с помощью конструкции цикла значение переменной s последовательно умножается n раз (второй аргумент метода) на значение х (первый аргумент метода). Значение переменной s возвращается результатом метода.

    В главном методе программы сначала командой

  show("Начинаем вычисления:");
вызывается статический метод show() для отображения текстового сообщения. Впоследствии этот же метод вызывается командой
  show(m + "!=" + factorial(m));   .
В аргументе, переданном методу show(), использована инструкция
  factorial (m), 
которой вызывается статический метод factorial(). Команда
  show(m + "!=" + factorial(m));   .
обрабатывается в несколько этапов. Сначала вычисляется текстовое значение
   m + "!=" + factorial(m), 
которое передается аргументом методу show() и, как следствие, отображается в консольном окне. Значение выражения
   m + "!=" + factorial(m), 
вычисляется путем преобразования значения переменной m к текстовому формату, после чего к полученному тексту дописывается текст "! = ". Затем вычисляется значение выражения factorial (m), и оно дописывается к полученному ранее текстовому значению. Значение выражения factorial(m) - это факториал числа, определяемого значением переменной m.

    Вычисление выражения factorial(m) выполняется так. Поскольку метод factorial() возвращает целочисленный результат, то при вызове метода для запоминания этого результата автоматически выделяется место в памяти. В процессе выполнения кода метода factorial() формируется значение переменной s. При выполнении команды

  return s;
в теле метода значение переменной s копируется в ячейку памяти, выделенную для хранения результата метода. Все локальные переменные, созданные при выполнении метода, удаляются, а значение из ячейки, выделенной под результат метода, используется в вычислениях - в данном случае подставляется вместо выражения factorial(m).

    Командой

  num = power(z, m);
переменной num в качестве значения присваивается результат вызова метода power() с аргументами z и m.

    При вызове метода power() с аргументами z и m значение z возводится в степень m, а результат записывается в локальную переменную s. При выполнении команды

  return s;
значение переменной s копируется в ячейку, автоматически выделенную для результата метода. При выполнении команды
  num = power(z, m);
значение из ячейки с результатом метода копируется в переменную num. После этого ячейка с результатом метода удаляется из памяти.

    Вычисленное значение переменной num используется в команде

  show(z + " в степени " + m + ": " + num);

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




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