Algorithms Form 5
Algorithms Form 5
Pseudocode is a kind of structured english for describing algorithms. It allows the designer to
focus on the logic of the algorithm without being distracted by details of language syntax. At
the same time, the pseudocode needs to be complete. It describe the entire logic of the
algorithm so that implementation becomes a rote mechanical task of translating line by line
into source code.
In general the vocabulary used in the pseudocode should be the vocabulary of the problem
domain, not of the implementation domain. The pseudocode is a narrative for someone who
knows the requirements (problem domain) and is trying to learn how the solution is
organized. E.g.,
Note that the logic must be decomposed to the level of a single loop or decision. Thus
"Search the list and find the customer with highest balance" is too vague because it takes a
loop AND a nested decision to implement it. It's okay to use "Find" or "Lookup" if there's a
predefined function for it such as String.indexOf().
Each textbook and each individual designer may have their own personal style of
pseudocode. Pseudocode is not a rigorous notation, since it is read by other people, not by the
computer. There is no universal "standard" for the industry, but for instructional purposes it is
helpful if we all follow a similar style. The format below is recommended for expressing your
solutions in our class.
The "structured" part of pseudocode is a notation for representing six specific structured
programming constructs: SEQUENCE, WHILE, IF-THEN-ELSE, REPEAT-UNTIL, FOR,
and CASE. Each of these constructs can be embedded inside any other construct. These
constructs represent the logic, or flow of control in an algorithm.
It has been proven that three basic constructs for flow of control are sufficient to implement
any "proper" algorithm.
SEQUENCE is a linear progression where one task is performed sequentially after another.
WHILE is a loop (repetition) with a simple conditional test at its beginning.
IF-THEN-ELSE is a decision (selection) in which a choice is made between two alternative
courses of action.
Although these constructs are sufficient, it is often useful to include three more constructs:
REPEAT-UNTIL is a loop with a simple conditional test at the bottom.
CASE is a multiway branch (decision) based on the value of an expression. CASE is a
generalization of IF-THEN-ELSE.
FOR is a "counting" loop.
SEQUENCE
Sequential control is indicated by writing one action after another, each action on a line by
itself, and all actions aligned with the same indent. The actions are performed in the sequence
(top to bottom) that they are written.
Example (non-computer)
Brush teeth
Wash face
Comb hair
Smile in mirror
Example
READ height of rectangle
READ width of rectangle
COMPUTE area as height times width
Common Action Keywords
Several keywords are often used to indicate common input, output, and processing
operations.
Input: READ, OBTAIN, GET
Output: PRINT, DISPLAY, SHOW
Compute: COMPUTE, CALCULATE, DETERMINE
Initialize: SET, INIT
Add one: INCREMENT, BUMP
IF-THEN-ELSE
Binary choice on a given Boolean condition is indicated by the use of four keywords: IF,
THEN, ELSE, and ENDIF. The general form is:
IF condition THEN
sequence 1
ELSE
sequence 2
ENDIF
The ELSE keyword and "sequence 2" are optional. If the condition is true, sequence 1 is
performed, otherwise sequence 2 is performed.
Example
The WHILE construct is used to specify a loop with a test at the top. The beginning and
ending of the loop are indicated by two keywords WHILE and ENDWHILE. The general
form is:
WHILE condition
sequence
ENDWHILE
The loop is entered only if the condition is true. The "sequence" is performed for each
iteration. At the conclusion of each iteration, the condition is evaluated and the loop
continues as long as the condition is true.
Example
Example
A CASE construct indicates a multiway branch based on conditions that are mutually
exclusive. Four keywords, CASE, OF, OTHERS, and ENDCASE, and conditions are used to
indicate the various alternatives. The general form is:
CASE expression OF
condition 1 : sequence 1
condition 2 : sequence 2
...
condition n : sequence n
OTHERS:
default sequence
ENDCASE
The OTHERS clause with its default sequence is optional. Conditions are normally numbers
or characters
indicating the value of "expression", but they can be English statements or some other
notation that specifies the condition under which the given sequence is to be performed. A
certain sequence may be associated with more than one condition.
Example
CASE Title OF
Mr : Print "Mister"
Mrs : Print "Missus"
Miss : Print "Miss"
Ms : Print "Mizz"
Dr : Print "Doctor"
ENDCASE
Example
CASE grade OF
A : points = 4
B : points = 3
C : points = 2
D : points = 1
F : points = 0
ENDCASE
REPEAT-UNTIL
This loop is similar to the WHILE loop except that the test is performed at the bottom of the
loop instead of at the top. Two keywords, REPEAT and UNTIL are used. The general form
is:
REPEAT
sequence
UNTIL condition
The "sequence" in this type of loop is always performed at least once, because the test is
peformed after the sequence is executed. At the conclusion of each iteration, the condition is
evaluated, and the loop repeats if the condition is false. The loop terminates when the
condition becomes true.
FOR
This loop is a specialized construct for iterating a specific number of times, often called a
"counting" loop. Two keywords, FOR and ENDFOR are used. The general form is:
Example
FOR each month of the year (good)
FOR month = 1 to 12 (ok)
NESTED CONSTRUCTS
The constructs can be embedded within each other, and this is made clear by use of indenting.
Nested constructs should be clearly indented from their surrounding constructs.
Example
INVOKING SUBPROCEDURES
EXCEPTION HANDLING
BEGIN
statements
EXCEPTION
WHEN exception type
statements to handle exception
WHEN another exception type
statements to handle exception
END
Sample Pseudocode
"Adequate"
FOR X = 1 to 10
FOR Y = 1 to 10
IF gameBoard[X][Y] = 0
Do nothing
ELSE
CALL theCall(X, Y) (recursive method)
increment counter
END IF
END FOR
END FOR
"Better"
Set moveCount to 1
FOR each row on the board
FOR each column on the board
IF gameBoard position (row, column) is occupied THEN
CALL findAdjacentTiles with row, column
INCREMENT moveCount
END IF
END FOR
END FOR
"Not So Good"
SET Carry to 0
FOR each DigitPosition in Number from least significant to most significant
COMPUTE Total as sum of FirstNum[DigitPosition] and SecondNum[DigitPosition] and
Carry
END LOOP
IF Carry = 1 THEN
RAISE Overflow exception
END IF
Algorithms
pseudo-code
flowcharts
written descriptions
program code
An algorithm should be seen as a starting point before writing a program. It should include
the required programming constructs to solve the problem, ie sequence, selection and
iteration. The finished program should follow the steps the algorithm describes.
Before an algorithm can be designed, it is important to check that the problem is completely
decomposed. You can find out more about decomposition on page 10 of this study guide. The
decomposed problem should consider the following questions:
Only when a problem is properly decomposed and understood can an algorithm design begin.
Pseudo-code
Most programs are developed using programming languages. These languages have
specific syntax that must be used so that the program will run properly.
This simple pseudo-code algorithm asks a user to input what their favourite subject is:
WHILE answer <> 'computer science' DO SEND 'What is your favourite subject?' TO
DISPLAY RECEIVE answer FROM (STRING) KEYBOARD IF answer = 'computer
science' THEN SEND 'Good choice!' TO DISPLAY ELSE SEND 'Really? '
TO DISPLAY END IF END WHILE
Pseudo-code is a simple way of describing a set of programming instructions in a
manner that resembles a programming language.
Advantages and disadvantages of pseudo-code
• It can be hard to see how a program flows. For example, where does following one
path as opposed to another take the program?
• It can be time consuming to produce.
Pseudo-code covers many areas of programming and there are different variants. The specific
pseudo-code syntax for the Edexcel GCSE Computer Science course can be found at the end
of the Edexcel specification at Appendix 1.
Flowcharts
Table with common flow diagram symbols, their names and their usage
Flowcharts can be used to plan out programs. This simple flowchart maps out an algorithm
for a program that prints the numbers 1 to 10:
A flow diagram mapping out an algorithm for a program that prints the numbers 1-10
flowcharts follow an international standard - it is easy for any flowchart user to pick up a
diagram and understand it
with a large program, the diagrams can become huge and therefore difficult to follow
any changes to the design may mean a lot of the diagram has to be redrawn
Written descriptions
Algorithms can also be ‘written descriptions’. There is no defined format for this, so
programmers are free to write as they wish. Short sentences are best. An algorithm should be
easy to understand and have no unnecessary detail. A recipe is a good example of clear
instructions, eg ‘stir’ and ‘bake’. A written description should include all the elements found
when decomposing the problem.
The main disadvantage of a written description is that there is a temptation to use too many
words. This makes the algorithm descriptive rather than instructional.
Program code
Program code can also be used to create an algorithm. In this context it is called draft
program code. There is no requirement for an algorithm to compile and run so errors are
acceptable so long as the meaning is clear.
Designing an algorithm using program code has the following advantages:
Standard algorithms
Since computers were created, users have devised programs, many of which, in part, needed
to do the same thing. As a result, standard algorithms have evolved and been adopted in many
programs.
Two types of algorithm that are often used are searches and sorts. Searches enable a data set
to be examined and a specific item to be found. Sorts enable a data set to be sorted into order.
• linear search
• binary search
Standard sorting algorithms include:
• bubble sort
• merge sort
Linear search
Starting at the beginning of the data set, each item of data is examined until a match is made.
Once the item is found, the search ends. If there is no match, the algorithm must deal with
this.
Suppose we were to search for the value 2 in this list. The search would start at position 0 and
check the value held there, in this case 3. 3 does not match 2, so we move on to the next
position.
The value at position 1 is 5. 5 does not match 2, so we move on to the next position.
SET find TO 2
SET found TO False
SET length TO LENGTH(list)
SET counter TO 0
WHILE found = False AND counter < length DO
IF list[counter] = find THEN
SET found TO True
SEND 'Found at position' & counter
TO DISPLAY
ELSE
SET counter TO counter + 1
END IF
END WHILE
IF found = False THEN
SEND 'Item not found' TO DISPLAY
END IFF
Although simple, a linear search can be quite inefficient. Suppose the data set contained 100
items of data, and the item searched for happens to be the last item in the set. All of the
previous 99 items would have to be searched through first.
However, linear searches have the advantage that they will work on any data set, whether it is
ordered or unordered.
Binary search
A binary search is an efficient method of searching an ordered list. It will not work on a list
that has not been sorted first.
The midpoint is found by adding the lowest position to the highest position and dividing by 2.
8/2 = 4
NOTE - if the answer is a decimal, round up. For example, 3.5 becomes 4. An alternative is
to round down, but be consistent.
7 is less than 11, so the bottom half of the list - including the midpoint - is discarded.
Table with list of ordered numbers, the first five numbers have been discarded
The new lowest position is 5.
14 is greater than 11, so the top half of the list (including the midpoint) is discarded.
Table with list of ordered numbers, the first five numbers and the last two numbers have been
discarded
The new highest position is 6.
Check at position 6.
SET find TO 11
SET found TO False
SET length TO LENGTH(list)
SET lowerBound TO 0
SET upperBound TO length
WHILE found = False DO
midpoint = (upperBound + lowerBound) DIV 2
IF list[midPoint] = find THEN
SEND 'Found at' & midpoint TO DISPLAY
SET found TO True
ELSE
IF list[midPoint]> item THEN
SET upperBound TO midpoint - 1
ELSE
SET lowerBound TO midpoint + 1
END IF
END IF
END WHILE
IF found = False THEN
SEND 'Not found' TO DISPLAY
END IF
A binary search is a much more efficient algorithm than a linear search. In an ordered list of
every number from 0 to 100, a linear search would take 99 steps to find the value 99. A
binary search would only require 7 steps.
However, a binary search can only work if a list has been sorted into order.
Bubble sort
A bubble sort is the simplest of the sorting algorithms. However, it is an inefficient sort for
anything but a small list because of the number of comparisons required.
Table with a list of unsorted numbers, the numbers at positions zero and one have been
swapped
Then move up to the next position, position 1. The value at position 1 is 9, and the value at
position 2 is 2. 9 is bigger than 2, so the two items are swapped. The list is now:
Table with a list of unsorted numbers, the numbers at positions one and two have been
swapped
Move up to the next position, position 2. The value at position 2 is 9, and the value at position
3 is 6. 9 is bigger than 6, so the two items are swapped. The list is:
Table with a list of unsorted numbers, the numbers at positions two and three have been
swapped
Now move up to the next position, position 3. The value at position 3 is 9, and the value at
position 4 is 5. 9 is bigger than 5, so the two items are swapped. The list is now:
Table with a list of unsorted numbers, the numbers at positions three and four have been
swapped
The first pass is now complete. However, this list may still be unsorted, so another pass takes
place.
After the third pass, the list is the same, as all items were in order after the second pass.
However, a bubble sort continues until no swaps are made in a pass. During the third pass, no
swaps occurred, so now the sort knows that all items are in order.
SET counter TO 0
SET swapped TO True
SET swaps TO 0
SET length TO LENGTH(list)
WHILE swapped = True DO
WHILE counter < length – 1 DO
IF list[counter] > list[counter + 1]
THEN
SET temp TO list[counter]
SET list[counter] TO
list[counter + 1]
SET list[counter + 1] TO temp
SET swaps TO swaps + 1
END IF
SET counter TO counter + 1
SET length TO length - 1
END WHILE
IF swaps = 0 THEN
SET swapped TO False
ELSE
SET swaps TO 0
SET counter TO 0
END IF
END WHILE