You are on page 1of 24

Principles of Programming

languages
Loop Structures- Part II
Lecture 12
Today…
• Last Session:
• Loop Structures- Part II

• Today’s Session:
• Loop Structures- Part III:
• While Statement
• Nested Loops
• Various Examples
Recap: Fibonacci Sequence
• Suppose we want to write a program that computes and outputs the
nth Fibonacci number, where n is a value entered by a user

• The Fibonacci sequence starts with 0 and 1

• After these first two numbers, each number in the sequence is


computed as simply the sum of the previous two numbers
• E.g., 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
Recap: Fibonacci Sequence
def fibonacci(n):
f_i = 0
f_j = 1

print(f_i, f_j, end = " ")

for k in range(2, n+1):


f_new = f_i + f_j
print(f_new, end = " ")
f_i = f_j
f_j = f_new
Recap: Fibonacci Sequence

n = eval(input("Enter a number that is larger than 1 >> "))


if n < 2:
print("You can only enter a number that is larger than 1!")
else:
fibonacci(n)
Definite Loops vs. Indefinite Loops
• So far, we have considered only the case where the number of
iterations is determined before the loop starts
• This kind of loops is called definite loops and for is used in Python
to write definite loops

• But, what if we want to write loops, wherein we do not know the


number of iterations beforehand?
• This kind of loops is denoted as indefinite loops
The While Statement
• In Python, an indefinite loop is implemented using a while statement

while <condition>:
<body>

• <condition> is a Boolean expression, just like in if statements

• <body> is, as usual, a sequence of one or more statements


The Flowchart of a While Loop

Is <condition> No
True?

Yes

<body>
Example
• Count = 0
• While count<9:
• print(“number:”, count)
• count = count+1
• Print(“good bye”)
A little guessing game
• This little code shows code for a
guessing game
• The random number is
generated from 0- 20 and once
that number is generated you
need to guess that number
• In this code we don’t know the
number of iterations we need
to have in order to guess the
answer therefore the reason
we have used the while loop
Revisiting Average of a Series of Numbers
• Here is how we have done it before:
def main():
n = eval(input("How many numbers do you have? "))
sum = 0.0

for i in range(n):
x = eval(input("Enter a number >> "))
sum = sum + x

print("\nThe average of the numbers is", sum/n)

main()
Revisiting Average of a Series of Numbers
• Here is how we can do it now using a while statement:
sum = 0.0
n = eval(input("How many numbers do you have? "))
count = 0
while count < n:
x = eval(input("Enter a number >> "))
sum = sum + x
count = count + 1

print("The average of the " + str(n) + " numbers you entered is ", sum/n)
Revisiting Average of a Series of Numbers
• Here is also another version that assumes no prior knowledge about
the quantity of numbers the user will input
sum = 0.0
count = 0
moreData = "yes"
while moreData == "yes":
x = eval(input("Enter a number >> "))
sum = sum + x
count = count + 1
moreData = input("Do you have more numbers (yes or no)? ")

print("The average of the " + str(count) + " numbers you entered is ", sum/count)
Printing Odd Numbers With Input Validation
• Suppose we want to print the odd numbers between two user-input
numbers (inclusive), say, start and end

• The program assumes some conditions, whereby the start and end
numbers shall be positive and end should be always greater than start

• Hence, we should continue prompting the user for the correct input
before proceeding with printing the odd numbers
• This process is typically called input validation
• Well-engineered programs should validate inputs whenever possible!
Printing Odd Numbers With Input Validation
1. while True:
2. start = eval(input("Enter start number: "))
3. end = eval(input("Enter end number: "))
4. if start >=0 and end >= 0 and end > start:
5. break It breaks the loop; execution continues at line 8.
6. else:
7. print("Please enter positive numbers, with end being greater than start")
8.
9. for i in range(start, end + 1):
10. if i % 2 == 0:
11. continue It skips one iteration in the loop; execution
12. print(i, end = " ") continues back at line 9.
Nested Loops
• Like the if statement, loops can also be nested to produce
sophisticated algorithms
• Example: Write a program that prints the following rhombus shape
*
* *
* *
* *
* *
* *
* *
* *
*
The Rhombus Example
• One way (not necessarily the best way!) to think about this problem is to
assume that the stars are within a matrix with equal rows and columns
1 2 3 4 5 6 7 8 9
1 *
2 * *
3 * *
Can you figure
4 * *
5 * * out the different
6 * * relationships
7 * * between rows
8 * *
and columns?
9 *
The Rhombus Example
• One way (not necessarily the best way!) to think about this problem is to
assume that the stars are within a matrix with equal rows and columns
1 2 3 4 5 6 7 8 9
1 *
2 * *
3 * * Print a star when:
4 * * 1) Row + Column == 6
5 * *
2) Row + Column == 14
6 * *
7 * * 3) Row – Column == 4
8 * * 4) Column – Row == 4
9 *
The Rhombus Example
• Here is one way of writing the program in Python
for i in range(1, 10):
for j in range(1, 10):
if ((i+j== 6) or (j-i==4) or (i+j == 14) or (i-j==4)):
print("*", end = "")
else:
print(" ", end = "")
print()

Can you generalize this code?


The Rhombus Example
• What are 6, 14, 4, and 4 below?
1 2 3 4 5 6 7 8 9
1 *
2 * *
3 * * Print a star when:
4 * * 1) Row + Column == 6
5 * *
6 * *
2) Row + Column == 14
7 * * 3) Row – Column == 4
8 * * 4) Column – Row == 4
9 *
The Rhombus Example
• What are 6, 14, 4, and 4 below?
1 2 3 4 5 6 7 8 9
1 *
2 * *
3 * * Print a star when:
4 * * 1) Row + Column == 6 (i.e., Columns/2 +2)
5 * *
6 * *
2) Row + Column == 14 (i.e., Columns + )
7 * * 3) Row – Column == 4 (i.e., Columns/2)
8 * * 4) Column – Row == 4 (i.e., Columns/2)
9 *
The Rhombus Example: A More General Version
while True:
rows = eval(input("Enter number of rows: "))
columns = eval(input("Enter number of columns: "))

if rows != columns or rows % 2 != 1 or columns % 2 != 1:


print("Please enter odd and equal rows and columns")
else:
break

rows = abs(rows)
columns = abs(columns)
The Rhombus Example: A More General Version
for i in range(1, rows+1):
for j in range(1, columns+1):
if ((i+j== (columns//2 +2)) or (j-i==(columns//2)) or (i+j ==
(columns+ math.ceil(rows/2))) or (i-j==(columns//2))):
print("*", end = "")
else:
print(" ", end = "")
print()
Next Lecture…
• Problem Solving

You might also like