CSC111 Homework 9 Solutions

From dftwiki3
Revision as of 13:11, 14 April 2010 by Thiebaut (talk | contribs)
Jump to: navigation, search

--D. Thiebaut 18:11, 14 April 2010 (UTC)


Problem 1

# hw9a.py
# Kristina Fedorenko
# (edited by D. Thiebaut)
# 111c - aq
#
#--- This program calculates how many people from a given list can
#--- fit into the elevator. Elevator's weight limit is set by
#--- the user. The program outputs the max number of people,
#--- their total weight and their names.
#

#--- prints a line of "-" ---
def line():
    print "-"*40

#--- asks user for the weight limit. Rejects anything --- 
#---           not within 0-1000 range                ---
def getTotalWeight():
    n = 1001
    while not 0<=n<=1000:
        try:
            n = input("Please enter an elevator weight limit (0 - 1000): ")
            if not 0<=n<=1000:
                print "The number you entered is not within allowed range."
        except SyntaxError:
            print "Invalid input."
            continue
        except NameError:
            print "Invalid input."
            continue
    return n

#--- MAIN FUNCTION ---
def main():
    people = [ ("JT", 150), ("TJ", 80), ("TT", 120), ("BT", 170), ("Mike", 12),
              ("AF", 27), ("Lea", 78), ("Leo", 180), ("Al", 55), ("GK", 110),
              ("JR", 111), ("VB", 76)]
    print
    #--- get the limit from user ---
    allowedWeight = getTotalWeight()


    #--- sort people by weight ---
    inElev = []
    for name, weight in people:
        inElev.append([weight, name])
    inElev.sort()

    #--- to fit max number of people, people with the lowest 
    #--- weight should be chosen
    
    
    #--- weight all people and if more than limit, remove the heaviest ---
    TotalWeight = 0
    names = []
    for weight, name in inElev:  #--- recalculates weight
        TotalWeight += weight
        names.append( name )
        if TotalWeight > allowedWeight:
            TotalWeight -= weight
            names.pop()          #--- remove last name added
	    break
    
        
    #--- prints out the results ---
    line()
    print "%-55s %-5d" %\
    ("Maximum number of people that can fit in the elevator:", len(names))
    print
    print "%-55s %-5d" %\
    ("Total weight of the people who fit in the elevator:", TotalWeight)
    print
    if len( names ) > 0:
        print "Names of the people in the elevator:"
        for name in names:
            print "   -", name
    line()
    print

main()


Problem 2

 
# hw9b.sol.py
# D. Thiebaut
# Computes e, the base of the natural log to 11 decimal
# places by summing up terms of the form 1/n!.  
# 
sum = 1.0
denom = 1
count = 1
print "-"*50
print "denom = ", denom
print "term = ", 0
print "sum = ", sum
print "count = ", count

#                         71828182845
while sum*100000000000 < 271828182845:
    print "-"*50
    print "denom = ", denom
    term = 1.0 / denom
    print "term = ", term
    sum = sum + term
    print "sum = %1.20f" % sum
    count += 1
    denom = denom * count
    print "count = ", count

print "final sum = %1.20f " % sum
print "count = ", count

# the output of the program is shown below:
"""
--------------------------------------------------
denom =  1
term =  0
sum =  1.0
count =  1
--------------------------------------------------
denom =  1
term =  1.0
sum = 2.00000000000000000000
count =  2
--------------------------------------------------
denom =  2
term =  0.5
sum = 2.50000000000000000000
count =  3
--------------------------------------------------
denom =  6
term =  0.166666666667
sum = 2.66666666666666651864
count =  4
--------------------------------------------------
denom =  24
term =  0.0416666666667
sum = 2.70833333333333303727
count =  5
--------------------------------------------------
denom =  120
term =  0.00833333333333
sum = 2.71666666666666634100
count =  6
--------------------------------------------------
denom =  720
term =  0.00138888888889
sum = 2.71805555555555544700
count =  7
--------------------------------------------------
denom =  5040
term =  0.000198412698413
sum = 2.71825396825396836675
count =  8
--------------------------------------------------
denom =  40320
term =  2.48015873016e-05
sum = 2.71827876984127003723
count =  9
--------------------------------------------------
denom =  362880
term =  2.7557319224e-06
sum = 2.71828152557319224769
count =  10
--------------------------------------------------
denom =  3628800
term =  2.7557319224e-07
sum = 2.71828180114638451315
count =  11
--------------------------------------------------
denom =  39916800
term =  2.50521083854e-08
sum = 2.71828182619849290091
count =  12
--------------------------------------------------
denom =  479001600
term =  2.08767569879e-09
sum = 2.71828182828616871092
count =  13
--------------------------------------------------
denom =  6227020800
term =  1.60590438368e-10
sum = 2.71828182844675936281
count =  14
--------------------------------------------------
denom =  87178291200
term =  1.14707455977e-11
sum = 2.71828182845823018710
count =  15
final sum =  2.71828182845823018710
count =  15

"""



