Выбрать главу

Закрытый метод НОД

Метод, вычисляющий наибольший общий делитель пары чисел, понадобится не только конструктору класса, но и всем операциям над рациональными числами. Алгоритм нахождения общего делителя хорошо известен со времен Эвклида. Я приведу программный код метода без особых пояснений:

/// <summary>

/// Закрытый метод класса.

/// Возвращает наибольший общий делитель чисел а, Ь

/// </summary>

/// <param name="а">первое число</param>

/// <param name="Ь">второе число, положительное</param>

/// <returns>HOД(a,b)</returns>

int nod(int m, int n)

{

      int p=0;

      m=Math.Abs(m); n =Math.Abs(n);

      if(n>m){p=m; m=n; n=p;}

      do

       {

       p = m%n; m=n; n=p;

       }while (n!=0);

       return(m);

}//nod

Печать рациональных чисел

Почти любой класс содержит один или несколько методов, позволяющих выводить на печать данные о классе. Такой метод имеется и в классе Rational. Вот его текст:

public void PrintRational(string name)

{

      Console.WriteLine(" {0} = {1} / { 2}",name,m,n);

}

Метод печатает имя и значение рационального числа в форме m/n.

Тестирование создания рациональных чисел

В классе Testing, предназначенном для тестирования нашей работы и являющегося клиентом класса Rational, создадим процедуру, позволяющую проверить корректность создания рациональных чисел. Вот эта процедура:

public void TestCreateRational()

{

      Rational r1=new Rational(0,0), r2 = new Rational(1,1);

      Rational r3=new Rational(10,8), r4 = new Rational(2,6);

      Rational r5=new Rational(4,-12), r6 = new Rational (-12,-14);

      r1.PrintRational("r1: (0,0)");

      r2.PrintRational("r2: (1,1)");

      r3.PrintRational("r3: (10,8)");

      r4.PrintRational("r4: (2,6)");

      r5.PrintRational("r5: (4,-12)");

      r6.PrintRational("r6: (-12,-14)");

}

Она создает и печатает шесть рациональных чисел. Вот как выглядят результаты ее работы.

Рис. 16.3. Создание и печать рациональных чисел

Операции над рациональными числами

Определим над рациональными числами стандартный набор операций — сложение и вычитание, умножение и деление. Реализуем эти операции методами с именами Plus, Minus, Mult, Divide соответственно. Поскольку рациональные числа — это прежде всего именно числа, то для выполнения операций над ними часто удобнее пользоваться привычными знаками операций (+, -, *, /). Язык C# допускает определение операций, заданных указанными символами. Этот процесс называется перегрузкой операций, и мы рассмотрим сейчас, как это делается. Конечно, можно было бы обойтись только перегруженными операциями, но мы приведем оба способа. Пользователь сам будет решать, какой из способов применять в конкретной ситуации — вызывать метод или операцию.

Покажем вначале реализацию метода Pius и операции +:

public Rational Plus(Rational a)

{

      int u,v;

      u = m*a.n +n*a.m; v= n*a.n;

      return (new Rational(u, v));

}//Plus

public static Rational operator +(Rational r1, Rational r2)

{

      return (r1.Plus(r2));

}

Метод Plus реализуется просто. По правилам сложения дробей вычисляется числитель и знаменатель результата, и эти данные становятся аргументами конструктора, создающего требуемое рациональное число, которое удовлетворяет правилам класса.

Обратите внимание на то, как определяется операция класса. Именем соответствующего метода является сам знак операции, которому предшествует ключевое слово operator. Важно также помнить, что операция является статическим методом класса с атрибутом static.