Difference between revisions of "CSC111 Lab 8 2015b"
Line 276: | Line 276: | ||
::: You should list the names in alphabetical order, i.e. Blanche should be first, if she's in the list, then Stanley, if he's in the list, then Stella, if she's in the list. | ::: You should list the names in alphabetical order, i.e. Blanche should be first, if she's in the list, then Stanley, if he's in the list, then Stella, if she's in the list. | ||
− | ::* Which of the three characters mentions the words "drink", "drinks", "liquor" or "whiskey"? List the answers in alphabetical order of their name. Example: | + | ::* Which of the three characters mentions the words "drink", "drinks", "liquor" or "whiskey"? List the answers in alphabetical order of their name under the heading "liquor". Example: |
− | + | liquor | |
Stella | Stella | ||
Line 301: | Line 301: | ||
Stella | Stella | ||
− | + | liquor | |
Stella | Stella | ||
</source> | </source> |
Revision as of 10:19, 28 October 2015
--D. Thiebaut (talk) 13:58, 26 October 2015 (EDT)
<showafterdate after="20151028 12:00" before="20151231 00:00">
Reminder: Please continue working in pairs. The deadline for submitting on Moodle is Friday 10/30/15, at 11:55 p.m.
Part 1: While Loops
Exercise 1: Robust Input with While Loops |
def getPositiveNumber(): # # put your code here # return 10 # just to make sure the code is accepted by Idle def main(): # Part 1, Exercise 1 x = getPositiveNumber() print( "getPositiveNumber() returned", x ) main()
Remove the return 10 statement in getPositiveNumber(), and complete the function so that it asks the user for a number larger than 0, and will keep on repeating the prompting until the user enters a number greater than 0. This way the function will always return a number greater than 0 to the main program.
Below is an example of the interaction between computer and user.
Please enter a number greater than 0: -1 -1 is invalid. Please enter a number greater than 0: -3 -3 is invalid. Please enter a number greater than 0: 0 0 is invalid. Please enter a number greater than 0: 20 getPositiveNumber() returned 20 >>>
Exercise 2: Ask for Yes/No answer |
Same idea as in Exercise 1, but this time the new function, called likesChoco() will keep on asking a question until the user's input is "YES", "yes", "y", "NO", "no", or "n". Any combination of lower/upper case in the spelling is accepted ("yES" is valid). The function will return True if the user answers yes, and False otherwise.
- Source
def likesChoco(): # # put your code here # return True # just to make sure the code works as is. def main(): # Part1, Exercise 2 if likesChoco() == True: print( "Me too!" ) else: print( "Sorry to hear that!" ) main()
- Example output
Do you like chocolate (Y/N)? possibly please enter by 'Yes' or 'No' Do you like chocolate (Y/N)? I don't know please enter by 'Yes' or 'No' Do you like chocolate (Y/N)? Oui please enter by 'Yes' or 'No' Do you like chocolate (Y/N)? y Me too!
Exercise 3: if/else versus elif |
- Create a new program (lab8_3.py) with the following bit of code:
def main(): grade = input( "Grade? " ).upper().strip() if grade == "A": print( "Excellent job!" ) else: if grade == "B": print( "Very nice" ) else: print( "Below B. Make an effort!" ) main()
- Run the code. Verify that it gives correct answers for all letters "A" to "F".
- Complete the code with additional if and else statements so that your program will give a different answer for "C", "D", and "F".
- You will have noticed that your code is indented to the right in a diagonal fashion. That's typical of this type of decision programs. Python supports the elif statement, though, that allows one to write cleaner code. elif stands for else if. The code above, with elif would look something like this:
def main(): grade = input( "Grade? " ).upper().strip() if grade == "A": print( "Excellent job!" ) elif grade == "B": print( "Very nice" ) else: print( "Below B. Make an effort!" ) main()
- When using if/elif/else, the general rule is that you should:
- start with an if
- use one or more elif statements
- end with an else
- Complete the program above with additional elif statements so that it can have a different answer for 'A', 'B', 'C', 'D' and 'F'.
Exercise 4: While and Elifs |
- Combine what you worked on today and put the section that asks for a grade and output a qualification of the grade inside a loop. Make the loop output "Invalid grade" for any letter that is not 'A', 'B', 'C', 'D', or 'F', and make the loop stop when the grade entered is 'Q' (for quit).
- Example of how your program should work:
Grade? A Excellent job! Grade? B Great job! Grade? a Excellent job! Grade? z Invalid grade Grade? lemon Invalid grade Grade? q Good bye! >>>
Processing Text
This part of the lab deals with finding keywords in text, very similarly to the way keywords such as "mother" or "father" were found by the Eliza program in a conversation with the user.
Video Introduction
Preparation
For this lab, you will be writing a program that looks for particular patterns in a play by Tennessee Williams: A Streetcar Named Desire. I have removed extra stage information from the play so that it contains only the dialogs.
- Get a sample of the play using this seed program, called lab8GetPlay.py:
# lab8GetPlay.py # your names # Fetches a text file from a Web site and prints it. from urllib.request import urlopen # library for requesting def main(): # the URL of the text file URL = "http://cs.smith.edu/~dthiebaut/classes/111/streetcarShort.txt" # open the URL response = urlopen(URL) # get its contents, and store it in a string called text text = response.read().decode('utf-8') # save the string to file open( "streetcarShort.txt", "w" ).write( text ) main()
- Run this program. Verify that you have a new text file in the folder where you have saved the program.
- Open the new file streetcarShort.txt and verify that you see a dialog between two characters in the play, Stella, and her sister Blanche.
Who's speaking most often, Stella or Blanche?
- Write a new program called lab8key.py that prompts the user for the name of a file, opens it, and counts how many lines (and not words) each of the two characters speaks.
Who mentions Stanley first, Stella or Blanche?
- An important character in the play is Stanley (who was played by Marlon Brando in the movie of the play). Who mentions Stanley first in this short excerpt from the play?
- Hints: Remember that you can break out of a look when a given condition occurs!
Who is Drinking
- Which of the two characters mentions the words "drink", "drinks", "liquor" the most?
- Hints: you can use the in operator to see if a word is in a list of words...
Analyzing The Whole Play
- Modify the program lab8GetPlay.py and change the URL and the file name in the open(...) statement from streetcarShort.txt to streetcar.txt.
- Run lab8GetPlay.txt and verify that you have a new file in your folder called streetcar.txt. It should contain the whole play. The last line of the play is "The end."
- Modify your lab8key.py program, and make it answer the following questions regarding the three main characters, Stanley, Stella, and Blanche:
- Several characters mention the word "Napoleon" in this play. Print the lines where this word appears.
- What are the names only of the characters who pronounce the word "Napoleon" in their lines. For example, if Stanley says 5 lines containing the word Napoleonic, and Stella only one line, your program should output one blank line followed by
Napoleon Stanley Stella
- You should list the names in alphabetical order, i.e. Blanche should be first, if she's in the list, then Stanley, if he's in the list, then Stella, if she's in the list.
- Which of the three characters mentions the words "drink", "drinks", "liquor" or "whiskey"? List the answers in alphabetical order of their name under the heading "liquor". Example:
liquor Stella
Typical Program Output
- Here is what your output could look like. This may not be the solution to the lab!
File name? streetcar.txt STANLEY: Have you ever heard of the Napoleonic code? STELLA: No, Stanley, I haven't heard of the Napoleonic code, if I have, I don't see what it-- STANLEY: In the state of Louisiana we have the Napoleonic code according to which what belongs to the wife belongs to the husband and vice versa. For instance if I had a piece of property, or you had a piece of property-- STANLEY: All right, I'll wait till she gets through soaking in a hot tub and then I'll inquire if she is acquainted with the Napoleonic code. It looks to me like you have been swindled, baby, and when you're swindled under the Napoleonic code I'm swindled too. And I don't like to be swindled. STANLEY: There is such a thing in this state of Louisiana as the Napoleonic code, according to which whatever belongs to my wife is also mine--and vice versa. STANLEY: You see, under the Napoleonic code--a man has to take an interest in his wife's affairs--especially now that she's going to have a baby. Napoleon Stanley Stella liquor Stella
Moodle Submission
- Save the program that answers the questions regarding the whole play in a file called lab8key.py and submit it to the Moodle LAB 8 section.
</showafterdate>
<showafterdate after="20151031 23:55" before="20151231 00:00">
Solution Programs
Robust Loops
def getPositiveNumber(): x = int( input( "Please enter a number greater than 0: " ) ) while x <= 0: print( "Invalid number!" ) x = int( input( "Please enter a new number: " ) ) return x def likesChoco(): ans = input( "Do you like chocolate (Yes/No)? " ) while not ans.upper() in [ "YES", "NO", "Y", "N" ]: print( "Invalid input!" ) ans = input( "Do you like chocolate (Yes/No)? " ) # # put your code here # return ans.upper() in ["YES", "Y"] def main(): # Part 1, Exercise 1 x = getPositiveNumber() print( "getPositiveNumber() returned", x ) # Part1, Exercise 2 if likesChoco() == True: print( "Me too!" ) else: print( "Sorry to hear that!" ) main()
Text Processing
=
import urllib.request def getFileFromWeb( URL ): """ Grabs the file located at the given URL, decodes it as a regular text string, and returns the string. """ response = urllib.request.urlopen(URL) text = response.read().decode('utf-8') #print( text ) return text def findNapoleon( lines ): """ Lists all the lines that contain the word Napoleon. """ for line in lines: #print( "line = ", line[0:40] ) if line.lower().find( "napoleon" ) != -1: print( line ) def whoSaysNapoleon( lines ): """ Figures out who of the 3 characters says the word Napoleon """ stanley = False blanche = False stella = False for line in lines: if line.lower().find( "napoleon" )!= -1: character = line.split()[0] if character == "STANLEY:": stanley = True if character == "BLANCHE:": blanche = True if character == "STELLA:": stella = True print() print( "Napoleon" ) if stanley: print( "Stanley" ) if blanche: print( "Blanche" ) if stella: print( "Stella" ) def whoSaysLiquor( lines ): """ Figures out who says words related to alcohol the most. """ # create 3 counters stanley = 0 blanche = 0 stella = 0 # define the keywords to look for keywords = ["drink", "liquor", "whiskey"] # process each line separately for line in lines: # get the lowercase version, just to be safe line = line.lower() # check which keyword, if any, appears in each line for keyword in keywords: if line.find( keyword ) != -1: character = line.split()[0] if character == "STANLEY:": stanley = stanley + 1 if character == "BLANCHE:": blanche = blanche + 1 if character == "STELLA:": stella = stella + 1 print() print( "liquor" ) if stanley > stella and stanley > blanche: print( "Stanley" ) elif blanche > stella and blanche > stanley: print( "Blanche" ) else: print( "Stella" ) def main(): URL = "http://cs.smith.edu/~dthiebaut/classes/111/streetcar.txt" text = getFileFromWeb( URL ) # transform text into lines for easier processing. lines = text.splitlines() # print all the lines containing "Napoleon" findNapoleon( lines ) # figure out who says "Napoleon" whoSaysNapoleon( lines ) # figure out who says liquor the most whoSaysLiquor( lines ) main()
</showafterdate>