Part 3, Optional and Extra Credit

# solution program for Hw9, Part 3 (optional and extra credit)
# D. Thiebaut
# The program reads a file formatted as follows:
# 
# name Jane Moore
# semester fall 2010 
# MWF 9 GEO 370
# TR  9 CSC 111 
# MW 10 GOV 228
# MWF 13 DAN 113
# TR  13 FRN 254 
# F   15 ESS 940
# F   14 ESS 940
#
# and outputs the same information into an html file, reformatted
# to look nice and organized.
#

def getFiles():
    """gets the name of files from the user"""
    inputFile = outputFile = None

    #--- ask for a valid file name ---
    while True:
        inputFile = raw_input( "Input file name? " )
        try:
            open( inputFile, 'r' )
            break
        except:
            print "Invalid file name.  Does not exit.  Please reenter!"

    #--- ask for an output file name with .htm or .html at the end ---
    while True:
        outputFile = raw_input( "Output file name? " )
        if outputFile[-5:] != ".html" and outputFile[-4:] != ".htm":
            print "Invalid file name.  Make sure it ends in .htm or .html!"
        else:
            break

    return inputFile, outputFile


def getInput( inputFile ):
    """reads the input file and returns the name, semester and
    schedule lines to the calling program"""

    lines = open( inputFile ).readlines()
    name = lines[0].strip()
    semester = lines[1].strip()
    return name, semester, lines[2:]

def parse( lines ):
    """parses the schedule lines and returns 5 arrays containing
    the various courses in the right slot"""

    #--- create empty lists for each day of the week ---
    M = []
    T = []
    W = []
    R = []
    F = []

    #--- fill the arrays with &nbsp; which is a blank space in html ---
    for i in range( 17 ): # index 8 corresponds to 8:00 am.
        M.append( "&nbsp;" )
        T.append( "&nbsp;" )
        W.append( "&nbsp;" )
        R.append( "&nbsp;" )
        F.append( "&nbsp;" )
        
    #--- read each line and extract information ---
    for line in lines:
        #print "line = ", line 
        words = line.split( )
        #print "words = ", words
        #--- skip badly formatted lines ---
        if len( words ) != 4: 
            continue
        #--- distribute courses in arrays for each day ---
        Days, time, dept, num = words
        time = int( time )  
        if Days.find( "M" )!= -1:
            M[ time ] = dept+num
        if Days.find( "T" )!= -1:
            T[ time ] = dept+num
        if Days.find( "W" )!= -1:
            W[ time ] = dept+num
        if Days.find( "R" )!= -1:
            R[ time ] = dept+num
        if Days.find( "F" )!= -1:
            F[ time ] = dept+num
        #print "M = ", M

    return M, T, W, R, F

def generateHtml( outputFile, name, semester, M, T, W, R, F ):
    """Generate the html code and stores it into the output file"""
    MM = TT = WW = RR = FF =  ""
    for i in range (8, 17): # index 8 is 8:00 a.m.
        MM = MM + "<td>%s</td>" % M[i]
        TT = TT + "<td>%s</td>" % T[i]
        WW = WW + "<td>%s</td>" % W[i]
        RR = RR + "<td>%s</td>" % R[i]
        FF = FF + "<td>%s</td>" % F[i]

    file = open( outputFile, 'w' )
    file.write( """<html>
<title>%s's Schedule</title>
<body>
<h1>J%s's Schedule</h1>

<h2>%s<h2>

<table border="1">
<tr><td>Day</td><td>8:00</td><td>9:00</td><td>10:00</td><td>11:00</td>
    <td>12:00</td><td>13:00</td><td>14:00</td><td>15:00</td><td>16:00</td></tr>
<tr><td>Monday</td>%s</tr>
<tr><td>Tuesday</td>%s</tr>
<tr><td>Wednesday</td>%s</tr>
<tr><td>Thursday</td>%s</tr>
<tr><td>Friday</td>%s</tr>
</table>
</body>
</html>
""" % ( name, name, semester, MM, TT, WW, RR, FF ) )
    file.close()


# ---------------------------------------------------------------------------------
#                                   MAIN PROGRAM
# ---------------------------------------------------------------------------------

def main():
    # get file names from user 
    inputFile, outputFile = getFiles()

    # parse information into fields.
    name, semester, lines = getInput( inputFile )

    # create lists for every day of the week
    M, T, W, R, F = parse( lines )

    # generate the html code 
    generateHtml( outputFile, name, semester, M, T, W, R, F )
    
main()