Вы находитесь на странице: 1из 40

# MH 1401

ALGORITHMS &
COMPUTING I
Thomas PEYRIN
AY 2016/17 Semester 1

19/09/16

## Lecture 6: Loop Statements

L6-2

Loop Statements
Consider creating a table of circle areas with radii ranging

## from 0.1cm to 100cm in steps of 0.05cm

Looping statements, or loops, allow to repeat

statements
The statements that are repeated are called the action of

a loop
There are two basic types of loops
Counted loops
Conditional loops

19/09/16

L6-3

Outline
for loops
Nested for loops
while loops
Error Checking

Lessons Learned

19/09/16

## Lecture 6: Loop Statements

L6-4

Counted Loop
A counted loop repeats statements a specified number of

times
It is known ahead of time how many iterations are

required
Example: repeat these statements 10 times

19/09/16

L6-5

Iterator
variable

Can be
any vector

## for loopvar = range

action
end
It is common to use i,j,(k,l,..) for iterator variables

## This overrides the value of the built-in variables i,j for 1

The range can be specified using any vector
Usually the colon operator : is used for the range

19/09/16

## The for Loop (ctd)

for i = 1:5
fprintf(%d\n,i)
end

action

First i is initialized to 1

## Then the action of the loop is executed

Then i is incremented
At the end i has the value 5

L6-6

19/09/16

L6-7

## The for Loop (ctd)

Example: finding sums

and products
We want to calculate:

i 1

i 1 2 ... n

## A running sum keeps

changing as we keep
adding to it

function runsum =
% sum1ToN returns
% integers from 1
% Format of call:

sum1ToN(n)
the sum of
to n
sum1ToN(n)

runsum = 0;
for i = 1:n
runsum = runsum + i;
end
end

Initialization to 0
running sum

19/09/16

L6-8

## Sums and Products for Vectors

Frequently it is required to

## calculate sums and/or the

product of the elements of
a vector
Values in a vector typically

## represent the same thing

Same operation can be

performed on every
element
As for loop, we could

## function outarg = myvecsum(vec)

% myvecsum returns the sum of
%
the elements in a vector
% Format of call:
%
myvecsum(vector)
outarg = 0;
for i = 1:length(vec)
outarg = outarg + vec(i);
end
end

for i = vec
outarg = outarg + i;
end

19/09/16

L6-9

## Sums and Products for Vectors (ctd)

MATLAB has a built in function sum, that will sum all

values in a vector
MATLAB has a built in function prod, that will return the

## product of all values in a vector

cumsum, calculates the cumulated sum of a vector
cumprod, calculates the cumulated product of a vector

19/09/16

## Lecture 6: Loop Statements

L6-10

Preallocating a Vector
There are two possibilities to simulate cumsum:

## Variant 1: Start with an empty vector and concatenate

each running sum value
Variant 2: Preallocate the vector to the correct size, then
change the value of each element to be successive
running sums

19/09/16

L6-11

## Preallocating a Vector (ctd)

Variant 1 is not very efficient:
Every time the vector is extended a new chunk of memory

## must be found that is large enough for the new vector

Then all values are copied to the new location
function outvec = myveccumsum(vec)
% myveccumsum simulates cumsum for a vector
% Format: myveccumsum(vector)
outvec = [];
runsum = 0;
for i = 1:length(vec)
runsum = runsum + vec(i);
outvec = [outvec runsum];
end
end

Initialized to
empty vector
New running
sum is appended

BAD!

19/09/16

L6-12

## Preallocating a Vector (ctd)

Variant 2 is much better

## function outvec = myveccumsumii(vec)

% myveccumsumii imitates cumsum for a vector
% It preallocates the output vector
% Format: myveccumsumii(vector)
outvec = zeros(size(vec));
runsum = 0;
for i = 1:length(vec)
runsum = runsum + vec(i);
outvec(i) = runsum;
end
end

Preallocate enough
Memory for the new
vector
Overwrite the 0s with
the running sum

Much better!

19/09/16

L6-13

## Combining for Loops with if Statements

Example: find the minimum (or maximum) value in a vector
Algorithm (input: vector, output: min of the vector):

## so far) is the first element in the vector to begin with

2. Loop through the rest of the vector (from the 2nd element

to the end)
3. If any element is less than the working minimum, than that

19/09/16

L6-14

## Preallocating a Vector (ctd)

function outmin = myminvec(vec)
% myminvec returns the minimum
%
value in a vector
% Format: myminvec(vector)
outmin = vec(1);
for i = 2:length(vec)
if vec(i) < outmin
outmin = vec(i);
end
end
end

## Assign the first

element to be the
working minimum
< is sufficient rather
than <=
if is sufficient rather
than if-else
MATLAB has built in
functions min and
max that find the
minimum and the
maximum values in a
vector

19/09/16

L6-15

## Input in a For Loop

A function that prompts the user n times to enter a

## number and stores these numbers in a vector

