if - else
Dan Bishop
danb_83 at yahoo.com
Thu Nov 27 01:37:54 EST 2003
> -----Original Message-----
> From: Jeff Wagner [mailto:JWagner at hotmail.com]
> Sent: Wednesday, November 26, 2003 6:20 PM
> To: python-list at python.org
> Subject: if - else
...[attempt at rewriting an old VB program in Python]...
> This is the old routine from VB which worked ... I know, it's
> crappy code. It's the first program I
> wrote many years ago.
>
> Public Sub MasterNumberRoutine()
> On Error GoTo ErrorHandler
>
> 'This routine determines if the input is a master number and, if not,
> 'adds the resultant
>
> Dim I2 As Integer
> Dim F2 As Integer
>
> If SumOfNumbers = 11 Or SumOfNumbers = 22 Or SumOfNumbers = 33
> Then
> GoTo Done
> End If
>
> I2 = Int(SumOfNumbers / 10)
> F2 = SumOfNumbers - (I2 * 10)
> SumOfNumbers = I2 + F2
>
> If SumOfNumbers = 10 Then
> GoTo Check10
> ElseIf SumOfNumbers > 9 Then
> MasterNumberRoutine
> Else
> GoTo Done
> End If
>
> Check10:
> 'If SumOfNumbers = 10, then set it's value to 1
> SumOfNumbers = 1
>
> Done:
> Exit Next:
> Exit Sub
>
> ErrorHandler:
> MsgBox "Error: " & Err.Number
> & vbCrLf & Err.Description,
> vbOKOnly, "Unexpected Error"
> Call ErrLogger("MasterNumberRoutine")
> Resume Exit Next
>
> End Sub
Before translating that to Python, I'd try cleaning up the VB code.
First, let's ignore the error-handling code (since it doesn't appear
that you actually expect any errors.
Public Sub MasterNumberRoutine()
'This routine determines if the input is a master number and, if
not,
'adds the resultant
Dim I2 As Integer
Dim F2 As Integer
If SumOfNumbers = 11 Or SumOfNumbers = 22 Or SumOfNumbers = 33
Then
GoTo Done
End If
I2 = Int(SumOfNumbers / 10)
F2 = SumOfNumbers - (I2 * 10)
SumOfNumbers = I2 + F2
If SumOfNumbers = 10 Then
GoTo Check10
ElseIf SumOfNumbers > 9 Then
MasterNumberRoutine
Else
GoTo Done
End If
Check10:
'If SumOfNumbers = 10, then set it's value to 1
SumOfNumbers = 1
Done:
End Sub
The "Goto Check10" line can be eliminated by moving the Check10 block
to each branch of the previous "If" that goes to Check10.
Public Sub MasterNumberRoutine()
'This routine determines if the input is a master number and, if
not,
'adds the resultant
Dim I2 As Integer
Dim F2 As Integer
If SumOfNumbers = 11 Or SumOfNumbers = 22 Or SumOfNumbers = 33
Then
GoTo Done
End If
I2 = Int(SumOfNumbers / 10)
F2 = SumOfNumbers - (I2 * 10)
SumOfNumbers = I2 + F2
If SumOfNumbers = 10 Then
SumOfNumbers = 1
ElseIf SumOfNumbers > 9 Then
MasterNumberRoutine
SumOfNumbers = 1 ' Are you sure you wanted to do this?
Else
GoTo Done
End If
Done:
End Sub
The last "GoTo Done" is now redundant (because the next statement is
at "Done" anyway). The first "GoTo Done" can also be eliminated by
putting everything in an If block.
Public Sub MasterNumberRoutine()
'This routine determines if the input is a master number and, if
not,
'adds the resultant
Dim I2 As Integer, F2 As Integer
If not (SumOfNumbers = 11 Or SumOfNumbers = 22 Or SumOfNumbers =
33) Then
I2 = Int(SumOfNumbers / 10)
F2 = SumOfNumbers - (I2 * 10)
SumOfNumbers = I2 + F2
If SumOfNumbers = 10 Then
SumOfNumbers = 1
ElseIf SumOfNumbers > 9 Then
MasterNumberRoutine
SumOfNumbers = 1 ' Are you sure you wanted to do this?
End If
End If
End Sub
Notice that you now have no need to ask for Python's equivalent of
"goto", because you didn't even need any goto's in VB!
Furthermore, the "If SumOfNumbers = 10" branch is redundant, because
if we rewrite the subroutine as
Public Sub MasterNumberRoutine()
'This routine determines if the input is a master number and, if
not,
'adds the resultant
Dim I2 As Integer, F2 As Integer
If not (SumOfNumbers = 11 Or SumOfNumbers = 22 Or SumOfNumbers =
33) Then
I2 = Int(SumOfNumbers / 10)
F2 = SumOfNumbers - (I2 * 10)
SumOfNumbers = I2 + F2
If SumOfNumbers > 9 Then
MasterNumberRoutine
SumOfNumbers = 1 ' Are you sure you wanted to do this?
End If
End If
End Sub
then when SumOfNumbers is 10, the recursive call assigns I2 = 1 and F2
= 0, and then SumOfNumbers = 1, which is exactly what it did before.
Translation to Python is now straightforward.
def MasterNumberRoutine():
global SumOfNumbers
if SumOfNumbers not in (11, 22, 33):
I2, F2 = divmod(SumOfNumbers, 10)
SumOfNumbers = I2 + F2
if SumOfNumbers > 9:
MasterNumberRoutine()
SumOfNumbers = 1 # Probably a bug.
However, it would be better to make SumOfNumbers a parameter instead
of a global variable.
More information about the Python-list
mailing list