Reputation: 43
I have to create a class and a tester program called fraction. A fractions is created and it can be simplified, multiplied, divided, added, and subtracted. When ever I use the multiply method it keeps returning the square of the second multiply and I am not sure why.
class Fraction{
private static int numerator;
private static int denominator;
public Fraction(int num, int den){
numerator = num;
denominator = den;
}
public static int getNumerator(){
return numerator;
}
public static int getDenominator(){
return denominator;
}
public static String getFraction(){
return (numerator + "/" + denominator);
}
public static void setNumerator(int x){
numerator = x;
}
public static void setDenominator(int x){
denominator = x;
}
public static Fraction multiply(Fraction fraction, Fraction fractionTwo){
Fraction newFraction = new Fraction(fraction.getNumerator() * fractionTwo.getNumerator(), fraction.getDenominator() * fractionTwo.getDenominator());
return reduce(newFraction.getNumerator(), newFraction.getDenominator());
}
public static Fraction divide(Fraction fraction, Fraction fractionTwo){
Fraction newFraction = new Fraction(fraction.getNumerator() * fractionTwo.getDenominator(), fraction.getDenominator() *fractionTwo.getNumerator());
return reduce(newFraction.getNumerator(), newFraction.getDenominator());
}
public static Fraction commonDenominator(Fraction fraction, Fraction fractionTwo){
int x = 2;
Fraction multiply = new Fraction(x, x);
for(x = multiply.getNumerator(); fraction.getDenominator() != fractionTwo.getDenominator(); x++){
multiply.setNumerator(x);
multiply.setDenominator(x);
}
multiply(multiply, fraction);
multiply(multiply, fractionTwo);
Fraction commonDenominator = new Fraction(x, x);
return commonDenominator;
}
public static Fraction addition(Fraction fraction, Fraction fractionTwo){
Fraction commonDenominator = commonDenominator(fraction, fractionTwo);
Fraction fractionAdd = multiply(fraction, commonDenominator);
Fraction fractionAddTwo = multiply(fractionTwo, commonDenominator);
Fraction newFraction = new Fraction((fractionAddTwo.getNumerator() + fractionAdd.getNumerator()), (fractionAddTwo.getDenominator() + fractionAdd.getDenominator()));
return newFraction;
}
public static Fraction subtraction(Fraction fraction, Fraction fractionTwo){
Fraction commonDenominator = commonDenominator(fraction, fractionTwo);
Fraction fractionAdd = multiply(fraction, commonDenominator);
Fraction fractionAddTwo = multiply(fractionTwo, commonDenominator);
Fraction newFraction = new Fraction((fractionAdd.getNumerator() - fractionAddTwo.getNumerator()), (fractionAdd.getDenominator() + fractionAddTwo.getDenominator()));
return newFraction;
}
public static boolean equals(Fraction fraction){
if(numerator == fraction.getNumerator() && denominator == fraction.getDenominator()){
return true;
}
else{
return false;
}
}
public static double decimalValue(Fraction fraction){
double decimal = (double)fraction.getNumerator()/fraction.getDenominator();
return decimal;
}
public static Fraction reduce(int numerator, int denominator){
if(numerator==0&&denominator==0){
numerator = 0;
denominator = 0;
}
else{
for(int x = Math.max(numerator, denominator); x>0; x--){
if(denominator == numerator){
numerator = 1;
denominator = 1;
}
else if(numerator == 0){
numerator = 0;
denominator = 1;
}
else if(numerator%x==0 && denominator%x==0){
numerator = numerator/x;
denominator = denominator/x;
}
}
}
Fraction fraction = new Fraction(numerator, denominator);
return fraction;
}
public String toString(){
reduce(numerator, denominator);
return (numerator) + "/" + (denominator);
}
}
Upvotes: 0
Views: 662
Reputation: 43
I figured out why it was squaring the last number instead of multiplying the two numbers. It was because my instance variables were static an they weren't supposed to be.
Upvotes: 0
Reputation: 1148
This method should be static, and then you call it Fraction.multiply(f1, f2)
public static Fraction multiply(Fraction fraction, Fraction fractionTwo) {
Fraction newFraction = new Fraction(fraction.getNumerator() * fractionTwo.getNumerator(), fraction.getDenominator() * fractionTwo.getDenominator());
return newFraction.reduce();
}
or method should use the current status of the object. Then you call it new Fraction(3,4).multiply(f1)
. This method can look like this:
public Fraction multiply(Fraction fractionTwo) {
Fraction newFraction = new Fraction(numerator * fractionTwo.getNumerator(), denominator * fractionTwo.getDenominator());
return newFraction.reduce();
}
So, all the code can look like this.
class Fraction {
private int numerator;
private int denominator;
public Fraction(int num, int den) {
numerator = num;
denominator = den;
}
public static void main (String[] args){
Fraction r1 = new Fraction (2,3); // 2/3
Fraction r2 = new Fraction(3,4); // 3/4
Fraction r3 = r1.multiply(r2); // 2/3 * 3/4
System.out.println(r3); // print 1/2
}
public int getNumerator() {
return numerator;
}
public int getDenominator() {
return denominator;
}
public Fraction multiply(Fraction fractionTwo) {
Fraction newFraction = new Fraction(numerator * fractionTwo.getNumerator(), denominator * fractionTwo.getDenominator());
return newFraction.reduce();
}
public Fraction reduce() {
for (int x = Math.max(numerator, denominator); x > 0; x--) {
if (numerator % x == 0 && denominator % x == 0) {
numerator = numerator / x;
denominator = denominator / x;
}
if (denominator == numerator) {
numerator = 1;
denominator = 1;
}
}
return this;
}
@Override
public String toString() {
return numerator + " / " + denominator;
}
}
Upvotes: 1
Reputation: 181
I won't give the same answer as you already got. So I answer regarding the toString()
method.
Please keep in mind that any object inherits from the class object
. And if you use the method toString()
you override it from the object class.
Here you can see the methods inside the object class: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html
As you can see, the toString()
method represents the object where it is used and it requires no parameter. So if you implement it as follows:
public String toString() {
return **your Code**;
}
Then this one should give no weird numbers and letters (which are actually the current memory address of the object).
All the best
Upvotes: 0