Posted by
Sven Van Caekenberghe-2 on
Apr 26, 2020; 6:17pm
URL: https://forum.world.st/mentor-question-2-tp5115643p5115653.html
> On 26 Apr 2020, at 20:10, Gabriel Cotelli <
[hidden email]> wrote:
>
> In the first method you aren't doing an assignment, are sending the message = to the temp isValid, if you change the method to:
> decimalFromBinary: aString
> | result isValid |
> isValid := self isValidBinary: aString.
> isValid
> ifTrue: [ result := 0.
> aString reverse
> withIndexDo:
> [ :digit :index | result := result + (digit
> digitValue * (2 raisedTo: index - 1)) ].
> ^ result ]
> ifFalse: [ ^ nil ]
> it should work.
There is a #reverseWithIndexDo: method
Also, #digitValue might be considered a builtin method that you are not allowed to use. Since you already did the #isValidBinary: test, you could say
(digit charCode - $0 charCode)
> In the second one you're comparing characters with numbers, this will always return false because the number 0 is not the same as the character 0.
> Use
> isValidBinary: aString
> ^ aString allSatisfy: [ :c | c = $0 or: [ c = $1 ] ]
> or something like
>
> isValidBinary: aString
> ^ aString allSatisfy: [ :c | '01' includes: c ]
>
> On Sun, Apr 26, 2020 at 2:52 PM Roelof Wobben via Pharo-users <
[hidden email]> wrote:
> Hello,
>
> I have to make some code that convert a binary to a decimal and im not
> allowed to use the convert methods that Pharo has.
>
> So I have written this :
>
>
> decimalFromBinary: aString
> | result isValid |
> isValid = self isValidBinary: aString.
> isValid
> ifTrue: [ result := 0.
> aString reverse
> withIndexDo:
> [ :digit :index | result := result + (digit
> digitValue * (2 raisedTo: index - 1)) ].
> ^ result ]
> ifFalse: [ ^ nil ]
>
> isValidBinary: aString
> ^ aString allSatisfy: [ :c | c = 0 or: [ c = 1 ] ]
>
>
> but on the first method I see a message that the temp variables are read
> before written.
> and the second one I see a message that I use a or instead of searching
> literals.
>
> Where did I think wrong here ?
>
> Roelof
>
>