Hi! Having trouble figuring out why my code below is returning 0 for any rational calculations entered on the cmd line. I am hoping it is something simple - since I have been staring it at it, for what seems like forever, just can't see it....need some more eyes!!!!
Please, Any help would be greatly appreciated.....Thanks so much!
Code is as follows:
import java.io.*;
import java.util.*;
import java.lang.*;
public class Rational_p3 {
/** Creates a new instance of Rational_p3 */
public Rational_p3() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Check command-line arguments
if (args.length != 3)
{
System.out.println(
"Usage: java Rational Calculator operand1 operator operand2");
System.exit(0);
}
System.out.println(args[1]);
// The result of the operation
int result = 0;
Rational r1 = new Rational();
Rational r2 = new Rational();
r1 = parseRational(args[0]);
r2 = parseRational(args[2]);
// Determine the operator
switch (args[1].charAt(0))
{
case '+': result = r1.add(r2).intValue();
break;
case '-': result = r1.subtract(r2).intValue();
break;
case '*': result = r1.multiply(r2).intValue();;
break;
case '/': result = r1.divide(r2).intValue();;
}
// Display result
System.out.println(args[0] + ' ' + args[1] + ' ' + args[2] + " = " + result);
}
// sets "this" to the value found in s static
public static Rational parseRational(String s)
{
StringTokenizer tokenizer;
String strNum, strDenom;
int itsNum, itsDenom;
// Set up a string tokenizer that can find the int values in s.
// Tokens are separates by blanks for "/" s
tokenizer = new StringTokenizer(s, " /");
strNum = tokenizer.nextToken();
strDenom = tokenizer.nextToken();
// Return a new ration with the specified numerator and denominator
itsNum = Integer.parseInt(strNum);
itsDenom = Integer.parseInt(strDenom);
//Rational rat ;
//rat = test.Rational.Rational();
return new Rational(itsNum, itsDenom);
}
/*************************************************************************
* Helper functions for GCD calculations
*************************************************************************/
// return gcd(m, n)
private static int gcd(int m, int n)
{
if (0 == n)return m;
else return gcd(n, m % n);
}
// return lcm(m, n)
private static int lcm(int m, int n)
{
return m * (n / gcd(m, n));
}
}
Rational file is std, see below:
public class Rational extends Number implements Comparable {
// Data fields for numerator and denominator
private long numerator = 0;
private long denominator = 1;
/** Construct a rational with default properties */
public Rational() {
this(0, 1);
}
/** Construct a rational with specified numerator and denominator */
public Rational(long numerator, long denominator) {
long gcd = gcd(numerator, denominator);
this.numerator = ((denominator > 0) ? 1 : -1) * numerator / gcd;
this.denominator = Math.abs(denominator) / gcd;
}
/** Find GCD of two numbers */
private static long gcd(long n, long d) {
long n1 = Math.abs(n);
long n2 = Math.abs(d);
int gcd = 1;
for (int k = 1; k <= n1 && k <= n2; k++) {
if (n1 % k == 0 && n2 % k == 0)
gcd = k;
}
return gcd;
}
/** Return numerator */
public long getNumerator() {
return numerator;
}
/** Return denominator */
public long getDenominator() {
return denominator;
}
/** Add a rational number to this rational */
public Rational add(Rational secondRational) {
long n = numerator * secondRational.getDenominator() +
denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
/** Subtract a rational number from this rational */
public Rational subtract(Rational secondRational) {
long n = numerator * secondRational.getDenominator()
- denominator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
/** Multiply a rational number to this rational */
public Rational multiply(Rational secondRational) {
long n = numerator * secondRational.getNumerator();
long d = denominator * secondRational.getDenominator();
return new Rational(n, d);
}
/** Divide a rational number from this rational */
public Rational divide(Rational secondRational) {
long n = numerator * secondRational.getDenominator();
long d = denominator * secondRational.numerator;
return new Rational(n, d);
}
/** Override the toString() method */
public String toString() {
if (denominator == 1)
return numerator + "";
else
return numerator + "/" + denominator;
}
/** Override the equals method in the Object class */
public boolean equals(Object parm1) {
if ((this.subtract((Rational)(parm1))).getNumerator() == 0)
return true;
else
return false;
}
/** Override the hashCode method in the Object class */
public int hashCode() {
return new Double(this.doubleValue()).hashCode();
}
/** Override the abstract intValue method in java.lang.Number */
public int intValue() {
return (int)doubleValue();
}
/** Override the abstract floatValue method in java.lang.Number */
public float floatValue() {
return (float)doubleValue();
}
/** Override the doubleValue method in java.lang.Number */
public double doubleValue() {
return numerator * 1.0 / denominator;
}
/** Override the abstract longValue method in java.lang.Number */
public long longValue() {
return (long)doubleValue();
}
/** Override the compareTo method in java.lang.Comparable */
public int compareTo(Object o) {
if ((this.subtract((Rational)o)).getNumerator() > 0)
return 1;
else if ((this.subtract((Rational)o)).getNumerator() < 0)
return -1;
else
return 0;
}
}