Reputation: 3
i'm new to kotlin and i'm having a trouble multiplying same parameters of two objects which are in the same class.
class Fraction (private val numerator:Int, denumerator:Int)
i have a class called fraction and 2 objects.
var f1 = Fraction(1,6)
var f2 = Fraction(3,6)
i want to create a function which multiplies first fraction on the second fraction. also i have to create a function which adds up these two fractions.
can someone help me?
Upvotes: 0
Views: 446
Reputation: 10493
You can use operator overloading here to support plus
and times
operation.
data class Fraction(val numerator: Int, val denominator: Int) {
operator fun plus(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.denominator + this.denominator * other.numerator,
denominator = this.denominator * other.denominator
)
}
operator fun times(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.numerator,
denominator = this.denominator * other.denominator
)
}
}
Usage:
val f1 = Fraction(1, 2)
val f2 = Fraction(3, 5)
println(f1 + f2)
println(f1 * f2)
Output:
Fraction(numerator=11, denominator=10)
Fraction(numerator=3, denominator=10)
Note that the resultant fraction won't be a reduced one. If you want the fraction in its lowest terms, you will have to divide numerator and denominator by their gcd. The final code will be:
data class Fraction(val numerator: Int, val denominator: Int) {
operator fun plus(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.denominator + this.denominator * other.numerator,
denominator = this.denominator * other.denominator
).reduced()
}
operator fun times(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.numerator,
denominator = this.denominator * other.denominator
).reduced()
}
fun reduced(): Fraction {
val gcd = gcd(numerator, denominator)
return Fraction(numerator / gcd, denominator / gcd)
}
}
tailrec fun gcd(n1: Int, n2: Int): Int {
return if (n2 != 0) gcd(n2, n1 % n2) else n1
}
Edit: As per @gidds suggestion in comments, I have added few more utility functions in the class which will help you when dealing with fractions.
data class Fraction(val numerator: Int, val denominator: Int) : Comparable<Fraction> {
operator fun plus(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.denominator + this.denominator * other.numerator,
denominator = this.denominator * other.denominator
).reduced()
}
operator fun minus(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.denominator - this.denominator * other.numerator,
denominator = this.denominator * other.denominator
).reduced()
}
operator fun times(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.numerator,
denominator = this.denominator * other.denominator
).reduced()
}
operator fun div(other: Fraction): Fraction {
return Fraction(
numerator = this.numerator * other.denominator,
denominator = this.denominator * other.numerator
).reduced()
}
override fun equals(other: Any?): Boolean {
if (other == null) return false
if (other !is Fraction) return false
return this.numerator * other.denominator == this.denominator * other.numerator
}
override fun hashCode(): Int {
return with(reduced()) { 31 * numerator + denominator }
}
override operator fun compareTo(other: Fraction): Int {
return when {
this == other -> 0
this.numerator * other.denominator > this.denominator * other.numerator -> 1
else -> -1
}
}
override fun toString(): String {
return "$numerator/$denominator"
}
fun reduced(): Fraction {
val gcd = gcd(numerator, denominator)
return Fraction(numerator / gcd, denominator / gcd)
}
}
Upvotes: 2
Reputation: 286
// Use data class instead class because the purpose of class is only hold data
data class Fraction(var numerator: Int, var denumerator: Int)
fun multiplyFraction(f1: Fraction, f2: Fraction) : Fraction {
val fractionResult = Fraction(
(f1.numerator * f2.numerator),
(f1.denumerator * f2.denumerator)
)
return fractionResult
}
fun addUpFraction(f1: Fraction, f2: Fraction) : Fraction {
lateinit var fractionResult: Fraction
// If f1 e f2 denumerators are equal
if (f1.denumerator === f2.denumerator) {
fractionResult = Fraction(
(f1.numerator + f2.numerator),
f1.denumerator
)
} else { // If not equal
fractionResult = Fraction(
((f1.numerator * f2.denumerator) + (f2.numerator * f1.denumerator)),
(f1.denumerator * f2.denumerator)
)
}
return fractionResult
}
fun main() {
// Fractions with denumerators equals
val f1 = Fraction(1, 5)
val f2 = Fraction( 3, 5)
var f3 = addUpFraction(f1, f2)
println("${f1.numerator}/${f1.denumerator} + ${f2.numerator}/${f2.denumerator} = " +
"${f3.numerator}/${f3.denumerator}")
f3 = multiplyFraction(f1, f2)
println("${f1.numerator}/${f1.denumerator} * ${f2.numerator}/${f2.denumerator} = " +
"${f3.numerator}/${f3.denumerator}")
// Fractions with denumerators not equals
f1.denumerator = 3
f3 = addUpFraction(f1, f2)
println("${f1.numerator}/${f1.denumerator} + ${f2.numerator}/${f2.denumerator} = " +
"${f3.numerator}/${f3.denumerator}")
f3 = multiplyFraction(f1, f2)
println("${f1.numerator}/${f1.denumerator} * ${f2.numerator}/${f2.denumerator} = " +
"${f3.numerator}/${f3.denumerator}")
}
References
Upvotes: 0