Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added FractionMath in C# #4040

Merged
merged 10 commits into from
Nov 13, 2024
193 changes: 193 additions & 0 deletions archive/c/c-sharp/FractionMath.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
using System;

namespace SamplePrograms
{
public class FractionMath
{
private int numerator;
private int denominator;

public FractionMath(int numerator = 0, int denominator = 1)
{
if (denominator == 0)
{
throw new ArgumentException("Denominator cannot be zero.");
}

this.numerator = numerator;
this.denominator = denominator;
}

private int GCD(int x, int y)
{
while (y != 0)
{
int z = x;
x = y;
y %= z;
}
return x;
}

private void Simplify()
{
int gcd = GCD(numerator, denominator);
numerator /= gcd;
denominator /= gcd;

if (denominator < 0)
{
numerator = -numerator;
denominator = -denominator;
}
}

public override string ToString()
{
Simplify();
return $"{numerator}/{denominator}";
}

public static FractionMath Parse(string fractionString)
{
string[] numbers = fractionString.Split('/');
if (numbers.Length != 2)
{
throw new FormatException("Invalid fraction. A format of 'numerator/denominator' is expected.");
}

int numerator = int.Parse(numbers[0]);
int denominator = int.Parse(numbers[1]);

return new FractionMath(numerator, denominator);
}

public static FractionMath operator +(FractionMath f1, FractionMath f2)
{
int newNumerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator;
int newDenominator = f1.denominator * f2.denominator;
return new FractionMath(newNumerator, newDenominator);
}

public static FractionMath operator -(FractionMath f1, FractionMath f2)
{
int newNumerator = f1.numerator * f2.denominator - f2.numerator * f1.denominator;
int newDenominator = f1.denominator * f2.denominator;
return new FractionMath(newNumerator, newDenominator);
}

public static FractionMath operator *(FractionMath f1, FractionMath f2)
{
int newNumerator = f1.numerator * f2.numerator;
int newDenominator = f1.denominator * f2.denominator;
return new FractionMath(newNumerator, newDenominator);
}

public static FractionMath operator /(FractionMath f1, FractionMath f2)
{
int newNumerator = f1.numerator * f2.denominator;
int newDenominator = f1.denominator * f2.numerator;
return new FractionMath(newNumerator, newDenominator);
}

public static bool operator ==(FractionMath f1, FractionMath f2)
{
return f1.numerator * f2.denominator == f1.denominator * f2.numerator;
}

public static bool operator !=(FractionMath f1, FractionMath f2)
{
return !(f1 == f2);
}

public static bool operator >(FractionMath f1, FractionMath f2)
{
return f1.numerator * f2.denominator > f1.denominator * f2.numerator;
}

public static bool operator <(FractionMath f1, FractionMath f2)
{
return f1.numerator * f2.denominator < f1.denominator * f2.numerator;
}

public static bool operator >=(FractionMath f1, FractionMath f2)
{
return f1 > f2 || f1 == f2;
}

public static bool operator <=(FractionMath f1, FractionMath f2)
{
return f1 < f2 || f1 == f2;
}

public static void Main(string[] args)
{
if (args.Length != 3)
{
Console.WriteLine("Usage: ./fraction-math operand1 operator operand2");
return;
}

try
{
FractionMath operand1 = Parse(args[0]);
string operation = args[1];
FractionMath operand2 = Parse(args[2]);

FractionMath result;
bool comparisonResult;

switch (operation)
{
case "+":
result = operand1 + operand2;
Console.WriteLine(result);
break;
case "-":
result = operand1 - operand2;
Console.WriteLine(result);
break;
case "*":
result = operand1 * operand2;
Console.WriteLine(result);
break;
case "/":
result = operand1 / operand2;
Console.WriteLine(result);
break;
case "==":
comparisonResult = operand1 == operand2;
Console.WriteLine(comparisonResult ? "1" : "0");
break;
case "!=":
comparisonResult = operand1 != operand2;
Console.WriteLine(comparisonResult ? "1" : "0");
break;
case ">":
comparisonResult = operand1 > operand2;
Console.WriteLine(comparisonResult ? "1" : "0");
break;
case "<":
comparisonResult = operand1 < operand2;
Console.WriteLine(comparisonResult ? "1" : "0");
break;
case ">=":
comparisonResult = operand1 >= operand2;
Console.WriteLine(comparisonResult ? "1" : "0");
break;
case "<=":
comparisonResult = operand1 <= operand2;
Console.WriteLine(comparisonResult ? "1" : "0");
break;
default:
Console.WriteLine($"Error: Invalid operator '{operation}'");
break;
}
}
catch (Exception e)
{
Console.WriteLine($"Error: {e.Message}");
}
}
}
}