As solving an equation is basically giving the set of its solutions, I prefer to use a set to solve the equation.Instead of the OrederedCollection of course. It simplifies the algorithm if the discriminant is 0, because adding two times the same root yields a set with only one element, not the same element counted twice. The algorithm (much like the one with ordered collection) goes like this:

*create an empty set with Set new.
*compute the discriminant.
*if it is positive, add to the set the "two" roots.
*you're done!


On Wed, Apr 2, 2014 at 8:45 PM, nacho <0800nacho@gmail.com> wrote:

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.

Very good points. I came up with a third draft. This is evolving good!
Thanks
Nacho

"The idea is to have a class to calculate quadratic equations.
This second third still only calculates real roots (leaving aside imaginary
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:
aNumber3
� � � � quadraticCoefficient := aNumber1.
� � � � linearCoefficient := aNumber2.
� � � � constant := aNumber3



QuadraticEquation>>calculateRoots
� � � � | discriminant |
� � � � �discriminant := linearCoefficient �squared - ( 4 * quadraticCoefficient �*
constant).

� � � � �discriminant �>= 0
� � � � � � � � � � � � � � � � ifFalse: [ ^ self rootsIfNone ]
� � � � � � � � � � � � � � � � ifTrue: [ ^ self solveRoots: discriminant]


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


QuadraticEquation>>rootsIfNone
� � � � ^ '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."






-----
Nacho
Smalltalker apprentice.
Buenos Aires, Argentina.
--
View this message in context: http://forum.world.st/Question-on-style-tp4752165p4752369.html
Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.