610 likes | 632 Views
EECS 110: Lec 11: Indefinite Loops and Program Design. Aleksandar Kuzmanovic Northwestern University. http://cs.northwestern.edu/~akuzma/classes/EECS110-s10/. Final Exam. When: Wednesday 6/2/10 Where: Tech L165 Auditorium Time: 9AM – 10:30AM. Python and images.
E N D
EECS 110: Lec 11: Indefinite Loops and Program Design Aleksandar Kuzmanovic Northwestern University http://cs.northwestern.edu/~akuzma/classes/EECS110-s10/
Final Exam • When: • Wednesday 6/2/10 • Where: • Tech L165 Auditorium • Time: • 9AM – 10:30AM
Python and images for creating and saving images import bmp.py image = BitMap( 300, 200, Color.GREEN ) creates a bitmap object and names it image
Python and images import bmp.py for creating and saving images image = BitMap( 300, 200, Color.GREEN ) creates a bitmap object and names it image objects are software abstractions containing structured information
Python and images and objects import bmp.py image = BitMap( 300, 200, Color.GREEN ) here, a bitmap object named image is calling an internal method named saveFile image.saveFile( "test.bmp" ) objects are variables that can contain their own functions, often called methods
Python and images and objects import bmp.py image = BitMap( 300, 200, Color.GREEN ) image.setPenColor( Color.Red ) two more internal methods image.plotPixel( 150, 100 ) image.saveFile( "test.bmp" ) objects are variables that can contain their own functions, often called methods
Q: What does this plot? from bmp import * def test(): """ image demonstration """ width = 200 height = 200 image = BitMap( width, height ) # a 2d loop over each pixel for col inrange(width): for row inrange(height): if col == row: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
Q: What does this plot? A: A diagonal in the SW -> NE direction from bmp import * def test(): """ image demonstration """ width = 200 height = 200 image = BitMap( width, height ) # a 2d loop over each pixel for col inrange(width): for row inrange(height): if col == row: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
How could you change this code so that it plots a diagonal from NW to SE? def test(): """ demonstrating images """ width = 200 height = 200 image = BitMap( width, height ) # a 2d loop over each pixel for col inrange(width): for row inrange(height): if col == row: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
How could you change this code so that it plots a diagonal from NW to SE? def test(): """ demonstrating images """ width = 200 height = 200 image = BitMap( width, height ) # a 2d loop over each pixel for col inrange(width): for row inrange(height): ifcol == height – row -1: image.plotPoint( col, row ) image.saveFile( "test.bmp" )
Input and typing trouble! print 'Please input a number of meters' meters = raw_input() # get input from user cm = meters * 100 # convert to centimeters print 'That is', cm, 'cm.'# print out the result
Input and typing trouble! print 'Please input a number of meters' meters = raw_input() # get input from user cm = meters * 100 # convert to centimeters print 'That is', cm, 'cm.'# print out the result >>> Please input a number of meters 5 That is 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555 cm. What is python thinking ?!?
Fix #1: use a type converter print 'Please input a number of meters' meters = int(raw_input()) cm = meters * 100 print 'That is', cm, 'cm.' check out my newly installed int converter! 100 1 The type of variable (box) matters! name:meters type: int name:cm type: int
Fix #1: use a type converter print 'Please input a number of meters' meters = int(raw_input()) # get int input from user cm = meters * 100 print 'That is', cm, 'cm.' print 'Please input a number of meters' meters = float(raw_input()) # get float input from user cm = meters * 100 print 'That is', cm, 'cm.' strconverts to string type
Fix #2: use input() print 'Please input a number of meters' meters = input() # get processed input from user cm = meters * 100 print 'That is', cm, 'cm.' Why not ALWAYS use input() ?
Fix #2: use input() print 'Please input a number of meters' meters = input() # get processed input from user cm = meters * 100 print 'That is', cm, 'cm.' Why not ALWAYS use input() ? raw_input always returns input as a string! input processes the input as if typed into Python both allow you to input a prompt string
inputvs.raw_input reply = raw_input('Enter a string and I\'ll tell you what I see.') for c in reply: print'I see a(n) ', c interprets what the user types as a string of characters reply = input('Enter any list and I\'ll tell you what I see.') for c in reply: print'I see a(n) ', c processes what the user types just as python would
More with Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' s = 'gattacaaggtaaaatgca' N = 0 for i in range(0,len(s)): if s[i] == 'a': N = N + 1 print'N is', N How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s = 'gattacaaggtaaaatgca' How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s = 'gattacaaggtaaaatgca' s = 'gattacaaggtaaaatgca' N = 0 for i in range(0,len(s)): if s[i] == 'a'or s[i] == 't': N = N + 1 print'N is', N How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' s = 'gattacaaggtaaaatgca' N = 0 for i in range(1,len(s)): if s[i] == 'a'and s[i-1] == 't': N = N + 1 print'N is', N How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' s = 'gattacaaggtaaaatgca' N = 0 for i in range(1,len(s)): if s[i] == 'a'and s[i-1] == 't': N = N + 1 print'N is', N How could we find the number of 'a's ? How about 'a's or 't's? How could we find the number of 'ta's ? How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' How could we find the longest sequence of 'a's ?
Loopy thinking 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca‘ - Len of current run - Len of best run How could we find the longest sequence of 'a's ?
Planning in "pseudocode" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' Keep track of CurRun, MaxRun Loop through the string: if we do see an 'a' if the PREVIOUS letter is NOT an 'a' if the PREVIOUS letter IS an 'a'
Planning in "pseudocode" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' Keep track of CurRun, MaxRun Loop through the string: if we do see an 'a' if the PREVIOUS letter is NOT an 'a' Start a Run! CurRun = 1 if the PREVIOUS letter IS an 'a' Continue our run! CurRun = CurRun + 1 Check for a new maximum…
Planning in "pseudocode" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 s ='gattacaaggtaaaatgca' MAX = 0 cur = 0 for i in range(0,len(s)): if s[i] == 'a': ifs[i-1] != 'a': cur = 1 else: cur = cur + 1 if cur > MAX: MAX = cur print'Max is', MAX Keep track of CurRun, MaxRun Loop through the string: if we do see an 'a' if the PREVIOUS letter is NOT an 'a' Start a Run! if the PREVIOUS letter IS an 'a' Continue our run! Check for a new maximum…
Summary 1 s = 'gattacaaggtaaaatgca' N = 0 for i in range(0,len(s)): if s[i] == 'a': N = N + 1 print'N is', N 2 s = 'gattacaaggtaaaatgca' N = 0 for i in range(0,len(s)): if s[i] == 'a'or s[i] == 't': N = N + 1 print'N is', N s = 'gattacaaggtaaaatgca' MAX = 0 cur = 0 for i in range(0,len(s)): if s[i] == 'a': ifs[i-1] != 'a': cur = 1 else: cur = cur + 1 if cur > MAX: MAX = cur print'Max is', MAX 4 3 s = 'gattacaaggtaaaatgca' N = 0 for i in range(1,len(s)): if s[i] == 'a'and s[i-1] == 't': N = N + 1 print'N is', N
Loops for while indefinite iteration definite iteration For a known number of iterations For an unknown number of iterations
Seeing into the future… defmenu(): choice = 1 # Anything except 9 while choice != 9: print "I see danger in your future..." printMenu() choice = input("Make your choice ") print"The inner eye can see no more" def printMenu(): print"What would you like to do?" print"\t 0: See another prediction" print"\t 9: Quit" "\t " represents a tab
Gimme a break I'll figure out later how to get out of this loop! defmenu(): whileTrue: print "I see danger in your future..." printMenu() choice = input("Make your choice ") if choice == 9: break print"The inner eye can see no more" def printMenu(): print"What would you like to do?" print"\t 0: See another prediction" print"\t 9: Quit" OK – I'll stop the loop now and continue with the code after the loop break stops the execution of the current loop
Indefinite Loops + input A problem this week ask you to repeatedly interact with the user (TTSecurities) What would you like to do? 0: Enter a new list 1: Print the current list 2: Find the average 9: Quit Please enter your choice The user's choice controls what happens
Indefinite Loops + input defmenu(): choice = 1 while choice != 9: printMenu() choice = input("Please enter your choice ") if choice == 0: print"You chose to enter a new list" elif choice == 1: print"You chose to print the list" elif choice == 2: print"You chose to find this average of the list" elif choice != 9: print"You made an invalid choice" print"Goodbye!" def printMenu(): print"What would you like to do?" print"\t 0: Enter a new list" print"\t 1: Print the current list" print"\t 2: Find the average" print"\t 9: Quit"
if vs elif defmenu(): choice = 1 while choice != 9: printMenu() choice = input("Please enter your choice ") if choice == 0: print"You chose to enter a new list" if choice == 1: print"You chose to print the list" if choice == 2: print"You chose to find this average of the list" if choice != 9: print"You made an invalid choice" print"Goodbye!" What happens if we change the elifs to ifs?
Indefinite Loops + input defmenu(): choice = 1 L = [] while choice != 9: printMenu() choice = input("Please enter your choice ") if choice == 0: L = getNewList() elif choice == 1: printList(L) elif choice == 2: averageList(L) elif choice != 9: print"You made an invalid choice" print"Goodbye!" defgetNewList(): print "You chose to get a new list" return[] Making a function for each choice makes the codecleaner and easier to modify
Gimme another break defmenu(): choice = 1 L = [] whileTrue: printMenu() choice = input("Please enter your choice ") if choice == 0: L = getNewList() elif choice == 1: printList(L) elif choice == 2: averageList(L) elif choice == 9: break else: print"You made an invalid choice" print"Goodbye!"
The Price Is Right! Goal: Buy from a set of 5items (as many of each as you want)while spending between $9.25 and $10.00.
Step 1: Identify Information To Store • What information does this program need to keep track of? Money you have spent, how much each item is, Items, # items to buy, limits,
Step 1: Identify Information To Store • How much has the user spent? float: money • Which items are available? list of strings: items • How much does each available item cost? list of floats: prices • Which item did the user currently choose? int: choice • How many of the currently chosen item does the user want? int: number Money you have spent, how much each item is, Items, # items to buy, limits,
Step 1: Identify Information To Store • How much has the user spent? float: money • Which items are available? [“coke”, “ramer”] list of strings: items • How much does each available item cost? list of floats: prices • Which item did the user currently choose? int: choice • How many of the currently chosen item does the user want? int: number Money you have spent, how much each item is, Items, # items to buy, limits,
Step 1: Identify Information To Store • How much has the user spent? float: money • Which items are available? [“coke”, “ramer”] list of strings: items • How much does each available item cost? list of floats: prices [ 0.75, 0.25] • Which item did the user currently choose? int: choice • How many of the currently chosen item does the user want? int: number Money you have spent, how much each item is, Items, # items to buy, limits,
Step 2: Break Down Functionality • What are the things that this program needs to do? Allow user to buy one item Ask user how many items to buy Update $$, update item list, check if finished
Step 2: Break Down Functionality • Control the overall game play • Prompt the user to enter a choice and number of items • Calculate the total spent • Figure out when the game is over • Figure out win or lose • Print a welcome message • Remove the purchased item from the lists (items, prices) Allow user to buy one item Ask user how many items to buy Update $$, update item list, check if finished
defplayTry1(): print"Welcome to the price is right!" print"Your goal is to buy 5 or fewer items (any number of each)" print"and spend between $9.25 and $10" items = ["bleach","coke","ramen","ice cream","super ball"] prices = [1.35, .75, .25, 3.00, 1.75] money = 0.0 while money < 9.25 and len(items) > 0: print"You have spent $", money printItems( items ) choice = input( "Which item would you like to buy? ") number = input( "How many "+items[choice]+" would you like?") print items[choice], "is $", prices[choice] money += prices[choice]*number prices = prices[0:choice] + prices[choice+1:] items = items[0:choice] + items[choice+1:] print"You have spent $", money if money >= 9.25 and money <= 10.0: print"You win!" else: print"You lose!" Attempt 1 ID problems, write on board
"Quiz" part 1: Print Items >>> items = [“coke”, “pepsi”, “sprite”] >>> printItems(items) 0 : coke 1 : pepsi 2 : sprite Allow user to buy one item Ask user how many items to buy Update $$, update item list, check if finished
defplayTry1(): print"Welcome to the price is right!" print"Your goal is to buy 5 or fewer items (any number of each)" print"and spend between $9.25 and $10" items = ["bleach","coke","ramen","ice cream","super ball"] prices = [1.35, .75, .25, 3.00, 1.75] money = 0.0 while money < 9.25 and len(items) > 0: print"You have spent $", money printItems( items ) choice = input( "Which item would you like to buy? ") number = input( "How many "+items[choice]+" would you like?") print items[choice], "is $", prices[choice] money += prices[choice]*number prices = prices[0:choice] + prices[choice+1:] items = items[0:choice] + items[choice+1:] print"You have spent $", money if money >= 9.25 and money <= 10.0: print"You win!" else: print"You lose!" Attempt 1 ID problems, write on board
defplayTry1(): print"Welcome to the price is right!" print"Your goal is to buy 5 or fewer items (any number of each)" print"and spend between $9.25 and $10" items = ["bleach","coke","ramen","ice cream","super ball"] prices = [1.35, .75, .25, 3.00, 1.75] money = 0.0 while money < 9.25 and len(items) > 0: print"You have spent $", money printItems( items ) choice = input( "Which item would you like to buy? ") number = input( "How many "+items[choice]+" would you like?") print items[choice], "is $", prices[choice] money += prices[choice]*number prices = prices[0:choice] + prices[choice+1:] items = items[0:choice] + items[choice+1:] print"You have spent $", money if money >= 9.25 and money <= 10.0: print"You win!" else: print"You lose!" Attempt 1: Issues ID problems, write on board Magic numbers!