Difference between revisions of "CSC111 Homework 4 2015"

From dftwiki3
Jump to: navigation, search
(Problem #3)
 
(17 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
</bluebox>
 
</bluebox>
 
<br />
 
<br />
 +
__TOC__
 +
<br />
 +
<tanbox>
 +
Make sure you use a main() function in all your programs.
 +
</tanbox>
 
<br />
 
<br />
 
=Problem #1=
 
=Problem #1=
 
<br />
 
<br />
Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase.   
+
Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase.  Make sure there's a blank line before the output of the account nameThis line will be used by the grading program to spot your output.
 
<br />
 
<br />
 
;:Example
 
;:Example
Line 14: Line 19:
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Allie</u>
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Allie</u>
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>BABA</u>
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>BABA</u>
 +
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: ababa  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: ababa  
 
<br />
 
<br />
Line 26: Line 32:
  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Allie</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Allie</u>  
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>BABA</u>  
+
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>BABA</u>
 +
 
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: ababazzz  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: ababazzz  
  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Al</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Al</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Gus</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Gus</u>  
 +
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is:aguszzzz  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is:aguszzzz  
  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Alma</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Alma</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Verylongname</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Verylongname</u>  
 +
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: averylon  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: averylon  
 
<br />
 
<br />
Line 42: Line 51:
 
=Problem #3=
 
=Problem #3=
 
<br />
 
<br />
Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase.  We want the computer account to be ''exactly'' 8 characters long, but this time it is padded with the current year (2015 for us).   
+
Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase.  We want the computer account to be ''exactly'' 8 characters long, but this time it is padded with the current year (2015 for us).  We assume the user name will always have at least 3 characters.
 
<br />
 
<br />
 
;:Example
 
;:Example
Line 48: Line 57:
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Allie</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Allie</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>BABA</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>BABA</u>  
 +
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: ababa201  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: ababa201  
  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Al</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Al</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Gus</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Gus</u>  
 +
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: agus2015  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: agus2015  
  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Alma</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;First name? <u>Alma</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Verylongname</u>  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Last name? <u>Verylongname</u>  
 +
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: averylon  
 
  &nbsp;&nbsp;&nbsp;&nbsp;Your computer account name is: averylon  
 
<br />
 
<br />
Line 63: Line 75:
 
=Problem #4=
 
=Problem #4=
 
<br />
 
<br />
Write a program that prompts the user for her first and last name, and outputs a triangle made with her name, padded with dots  in front of it, as illustrated below.  There is no limit on the length of the first and last names.
+
Write a program that prompts the user for her first and last name, and outputs a triangle made with her name, padded with dots  in front of it, as illustrated below.  There is no limit on the length of the first and last names.  Notice that there is a blank line between the input section and the output section.
 
<br />
 
<br />
 
:;Example
 
:;Example
Line 69: Line 81:
 
First name? Maria
 
First name? Maria
 
Last name? LUCE
 
Last name? LUCE
 +
 
........M
 
........M
 
.......Ma
 
.......Ma
Line 115: Line 128:
 
:;Example
 
:;Example
 
:<source lang="text">
 
:<source lang="text">
Enter date: 02142015
+
Enter date: 02022015
  
 
2 Feb 2015
 
2 Feb 2015
Line 122: Line 135:
 
* Submit your program to HW 4 PB 6 on Moodle.
 
* Submit your program to HW 4 PB 6 on Moodle.
 
<br />
 
<br />
 +
 
=Problem #7=
 
=Problem #7=
 
<br />
 
<br />
Line 131: Line 145:
 
Please enter last name:  SMITH
 
Please enter last name:  SMITH
 
Please enter date of birth (yyyymmdd): 17960827
 
Please enter date of birth (yyyymmdd): 17960827
Please enter date of death( yyyymmdd): 18700612
+
Please enter date of death( yyyymmdd): 18700602
 
Please enter accomplishment: Funded Smith College, the largest member of the seven sisters.
 
Please enter accomplishment: Funded Smith College, the largest member of the seven sisters.
  
 
==============================================================
 
==============================================================
Sophia Smith (August 27, 1796 -- June 12, 1870)
+
Sophia Smith (August 27, 1796 -- June 2, 1870)
 
Funded smith college, the largest member of the seven sisters.
 
Funded smith college, the largest member of the seven sisters.
 
==============================================================
 
==============================================================
Line 143: Line 157:
 
* Submit your program to HW 4 PB 7 on Moodle.
 
* Submit your program to HW 4 PB 7 on Moodle.
 
<br />
 
<br />
 +
<tanbox>
 +
;Note:
 +
:The bar of '=' signs will not show up correctly on Moodle, because of it uses a proportional font.  However, Idle will display the output correctly, so make sure you debug in Idle and use Moodle just for submission.  Resist the urge to modify your program in Moodle.  Idle is a much friendlier place to edit programs.
 +
</tanbox>
 +
<br />
 +
<br />
 +
<showafterdate after="20150225 00:00">
 +
=Solution Programs=
 +
<br />
 +
<source lang="python">
 +
# hw4sol.py
 +
# D. Thiebaut
 +
# Solution program(s) for Homework 4, 2015
 +
# The solution organizes the individual solutions
 +
# into functions, but you didn't have to do that for
 +
# solving the problems.
 +
# Just comment out the appropriate line in the the main()
 +
# function to energize the solution for a give problem..
 +
 +
# solution for Problem 1
 +
def problem1():
 +
    fName = input( "Your first name? " )
 +
    lName = input( "Your last name? " )
 +
    full  = fName[0] + lName
 +
    full = full.lower()
 +
    print( full)
 +
 +
# solution for Problem 2
 +
def problem2():
 +
    fName = input( "Your first name? " )
 +
    lName = input( "Your last name? " )
 +
    full  = fName[0] + lName + "zzzzzzzz"
 +
    full = full[0:8].lower()
 +
    print( full)
 +
 +
# solution for Problem 3
 +
def problem3():
 +
    fName = input( "Your first name? " )
 +
    lName = input( "Your last name? " )
 +
    full  = fName[0] + lName + "20152015"
 +
    full = full[0:8].lower()
 +
    print( full)
 +
 +
# solution for Problem 4
 +
def problem4():
 +
    fName = input( "Your first name? " )
 +
    lName = input( "Your last name? " )
 +
    name = fName + lName
 +
    noChars = len( name )
 +
    for i in range( 1, noChars+1 ):
 +
        noSpaces = noChars - i
 +
        spaces = '.' * noSpaces
 +
        print( spaces + name[0:i] )
 +
 +
# solution for Problem 5
 +
def problem5():
 +
    # define the list of months as a list of strings
 +
    monthNames = ["January", "February", "March", "April",
 +
                  "May", "June", "July", "August",
 +
                  "September", "October", "November", "December"]
 +
   
 +
    # get the date from the user
 +
    date = input( "Enter date: " )
 +
 +
    # extract the different variables from the date
 +
    month = date[0:2]
 +
    day  = date[2:4]
 +
    year  = date[4: ]
 +
    dayInt = int( day )
 +
    monthIndex = int( month ) - 1
 +
    monthStr  = monthNames[ monthIndex ][0:3]
 +
 +
    # display result
 +
    print( dayInt, monthStr, year )
 +
 +
 +
# solution for Problem 6
 +
def problem6():
 +
    # define the list of months as a string of 3-char names
 +
    monthNames = "JanFebMarAprMayJunJulAugSepOctNovDec"
 +
 +
    # get the date from the user
 +
    date = input( "Enter date: " )
 +
 +
    # extract the different variables from the date
 +
    month = date[0:2]
 +
    day  = date[2:4]
 +
    year  = date[4: ]
 +
    dayInt = int( day )
 +
    monthIndex = int( month ) - 1
 +
    monthStr  = monthNames[ monthIndex*3 : monthIndex*3+3]
 +
 +
    # display result
 +
    print( dayInt, monthStr, year )
 +
 +
 +
# solution for Problem 7
 +
def problem7():
 +
 +
    # get the input from the user
 +
    fName  = input( "Enter first name: " )
 +
    lName  = input( "Enter last name:  " )
 +
    dob    = input( "Date of birth (yyyymmdd)" )
 +
    dod    = input( "Date of death (yyyymmdd)" )
 +
    accomp  = input( "Enter accomplishment: " )
 +
 +
 +
    # Figure out the length of the bar
 +
    bar    = "=" * len( accomp )
 +
 +
    # reformat names
 +
    fName  = fName.capitalize()
 +
    lName  = lName.capitalize()
 +
    accomp  = accomp.capitalize()
 +
 +
    # use a list of strings for the month, to get
 +
    # the correct month for a give number.
 +
    months  = ["January", "February", "March",
 +
              "April", "May", "June",
 +
              "July",  "August", "September",
 +
              "October", "November", "December" ]
 +
 +
    # extract day, month and year from dates.
 +
    dobDay  = int( dob[-2:] )
 +
    dobYear = dob[0:4]
 +
    dobMonth= int( dob[4:6] ) - 1
 +
    dobMonth= months[ dobMonth ]
 +
 +
    dodDay  = int( dod[-2:] )
 +
    dodYear = dod[0:4]
 +
    dodMonth= int( dod[4:6] ) - 1
 +
    dodMonth= months[ dodMonth ]
 +
 +
    # output the result, nicely formatted
 +
    #print()
 +
    print( bar )
 +
    line1 = "{0:1} {1:1} ({2:1} {3:1}, {4:1} -- {5:1} {6:1}, {7:1})"
 +
    print( line1.format( fName, lName, dobMonth, dobDay, dobYear,
 +
                        dodMonth, dodDay, dodYear ) )
 +
    print( accomp )
 +
    print( bar + "\n" )
 +
 +
 +
# main program.
 +
# Calls all the functions that solve the different problems.
 +
# Comment out the lines you want to actually activate the
 +
# function you are interested in.
 +
 +
def main():
 +
    #problem1()
 +
    #problem2()
 +
    #problem3()
 +
    #problem4()
 +
    #problem5()
 +
    #problem6()
 +
    problem7()
 +
 +
main()
 +
 +
       
 +
 +
 +
</source>
 +
<br />
 +
</showafterdate>
 +
<br />
 +
<onlydft>
 +
=VPL Module=
 +
<br />
 +
==Problem 1==
 +
<br />
 +
===vpl_run.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
<br />
 +
===vpl_evaluate.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
# D. Thiebaut
 +
 +
cat > vpl_execution <<EEOOFF
 +
#! /bin/bash
 +
#set -x
 +
 +
# --- program tested (no extension) ---
 +
prog=hw4.py
 +
solutionProg=hw4sol.py
 +
 +
# --- Python ----
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
# =================================================
 +
# Pick 3 random inputs to test program with
 +
TEMP1=( "ALMA"  "zella" "Maria" )
 +
TEMP2=( "BRAVO"  "BONO" "smith" )
 +
 +
 +
 +
# =================================================
 +
# function that prints the difference between user and expected output
 +
incorrectOutput() {
 +
        echo "Comment :=>>- Your output is incorrect."
 +
        #--- display test file ---
 +
        echo "<|--"
 +
        echo "Your program tested with \$1 and \$2"
 +
        echo "--|>"
 +
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Your output:"
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat userOut
 +
        echo "--|>"
 +
        echo ""
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Expected output: "
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat expectedOut
 +
        echo "--|>"
 +
 +
}
 +
 +
# function that tells user of program crash or infinite loop,
 +
# and what the test was.
 +
timeoutOutput() {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
        i=\$1
 +
        echo "Comment :=>>- Your program has timed out or crashed."
 +
 +
        #--- display test file ---
 +
        echo "Comment :=>>- Your program tested with:"
 +
        echo "<|--"
 +
        cat data\${i}.txt
 +
        echo "--|>"
 +
    fi
 +
}
 +
 +
# function that puts all words in file on separate lines
 +
# and keep last line
 +
keepLast ( ) {
 +
  if [ "\$1" ]; then    # if there's a parameter
 +
      cat \$1 | tr ' ' '\n' | sed '/^\s*\$/d' > dummy.out
 +
      cp dummy.out \$1
 +
 +
      cat \$1 | tail -1 > dummy.out
 +
      cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# function that removes non-digits, extra spaces, and extra blank lines from text file.
 +
cleanup () {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
       
 +
        #--- remove non numbers and non minus---
 +
        #cat \$1 | sed 's/[^0-9*.0-9\ ]*//g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove multiple spaces ---
 +
        #cat \$1 | sed 's/  */ /g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #cat \$1 | sed 's/^[ \t]*//' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove blank lines ---
 +
        cat \$1 | sed '/^\s*\$/d' > dummy.out
 +
        #cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# initial grade
 +
grade=40
 +
 +
for ((i=0;i<\${#TEMP1[@]};i++)); do
 +
  echo "\${TEMP1[i]}" > input
 +
  echo "\${TEMP2[i]}" >> input
 +
 +
  #echo "\${TEMP1[i]}"
 +
  #echo "\${TEMP2[i]}"
 +
 +
  # =================================================
 +
  # generate user output and exptect output
 +
  \$python \$prog < input > userOut
 +
  \$python \$solutionProg < input > expectedOut
 +
 +
  cp userOut userOut.org
 +
  cp expectedOut expectedOut.org
 +
 +
  #cleanup userOut
 +
  #cleanup expectedOut
 +
 +
  keepLast userOut
 +
  keepLast expectedOut
 +
 +
  #--- compute difference ---
 +
  diff -y -w --ignore-all-space userOut expectedOut > diff.out
 +
 +
  #--- reject if different ---
 +
  if ((\$? > 0)); then
 +
      incorrectOutput \${TEMP1[i]} \${TEMP2[i]}
 +
      grade=\$((grade+5))
 +
      # --------------------- REWARD IF CORRECT OUTPUT -----------------
 +
  else
 +
      #--- good output ---
 +
      echo "Comment :=>>- Congrats, your output is correct."
 +
      echo "Comment :=>> --------------------------------."
 +
      echo "<|--"                                                                           
 +
      echo "Your program tested with \${TEMP1[i]} and \${TEMP2[i]}"
 +
      echo ""
 +
      cat userOut
 +
      echo "--|>"
 +
      grade=\$((grade+20))
 +
  fi
 +
 +
done
 +
 +
# =================================================
 +
# Report grade
 +
if (( grade > 100 )); then
 +
  grade=100
 +
fi
 +
echo "Grade :=>> \$grade"
 +
 +
 +
exit
 +
 +
 +
 +
 +
EEOOFF
 +
 +
chmod +x vpl_execution
 +
 +
</source>
 +
<br />
 +
 +
 +
==Problem 2==
 +
<br />
 +
===vpl_run.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
 +
<br />
 +
===vpl_evaluate.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
# D. Thiebaut
 +
 +
cat > vpl_execution <<EEOOFF
 +
#! /bin/bash
 +
#set -x
 +
 +
# --- program tested (no extension) ---
 +
prog=hw4.py
 +
solutionProg=hw4sol.py
 +
 +
# --- Python ----
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
# =================================================
 +
# Pick 3 random inputs to test program with
 +
TEMP1=( "ALMA"  "zella" "M" )
 +
TEMP2=( "BRAVO"  "BONO" "s" )
 +
 +
 +
 +
# =================================================
 +
# function that prints the difference between user and expected output
 +
incorrectOutput() {
 +
        echo "Comment :=>>- Your output is incorrect."
 +
        #--- display test file ---
 +
        echo "<|--"
 +
        echo "Your program tested with \$1 and \$2"
 +
        echo "--|>"
 +
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Your output:"
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat userOut
 +
        echo "--|>"
 +
        echo ""
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Expected output: "
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat expectedOut
 +
        echo "--|>"
 +
 +
}
 +
 +
# function that tells user of program crash or infinite loop,
 +
# and what the test was.
 +
timeoutOutput() {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
        i=\$1
 +
        echo "Comment :=>>- Your program has timed out or crashed."
 +
 +
        #--- display test file ---
 +
        echo "Comment :=>>- Your program tested with:"
 +
        echo "<|--"
 +
        cat data\${i}.txt
 +
        echo "--|>"
 +
    fi
 +
}
 +
 +
# function that puts all words in file on separate lines
 +
# and keep last line
 +
keepLast ( ) {
 +
  if [ "\$1" ]; then    # if there's a parameter
 +
      cat \$1 | tr ' ' '\n' | sed '/^\s*\$/d' > dummy.out
 +
      cp dummy.out \$1
 +
 +
      cat \$1 | tail -1 > dummy.out
 +
      cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# function that removes non-digits, extra spaces, and extra blank lines from text file.
 +
cleanup () {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
       
 +
        #--- remove non numbers and non minus---
 +
        #cat \$1 | sed 's/[^0-9*.0-9\ ]*//g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove multiple spaces ---
 +
        #cat \$1 | sed 's/  */ /g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #cat \$1 | sed 's/^[ \t]*//' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove blank lines ---
 +
        cat \$1 | sed '/^\s*\$/d' > dummy.out
 +
        #cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# initial grade
 +
grade=40
 +
 +
for ((i=0;i<\${#TEMP1[@]};i++)); do
 +
  echo "\${TEMP1[i]}" > input
 +
  echo "\${TEMP2[i]}" >> input
 +
 +
  #echo "\${TEMP1[i]}"
 +
  #echo "\${TEMP2[i]}"
 +
 +
  # =================================================
 +
  # generate user output and exptect output
 +
  \$python \$prog < input > userOut
 +
  \$python \$solutionProg < input > expectedOut
 +
 +
  cp userOut userOut.org
 +
  cp expectedOut expectedOut.org
 +
 +
  #cleanup userOut
 +
  #cleanup expectedOut
 +
 +
  keepLast userOut
 +
  keepLast expectedOut
 +
 +
  #--- compute difference ---
 +
  diff -y -w --ignore-all-space userOut expectedOut > diff.out
 +
 +
  #--- reject if different ---
 +
  if ((\$? > 0)); then
 +
      incorrectOutput \${TEMP1[i]} \${TEMP2[i]}
 +
      grade=\$((grade+5))
 +
      # --------------------- REWARD IF CORRECT OUTPUT -----------------
 +
  else
 +
      #--- good output ---
 +
      echo "Comment :=>>- Congrats, your output is correct."
 +
      echo "Comment :=>> --------------------------------."
 +
      echo "<|--"                                                                           
 +
      echo "Your program tested with \${TEMP1[i]} and \${TEMP2[i]}"
 +
      echo ""
 +
      cat userOut
 +
      echo "--|>"
 +
      grade=\$((grade+20))
 +
  fi
 +
 +
done
 +
 +
# =================================================
 +
# Report grade
 +
if (( grade > 100 )); then
 +
  grade=100
 +
fi
 +
echo "Grade :=>> \$grade"
 +
 +
 +
exit
 +
 +
 +
 +
 +
EEOOFF
 +
 +
chmod +x vpl_execution
 +
 +
 +
 +
</source>
 +
<br />
 +
 +
 +
==Problem 3==
 +
<br />
 +
===vpl_run.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
<br />
 +
===vpl_evaluate.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
# D. Thiebaut
 +
 +
cat > vpl_execution <<EEOOFF
 +
#! /bin/bash
 +
#set -x
 +
 +
# --- program tested (no extension) ---
 +
prog=hw4.py
 +
solutionProg=hw4sol.py
 +
 +
# --- Python ----
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
# =================================================
 +
# Pick 3 random inputs to test program with
 +
TEMP1=( "ALMA"  "zella" "M" )
 +
TEMP2=( "BRAVO"  "BONO" "s" )
 +
 +
 +
 +
# =================================================
 +
# function that prints the difference between user and expected output
 +
incorrectOutput() {
 +
        echo "Comment :=>>- Your output is incorrect."
 +
        #--- display test file ---
 +
        echo "<|--"
 +
        echo "Your program tested with \$1 and \$2"
 +
        echo "--|>"
 +
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Your output:"
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat userOut
 +
        echo "--|>"
 +
        echo ""
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Expected output: "
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat expectedOut
 +
        echo "--|>"
 +
 +
}
 +
 +
# function that tells user of program crash or infinite loop,
 +
# and what the test was.
 +
timeoutOutput() {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
        i=\$1
 +
        echo "Comment :=>>- Your program has timed out or crashed."
 +
 +
        #--- display test file ---
 +
        echo "Comment :=>>- Your program tested with:"
 +
        echo "<|--"
 +
        cat data\${i}.txt
 +
        echo "--|>"
 +
    fi
 +
}
 +
 +
# function that puts all words in file on separate lines
 +
# and keep last line
 +
keepLast ( ) {
 +
  if [ "\$1" ]; then    # if there's a parameter
 +
      cat \$1 | tr ' ' '\n' | sed '/^\s*\$/d' > dummy.out
 +
      cp dummy.out \$1
 +
 +
      cat \$1 | tail -1 > dummy.out
 +
      cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# function that removes non-digits, extra spaces, and extra blank lines from text file.
 +
cleanup () {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
       
 +
        #--- remove non numbers and non minus---
 +
        #cat \$1 | sed 's/[^0-9*.0-9\ ]*//g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove multiple spaces ---
 +
        #cat \$1 | sed 's/  */ /g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #cat \$1 | sed 's/^[ \t]*//' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove blank lines ---
 +
        cat \$1 | sed '/^\s*\$/d' > dummy.out
 +
        #cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# initial grade
 +
grade=40
 +
 +
for ((i=0;i<\${#TEMP1[@]};i++)); do
 +
 +
  testNo=\$((i+1))
 +
  echo "Comment :=>>- Test \$testNo"
 +
 
 +
  echo "\${TEMP1[i]}" > input
 +
  echo "\${TEMP2[i]}" >> input
 +
 +
  #echo "\${TEMP1[i]}"
 +
  #echo "\${TEMP2[i]}"
 +
 +
  # =================================================
 +
  # generate user output and exptect output
 +
  \$python \$prog < input 2> errorOut 1> userOut
 +
  \$python \$solutionProg < input > expectedOut
 +
 +
  if [ -s errorOut ] ; then                                                                                           
 +
    echo "Comment :=>> Your program crashed..."
 +
    echo "Comment :=>> The input was"
 +
    echo "<|--"                                                     
 +
    cat input
 +
    echo "--|>"
 +
    echo "Comment :=>> Error message:"
 +
    echo "<|--"                                                     
 +
    cat errorOut
 +
    echo "--|>"                                                     
 +
    continue               
 +
  fi   
 +
 +
  cp userOut userOut.org
 +
  cp expectedOut expectedOut.org
 +
 +
  #cleanup userOut
 +
  #cleanup expectedOut
 +
 +
  keepLast userOut
 +
  keepLast expectedOut
 +
 +
  #--- compute difference ---
 +
  diff -y -w --ignore-all-space userOut expectedOut > diff.out
 +
 +
  #--- reject if different ---
 +
  if ((\$? > 0)); then
 +
      incorrectOutput \${TEMP1[i]} \${TEMP2[i]}
 +
      grade=\$((grade+5))
 +
      # --------------------- REWARD IF CORRECT OUTPUT -----------------
 +
  else
 +
      #--- good output ---
 +
      echo "Comment :=>>- Congrats, your output is correct."
 +
      echo "Comment :=>> --------------------------------."
 +
      echo "<|--"                                                                           
 +
      echo "Your program tested with \${TEMP1[i]} and \${TEMP2[i]}"
 +
      echo ""
 +
      cat userOut
 +
      echo "--|>"
 +
      grade=\$((grade+20))
 +
  fi
 +
 +
done
 +
 +
# =================================================
 +
# Report grade
 +
if (( grade > 100 )); then
 +
  grade=100
 +
fi
 +
echo "Grade :=>> \$grade"
 +
 +
 +
exit
 +
 +
 +
 +
 +
EEOOFF
 +
 +
chmod +x vpl_execution
 +
 +
 +
 +
 +
</source>
 +
<br />
 +
 +
 +
==Problem 4==
 +
<br />
 +
===vpl_run.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
<br />
 +
===vpl_evaluate.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
# D. Thiebaut
 +
 +
cat > vpl_execution <<EEOOFF
 +
#! /bin/bash
 +
#set -x
 +
 +
# --- program tested (no extension) ---
 +
prog=hw4.py
 +
solutionProg=hw4sol.py
 +
 +
# --- Python ----
 +
if [[ `hostname -s` = "beowulf2" ]]; then
 +
  python=/usr/bin/python3.3
 +
else
 +
  python=/usr/local/bin/python3.4
 +
fi
 +
 +
# =================================================
 +
# Pick 3 random inputs to test program with
 +
TEMP1=( "CHOCO"  "z"  "s" )
 +
TEMP2=( "LATE"  "ebra" "o" )
 +
TEMP3=(  9      5    2  )
 +
 +
 +
# =================================================
 +
# function that prints the difference between user and expected output
 +
incorrectOutput() {
 +
        echo "Comment :=>>- Your output is incorrect."
 +
        #--- display test file ---
 +
        echo "<|--"
 +
        echo "Your program tested with \$1 and \$2"
 +
        echo "--|>"
 +
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Your output:"
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat userOut
 +
        echo "--|>"
 +
        echo ""
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Expected output: "
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat expectedOut
 +
        echo "--|>"
 +
 +
}
 +
 +
# function that tells user of program crash or infinite loop,
 +
# and what the test was.
 +
timeoutOutput() {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
        i=\$1
 +
        echo "Comment :=>>- Your program has timed out or crashed."
 +
 +
        #--- display test file ---
 +
        echo "Comment :=>>- Your program tested with:"
 +
        echo "<|--"
 +
        cat data\${i}.txt
 +
        echo "--|>"
 +
    fi
 +
}
 +
 +
# function that puts all words in file on separate lines
 +
# and keep last line
 +
keepLast ( ) {
 +
  if [ "\$1" ]; then    # if there's a parameter
 +
      cat \$1 | tr ' ' '\n' | sed '/^\s*\$/d' > dummy.out
 +
      cp dummy.out \$1
 +
 +
      cat \$1 | tail -\$2 > dummy.out
 +
      cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# function that removes non-digits, extra spaces, and extra blank lines from text file.
 +
cleanup () {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
       
 +
        #--- remove non numbers and non minus---
 +
        #cat \$1 | sed 's/[^0-9*.0-9\ ]*//g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove multiple spaces ---
 +
        #cat \$1 | sed 's/  */ /g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #cat \$1 | sed 's/^[ \t]*//' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove blank lines ---
 +
        cat \$1 | sed '/^\s*\$/d' > dummy.out
 +
        #cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# initial grade
 +
grade=40
 +
 +
for ((i=0;i<\${#TEMP1[@]};i++)); do
 +
  echo "\${TEMP1[i]}" > input
 +
  echo "\${TEMP2[i]}" >> input
 +
 +
  testNo=\$((i+1))
 +
  echo "Comment :=>>- Test \$testNo"
 +
 +
 +
  # =================================================
 +
  # generate user output and exptect output
 +
  \$python \$solutionProg < input > expectedOut
 +
  \$python \$prog < input 2> errorOut 1> userOut
 +
 +
  if [ -s errorOut ] ; then                                                                                           
 +
    echo "Comment :=>> Your program crashed..."
 +
    echo "Comment :=>> The input was"
 +
    echo "<|--"                                                     
 +
    cat input
 +
    echo "--|>"
 +
    echo "Comment :=>> Error message:"
 +
    echo "<|--"                                                     
 +
    cat errorOut
 +
    echo "--|>"                                                     
 +
    continue               
 +
  fi   
 +
 +
  cp userOut userOut.org
 +
  cp expectedOut expectedOut.org
 +
 +
  #cleanup userOut
 +
  #cleanup expectedOut
 +
 +
  keepLast userOut \${TEMP3[i]}
 +
  keepLast expectedOut \${TEMP3[i]}
 +
 +
  #--- compute difference ---
 +
  diff -y -w --ignore-all-space userOut expectedOut > diff.out
 +
 +
  #--- reject if different ---
 +
  if ((\$? > 0)); then
 +
      incorrectOutput \$TEMP1 \$TEMP2
 +
      grade=\$((grade+5))
 +
      # --------------------- REWARD IF CORRECT OUTPUT -----------------
 +
  else
 +
      #--- good output ---
 +
      echo "Comment :=>>- Congrats, your output is correct."
 +
      echo "Comment :=>> --------------------------------."
 +
      echo "<|--"                                                                           
 +
      echo "Your program tested with \${TEMP1[i]} and \${TEMP2[i]}"
 +
      echo ""
 +
      cat userOut
 +
      echo "--|>"
 +
      grade=\$((grade+20))
 +
  fi
 +
 +
done
 +
 +
# =================================================
 +
# Report grade
 +
if (( grade > 100 )); then
 +
  grade=100
 +
fi
 +
echo "Grade :=>> \$grade"
 +
 +
 +
exit
 +
 +
 +
 +
 +
EEOOFF
 +
 +
chmod +x vpl_execution
 +
 +
 +
 +
</source>
 +
<br />
 +
 +
 +
==Problem 5==
 +
<br />
 +
===vpl_run.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
<br />
 +
===vpl_evaluate.sh===
 +
<br />
 +
<source lang="bash">
 +
 +
#! /bin/bash
 +
# D. Thiebaut
 +
 +
cat > vpl_execution <<EEOOFF
 +
#! /bin/bash
 +
#set -x
 +
 +
# --- program tested (no extension) ---
 +
prog=hw4.py
 +
solutionProg=hw4sol.py
 +
 +
# --- Python ----
 +
if [[ `hostname -s` = "beowulf2" ]]; then
 +
  python=/usr/bin/python3.3
 +
else
 +
  python=/usr/local/bin/python3.4
 +
fi
 +
 +
# =================================================
 +
# Pick 3 random inputs to test program with
 +
TEMP1=( "02142015"  "01311900"  "12012000" )
 +
#TEMP1=( "02142015" ) #  "01311900"  "12012000" )
 +
 +
# =================================================
 +
# function that looks for forbidden patterns in the program
 +
testForPatterns() {
 +
 +
  requiredPattern="\"January\""
 +
  forbiddenPattern="\"Jan\""
 +
 +
  # remove comments
 +
  cat \$prog | sed 's:#.*$::g' > user.temp
 +
 +
  # look for required patterns
 +
  grep "\$requiredPattern" user.temp  &> grepLines1.out
 +
 +
  if [ -s grepLines1.out ] ; then
 +
    nothing="happens"
 +
  else
 +
    echo "Comment :=>> Your program must use months"
 +
    echo "Comment :=>> expressed as full names (e.g. \"February\")."
 +
    echo "<|--"
 +
    cat grepLines1.out
 +
    echo "--|>"
 +
    echo "Grade :=>> 50"
 +
    exit
 +
  fi
 +
 +
  grep "\$forbiddenPattern" user.temp  &> grepLines.out
 +
  if [ -s grepLines.out ] ; then
 +
      echo "Comment :=>> You cannot use strings of 3 characters"
 +
      echo "Comment :=>> for the months."
 +
      echo "Grade :=>> 50"
 +
      exit
 +
  fi
 +
}
 +
 +
 +
# =================================================
 +
# function that prints the difference between user and expected output
 +
incorrectOutput() {
 +
        echo "Comment :=>>- Your output is incorrect."
 +
        #--- display test file ---
 +
        echo "<|--"
 +
        echo "Your program tested with \$1"
 +
        echo "--|>"
 +
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Your output:"
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat userOut
 +
        echo "--|>"
 +
        echo ""
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Expected output: "
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat expectedOut
 +
        echo "--|>"
 +
 +
}
 +
 +
# function that tells user of program crash or infinite loop,
 +
# and what the test was.
 +
timeoutOutput() {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
        i=\$1
 +
        echo "Comment :=>>- Your program has timed out or crashed."
 +
 +
        #--- display test file ---
 +
        echo "Comment :=>>- Your program tested with:"
 +
        echo "<|--"
 +
        cat data\${i}.txt
 +
        echo "--|>"
 +
    fi
 +
}
 +
 +
# function that puts all words in file on separate lines
 +
# and keep last line
 +
keepLast ( ) {
 +
  if [ "\$1" ]; then    # if there's a parameter
 +
      cat \$1 | tr ' ' '\n' | sed '/^\s*\$/d' > dummy.out
 +
      cp dummy.out \$1
 +
 +
      cat \$1 | tail -3 | tr '\n' ' ' > dummy.out
 +
      cp dummy.out \$1
 +
      echo "" >> \$1
 +
  fi
 +
}
 +
 +
# function that removes non-digits, extra spaces, and extra blank lines from text file.
 +
cleanup () {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
       
 +
        #--- remove non numbers and non minus---
 +
        #cat \$1 | sed 's/[^0-9*.0-9\ ]*//g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove multiple spaces ---
 +
        #cat \$1 | sed 's/  */ /g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #cat \$1 | sed 's/^[ \t]*//' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove blank lines ---
 +
        cat \$1 | sed '/^\s*\$/d' > dummy.out
 +
        #cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# initial grade
 +
grade=40
 +
 +
for ((i=0;i<\${#TEMP1[@]};i++)); do
 +
  echo "\${TEMP1[i]}" > input
 +
  #echo "input = "
 +
  #cat input
 +
 +
  testNo=\$((i+1))
 +
  echo "Comment :=>>- Test \$testNo"
 +
 +
  # =================================================
 +
  # generate user output and exptect output
 +
  \$python \$prog < input 2> errorOut 1> userOut
 +
  \$python \$solutionProg < input > expectedOut
 +
 +
  if [ -s errorOut ] ; then                                                                                           
 +
    echo "Comment :=>> Your program crashed..."
 +
    echo "Comment :=>> The input was"
 +
    echo "<|--"                                                     
 +
    cat input
 +
    echo "--|>"
 +
    echo "Comment :=>> Error message:"
 +
    echo "<|--"                                                     
 +
    cat errorOut
 +
    echo "--|>"                                                     
 +
    continue               
 +
  fi   
 +
 +
  # test to see if the program uses the right
 +
  # strings for the months.
 +
  testForPatterns
 +
 +
  cp userOut userOut.org
 +
  cp expectedOut expectedOut.org
 +
 +
  #cleanup userOut
 +
  #cleanup expectedOut
 +
 +
  keepLast userOut
 +
  keepLast expectedOut
 +
 +
  #--- compute difference ---
 +
  diff -y -w --ignore-all-space userOut expectedOut > diff.out
 +
 +
  #--- reject if different ---
 +
  if ((\$? > 0)); then
 +
      incorrectOutput \$TEMP1
 +
      grade=\$((grade+5))
 +
      # --------------------- REWARD IF CORRECT OUTPUT -----------------
 +
  else
 +
      #--- good output ---
 +
      echo "Comment :=>>- Congrats, your output is correct."
 +
      echo "Comment :=>> --------------------------------."
 +
      echo "<|--"                                                                           
 +
      echo "Your program tested with \${TEMP1[i]}"
 +
      echo ""
 +
      cat userOut
 +
      echo "--|>"
 +
      grade=\$((grade+20))
 +
  fi
 +
 +
done
 +
 +
# =================================================
 +
# Report grade
 +
if (( grade > 100 )); then
 +
  grade=100
 +
fi
 +
echo "Grade :=>> \$grade"
 +
 +
 +
exit
 +
 +
 +
 +
 +
EEOOFF
 +
 +
chmod +x vpl_execution
 +
 +
 +
 +
 +
 +
</source>
 +
<br />
 +
 +
 +
==Problem 6==
 +
<br />
 +
===vpl_run.sh===
 +
<br />
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
<br />
 +
===vpl_evaluate.sh===
 +
<br />
 +
<source lang="bash">
 +
 +
#! /bin/bash
 +
# D. Thiebaut
 +
 +
cat > vpl_execution <<EEOOFF
 +
#! /bin/bash
 +
#set -x
 +
 +
# --- program tested (no extension) ---
 +
prog=hw4.py
 +
solutionProg=hw4sol.py
 +
 +
# --- Python ----
 +
if [[ `hostname -s` = "beowulf2" ]]; then
 +
  python=/usr/bin/python3.3
 +
else
 +
  python=/usr/local/bin/python3.4
 +
fi
 +
 +
 +
# =================================================
 +
# Pick 3 random inputs to test program with
 +
TEMP1=( "02142015"  "01311900"  "12012000" )
 +
 +
# =================================================
 +
# function that looks for forbidden patterns in the program
 +
testForPatterns() {
 +
 +
  requiredPattern="\"JanFebMarApr"
 +
  forbiddenPattern="\"Jan\""
 +
 +
  # remove comments
 +
  cat \$prog | sed 's:#.*$::g' > user.temp
 +
 +
  # look for required patterns
 +
  grep "\$requiredPattern" user.temp  &> grepLines1.out
 +
 +
  if [ -s grepLines1.out ] ; then
 +
    nothing="happens"
 +
  else
 +
    echo "Comment :=>> Your program must use months"
 +
    echo "Comment :=>> expressed as full names (e.g. \"February\")."
 +
    echo "<|--"
 +
    cat grepLines1.out
 +
    echo "--|>"
 +
    echo "Grade :=>> 50"
 +
    exit
 +
  fi
 +
 +
  grep "\$forbiddenPattern" user.temp  &> grepLines.out
 +
  if [ -s grepLines.out ] ; then
 +
      echo "Comment :=>> You cannot use strings of 3 characters"
 +
      echo "Comment :=>> for the months."
 +
      echo "Grade :=>> 50"
 +
      exit
 +
  fi
 +
}
 +
 +
 +
# =================================================
 +
# function that prints the difference between user and expected output
 +
incorrectOutput() {
 +
        echo "Comment :=>>- Your output is incorrect."
 +
        #--- display test file ---
 +
        echo "<|--"
 +
        echo "Your program tested with \$1 and \$2"
 +
        echo "--|>"
 +
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Your output:"
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat userOut
 +
        echo "--|>"
 +
        echo ""
 +
        echo "Comment :=>> ---------------"
 +
        echo "Comment :=>>- Expected output: "
 +
        echo "Comment :=>> ---------------"
 +
        echo "<|--"
 +
        cat expectedOut
 +
        echo "--|>"
 +
 +
}
 +
 +
# function that tells user of program crash or infinite loop,
 +
# and what the test was.
 +
timeoutOutput() {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
        i=\$1
 +
        echo "Comment :=>>- Your program has timed out or crashed."
 +
 +
        #--- display test file ---
 +
        echo "Comment :=>>- Your program tested with:"
 +
        echo "<|--"
 +
        cat data\${i}.txt
 +
        echo "--|>"
 +
    fi
 +
}
 +
 +
# function that puts all words in file on separate lines
 +
# and keep last line
 +
keepLast ( ) {
 +
  if [ "\$1" ]; then    # if there's a parameter
 +
      cat \$1 | tr ' ' '\n' | sed '/^\s*\$/d' > dummy.out
 +
      cp dummy.out \$1
 +
 +
      cat \$1 | tail -3 | tr '\n' ' ' > dummy.out
 +
      cp dummy.out \$1
 +
      echo "" >> \$1
 +
  fi
 +
}
 +
 +
# function that removes non-digits, extra spaces, and extra blank lines from text file.
 +
cleanup () {
 +
    if [ "\$1" ]; then  # if there's a parameter
 +
       
 +
        #--- remove non numbers and non minus---
 +
        #cat \$1 | sed 's/[^0-9*.0-9\ ]*//g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove multiple spaces ---
 +
        #cat \$1 | sed 's/  */ /g' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #cat \$1 | sed 's/^[ \t]*//' > dummy.out
 +
        #cp dummy.out \$1
 +
 +
        #--- remove blank lines ---
 +
        cat \$1 | sed '/^\s*\$/d' > dummy.out
 +
        #cp dummy.out \$1
 +
  fi
 +
}
 +
 +
# initial grade
 +
grade=40
 +
 +
for ((i=0;i<\${#TEMP1[@]};i++)); do
 +
  echo "\${TEMP1[i]}" > input
 +
 +
  testNo=\$((i+1))
 +
  echo "Comment :=>>- Test \$testNo"
 +
 +
 +
  # =================================================
 +
  # generate user output and exptect output
 +
  \$python \$solutionProg < input > expectedOut
 +
  \$python \$prog < input 2> errorOut 1> userOut
 +
 +
  if [ -s errorOut ] ; then                                                                                           
 +
    echo "Comment :=>> Your program crashed..."
 +
    echo "Comment :=>> The input was"
 +
    echo "<|--"                                                     
 +
    cat input
 +
    echo "--|>"
 +
    echo "Comment :=>> Error message:"
 +
    echo "<|--"                                                     
 +
    cat errorOut
 +
    echo "--|>"                                                     
 +
    continue               
 +
  fi   
 +
 +
  # test to see if the program uses the right
 +
  # strings for the months.
 +
  testForPatterns
 +
 +
  cp userOut userOut.org
 +
  cp expectedOut expectedOut.org
 +
 +
  #cleanup userOut
 +
  #cleanup expectedOut
 +
 +
  keepLast userOut
 +
  keepLast expectedOut
 +
 +
  #--- compute difference ---
 +
  diff -y -w --ignore-all-space userOut expectedOut > diff.out
 +
 +
  #--- reject if different ---
 +
  if ((\$? > 0)); then
 +
      incorrectOutput \$TEMP1
 +
      grade=\$((grade+5))
 +
      # --------------------- REWARD IF CORRECT OUTPUT -----------------
 +
  else
 +
      #--- good output ---
 +
      echo "Comment :=>>- Congrats, your output is correct."
 +
      echo "Comment :=>> --------------------------------."
 +
      echo "<|--"                                                                           
 +
      echo "Your program tested with \${TEMP1[i]} and \${TEMP2[i]}"
 +
      echo ""
 +
      cat userOut
 +
      echo "--|>"
 +
      grade=\$((grade+20))
 +
  fi
 +
 +
done
 +
 +
# =================================================
 +
# Report grade
 +
if (( grade > 100 )); then
 +
  grade=100
 +
fi
 +
echo "Grade :=>> \$grade"
 +
 +
 +
exit
 +
 +
 +
 +
 +
EEOOFF
 +
 +
chmod +x vpl_execution
 +
 +
 +
 +
</source>
 +
<br />
 +
==Problem 7==
 +
<br />
 +
===vpl_run.sh===
 +
<source lang="bash">
 +
#! /bin/bash
 +
 +
cat > vpl_execution <<EOF
 +
#! /bin/bash
 +
 +
python=/usr/local/bin/python3.4
 +
#python=/usr/bin/python3.3
 +
 +
prog=hw4.py
 +
\$python \$prog
 +
 +
EOF
 +
 +
chmod +x vpl_execution
 +
</source>
 +
<br />
 +
===vpl_evaluate.sh===
 
<br />
 
<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 />
 
<br />
 +
===evaluate.py===
 
<br />
 
<br />
 +
<source lang="python">
 +
# evaluate.py
 +
# D. Thiebaut
 +
import sys
 +
import random
 +
import subprocess
 +
 +
#--- define what the student program is called, and what the solution
 +
#--- program name is.
 +
module = "hw4"
 +
solutionModule = "hw4sol"
 +
stripOutputsBeforeCompare = True  # set to true if extra space in output is not important
 +
 +
def commentLong( line ):
 +
    print( "<|--\n" + line  + "\n --|>" )
 +
 +
def commentShort( text ):
 +
    print( "Comment :=>> " + text )
 +
 +
def printGrade( grade ):
 +
    print( "Grade :=>> ", grade )
 +
 +
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)
 +
 +
# 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 ):
 +
    p = subprocess.Popen( [ "python3", 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
 +
 +
                     
 +
def generateInputFileWithRandomInputs( inputFileName ):
 +
    #--- generate random inputs ---
 +
    dates1 = [ "17960807", "19010111", "19450501", "19640815", "19640815" ]
 +
    dates2 = [ "20140114", "20100903", "20090218", "20040109", "20040119" ]
 +
    names1 = [ "Flip", "Min", "Lei", "Sophia", "Gloria", "Ann" ]
 +
    names2 = [ "Thomas", "Gold", "Lundt", "Blake", "Ramdath" ]
 +
    accoms = [ "Invented sliced bread",
 +
              "Flew over Paradise Pond with a human powered glider",
 +
              "Created the first encylopedia of chocolate",
 +
              "Graduated summa cum laude" ]
 +
             
 +
    idx  = random.randrange( len( dates1 ) )
 +
    date1 = dates1[idx]
 +
    date2 = dates2[idx]
 +
    name1 = random.choice( names1 )
 +
    name2 = random.choice( names2 )
 +
    accom = random.choice( accoms )
 +
 +
    #--- create input file with input data ---
 +
    file = open( inputFileName, "w" )
 +
    text = ""
 +
    for word in ( name1, name2, date1, date2, accom ):
 +
        file.write( word+"\n" )
 +
        text += word + "\n"
 +
    file.close()
 +
    return text
 +
 +
# 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 ):
 +
    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
 +
    file = open( outputFileName, "r" )
 +
    text = file.read()
 +
    index = text.find( "=" )
 +
    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 )
 +
    #print( "userOutText:" + userOutText )
 +
    #print( "expectedOutText:" + expectedOutText )
 +
    misMatchLineNumbers = []
 +
    userTextOutLines = userOutText.split( "\n" )
 +
    expectedOutTextLines = expectedOutText.split( "\n" )
 +
 +
    for i in range( len( userTextOutLines ) ):
 +
        lineNo = i+1
 +
        userLine = userTextOutLines[i]
 +
        expectedLine = userTextOutLines[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." )
 +
        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 differences 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 />

Latest revision as of 17:02, 12 June 2015

--D. Thiebaut (talk) 15:23, 15 February 2015 (EST)


Make sure you go through the Preparation Page for Homework 4 first, before attempting these programs!



Make sure you use a main() function in all your programs.


Problem #1


Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase. Make sure there's a blank line before the output of the account name. This line will be used by the grading program to spot your output.

Example
    First name? Allie
    Last name? BABA

    Your computer account name is: ababa 


  • Submit your program to HW 4 PB 1 on Moodle.


Problem #2


Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase. But now we want the computer account to be exactly 8 characters long. If the user names are too short, your program will pad it with the character 'z'.

Example
    First name? Allie 
    Last name? BABA
 
    Your computer account name is: ababazzz 
    First name? Al 
    Last name? Gus 

    Your computer account name is:aguszzzz 
    First name? Alma 
    Last name? Verylongname 

    Your computer account name is: averylon 


  • Submit your program to HW 4 PB 2 on Moodle.


Problem #3


Write a program that prompts the user for her first and last name, and outputs a computer account made of the first initial of her first name, plus her last name, all in lowercase. We want the computer account to be exactly 8 characters long, but this time it is padded with the current year (2015 for us). We assume the user name will always have at least 3 characters.

Example
    First name? Allie 
    Last name? BABA 

    Your computer account name is: ababa201 
    First name? Al 
    Last name? Gus 

    Your computer account name is: agus2015 
    First name? Alma 
    Last name? Verylongname 

    Your computer account name is: averylon 


  • Submit your program to HW 4 PB 3 on Moodle.


Problem #4


Write a program that prompts the user for her first and last name, and outputs a triangle made with her name, padded with dots in front of it, as illustrated below. There is no limit on the length of the first and last names. Notice that there is a blank line between the input section and the output section.

Example
First name? Maria
Last name? LUCE
 
........M
.......Ma
......Mar
.....Mari
....Maria
...MariaL
..MariaLU
.MariaLUC
MariaLUCE


  • Submit your program to HW 4 PB 4 on Moodle.


Problem #5


Write a program that prompts the user to enter a date in the form mmddyyyy, and displays it back as dd month yyyy, where month is the first 3 letters of the name of the month, in English.

Your program must use the list of months defined as follows:

 monthNames = ["January", "February", "March", "April", "May", "June", "July", "August",
                       "September", "October", "November", "December"]


Example
Enter date: 02042015

4 Feb 2015


  • Submit your program to HW 4 PB 5 on Moodle.


Problem #6


Write a program that prompts the user to enter a date in the form mmddyyyy, and displays it back as dd month yyyy, where month is the first 3 letters of the name of the month, in English.

Your program must use the string defined as follows, and cannot use the list you used in Problem 5!

 monthNames = "JanFebMarAprMayJunJulAugSepOctNovDec"


Example
Enter date: 02022015

2 Feb 2015


  • Submit your program to HW 4 PB 6 on Moodle.


Problem #7


Write a program that asks the user for several pieces of information about some famous person, and outputs the information in a nicely formatted box, where the length of the bar of '=' signs before and before the information is the same as the length of the accomplishment information.

Example
Please enter first name: Sophia
Please enter last name:  SMITH
Please enter date of birth (yyyymmdd): 17960827
Please enter date of death( yyyymmdd): 18700602
Please enter accomplishment: Funded Smith College, the largest member of the seven sisters.

==============================================================
Sophia Smith (August 27, 1796 -- June 2, 1870)
Funded smith college, the largest member of the seven sisters.
==============================================================


  • Note that the name is formatted correctly, even if the user enters all uppercase or lowercase letters for the name.
  • Submit your program to HW 4 PB 7 on Moodle.


Note
The bar of '=' signs will not show up correctly on Moodle, because of it uses a proportional font. However, Idle will display the output correctly, so make sure you debug in Idle and use Moodle just for submission. Resist the urge to modify your program in Moodle. Idle is a much friendlier place to edit programs.



<showafterdate after="20150225 00:00">

Solution Programs


# hw4sol.py
# D. Thiebaut
# Solution program(s) for Homework 4, 2015
# The solution organizes the individual solutions
# into functions, but you didn't have to do that for
# solving the problems.
# Just comment out the appropriate line in the the main()
# function to energize the solution for a give problem..

# solution for Problem 1
def problem1():
    fName = input( "Your first name? " )
    lName = input( "Your last name? " )
    full  = fName[0] + lName
    full = full.lower()
    print( full)

# solution for Problem 2
def problem2():
    fName = input( "Your first name? " )
    lName = input( "Your last name? " )
    full  = fName[0] + lName + "zzzzzzzz"
    full = full[0:8].lower()
    print( full)

# solution for Problem 3
def problem3():
    fName = input( "Your first name? " )
    lName = input( "Your last name? " )
    full  = fName[0] + lName + "20152015"
    full = full[0:8].lower()
    print( full)

# solution for Problem 4
def problem4():
    fName = input( "Your first name? " )
    lName = input( "Your last name? " )
    name = fName + lName
    noChars = len( name )
    for i in range( 1, noChars+1 ):
        noSpaces = noChars - i
        spaces = '.' * noSpaces
        print( spaces + name[0:i] )

# solution for Problem 5
def problem5():
    # define the list of months as a list of strings
    monthNames = ["January", "February", "March", "April", 
                  "May", "June", "July", "August",
                  "September", "October", "November", "December"]
    
    # get the date from the user
    date = input( "Enter date: " )

    # extract the different variables from the date
    month = date[0:2]
    day   = date[2:4]
    year  = date[4: ]
    dayInt = int( day )
    monthIndex = int( month ) - 1
    monthStr   = monthNames[ monthIndex ][0:3]

    # display result
    print( dayInt, monthStr, year )


# solution for Problem 6
def problem6():
    # define the list of months as a string of 3-char names
    monthNames = "JanFebMarAprMayJunJulAugSepOctNovDec"

    # get the date from the user
    date = input( "Enter date: " )

    # extract the different variables from the date
    month = date[0:2]
    day   = date[2:4]
    year  = date[4: ]
    dayInt = int( day )
    monthIndex = int( month ) - 1
    monthStr   = monthNames[ monthIndex*3 : monthIndex*3+3]

    # display result
    print( dayInt, monthStr, year )


# solution for Problem 7
def problem7():

    # get the input from the user
    fName   = input( "Enter first name: " )
    lName   = input( "Enter last name:  " )
    dob     = input( "Date of birth (yyyymmdd)" )
    dod     = input( "Date of death (yyyymmdd)" )
    accomp  = input( "Enter accomplishment: " )


    # Figure out the length of the bar
    bar     = "=" * len( accomp )

    # reformat names 
    fName   = fName.capitalize()
    lName   = lName.capitalize()
    accomp  = accomp.capitalize()

    # use a list of strings for the month, to get
    # the correct month for a give number.
    months  = ["January", "February", "March", 
               "April", "May", "June", 
               "July",  "August", "September", 
               "October", "November", "December" ]

    # extract day, month and year from dates.
    dobDay  = int( dob[-2:] )
    dobYear = dob[0:4]
    dobMonth= int( dob[4:6] ) - 1
    dobMonth= months[ dobMonth ]

    dodDay  = int( dod[-2:] )
    dodYear = dod[0:4]
    dodMonth= int( dod[4:6] ) - 1
    dodMonth= months[ dodMonth ]

    # output the result, nicely formatted
    #print()
    print( bar )
    line1 = "{0:1} {1:1} ({2:1} {3:1}, {4:1} -- {5:1} {6:1}, {7:1})"
    print( line1.format( fName, lName, dobMonth, dobDay, dobYear,
                         dodMonth, dodDay, dodYear ) )
    print( accomp )
    print( bar + "\n" )


# main program.
# Calls all the functions that solve the different problems.
# Comment out the lines you want to actually activate the
# function you are interested in.

def main():
    #problem1()
    #problem2()
    #problem3()
    #problem4()
    #problem5()
    #problem6()
    problem7()

main()


</showafterdate>


...