function numvec = forinputvec(n)
% forinputvec returns a vector of lenght n
% It Prompts the user and puts n numbers
%
into a vector
% Format: forinputvec(n)
numvec = zeros(1,n);
for iv = 1:n
inputnum = input('Enter a number: ');
numvec(iv) = inputnum;
end
end

Preallocate
the vector
Store the value

19/09/16

L6-16

## Lecture 6: Loop Statements

Clicker Question 1
What would be the result of the following for loop?
for i=4:2:8
fprintf(a )
end
25%

25%

25%

25%

A. a a a
f

B. a a a a a a a a a a a a a a
f

C. a a a a a a a a
f

D. a a a a

aa
aaaaaaaa
A.

B.

C.

D.

19/09/16

## Lecture 6: Loop Statements

Clicker Question
What would be the result of the following for loop?
for i=4:2:8
fprintf(a )
end
A. a a a
f

B. a a a a a a a a a a a a a a
f

C. a a a a a a a a
f

D. a a a a

aa
aaaaaaaa

L6-17

19/09/16

L6-18

Outline
for loops
Nested for loops
while loops
Error Checking

Lessons Learned

19/09/16

L6-19

## Nested For Loops

The action of a loop can be any valid statement
When the action of a loop is another loop, this is called a

nested loop
The entire inner loop is part of the action of the outer loop
General form:

## for loopvarone = rangeone

for loopvartwo = rangetwo
action2
end
end

Inner
loop

Outer
loop

19/09/16

L6-20

## Nested For Loops (ctd)

Example: Printing a box

the users input
Algorithm:

## for every row of output:

Print the required number of

## stars (using an inner loop)

Move the cursor down to
the next line

*****
*****
*****
*****

function printstars(rows,columns)
% Prints a box of stars
% How many will be specified
%
by 2 variables for the number
%
of rows and columns
% loop over the rows
for i=1:rows
% for every row loop to print *'s
%
and then one \n
for j=1:columns
fprintf('*')
end
fprintf('\n')
end
end

19/09/16

L6-21

## Nested For Loops (ctd)

Example: creating a multiplication table
function outmat = multtable(rows, columns)
% multtable returns a matrix which is a
% multiplication table
% Format: multtable(nRows, nColumns)
% Preallocate the matrix
outmat = zeros(rows,columns);
for i = 1:rows
for j = 1:columns
outmat(i,j) = i * j;
end
end
end

Preallocate
the matrix

because rows
and columns
are known

19/09/16

L6-22

## Nested For Loops (ctd)

Example: calculate the overall sum of the elements of a

matrix
Algorithm (input: matrix, output: the sum):
Use size to determine the number of rows and columns
Initialize the running sum
Use nested loop
Loop over rows (i)
Loop over columns (j)
Add each element to running sum

19/09/16

L6-23

## Nested For Loops (ctd)

function outsum = mymatsum(mat)
% mymatsum returns the overall sum
%
of the elements in a matrix
% Format: mymatsum(matrix)
[row col] = size(mat);
outsum = 0;
% The outer loop is over the rows
for i = 1:row
for j = 1:col
outsum = outsum + mat(i,j);
end
end
end

for i = 1:col
for j = 1:row

## The order of the

loops does not
matter in this example

19/09/16

L6-24

## Nested For Loops (ctd)

Recall MATLAB has a built in function sum, that operates

## columnwise on a matrix, i.e. it will return the sum of a

column
Overall sum can be calculated by just summing the

column sums:
>> sum(sum(mat))
Q: How can I find the sum of a row?

## => simply use the sum on the transposed matrix:

>> sum(mat)
cumsum, min, max, operate columnwise

19/09/16

## Nested For Loops (ctd)

Q: how to print a triangle of stars, like this:
% Prints a triangle of stars
% How many will be specified by rows
rows = 4;
% The outer loop is over the rows
for i = 1:rows
for j = 1:i
fprintf(*)
end
fprintf(\n)
end

L6-25

*
**
***
****

only up to the
value of i

19/09/16

L6-26

## Nested For Loops (ctd)

Q: we would like to load experimental data from a file and obtain the
sum of the values in each row, except for negative numbers (which
are considered as experiment errors)
% Sums only positive numbers from file.
% Reads from the file into a matrix and then calculates and
% prints the sum of only the positive numbers in each row
load datavals.dat;
[r c] = size(datavals);
for i = 1:r
sumrow=0;
for j = 1:c
if datavals(i,j) >= 0
sumrow = sumrow + datavals(i,j);
end
end
fprintf(The sum for row %d is %d\n,i,sumrow)
end

19/09/16

Clicker Question 2

for a=4:-1:1
for b=a:-1:2
fprintf(%i,b)
end
fprintf(\n)
end

## What would be the result of the

following nested for loop?
A.

L6-27

## Lecture 6: Loop Statements

4444
333
22
f

B.

4444
333
22
1

25%

25%

25%

25%

C.

