Here's another example of using pseudocode
You are required to write a program which will take as its input a positive integer of up to nine digits, find the last number, and raise each indvidual digit to the power of that last digit. Then add all these numbers together and check if the answer is the same as the original number. If it is the same, print a message to the screen. Here's an example to show what it means. The user enters the number 1232. The last digit is 2. If 12 + 22 + 32 + 42 = 1232, print "It's a hit" on screen. Otherwise print "Not a magic number".
Here's the first attempt at pseudocode.
Read the input | |
Find last digit | |
Find all the individual digits | |
Calculate the total of all the powers | |
If the total equals the original | |
Print It's a hit | |
Else | |
Print Not a magic number | |
end if |
Then after a few minutes thought we refine the above to the following.
Read the input | |
Find last digit | |
Remove the last digit | |
Find the "new" last digit | |
Repeat the above until all digits dealt with | |
Calculate the total of all the powers | |
If the total equals the original | |
Print It's a hit | |
Else | |
Print Not a magic number | |
end if |
That is the basic plan for the program! Now all we have to do it expand on each part using stepwise refinement, to get a better view of how the program will look. We need a way to slice of the last number to get hold of it and to leave the number with the last digit sliced off. It helps if we remember that when working with integers we can use modular division - divide by a number and get the remainder, and that integer division throws away the remainder. For example, 129 divided by 10 as integer division gives an answer of 12. But 129 mod 10 gives an answer of 9 (the remainder). The other point to remember is that as the user can enter any number from 0 to 999999999, we don't know how many digits we will be dealing with, so the program must be able to handle any number in the range. So here's the first few bits of refinement to our ideas.
Read the input | ||
input = original | ||
lastOne = original mod 10 | /* get the remainder | |
new = original / 10 | /* integer division, no remainder | |
eigth = new mod 10 | /* get next remainder | |
new = new / 10 | /* integer division, no remainder | |
seventh = new mod 10 | /* and so on | |
new = new / 10 | ||
sixth = new mod 10 | ||
new = new / 10 | ||
fifth = new mod 10 | ||
new = new / 10 | ||
fourth = new mod 10 | ||
new = new / 10 | ||
third = new mod 10 | ||
new = new / 10 | ||
second = new mod 10 | ||
first = new / 10 | ||
Calculate the total of all the powers | ||
If the total equals the original | ||
Print It's a hit | ||
Else | ||
Print Not a magic number | ||
end if |
So now we have a way of getting the current last digit and then removing that totally from the original number. To show it working, here are a few of the steps.
1232 mod 10 gives 2, then 1232 / 10 give 123. Then 123 mod 10 give 3 and 123 / 10 gives 12. Then 12 mod 10 gives 2 and 12 /10 gives 1. Next 1 mod 10 gives 1, and 1 /10 gives 0. All further divisions will give us 0 as well.
So now all we need to do is the calculation of the numbers raised to the power of the last digit. Every programming language has a maths function that does this for you. so we can write a shorthand version of this to complete the pseudocode. We simply write maths(number to the power of lastOne) as a shorthand for whatever the language you are using has for its maths function. We don't need to know how to write the maths function just now, we will find that out when we pick up a text book.
Read the input | ||
input = original | ||
lastOne = original mod 10 | /* get the remainder | |
new = original / 10 | /* integer division, no remainder | |
eigth = new mod 10 | /* get next remainder | |
new = new / 10 | /* integer division, no remainder | |
seventh = new mod 10 | /* and so on | |
new = new / 10 | ||
sixth = new mod 10 | ||
new = new / 10 | ||
fifth = new mod 10 | ||
new = new / 10 | ||
fourth = new mod 10 | ||
new = new / 10 | ||
third = new mod 10 | ||
new = new / 10 | ||
second = new mod 10 | ||
first = new / 10 | ||
total = maths(first to power of lastOne) + maths(secondto power of lastOne) + maths(third to power of lastOne) +maths(third to power of lastOne) + maths(fourth to power of lastOne) + maths(fifth to power of lastOne) +maths(sixth to power of lastOne) + maths(seventh to power of lastOne) + maths(eigth to power of lastOne) + maths(ninth to power of lastOne) | ||
If (total equals original) | ||
Print It's a hit | ||
Else | ||
Print Not a magic number | ||
End if |
The maths part depends on a simple fact - zero to the power of any number is zero, so it handles all the zeros that are generated by division when we run out of actual digits.
So now we might look at expanding the Read input line, to check the number is within the allowed range.
Read input | ||
input value = original |
||
while(original less than zero OR original value greater than 999999999) | ||
Print "Sorry we need integers with a value between zero and 999999999.. Please try again." | ||
read input | ||
input value = original | ||
end while | ||
(followed by the rest of the pseudocode above) | ||
The plan is complete. So now all we have to do is look in a text book for any help with the syntax of a particular command and then write the program. This pseudocode will work for Visual Basic, C, C++, Java, PHP, Pascal, Delphi and so on. Because it is a plan. And any program you plan in advance is bound to work. And barring typos, the resulting program will work first time! (As a test, 153 = 13 + 53 + 33, and the only other numbers where this is true are 1, 1634, 9474 and of course, as I'm sure you knew, 9800817.)
Plan your programs - you know it makes sense.