Skip to Main Content

Java APIs

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Java Error: Rational calculator returns 0 for calculations

843810Oct 13 2005
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;
  }
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 10 2005
Added on Oct 13 2005
0 comments
172 views