432
32
2
f
hy

D.

4321
321
21
1

A.

B.

C.

D.

19/09/16

Clicker Question 2
What would be the result of the
following nested for loop?
A.

L6-28

## Lecture 6: Loop Statements

4444
333
22

for a=4:-1:1
for b=a:-1:2
fprintf(%i ,b)
end
fprintf(\n)
end

B.

4444
333
22
1
f

C.

432
32
2
g
f

D.

4321
321
21
1

Equivalent to:
for a = [4 3 2 1]
for b = [a 2]
fprintf(%i ,b)
end
fprintf(\n)
end

19/09/16

L6-29

Outline
for loops
Nested for loops
while loops
Error Checking

Lessons Learned

19/09/16

L6-30

## The while Loop

while condition
action
end
The action is executed as long as the condition is true
First the condition is evaluated
If true the action is executed
Condition is evaluated again and again and again
Q: How does it stop?

## => Something in the action has to change something in

the condition to become false! Otherwise you have an
infinite loop (press Ctrl+C to stop if this situation happens)

19/09/16

L6-31

## The while Loop (ctd)

Example: Find the first factorial that is greater than the

## input argument high

Note: previously we could use a for loop, because we

## only wanted to calculate a particular factorial. That is, it

was known ahead of time how many times we need to
repeat that loop. This is not the case here.
Algorithm (input: high, output: the 1st factorial > high):
One variable iterates through the values 1,2,3,
One variable stores the factorial of the iterator at each step
If factorial is not greater than high, increase the iterator

19/09/16

L6-32

## The while Loop (ctd)

function facgt = factgthigh(high)
% factgthigh returns the first
%
factorial > high
% Format:
%
factgthigh(inputInteger)
i=0;
fac=1;
while fac <= high
i=i+1;
fac = fac * i;
end
facgt = fac;
end

## i can also be initialized to 1

The execution statement

Repeat until
fac>high

## has to be rewritten then

It is possible to use more

## complicated conditions for

the while loop using ||
and the && operators

19/09/16

L6-33

## Input in a while Loop

while loops can be used to process input from the user as

## long as the user is entering correct data

First prompt is outside the loop
Subsequent prompts are within the loop so there is a new

value to be checked
What happens if the user enters -23? => it goes out of the loop
inputnum = input('Enter a positive number: ');
while inputnum >= 0
fprintf('You entered a %d.\n\n',inputnum)
inputnum = input('Enter a positive number: ');
end
fprintf('OK I stop!\n')

19/09/16

L6-34

## Counting in a while Loop

while loops are frequently used to count how many

## times the action was repeated

counter=0;
inputnum=input('Enter a positive number: ');
while inputnum >= 0
fprintf('You entered a %d.\n\n',inputnum)
counter = counter + 1;
inputnum = input('Enter a positive number: ');
end
fprintf('You entered %d positive numbers.\n',counter)

19/09/16

L6-35

Outline
for loops
Nested for loops
while loops
Error Checking

Lessons Learned

19/09/16

L6-36

## Error-Checking User Input in a while Loop

Usually there is a valid range of values
If a user enters incorrect value, the program should repeat

## the prompt until the value is in correct range

Very common application of a conditional loop, called

error-checking
inputnum=input('Enter a positive number: ');
while inputnum < 0
inputnum = input('Invalid! Enter a positive number: ');
end
fprintf('Thanks, you entered a %.1f \n',inputnum)

19/09/16

L6-37

## Error-Checking for Integers

MATLAB uses by default double
Question: How to check if the user has entered an integer?

=> Answer:
Convert the input to integer (e.g. using int32())
Compare input with converted value

## inputnum = input('Enter an integer: ');

num2 = int32(inputnum);
while num2 ~= inputnum
inputnum = input('Invalid! Enter an integer: ');
num2 = int32(inputnum);
end
fprintf('Thanks, you entered a %d \n',inputnum)

used for
comparison

19/09/16

L6-38

Outline
for loops
Nested for loops
while loops
Error Checking

Lessons Learned

19/09/16

## Lecture 6: Loop Statements

L6-39

Lessons learned
Common Pitfalls:
Forgetting to initialize a running sum or count variable to 0
Forgetting to initialize a running product variable to 1
Initialization might be required again in the inside loops in case

of nested loops
In cases where loops are necessary, not realizing that if an

action is required for every row in a matrix, the outer loop must
be over the rows (analog for columns)
Not realizing that the action of a while loop might never be

executed
Failing to error-check the input into a program

19/09/16

## Lecture 6: Loop Statements

L6-40

Lessons learned
Programming Style Guidelines:
Use loops for repetition only when necessary:
for statements as counted loops
while statements as conditional loop
Do not use i or j as iterator variable names if the use of the built

## in constants i and j is desired (otherwise ok)

Indent the action of loops
If the loop variable is just being used to specify how many

## times the action of the loop is to be executed (i.e. do n times),

use the colon operator 1:n