logo search
C#, 320 стр

Конструкторы класса Rational

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

/// <summary>

/// Конструктор класса. Создает рациональное число

/// m/n, эквивалентное a/b, но со взаимно несократимыми

/// числителем и знаменателем. Если b=0, то результатом

/// является рациональное число 0 -пара (0,1).

/// </summary>

/// <param name="a">числитель</param>

/// <param name="b">знаменатель</param>

public Rational(int a, int b)

{

if(b==0) {m=0; n=1;}

else

{

//приведение знака

if( b<0) {b=-b; a=-a;}

//приведение к несократимой дроби

int d = nod(a,b);

m=a/d; n=b/d;

}

}

Как видите, конструктор класса может быть довольно сложным.

В нем, как в нашем случае, может проверяться корректность задаваемых аргументов. Для рациональных чисел мы полагаем, что задание нулевого знаменателя означает задание рационального числа 0, и этоэквивалентно заданию пары (0, 1). В остальных случаях выполняется приведение заданной пары чисел к эквивалентному рациональному числу с несократимыми числителем и знаменателем. По ходу дела вызывается закрытый метод класса, вычисляющий значение НОД(a,b) - наибольшего общего делителя чисел a и b.