Very good points. I came up with a third draft. This is evolving good!
Hi Nacho,
I wouldn't throw an error because otherwise one must know beforehand that an
equation is non-resolvable or must use #on:do: everywhere.
Since that when you ask to resolve an equation you get back a collection of
solutions, a non-resolvable equation could just return an empty collection,
couldn't it?.
If you really want to consider that asking to resolve a non-resolvable
equation is an error, another solution would be to provide a #rootsIfNone:
method. That's a common pattern in Smalltalk.
I would also rename 'checkNegative' to 'discriminant', because it's not
obvious to see what that variable represents at first glance.
Thanks
Nacho
This second third still only calculates real roots (leaving aside imaginary
"The idea is to have a class to calculate quadratic equations.
roots).
But thanks to Damien Cassou, and Camille Teruel has a better style.
A QuadraticEquation is a class used to solve Quadratic Equations of the
form: ax^2 + bx + c = 0, where a is not 0.
You can set the coefficients using the following method
setQuadraticCoefficient: �linearCoefficient: �constant:"
Object subclass: #QuadraticEquation
� � � � instanceVariableNames: 'quadraticCoefficient linearCoefficient constant
roots'
� � � � classVariableNames: ''
� � � � category: 'IS-Math'
"I create accessors (only getters for each term) and then the following
method to set the terms"
setQuadraticCoefficient: aNumber1 linearCoefficient: aNumber2 constant:� � � � | discriminant |
aNumber3
� � � � quadraticCoefficient := aNumber1.
� � � � linearCoefficient := aNumber2.
� � � � constant := aNumber3
QuadraticEquation>>calculateRoots
� � � � �discriminant := linearCoefficient �squared - ( 4 * quadraticCoefficient �*
constant).
� � � � �discriminant �>= 0
� � � � � � � � � � � � � � � � ifFalse: [ ^ self rootsIfNone ]
� � � � � � � � � � � � � � � � ifTrue: [ ^ self solveRoots: discriminant]
QuadraticEquation>>rootsIfNone
QuadraticEquation>>solveRoots: aTerm
� � � � | rootA rootB |
� � � � roots := OrderedCollection new.
� � � � rootA := (linearCoefficient �negated + aTerm sqrt) / (2 *
quadraticCoefficient).
� � � � rootB := (linearCoefficient �negated �- aTerm sqrt) / (2 *
quadraticCoefficient).
� � � � roots add: rootA; add: rootB.
� � � � ^ roots
� � � � ^ 'No real solution for the equation'
" � � � Example: �-3x^2+2x+2=0
� � � � an OrderedCollection(-0.5485837703548636 1.2152504370215302)
� � � � print(it)
� � � � | anEquation |
� � � � anEquation := QuadraticEquation new.
� � � � anEquation setQuadraticCoefficient: -3 linearCoefficient: 2 constant: 2.
� � � � anEquation calculateRoots."
-----View this message in context: http://forum.world.st/Question-on-style-tp4752165p4752369.html
Nacho
Smalltalker apprentice.
Buenos Aires, Argentina.
--
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.