Python Programming: Producing a Multiplication Table

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)

Comments are closed.