📄 rational.cs
字号:
namespace Rational
{
using System;
/// <summary>
/// Rational defines a class for holding and manipulating rational numbers
/// </summary>
[CustomAttribute.DeveloperInfo("John S.", Date="12-12-2000"),
CustomAttribute.DeveloperInfo("C++ Developer", Date="11-11-2000")]
public class Rational
{
private int dividend = 0;
private int divisor = 1;
// Define constructors
public Rational(int dividend)
{
this.dividend = dividend;
this.divisor = 1;
}
public Rational(int dividend, int divisor)
{
if (divisor == 0) {
throw new ArgumentOutOfRangeException("Divisor cannot be zero");
} else {
this.dividend = dividend;
this.divisor = divisor;
}
}
public Rational(Rational r1)
{
this.dividend = r1.dividend;
this.divisor = r1.divisor;
}
// Define operators
public static bool operator== (Rational r1, Rational r2)
{
decimal decimalValue1 = (decimal)r1.dividend / r1.divisor;
decimal decimalValue2 = (decimal)r2.dividend / r2.divisor;
return decimalValue1 == decimalValue2;
}
public static bool operator!= (Rational r1, Rational r2)
{
return !(r1 == r2);
}
public static bool operator< (Rational r1, Rational r2)
{
decimal decimalValue1 = (decimal)r1.dividend / r1.divisor;
decimal decimalValue2 = (decimal)r2.dividend / r2.divisor;
return decimalValue1 < decimalValue2;
}
public static bool operator> (Rational r1, Rational r2)
{
return !((r1 < r2) || (r1 == r2));
}
public static bool operator <= (Rational r1, Rational r2)
{
return !(r1 > r2);
}
public static bool operator >= (Rational r1, Rational r2)
{
return !(r1 < r2);
}
public static Rational operator+ (Rational r1, Rational r2)
{
// Make working copies of r1 and r2
Rational tempR1 = new Rational(r1);
Rational tempR2 = new Rational(r2);
// Work out a common divisor
// E.g. to add 1/4 and 2/3, convert to 3/12 and 8/12
int commonDivisor;
if (tempR1.divisor != tempR2.divisor) {
commonDivisor = tempR1.divisor * tempR2.divisor;
// Multiply out the dividends of each rational
tempR1.dividend *= tempR2.divisor;
tempR2.dividend *= tempR1.divisor;
} else {
commonDivisor = tempR1.divisor;
}
// Create a new Rational with the dividends summed and the common divisor
// E.g. 1/4 + 2/3 = 3/12 + 8/12 = 11/12
Rational result = new Rational(tempR1.dividend + tempR2.dividend, commonDivisor);
return result;
}
public static Rational operator+ (Rational r1, int i1)
{
// Convert i1 into a Rational
Rational r2 = new Rational(i1 * r1.divisor, r1.divisor);
// Perform Rational addition
return r1 + r2;
}
public static Rational operator- (Rational r1, Rational r2)
{
// Make working copies of r1 and r2
Rational tempR1 = new Rational(r1);
Rational tempR2 = new Rational(r2);
// Work out a common divisor
// E.g. to subtract 2/3 from 1/4, convert to 8/12 and 3/12
int commonDivisor;
if (tempR1.divisor != tempR2.divisor) {
commonDivisor = tempR1.divisor * tempR2.divisor;
// Multiply out the dividends of each rational
tempR1.dividend *= tempR2.divisor;
tempR2.dividend *= tempR1.divisor;
} else {
commonDivisor = tempR1.divisor;
}
// Create a new Rational with the dividends summed and the common divisor
// E.g. 2/3 - 1/4 = 8/12 - 3/12 = 5/12
Rational result = new Rational(tempR1.dividend - tempR2.dividend, commonDivisor);
return result;
}
public static Rational operator- (Rational r1, int i1)
{
// Convert i1 into a Rational
Rational r2 = new Rational(i1 * r1.divisor, r1.divisor);
// Perform Rational addition
return r1 - r2;
}
public static Rational operator++ (Rational r1)
{
return r1 + 1;
}
public static Rational operator-- (Rational r1)
{
return r1 - 1;
}
public static implicit operator float (Rational r1)
{
float temp;
temp = (float)r1.dividend / r1.divisor;
return temp;
}
public static explicit operator int (Rational r1)
{
float temp;
temp = (float)r1.dividend / r1.divisor;
return (int) temp;
}
public static implicit operator Rational(int i1)
{
Rational temp = new Rational(i1, 1);
return temp;
}
public static Rational operator* (Rational r1, Rational r2)
{
int dividend = r1.dividend * r2.dividend;
int divisor = r1.divisor * r2.divisor;
Rational temp = new Rational(dividend, divisor);
return temp;
}
public static Rational operator* (Rational r1, int i1)
{
int dividend = r1.dividend * i1;
Rational temp = new Rational(dividend, r1.divisor);
return temp;
}
public static Rational operator/ (Rational r1, Rational r2)
{
// Create the reciprocal of r2 and then multiply
Rational temp = new Rational(r2.divisor, r2.dividend);
return r1 * temp;
}
public static Rational operator/ (Rational r1, int i1)
{
// Create a Rational that is the reciprocal of i1 and then multiply
Rational temp = new Rational(1, i1);
return r1 * temp;
}
public static Rational operator% (Rational r1, int i1)
{
// Convert r1 to an int
int temp = (int)r1;
// Work out the rounding difference between temp and r1
Rational diff = r1 - temp;
// Perform % on temp and i1
int remainder = temp % i1;
// Add remainder and diff together to get the complete result
diff = diff + remainder;
return diff;
}
// Override methods
public override string ToString()
{
return dividend + "/" + divisor;
}
public override bool Equals(Object r1)
{
return (this == r1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -