Difference between revisions of "CSC111 Lab 5 2015b"

From dftwiki3
Jump to: navigation, search
(Moodle Submission)
Line 684: Line 684:
 
</showafterdate>
 
</showafterdate>
 
<br />
 
<br />
<onlydft>
 
=VPL Modules=
 
<br />
 
==Challenge 7==
 
===vpl_run.sh===
 
<br />
 
<source lang="bash">
 
#! /bin/bash
 
 
cat > vpl_execution <<EOF
 
#! /bin/bash
 
 
# --- Python ----
 
if [[ `hostname -s` = "beowulf2" ]]; then
 
  python=/usr/bin/python3.3
 
else
 
  python=/usr/local/bin/python3.4
 
fi
 
 
prog=lab5_7.py
 
\$python \$prog
 
 
EOF
 
 
chmod +x vpl_execution
 
</source>
 
<br />
 
===vpl_evaluate.sh===
 
<br />
 
<source lang="bash">
 
#! /bin/bash
 
 
cat  > vpl_execution <<EOF
 
#! /bin/bash
 
 
# --- Python ----
 
if [[ `hostname -s` = "beowulf2" ]]; then
 
  python=/usr/bin/python3.3
 
else
 
  python=/usr/local/bin/python3.4
 
fi
 
 
 
 
\$python evaluate.py
 
 
EOF
 
 
chmod +x vpl_execution
 
 
 
</source>
 
<br />
 
===evaluate.py===
 
<br />
 
<source lang="python">
 
# evaluate.py
 
# D. Thiebaut
 
# This program is used to test a student's python program on Moodle.
 
 
import sys
 
import random
 
import subprocess
 
 
#--- define what the student program is called, and what the solution
 
#--- program name is.
 
module = "lab5_7"
 
solutionModule = "lab5_7sol"
 
userOutSplitPattern = "POEM"    # pattern used to start recording the user
 
                              # output.  Useful when program does several
 
                              # input() statements, and user output starts
 
                              # after that.
 
 
 
#--- GLOBALS ---
 
interpreter = sys.executable
 
 
def commentLong( line ):
 
    print( "<|--\n" + line  + "\n --|>" )
 
 
def commentShort( text ):
 
    print( "Comment :=>> " + text )
 
 
def printGrade( grade ):
 
    print( "Grade :=>> ", grade )
 
 
# generateInputFileWithRandomInputs
 
# generate a file with name "inputFileName" with some random input
 
# for the program.
 
# MAKE SURE TO EDIT THIS TO MATCH THE PROGRAM BEING TESTED
 
def generateInputFileWithRandomInputs( inputFileName ):
 
    #--- generate random inputs ---
 
    fileName = random.choice( [ "choco.txt", "choc.txt", "chocolat.txt" ] )
 
   
 
    title    = [ "POEM: Chocolate Poem", "POEM: Chocolate Chocolate", "POEM: Chocolate Anyone?" ]
 
    lines    = [ "Chocolate, CHOCOLATE : you're the best!",
 
                "Milk chocolate, dark chocolate?  Who cares?",
 
                "I'm happy when I eat chocolate.  You?",
 
                "This line does not contain c-h-o-c-o-l-a-t-e",
 
                "It's cold... I want some hot chocolate, now!" ]
 
    author  = [ "--Anonymous", "--Francis", "--DFT" ]
 
    replace  = random.choice( [ "carrot", "cocoa", "cream" ] )
 
 
    poem    = [ random.choice( title ),
 
                random.choice( lines ),
 
                random.choice( lines ),
 
                random.choice( lines ),
 
                random.choice( author ) ]
 
    poem = "\n".join( poem )
 
 
    #--- create data file with input data ---
 
    text = poem + "\n"
 
    file = open( fileName, "w" )
 
    file.write( text )
 
    file.close()
 
 
    #--- create input file for stdin ---
 
    file = open( inputFileName, "w" )
 
    file.write( fileName + "\n" )
 
    file.write( replace + "\n" )
 
    file.close()
 
 
    return  text
 
 
# checkForFunctionPresence
 
# checks that "functionName" is defined and called in the program.
 
# MAKE SURE TO EDIT TO MATCH PROGRAM BEING TESTED
 
def checkForFunctionPresence( module, functionName ):
 
    foundDef = False
 
    foundCall = False
 
 
    for line in open( module+".py", "r" ).readlines():
 
        # remove comments
 
        idx = line.find( "#" )
 
        if ( idx >=0 ): line = line[0:idx]
 
 
        if line.startswith( "def " + functionName + "(" ):
 
            foundDef = True
 
            continue
 
        if line.startswith( "def " + functionName + " (" ):
 
            foundDef = True
 
            continue
 
        if line.find( functionName+"(" ) != -1:
 
            foundCall = True
 
            continue
 
 
    return (foundDef, foundCall)
 
 
 
 
# ==================================================================
 
# NO EDITS NEEDED BELOW!
 
# ==================================================================
 
 
 
 
 
# checkModuleRunsOK: runs the module as a shell subprocess and
 
# look for errors in the output.  This is required, because otherwise
 
# importing the module in this program will make this program crash.
 
# It's not possible (as far as I can tell0 to catch exceptions from
 
# the import or __module__ statements.
 
# returns True, none if no errors, otherwise False, string if there's
 
# an exception, and the error message (string) is in the returned 2nd
 
# arg.
 
# The module name is assumed to not include ".py"
 
def checkModuleRunsOk( module, inputFileName ):
 
    global interpreter
 
    p = subprocess.Popen( [ interpreter, module+".py" ],
 
                          stdout=subprocess.PIPE,
 
                          stderr=subprocess.PIPE,
 
                          stdin=subprocess.PIPE)
 
 
    p.stdin.write( bytes( open( inputFileName, "r" ).read(), 'UTF-8' ) )
 
    data = p.communicate( )
 
    p.stdin.close()
 
 
    error = data[1].decode( 'UTF-8' )
 
    if len( error ) > 1:
 
        return False, error
 
    return True, None
 
 
                     
 
# extractTextFromErrorMessage( sys_exc_info ):
 
def extractTextFromErrorMessage( sys_exc_info ):
 
    print( "sys_exec_info = ", sys_exc_info )
 
    text = ""
 
    for field in sys_exc_info:
 
        if type( field )==type( " " ):
 
            text += field + "\n"
 
    return text
 
 
# runModule:
 
# runs the module, passes it data from the input file on its stdin
 
# and get its output on stdout captured in outputFileName.
 
# We assume the module will not crash, because we already tested
 
# it with checkModuleRunsOk().
 
def runModule( module, inputFileName, outputFileName ):
 
    global userOutSplitPattern
 
 
    error = False
 
 
    #--- make stdin read information from the text file
 
    sys.stdin = open( inputFileName, "r" )
 
 
    #--- capture the stdout of the program to test into a file
 
    saveStdOut = sys.stdout
 
    saveStdErr = sys.stderr
 
 
    sys.stdout = open( outputFileName, "w" )
 
    sys.stderr = open( "errorOut", "w" )
 
 
    #--- run the student program ---
 
    try:
 
        _module = __import__(  module  )
 
    except:
 
        error = True
 
        sys.stderr.close()
 
        sys.stderr = saveStdErr
 
        sys.stdout.close()
 
        sys.stdout = saveStdOut
 
        text = sys.exc_info()[0]
 
        text = extractTextFromErrorMessage( text )
 
        print( "*** sys.exc_info() = ", text )
 
        return error, text
 
       
 
    #--- filter out junk from output of program ---
 
    sys.stdout.close()
 
    sys.stdout = saveStdOut
 
    sys.stderr.close()
 
    sys.stderr = saveStdErr
 
    file = open( outputFileName, "r" )
 
    text = file.read()
 
    index = text.find( userOutSplitPattern ) #"+-" )
 
    text = text[index:]
 
    text = text.strip( ).strip( "\n" ) + "\n"
 
    #print( text, end="" )
 
    file.close()
 
    return False, text
 
 
def removeBlankLines( lines ):
 
    newLines = []
 
    for line in lines.split( "\n" ):
 
        if len( line )==0:
 
            continue
 
        newLines.append( line )
 
 
    return ( "\n".join( newLines ) ) + "\n"
 
 
def compareUserExpected( inputLines, userOutText, expectedOutText ):
 
    userOutText = removeBlankLines( userOutText )
 
    expectedOutText = removeBlankLines( expectedOutText )
 
    #print( "userOutText:" + userOutText )
 
    #print( "expectedOutText:" + expectedOutText )
 
    misMatchLineNumbers = []
 
    userTextOutLines = userOutText.split( "\n" )
 
    expectedOutTextLines = expectedOutText.split( "\n" )
 
 
    for i in range( len( userTextOutLines ) ):
 
        lineNo = i+1
 
        if userTextOutLines[i] != expectedOutTextLines[i]:
 
            misMatchLineNumbers.append( lineNo )
 
   
 
    return misMatchLineNumbers
 
           
 
 
 
def main():
 
    global module
 
    global solutionModule
 
 
   
 
    #--- check that the main module uses a main() function
 
    foundDef, foundCall = checkForFunctionPresence( module, "main" )
 
    if (not foundDef) or (not foundCall):
 
        commentShort( "-Missing main() program" )
 
        commentShort( "Your program must use a main() function." )
 
        commentShort( "(make sure you spell it exactly \"main()\"!" )
 
        printGrade( 40 )
 
        return
 
 
 
    #--- generate input file with random data ---
 
    inputLines = generateInputFileWithRandomInputs( "input" )
 
 
 
    Ok, errorMessage = checkModuleRunsOk( module, "input" )
 
    if not Ok:
 
        commentLong( "- Your program crashed...\n"
 
                    + "Your program was tested with:\n"
 
                    + inputLines  + "\n"
 
                    + "Error message:\n"
 
                    + errorMessage + "\n" )
 
        printGrade( 50 )
 
        return
 
 
                   
 
    error, userOutText        = runModule( module, "input", "userOut" )
 
    if error:
 
        commentLong( "- Your program crashed...\n"
 
                    + "Your program was tested with:\n"
 
                    + inputLines  + "\n"
 
                    + "Error message:\n"
 
                    + userOutText + "\n" )
 
        printGrade( 50 )
 
        return
 
 
    dummy, expectedOutText    = runModule( solutionModule, "input", "expectedOut" )
 
 
    misMatchLineNumbers = compareUserExpected( inputLines,
 
                                              userOutText,
 
                                              expectedOutText )
 
    if len( misMatchLineNumbers ) == 0:
 
        commentLong( "- Congrats, correct output!\n"
 
                    +"Your program was tested with:\n"
 
                    +inputLines + "\n"
 
                    +"Your output:\n"
 
                    +userOutText + "\n" )
 
        printGrade( 100 )
 
    else:
 
        s = "" if len( misMatchLineNumbers ) == 1 else "s"
 
 
        commentLong( "-Incorrect output.\n"
 
                    +"Your program was tested with:\n"
 
                    +inputLines + "\n"
 
                    +"Your output:\n"
 
                    +userOutText + "\n"
 
                    +"Expected output:\n"
 
                    +expectedOutText + "\n"
 
                    +("There are mismatches in Line%s " % s) +
 
                    ", ".join( [str(k) for k in misMatchLineNumbers] )
 
                    +"\n" )
 
        noLinesGood = len( expectedOutText.strip().split("\n") )
 
        noErrors    = len( misMatchLineNumbers )
 
        #print( "noLinesGood = ", noLinesGood, " noErrors = ", noErrors )
 
 
        grade      = round( 60 + 40 / noLinesGood *( noLinesGood- noErrors ) )
 
        printGrade( grade )
 
 
main()
 
 
 
 
</source>
 
<br />
 
 
==Challenge 9==
 
 
===evaluate.py===
 
<br />
 
<source lang="python">
 
# evaluate.py
 
# D. Thiebaut
 
# This program is used to test a student's python program on Moodle.
 
 
import sys
 
import random
 
import subprocess
 
 
#--- define what the student program is called, and what the solution
 
#--- program name is.
 
module = "lab5_9"
 
solutionModule = module + "sol"
 
userOutSplitPattern = "Ha"    # pattern used to start recording the user
 
                              # output.  Useful when program does several
 
                              # input() statements, and user output starts
 
                              # after that.
 
stripOutputsBeforeCompare = True
 
                              # set to True if extra spaces at beginning or
 
                              # end of user output is ok
 
 
#--- GLOBALS ---
 
interpreter = sys.executable
 
 
def commentLong( line ):
 
    print( "<|--\n" + line  + "\n --|>" )
 
 
def commentShort( text ):
 
    print( "Comment :=>> " + text )
 
 
def printGrade( grade ):
 
    print( "Grade :=>> ", grade )
 
 
# generateInputFileWithRandomInputs
 
# generate a file with name "inputFileName" with some random input
 
# for the program.
 
# MAKE SURE TO EDIT THIS TO MATCH THE PROGRAM BEING TESTED
 
def generateInputFileWithRandomInputs( inputFileName ):
 
    #--- generate random inputs ---
 
 
    list = []
 
    for i in range( random.choice( [2, 5, 3] ) ):
 
        list.append( random.choice( [ "Dave", "Jorge", "Max", "Carl", "Tim" ] ) )
 
   
 
    names = " ".join( list )
 
 
    #--- create input file for stdin ---
 
    file = open( inputFileName, "w" )
 
    file.write( names + "\n" )
 
    file.close()
 
 
    return names + "\n"
 
 
# checkForFunctionPresence
 
# checks that "functionName" is defined and called in the program.
 
# MAKE SURE TO EDIT TO MATCH PROGRAM BEING TESTED
 
def checkForFunctionPresence( module, functionName ):
 
    foundDef = False
 
    foundCall = False
 
 
    for line in open( module+".py", "r" ).readlines():
 
        # remove comments
 
        idx = line.find( "#" )
 
        if ( idx >=0 ): line = line[0:idx]
 
 
        if line.startswith( "def " + functionName + "(" ):
 
            foundDef = True
 
            continue
 
        if line.startswith( "def " + functionName + " (" ):
 
            foundDef = True
 
            continue
 
        if line.find( functionName+"(" ) != -1:
 
            foundCall = True
 
            continue
 
 
    return (foundDef, foundCall)
 
 
 
 
# ==================================================================
 
# NO EDITS NEEDED BELOW!
 
# ==================================================================
 
 
 
 
 
# checkModuleRunsOK: runs the module as a shell subprocess and
 
# look for errors in the output.  This is required, because otherwise
 
# importing the module in this program will make this program crash.
 
# It's not possible (as far as I can tell0 to catch exceptions from
 
# the import or __module__ statements.
 
# returns True, none if no errors, otherwise False, string if there's
 
# an exception, and the error message (string) is in the returned 2nd
 
# arg.
 
# The module name is assumed to not include ".py"
 
def checkModuleRunsOk( module, inputFileName ):
 
    global interpreter
 
    p = subprocess.Popen( [ interpreter, module+".py" ],
 
                          stdout=subprocess.PIPE,
 
                          stderr=subprocess.PIPE,
 
                          stdin=subprocess.PIPE)
 
 
    #print( "inputFileName = ", inputFileName )
 
    #print( "open( inputFileName, r).read() = ", open( inputFileName, "r" ).read() )
 
 
    p.stdin.write( bytes( open( inputFileName, "r" ).read(), 'UTF-8' ) )
 
    data = p.communicate( )
 
    p.stdin.close()
 
 
    error = data[1].decode( 'UTF-8' )
 
    if len( error ) > 1:
 
        return False, error
 
    return True, None
 
 
                     
 
# extractTextFromErrorMessage( sys_exc_info ):
 
def extractTextFromErrorMessage( sys_exc_info ):
 
    print( "sys_exec_info = ", sys_exc_info )
 
    text = ""
 
    for field in sys_exc_info:
 
        if type( field )==type( " " ):
 
            text += field + "\n"
 
    return text
 
 
# runModule:
 
# runs the module, passes it data from the input file on its stdin
 
# and get its output on stdout captured in outputFileName.
 
# We assume the module will not crash, because we already tested
 
# it with checkModuleRunsOk().
 
def runModule( module, inputFileName, outputFileName ):
 
    global userOutSplitPattern
 
 
    error = False
 
 
    #--- make stdin read information from the text file
 
    sys.stdin = open( inputFileName, "r" )
 
 
    #--- capture the stdout of the program to test into a file
 
    saveStdOut = sys.stdout
 
    saveStdErr = sys.stderr
 
 
    sys.stdout = open( outputFileName, "w" )
 
    sys.stderr = open( "errorOut", "w" )
 
 
    #--- run the student program ---
 
    try:
 
        _module = __import__(  module  )
 
    except:
 
        error = True
 
        sys.stderr.close()
 
        sys.stderr = saveStdErr
 
        sys.stdout.close()
 
        sys.stdout = saveStdOut
 
        text = sys.exc_info()[0]
 
        text = extractTextFromErrorMessage( text )
 
        print( "*** sys.exc_info() = ", text )
 
        return error, text
 
       
 
    #--- filter out junk from output of program ---
 
    sys.stdout.close()
 
    sys.stdout = saveStdOut
 
    sys.stderr.close()
 
    sys.stderr = saveStdErr
 
 
    file = open( outputFileName, "r" )
 
    text = file.read()
 
    index = text.find( userOutSplitPattern ) #"+-" )
 
    text = text[index:]
 
    text = text.strip( ).strip( "\n" ) + "\n"
 
    #print( text, end="" )
 
    file.close()
 
    return False, text
 
 
def removeBlankLines( lines ):
 
    newLines = []
 
    for line in lines.split( "\n" ):
 
        if len( line )==0:
 
            continue
 
        newLines.append( line )
 
 
    return ( "\n".join( newLines ) ) + "\n"
 
 
def compareUserExpected( inputLines, userOutText, expectedOutText ):
 
    global stripOutputsBeforeCompare
 
 
    userOutText = removeBlankLines( userOutText )
 
    expectedOutText = removeBlankLines( expectedOutText )
 
    misMatchLineNumbers = []
 
    userTextOutLines = userOutText.split( "\n" )
 
    expectedOutTextLines = expectedOutText.split( "\n" )
 
 
    for i in range( len( userTextOutLines ) ):
 
        lineNo = i+1
 
        userLine = userTextOutLines[i]
 
        expectedLine = expectedOutTextLines[i]
 
        if stripOutputsBeforeCompare:
 
            userLine = userLine.strip()
 
            expectedLine = expectedLine.strip()
 
        if userLine != expectedLine:
 
            #print( "user    >" + userTextOutLines[i] + "<" )
 
            #print( "expected >" + expectedOutTextLines[i] + "<" )
 
            misMatchLineNumbers.append( lineNo )
 
   
 
    return misMatchLineNumbers
 
           
 
 
 
def main():
 
    global module
 
    global solutionModule
 
 
   
 
    #--- check that the main module uses a main() function
 
    foundDef, foundCall = checkForFunctionPresence( module, "main" )
 
    if (not foundDef) or (not foundCall):
 
        commentShort( "-Missing main() program" )
 
        commentShort( "Your program must use a main() function." )
 
        commentShort( "(make sure you spell it exactly \"main()\"!" )
 
        printGrade( 40 )
 
        return
 
 
 
    #--- generate input file with random data ---
 
    inputLines = generateInputFileWithRandomInputs( "input" )
 
 
 
    Ok, errorMessage = checkModuleRunsOk( module, "input" )
 
    if not Ok:
 
        commentLong( "- Your program crashed...\n"
 
                    + "Your program was tested with:\n"
 
                    + inputLines  + "\n"
 
                    + "Error message:\n"
 
                    + errorMessage + "\n" )
 
        printGrade( 50 )
 
        return
 
 
                   
 
    error, userOutText        = runModule( module, "input", "userOut" )
 
    if error:
 
        commentLong( "- Your program crashed...\n"
 
                    + "Your program was tested with:\n"
 
                    + inputLines  + "\n"
 
                    + "Error message:\n"
 
                    + userOutText + "\n" )
 
        printGrade( 50 )
 
        return
 
 
    dummy, expectedOutText    = runModule( solutionModule, "input", "expectedOut" )
 
 
    misMatchLineNumbers = compareUserExpected( inputLines,
 
                                              userOutText,
 
                                              expectedOutText )
 
    if len( misMatchLineNumbers ) == 0:
 
        commentLong( "- Congrats, correct output!\n"
 
                    +"Your program was tested with:\n"
 
                    +inputLines + "\n"
 
                    +"Your output:\n"
 
                    +userOutText + "\n" )
 
        printGrade( 100 )
 
    else:
 
        s = "" if len( misMatchLineNumbers ) == 1 else "s"
 
 
        commentLong( "-Incorrect output.\n"
 
                    +"Your program was tested with:\n"
 
                    +inputLines + "\n"
 
                    +"Your output:\n"
 
                    +userOutText + "\n"
 
                    +"Expected output:\n"
 
                    +expectedOutText + "\n"
 
                    +("There are errors in Line%s " % s) +
 
                    ", ".join( [str(k) for k in misMatchLineNumbers] )
 
                    +"\n" )
 
        noLinesGood = len( expectedOutText.strip().split("\n") )
 
        noErrors    = len( misMatchLineNumbers )
 
        #print( "noLinesGood = ", noLinesGood, " noErrors = ", noErrors )
 
 
        grade      = round( 60 + 40 / noLinesGood *( noLinesGood- noErrors ) )
 
        printGrade( grade )
 
 
main()
 
 
 
 
 
</source>
 
<br />
 
</onlydft>
 
 
<br /><br /><br />
 
<br /><br /><br />
 
<br />
 
<br />

Revision as of 15:43, 6 October 2015

--D. Thiebaut (talk) 12:17, 22 February 2015 (EST)





This lab deals with functions, passing parameters, and returning values. It is also about for you to start the Python.org documentation on the Web. The online documentation is a great help when writing programs. The Moodle submissions are due on Friday 10/08 at 11:55 p.m.



Searching the Python.org Docs

Python org.png


  • Open your Web browser and go to http://python.org
  • Click on Documentation, then on Python 3.x Docs.
  • In the Search Bar on the left, enter string methods.
  • Locate the result that contains Built-In Types, and go to that page. Locate the string methods there... (Hints: 4.7.1)
  • Look at all the different methods that strings offer you.
  • You're ready for the lab!


Functions


Working with Functions in the Console


  • This sections serves as a review for the end="..." optional parameter in print statements.
  • Try the following statements in the Python console:


>>> def test():
	print( "hello" )
	print( "there" )

	
>>> test()


>>> def test():
	print( "hello", end="" )
	print( "there" )

	
>>> test()

>>> def test():
	print( "hello", end="-" )
	print( "there" )

	
>>> test()
>>>


Notice what happens when you add the end="" construct in the print statement. It changes the way the print() function ends printing what it has to print. By default, if you do not have an end="" construct, print() brings the cursor to the next line. But this behavior can be changed. We are going to use this, in the new program below.

Teller Machine with Functions

TellerFigure.jpg


  • Without looking at your notes, (but if you get stuck, it's ok to look up your notes or the class notes on the Web), try to recreate the teller machine program.
  1. Start with the main program, have it call a function to get the amount (you can call it getAmount()), then it calls a function (say divideInBills()), that receives the amount, breaks it into 4 numbers, and returns a list of 4 numbers to main. And finally, at the end of main(), a function (say, displayResults()) is passed the list of 4 numbers and prints them in a nicely formatted output.



Challenge #1

QuestionMark5.jpg
  • Instead of having the function getAmount() return 4 numbers, like this:


     no20s, no10s, no5s, no1s = divideInBills( amount )


create a new function called breakDown( ... ) that gets the amount and a value, and returns the number of bills of that value, and the new amount:


    amount, no20s = breakDown( amount, 20 )
    amount, no10s = breakDown( amount, 10 )
    amount, no5s = breakDown( amount, 5 )
    amount, no1s = breakDown( amount, 1 )  # you might find a simpler way to write this!







Functions and Stick Figure, Version 1


  • This section will be cleaner if you start a new program, rather than add to an existing program.
  • Add this code section to your new program:


def head():
    print( "  o" )

def leftArm():
    print( " /", end="" )

def torso():
    print( "O", end="" )

def rightArm():
    print( "\\" )

def leftLeg():
    print( " /", end="" )

def rightLeg():
    print( " \\" )

def stickFigure():
    head()
    leftArm()
    torso()
    rightArm()
    leftLeg()
    rightLeg()

def main():
    stickFigure()

main()


  • Take a close look at the program. Locate the end="" construct, which prevents the print from going to the next line when it's done.
  • Notice also the "\\" string. Because the '\' character is used to print special characters, like '\n' (new line), or '\t' (tab), if we want to print a regular backslash character, we have to use 2 backslashes next to each other.


  • Run the program. Notice how it displays a stick figure.


Functions and Stick Figure, Version 2


  • Modify the stick figure program so that it looks like the code below:


def head():
    print( "  o" )

def leftArm():
    print( " /", end="" )

def torso():
    print( "O", end="" )

def rightArm():
    print( "\\" )

def leftLeg():
    print( " /", end="" )

def rightLeg():
    print( " \\" )

def body():
    leftArm()
    torso()
    rightArm()

def newStickFigure():
    head()
    body()
    leftLeg()
    rightLeg()

def main():
    newStickFigure()

main()
  • Observe how the code is different, and the new function body() is used to display the body of the stick figure (torso plus arms).
  • Using the example of body(), add a new function called legs() that will call leftLeg() and rightLeg() to draw both legs. Modify newStickFigure() by removing the calls to leftLeg() and rightLeg(), and adding instead a call to legs(). Your new function should look something like this:


def newStickFigure():
    head()
    body()
    legs()


Trimming DNA


  • Assume that we have a string containing the description of a DNA sequence, say "AAGACTAAAAAAGACTT." (DNA sequences are made of 4 symbols: A, C, G, and T.) Assume we know that "AGA" is a special marker in our DNA strings. So our string is marked in this way: "AAGACTAAAAAAGACTT."
  • Write a function called trimDNA( ) that receives the original DNA string as a parameter, and returns the string where everything on the left and right of the markers has been removed. We assume that the string will always contain two markers.
  • Example:


def main():
     DNA = "AAGACTAAAAAAGACTT"
     newDNA = trimDNA( DNA )
     print( newDNA )


  • The output would be
 AGACTAAAAAAGA


Testing


Make sure your function works strings of the type AAGAAGACTT, or AGATTTTAGA.



Happy Birthday!


  • Start with these three new functions:


def happyBirthday():
    print( "Happy birthday to you!" )

def happyBirthdayDear( name ):
    print( ("Happy birthday, dear " + name +"!" ) )


  • Write a third function called singSong() that calls the two functions above. When calling happyBirthdayDear( ... ), pass it some name, say yours, or "Dave", or one of your friends. You should get this kind of output:


Happy birthday to you!
Happy birthday, dear Dave!


  • Modify singSong() so that it displays a more appropriate version on the song:


Happy birthday to you!
Happy birthday to you!
Happy birthday, dear Dave!
Happy birthday to you!


Passing the Name as a Parameter


  • Modify your singSong( ) function one more time. I'm highlighting the lines that should change in your function:


def singSong( name ):
     ...
     ...
     happyBirthdayDear( name )
     ...


  • Now, make your program sing "Happy Birthday" to Dave, Karl, Jorge, and Tim!


Challenge #2

QuestionMark8.jpg
  • Make your program prompt the user for a name in the main() function.
  • Then main() will pass the name to singSong(), and your program will sing Happy Birthday to the person of your choice.






Challenge #3

QuestionMark9.jpg


  • Modify your solution program for Challenge 8 so that the user can enter several names on one line when prompted by your program. Your program then "sings" happy birthday to all the friends, one after the other...


  • Example:


Please enter the names of your friends: Jorge Karl Dave

Happy birthday to you!
Happy birthday to you!
Happy birthday, dear Jorge!
Happy birthday to you!

Happy birthday to you!
Happy birthday to you!
Happy birthday, dear Karl!
Happy birthday to you!

Happy birthday to you!
Happy birthday to you!
Happy birthday, dear Dave!
Happy birthday to you!


Moodle Submission


  • Submit your solution program for Challenge 3 to Moodle, in Section LAB 5 PB 3. You will need to rename your program lab5_3.py.






<showafterdate after="20150227 11:00" before="20150601 00:00">

Solution Programs


# Solution program for Lab #5
# All solutions to the challenges are stored in functions named challengex(),
# where x is 1, 2, 3, etc.
#

text = """Chocolate
Chocolate is the first luxury.
It has so many things wrapped up in it:
Deliciousness in the moment,
childhood memories,
and that grin-inducing
feeling of getting a reward for being good.
--Mariska Hargitay"""

def makeTextFile():
    file = open("hargitay.txt","w" )
    file.write( text )
    file.close()


def bar():
    print()
    print( "-"*80 )

def program0():
    # split the long string into individual lines
    lines = text.split( "\n" )

    # print each line
    for line in lines:
        print( line )

def challenge1():
    # split the long string into individual lines
    lines = text.split( "\n" )

    # print each line
    for line in lines:
        print( line.center( 60 ) )

def challenge2():
    # split the long string into individual lines
    lines = text.split( "\n" )

    # print title
    print( lines[0].upper().center( 60 ) )
    
    # print each line
    for line in lines[1: ]:
        print( line.center( 60 ) )


def challenge3():
    # split the long string into individual lines
    lines = text.split( "\n" )

    # get first and last line
    title = lines[0]
    lastLine = lines[-1]

    # get first line and print it
    print( title.upper().center( 60 ) )
    print()
    
    # print poem, between title and last line
    for line in lines[1:-1]:
        print( line )

    # print last line right-justified
    print( lastLine.rjust( 60 ) )


def challenge4():
    # split the long string into individual lines
    lines = text.split( "\n" )

    bar = "+" + "-"*50 + "+"

    # get first line and print it
    print( bar )
    print( "|" + lines[0].upper().center( 50 ) + "|" )
    
    # print each line
    for line in lines[1:-1]:
        print( "|" + line.center(50) + "|" )
    print( "|" + lines[-1].rjust(50) + "|" )
    print( bar )


def challenge5():
    # open the file and read the lines in
    fileName = "hargitay.txt"
    file = open( fileName, "r" )
    lines = file.readlines()
    file.close()

    # create a bar for the top and bottom of box
    bar = "+" + "-"*50 + "+"

    # get first line and print it
    print( bar )
    print( "|" + lines[0].upper().center( 50 ) + "|" )
    
    # print each line
    for line in lines[1:-1]:
        print( "|" + line.center(50) + "|" )
    print( "|" + lines[-1].rjust(50) + "|" )
    print( bar )

def challenge6():
    # open the file and read the lines in
    fileName = "hargitay.txt"
    file = open( fileName, "r" )
    text = file.read()
    lines = text.split( "\n" )
    file.close()

    # create a bar for the top and bottom of box
    bar = "+" + "-"*50 + "+"

    # get first line and print it
    print( bar )
    print( "|" + lines[0].upper().center( 50 ) + "|" )
    
    # print each line
    for line in lines[1:-1]:
        print( "|" + line.center(50) + "|" )
    print( "|" + lines[-1].rjust(50) + "|" )
    print( bar )


def challenge7():
    # get the user input
    fileName = input( "File name? " )
    word     = input( "Word to swap in? " )
    
    # open the file and read the lines in
    file = open( fileName, "r" )
    text = file.read()
    file.close()

    # replace chocolate by word before we split the text
    text = text.replace( "Chocolate", word.capitalize() )
    text = text.replace( "chocolate", word.lower() )
    text = text.replace( "CHOCOLATE", word.upper() )

    file = open( fileName, "w" )
    file.write( text )
    file.close()

  


# --------------------- stickFigure -----------------------

def head():
    print( "  o" )

def leftArm():
    print( " /", end="" )

def torso():
    print( "O", end="" )

def rightArm():
    print( "\\" )

def leftLeg():
    print( " /", end="" )

def rightLeg():
    print( " \\" )

def stickFigure():
    head()
    leftArm()
    torso()
    rightArm()
    leftLeg()
    rightLeg()

def body():
    leftArm()
    torso()
    rightArm()

def legs():
    leftLeg()
    rightLeg()

def newStickFigure():
    head()
    body()
    legs()

# --------------------- stickFigure1 ----------------------

def leftForearm1():
    print( " /", end="" )

def sword1():
    print( "+=====>" )

def leftArm1():
    print( " \\", end="" )

def head1():
    print( "O", end="" )

def rightArm1():
    print( "___" )

def body1():
    print( "  |" )
    print( "  |" )

def leftThigh1():
    print( " / ", end="" )

def rightThigh1():
    print( "\\" )

def leftCalf1():
    print( "/   ", end ="" )

def rightCalf1():
    print( "\\" )

def stickFigure1():
    leftForearm1()
    sword1()
    leftArm1()
    head1()
    rightArm1()
    body1()
    leftThigh1()
    rightThigh1()
    leftCalf1()
    rightCalf1()


# ---------------------------------------------------------


def happyBirthday():
    print( "Happy birthday to you!" )

def happyBirthdayDear( name ):
    print( "Happy birthday, dear " + name +"!"  )

def singSong( name ):
    happyBirthday()
    happyBirthday()
    happyBirthdayDear( name )
    happyBirthday()


def challenge8( ):
    # get the name from the user
    name = input( "Who's birthday should we celebrate? " )

    # sing the song for that person
    singSong( name )

# challenge 9
def happyBirthday():
    print( "Happy birthday to you!" )

def happyBirthdayDear( name ):
    print( "Happy birthday, dear " + name +"!"  )

def singSong( name ):
    happyBirthday()
    happyBirthday()
    happyBirthdayDear( name )
    happyBirthday()

def challenge9( ):
    # get a line of names, separated by spaces
    line = input( "? " )

    # remove extra spaces at the front or back
    line = line.strip()

    # split the line into individual names, and sing song for each
    for name in line.split( " " ):
        singSong( name )
        # blank line separates the different songs
        print()


def bar():
    print( "\n" + ( "-"*30 ) + "oOo" + ("-"*30 ) +"\n" )

    
def main():
    
    challenge1()
    bar()
    challenge2()
    bar()
    challenge3()
    bar()
    challenge4()
    bar()
    challenge5()
    bar()
    challenge6()
    bar()
    challenge7()
    bar()
    challenge8()
    bar()
    challenge9()
    bar()
  
    
main()

</showafterdate>