Python Programming: Producing a Multiplication Table
People learning to program often struggle with how to decompose a problem into the steps necessary to write a program to solve that problem. This is one of a series of posts in which I take a problem and go through my decision-making process that leads to a program.
The problem: produce a multiplication table. I assume that at this point you know about statements, conditionals, loops, and functions.
You can find a video with more details at https://youtu.be/QJqfYn_4pmw.
Design
Think of design as being similar to planning a trip. Given a specific destination, how do I get there from where I am now? I can better understand what I need to do by working a small example by hand.
An n x n multiplication table where n = 4 looks like this:
1 2 3 4
--------------------
1 | 1 2 3 4
2 | 2 4 6 8
3 | 3 6 9 12
4 | 4 8 12 16
To produce this, I took each row number in the left-hand column and multiplied by the row of numbers across the top. So the first row of products is
1 x (1, 2, 3, 4) = (1, 2, 3, 4)
the second row is
2 x (1, 2, 3, 4) = (2, 4, 6, 8)
and so forth. This may seem obvious given how young you probably were when you were first exposed to multiplication tables, but by doing this I am trying to understand my decision-making process while producing the table. I can see that I repeat the process of multiplying a number by the numbers 1 to n. The number than I multiply by each row of numbers is the row number itself-row 1, row 2, and so forth.
I can see that I have a two processes that repeat and therefore I will probably need two loops. One loop produces the integers from 1 to n with each being multiplied by the row number. The other loop produces the row numbers, which themselves are the integers from 1 to n. The loop that produces the row numbers will be the outer loop, with the other loop being inside of it.
At this point I have the function
def multTable(n) :
for r in range(1, n+1) :
for c in range(1, n+1) :
print("%3d " % (r*c), end="")
print()
that produces
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
This is my starting point. Now I want to add the row and column numbers that make it look like a traditional multiplication table.f What should I do first? Since printing the column values will require indenting the output with spaces, I want to do that after I see how much space the row numbers require.
Before printing a row of output value, that is, the products, I need to print the row number followed by the vertical bar. By default the print() function includes a newline, so I suppress it using end=””. Then the row of products will follow the line number. At this point my function looks like this:
def multTable(n) :
for r in range(1, n+1) :
print("%2d |" % r, end="")
for c in range(1, n+1) :
print("%3d " % (r*c), end="")
print()
and it produces
1 | 1 2 3 4
2 | 2 4 6 8
3 | 3 6 9 12
4 | 4 8 12 16
Now I am ready to add the column numbers and a row of dashes to form a line. For this, I decided to create a separate function:
def printHeader(n) :
print(" ", end="")
for c in range(1, n+1) :
print("%3d " % c, end="")
print()
print(" ", end="")
for c in range(1, n+1) :
print("-----", end="")
print()
Much of the logic in printHeader()
is similar to what I wrote in multTable()
. Could I have put the logic of printHeader()
inside multTable()
instead of it’s own function? Sure, but I think this makes the underlying logic easier to follow.
It also has the benefit that I can “turn off” the header if I wish by simply commenting out the function call.
Here is the final program:
def printHeader(n) :
print(" ", end="")
for c in range(1, n+1) :
print("%3d " % c, end="")
print()
print(" ", end="")
for c in range(1, n+1) :
print("-----", end="")
print()
def multTable(n) :
printHeader(n)
for r in range(1, n+1) :
print("%2d |" % r, end="")
for c in range(1, n+1) :
print("%3d " % (r*c), end="")
print()
####### main #######
n = int( input("enter size (15 rows max): ") )
multTable(n)