Difference between revisions of "CSC111 Homework 3 2015"
(→Problem 1: Teller Machine: Version 1) |
|||
(16 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
---- | ---- | ||
<br /> | <br /> | ||
+ | <tanbox> | ||
+ | The homework is always released right after Lab Session 4 (3-5 p.m. Thursday). Homework 3 was accidentally released early... | ||
+ | </tanbox> | ||
+ | <br /><br /> | ||
+ | <br /><br /> | ||
+ | <showafterdate after="20150212 17:00" before="20200601 00:00"> | ||
+ | <bluebox> | ||
+ | The problems in this assignment slowly take you from the program we solved in class, of a simple teller machine problem that expects integers and returns $20, $10, $5, and $1-bills, to a more sophisticated program that is robust enough to deal with erroneous inputs, and even inputs including pennies, and outputs the right amount of information in a nicely formatted way. | ||
+ | </bluebox> | ||
+ | <br /> | ||
+ | __TOC__ | ||
+ | <br /> | ||
+ | |||
=Problem 1: Teller Machine: Version 1= | =Problem 1: Teller Machine: Version 1= | ||
<br /> | <br /> | ||
Line 10: | Line 23: | ||
Make sure you test your program well, so that it works well with particular withdrawal values, such as 0, 1, 5, 10, and 20. | Make sure you test your program well, so that it works well with particular withdrawal values, such as 0, 1, 5, 10, and 20. | ||
<br /> | <br /> | ||
− | Submit your program to the Moodle HW 3 PB 1 section. | + | Submit your program to the Moodle HW 3 PB 1 section. Note that the Moodle test program removes words from the output of your program and concentrates only on whether the numbers are correct or not. |
<br /> | <br /> | ||
Here is an example of how your program should behave. The user enters 139 when prompted for a value: | Here is an example of how your program should behave. The user enters 139 when prompted for a value: | ||
Line 25: | Line 38: | ||
=Problem 2: Teller Machine: User sometimes inputs floats= | =Problem 2: Teller Machine: User sometimes inputs floats= | ||
<br /> | <br /> | ||
− | This version of your program should be robust enough to work well, even when the user enters a number of the form 10.25. In such a case your program will only treat the integer part of the sum entered by the user, and will discard the decimal digits. So 10.25 will be treated as 10. | + | This version of your program should be robust enough to work well, even when the user enters a number of the form 10.25. In such a case we assume that the teller machine does not return coins. So your program will only treat the integer part of the sum entered by the user, and will discard the decimal digits. So 10.25 will be treated as 10. |
<br /> | <br /> | ||
− | Call your program hw3.py. You will have to take the string returned by the '''input()''' function and one or more functions to transform | + | Call your program hw3.py. You will have to take the string returned by the '''input()''' function and one or more functions (such as abs(), round(), int(), eval(), for example) to transform the input into an integer. You will find the page on ''built-in functions'' at https://docs.python.org/3/library/functions.html very useful for figuring out which function to use! |
<br /> | <br /> | ||
− | Submit your program to the | + | Submit your program to the Moodle HW 3 PB 2 section. |
<br /> | <br /> | ||
Example of user interaction with the program, where the user enters 139.55: | Example of user interaction with the program, where the user enters 139.55: | ||
Line 43: | Line 56: | ||
=Problem 3: The User sometimes inputs negative numbers= | =Problem 3: The User sometimes inputs negative numbers= | ||
<br /> | <br /> | ||
− | Make your program more robust so that if the user enters a minus sign in front of the number, by mistake, your program will discard it. In other words, if the user enters -30.50, your program will treat this number as 30. If the user enters -10, the program will treat it as 10. | + | Make your program more '''robust''' so that if the user enters a minus sign in front of the number, by mistake, your program will discard it. In other words, if the user enters -30.50, your program will treat this number as 30. If the user enters -10, the program will treat it as 10. |
<br /> | <br /> | ||
Submit your program hw3.py program to the Moodle HW 3 PB 3 section. | Submit your program hw3.py program to the Moodle HW 3 PB 3 section. | ||
Line 59: | Line 72: | ||
=Problem 4: Teller Machine with $50-bills= | =Problem 4: Teller Machine with $50-bills= | ||
<br /> | <br /> | ||
− | Your new program, also called hw3.py, will now be able to accept negative numbers or floats as input, and will also | + | Your new program, also called hw3.py, will now be able to accept negative numbers or floats as input, and will also output $50-bills, in addition to $20, $10, $5, and $1-bills. |
<br /> | <br /> | ||
Submit your program, called hw3.py, to the Moodle HW 3 PB 4 section. | Submit your program, called hw3.py, to the Moodle HW 3 PB 4 section. | ||
<br /> | <br /> | ||
− | =Problem 5 Teller Machine | + | =Problem 5: Teller Machine That Returns Coins= |
<br /> | <br /> | ||
This time the program accepts inputs of the form 123.55 and will output the change expressed in $20, $10, $5, and $1-bills, along with a number of quaters, dimes, nickels, and cents. | This time the program accepts inputs of the form 123.55 and will output the change expressed in $20, $10, $5, and $1-bills, along with a number of quaters, dimes, nickels, and cents. | ||
Line 70: | Line 83: | ||
Submit your new version of hw3.py to the Moodle HW 3 PB 5 section. | Submit your new version of hw3.py to the Moodle HW 3 PB 5 section. | ||
<br /> | <br /> | ||
− | Here is an example of an interaction with the user, who enters 124.46 as the amount to withdraw. | + | Here is an example of an interaction with the user, who enters 124.46 as the amount to withdraw. We assume that the user may enter -124.46, in which case your program should treat that value as +124.46. |
Please enter amount to withdraw: <u>124.46</u> | Please enter amount to withdraw: <u>124.46</u> | ||
Line 86: | Line 99: | ||
=Problem 6: Formatted output= | =Problem 6: Formatted output= | ||
<br /> | <br /> | ||
− | Use your solution for Problem 3, and make it output the result in a box, nicely formatted, as illustrated below. The Moodle test program will be checking with random positive amounts, and your output must match exactly the output below. | + | Use your solution for Problem 3, and make it output the result in a box, nicely formatted, as illustrated below. The Moodle test program will be checking with random positive amounts, and your output must match exactly the output below. Unlike the previous tests, this time Moodle does not discard anything in your output, and will test it directly to the solution program's output. In the example below, the user input is 234. Note that there is a blank line before the first bar of the box. It is important to have one blank line between the input and the box for Moodle to test your program properly. |
<br /> | <br /> | ||
<source lang="text"> | <source lang="text"> | ||
Please enter amount to withdraw: 234 | Please enter amount to withdraw: 234 | ||
+ | |||
+--------------------------------+ | +--------------------------------+ | ||
| Withdrawal amount: $234 | | | Withdrawal amount: $234 | | ||
Line 101: | Line 115: | ||
Submit your solution program in Section HW3 PB 6. | Submit your solution program in Section HW3 PB 6. | ||
<br /> | <br /> | ||
+ | </showafterdate> | ||
<br /> | <br /> | ||
+ | <showafterdate after="20150217 23:55" before="20150601 12:00"> | ||
+ | =Solution Program= | ||
+ | <br /> | ||
+ | <source lang="python"> | ||
+ | # hw3Solutions.py | ||
+ | # D. Thiebaut | ||
+ | # solution programs for Homework #3 | ||
+ | # | ||
+ | |||
+ | def main1(): | ||
+ | # get amount | ||
+ | amount = int( input( "Please enter amount to withdraw: " ) ) | ||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | def main2(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | |||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | def main3(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | amount = abs( amount ) | ||
+ | |||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | def main4(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | amount = abs( amount ) | ||
+ | |||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no50s = amount // 50 | ||
+ | amount = amount % 50 | ||
+ | |||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no50s, "$50-bill(s)" ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | def main5(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = eval( amount ) | ||
+ | amount = abs( amount ) | ||
+ | originalAmount = amount | ||
+ | |||
+ | # break down float into two ints, the dollar part, and | ||
+ | # the number of pennies. | ||
+ | intAmount = abs( int( amount ) ) | ||
+ | pennies = abs( int ( round ( (amount - intAmount) * 100 ) ) ) | ||
+ | |||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = intAmount // 20 | ||
+ | intAmount = intAmount % 20 | ||
+ | |||
+ | no10s = intAmount // 10 | ||
+ | intAmount = intAmount % 10 | ||
+ | |||
+ | no5s = intAmount // 5 | ||
+ | no1s = intAmount % 5 | ||
+ | |||
+ | # computer quarters, dimes, nickels, cents | ||
+ | quarters = pennies // 25 | ||
+ | pennies = pennies % 25 | ||
+ | |||
+ | dimes = pennies // 10 | ||
+ | pennies = pennies % 10 | ||
+ | |||
+ | nickels = pennies // 5 | ||
+ | cents = pennies % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmount ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | print( quarters, "quarter(s)" ) | ||
+ | print( dimes, "dime(s)" ) | ||
+ | print( nickels, "nickel(s)" ) | ||
+ | print( cents, "cent(s)" ) | ||
+ | |||
+ | |||
+ | def main7(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | amount = abs( amount ) | ||
+ | |||
+ | originalAmount = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | bar = "+--------------------------------+" | ||
+ | print( bar ) | ||
+ | print( "| Withdrawal amount: ${0:<10} |".format( originalAmount ) ) | ||
+ | print( "| $20-bill(s): {0:<10} |".format( no20s ) ) | ||
+ | print( "| $10-bill(s): {0:<10} |".format( no10s ) ) | ||
+ | print( "| $5-bill(s): {0:<10} |".format( no5s ) ) | ||
+ | print( "| $1-bill(s): {0:<10} |".format( no1s ) ) | ||
+ | print( bar ) | ||
+ | |||
+ | main1() | ||
+ | main2() | ||
+ | main3() | ||
+ | main4() | ||
+ | main6() | ||
+ | main7() | ||
+ | |||
+ | |||
+ | </source> | ||
+ | </showafterdate> | ||
<br /> | <br /> | ||
<br /> | <br /> | ||
+ | <onlydft> | ||
+ | =VPL Modules= | ||
+ | ==Problem 1== | ||
+ | ===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=hw3.py | ||
+ | \$python \$prog | ||
+ | |||
+ | EOF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===vpl_evaluate.sh=== | ||
+ | <source lang="bash"> | ||
+ | #! /bin/bash | ||
+ | # D. Thiebaut | ||
+ | |||
+ | cat > vpl_execution <<EEOOFF | ||
+ | #! /bin/bash | ||
+ | #set -x | ||
+ | |||
+ | # --- program tested (no extension) --- | ||
+ | prog=hw3.py | ||
+ | solutionProg=hw3sol.py | ||
+ | |||
+ | # --- Python ---- | ||
+ | #python=/usr/local/bin/python3.4 | ||
+ | python=/usr/bin/python3.3 | ||
+ | |||
+ | # ================================================= | ||
+ | # Pick 3 random inputs to test program with | ||
+ | TEMP1=\$RANDOM | ||
+ | let "TEMP1 %= 130" | ||
+ | let "TEMP1 = TEMP1 + 16" | ||
+ | |||
+ | |||
+ | # ================================================= | ||
+ | # 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 \$TEMP" | ||
+ | echo "--|>" | ||
+ | |||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Your output:" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat userOut.org | ||
+ | echo "--|>" | ||
+ | echo "" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Expected output: " | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat expectedOut.org | ||
+ | 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 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 | ||
+ | } | ||
+ | |||
+ | for TEMP in \$TEMP1 ; do | ||
+ | |||
+ | echo \$TEMP > input | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 | ||
+ | |||
+ | #--- compute difference --- | ||
+ | diff -y -w --ignore-all-space userOut expectedOut > diff.out | ||
+ | |||
+ | #--- reject if different --- | ||
+ | if ((\$? > 0)); then | ||
+ | incorrectOutput | ||
+ | grade=65 | ||
+ | # --------------------- REWARD IF CORRECT OUTPUT ----------------- | ||
+ | else | ||
+ | #--- good output --- | ||
+ | echo "Comment :=>>- Congrats, your output is correct." | ||
+ | echo "Comment :=>> --------------------------------." | ||
+ | echo "<|--" | ||
+ | echo "Your program tested with \$TEMP" | ||
+ | echo "" | ||
+ | cat userOut | ||
+ | echo "--|>" | ||
+ | grade=100 | ||
+ | fi | ||
+ | |||
+ | done | ||
+ | |||
+ | # ================================================= | ||
+ | # Report grade | ||
+ | if (( grade > 100 )); then | ||
+ | grade=100 | ||
+ | fi | ||
+ | echo "Grade :=>> \$grade" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | EEOOFF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===hw3.py=== | ||
+ | <source lang="bash"> | ||
+ | def main(): | ||
+ | # get amount | ||
+ | amount = int( input( "Enter amount: " ) ) | ||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "amount: ", originalAmout ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | main() | ||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | ==Problem 2== | ||
+ | ===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=hw3.py | ||
+ | \$python \$prog | ||
+ | |||
+ | EOF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===vpl_evaluate.sh=== | ||
+ | <source lang="bash"> | ||
+ | #! /bin/bash | ||
+ | # D. Thiebaut | ||
+ | |||
+ | cat > vpl_execution <<EEOOFF | ||
+ | #! /bin/bash | ||
+ | #set -x | ||
+ | |||
+ | # --- program tested (no extension) --- | ||
+ | prog=hw3.py | ||
+ | solutionProg=hw3sol.py | ||
+ | |||
+ | # --- Python ---- | ||
+ | python=/usr/local/bin/python3.4 | ||
+ | #python=/usr/bin/python3.3 | ||
+ | |||
+ | # ================================================= | ||
+ | # Pick 3 random inputs to test program with | ||
+ | TEMP1=\$RANDOM | ||
+ | let "TEMP1 %= 130" | ||
+ | let "TEMP1 = TEMP1 + 16" | ||
+ | TEMP1=\${TEMP1}.79 | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 \$TEMP" | ||
+ | echo "--|>" | ||
+ | |||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Your output:" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat userOut.org | ||
+ | echo "--|>" | ||
+ | echo "" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Expected output: " | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat expectedOut.org | ||
+ | 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 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 | ||
+ | } | ||
+ | |||
+ | for TEMP in \$TEMP1 ; do | ||
+ | |||
+ | echo \$TEMP > input | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 | ||
+ | |||
+ | #--- compute difference --- | ||
+ | diff -y -w --ignore-all-space userOut expectedOut > diff.out | ||
+ | |||
+ | #--- reject if different --- | ||
+ | if ((\$? > 0)); then | ||
+ | incorrectOutput | ||
+ | grade=65 | ||
+ | # --------------------- REWARD IF CORRECT OUTPUT ----------------- | ||
+ | else | ||
+ | #--- good output --- | ||
+ | echo "Comment :=>>- Congrats, your output is correct." | ||
+ | echo "Comment :=>> --------------------------------." | ||
+ | echo "<|--" | ||
+ | echo "Your program tested with \$TEMP" | ||
+ | echo "" | ||
+ | cat userOut | ||
+ | echo "--|>" | ||
+ | grade=100 | ||
+ | fi | ||
+ | |||
+ | done | ||
+ | |||
+ | # ================================================= | ||
+ | # Report grade | ||
+ | if (( grade > 100 )); then | ||
+ | grade=100 | ||
+ | fi | ||
+ | echo "Grade :=>> \$grade" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | EEOOFF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===hw3.py=== | ||
+ | <source lang="bash"> | ||
+ | |||
+ | def main(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | |||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | main() | ||
+ | </source> | ||
+ | |||
+ | ==Problem 3== | ||
+ | ===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=hw3.py | ||
+ | \$python \$prog | ||
+ | |||
+ | EOF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===vpl_evaluate.sh=== | ||
+ | <source lang="bash"> | ||
+ | #! /bin/bash | ||
+ | # D. Thiebaut | ||
+ | |||
+ | cat > vpl_execution <<EEOOFF | ||
+ | #! /bin/bash | ||
+ | #set -x | ||
+ | |||
+ | # --- program tested (no extension) --- | ||
+ | prog=hw3.py | ||
+ | solutionProg=hw3sol.py | ||
+ | |||
+ | # --- Python ---- | ||
+ | python=/usr/local/bin/python3.4 | ||
+ | #python=/usr/bin/python3.3 | ||
+ | |||
+ | # ================================================= | ||
+ | # Pick 3 random inputs to test program with | ||
+ | TEMP1=\$RANDOM | ||
+ | let "TEMP1 %= 130" | ||
+ | let "TEMP1 = TEMP1 + 16" | ||
+ | TEMP1=-\${TEMP1}.79 | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 \$TEMP" | ||
+ | echo "--|>" | ||
+ | |||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Your output:" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat userOut.org | ||
+ | echo "--|>" | ||
+ | echo "" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Expected output: " | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat expectedOut.org | ||
+ | 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 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 | ||
+ | } | ||
+ | |||
+ | for TEMP in \$TEMP1 ; do | ||
+ | |||
+ | echo \$TEMP > input | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 | ||
+ | |||
+ | #--- compute difference --- | ||
+ | diff -y -w --ignore-all-space userOut expectedOut > diff.out | ||
+ | |||
+ | #--- reject if different --- | ||
+ | if ((\$? > 0)); then | ||
+ | incorrectOutput | ||
+ | grade=65 | ||
+ | # --------------------- REWARD IF CORRECT OUTPUT ----------------- | ||
+ | else | ||
+ | #--- good output --- | ||
+ | echo "Comment :=>>- Congrats, your output is correct." | ||
+ | echo "Comment :=>> --------------------------------." | ||
+ | echo "<|--" | ||
+ | echo "Your program tested with \$TEMP" | ||
+ | echo "" | ||
+ | cat userOut | ||
+ | echo "--|>" | ||
+ | grade=100 | ||
+ | fi | ||
+ | |||
+ | done | ||
+ | |||
+ | # ================================================= | ||
+ | # Report grade | ||
+ | if (( grade > 100 )); then | ||
+ | grade=100 | ||
+ | fi | ||
+ | echo "Grade :=>> \$grade" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | EEOOFF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===hw3.py=== | ||
+ | <source lang="bash"> | ||
+ | def main(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | amount = abs( amount ) | ||
+ | |||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | main() | ||
+ | </source> | ||
+ | ==Problem 4== | ||
+ | ===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=hw3.py | ||
+ | \$python \$prog | ||
+ | |||
+ | EOF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===hw3.py=== | ||
+ | <source lang="bash"> | ||
+ | |||
+ | def main(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | amount = abs( amount ) | ||
+ | |||
+ | originalAmout = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no50s = amount // 50 | ||
+ | amount = amount % 50 | ||
+ | |||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmout ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no50s, "$50-bill(s)" ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | |||
+ | main() | ||
+ | </source> | ||
+ | ===vpl_evaluate.sh=== | ||
+ | <source lang="bash"> | ||
+ | #! /bin/bash | ||
+ | # D. Thiebaut | ||
+ | |||
+ | cat > vpl_execution <<EEOOFF | ||
+ | #! /bin/bash | ||
+ | #set -x | ||
+ | |||
+ | # --- program tested (no extension) --- | ||
+ | prog=hw3.py | ||
+ | solutionProg=hw3sol.py | ||
+ | |||
+ | # --- Python ---- | ||
+ | python=/usr/local/bin/python3.4 | ||
+ | #python=/usr/bin/python3.3 | ||
+ | |||
+ | # ================================================= | ||
+ | # Pick 3 random inputs to test program with | ||
+ | TEMP1=\$RANDOM | ||
+ | let "TEMP1 %= 130" | ||
+ | let "TEMP1 = TEMP1 + 50" | ||
+ | #TEMP1=-\${TEMP1}.79 | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 \$TEMP" | ||
+ | echo "--|>" | ||
+ | |||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Your output:" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat userOut.org | ||
+ | echo "--|>" | ||
+ | echo "" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Expected output: " | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat expectedOut.org | ||
+ | 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 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 | ||
+ | } | ||
+ | |||
+ | for TEMP in \$TEMP1 ; do | ||
+ | |||
+ | echo \$TEMP > input | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 | ||
+ | |||
+ | #--- compute difference --- | ||
+ | diff -y -w --ignore-all-space userOut expectedOut > diff.out | ||
+ | |||
+ | #--- reject if different --- | ||
+ | if ((\$? > 0)); then | ||
+ | incorrectOutput | ||
+ | grade=65 | ||
+ | # --------------------- REWARD IF CORRECT OUTPUT ----------------- | ||
+ | else | ||
+ | #--- good output --- | ||
+ | echo "Comment :=>>- Congrats, your output is correct." | ||
+ | echo "Comment :=>> --------------------------------." | ||
+ | echo "<|--" | ||
+ | echo "Your program tested with \$TEMP" | ||
+ | echo "" | ||
+ | cat userOut | ||
+ | echo "--|>" | ||
+ | grade=100 | ||
+ | fi | ||
+ | |||
+ | done | ||
+ | |||
+ | # ================================================= | ||
+ | # Report grade | ||
+ | if (( grade > 100 )); then | ||
+ | grade=100 | ||
+ | fi | ||
+ | echo "Grade :=>> \$grade" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | EEOOFF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | |||
+ | ==Problem 5== | ||
+ | ===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=hw3.py | ||
+ | \$python \$prog | ||
+ | |||
+ | EOF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===vpl_evaluate.sh=== | ||
+ | <source lang="bash"> | ||
+ | #! /bin/bash | ||
+ | # D. Thiebaut | ||
+ | |||
+ | cat > vpl_execution <<EEOOFF | ||
+ | #! /bin/bash | ||
+ | #set -x | ||
+ | |||
+ | # --- program tested (no extension) --- | ||
+ | prog=hw3.py | ||
+ | solutionProg=hw3sol.py | ||
+ | |||
+ | # --- Python ---- | ||
+ | python=/usr/local/bin/python3.4 | ||
+ | #python=/usr/bin/python3.3 | ||
+ | |||
+ | # ================================================= | ||
+ | # Pick 3 random inputs to test program with | ||
+ | TEMP1=\$RANDOM | ||
+ | let "TEMP1 %= 130" | ||
+ | let "TEMP1 = TEMP1 + 50" | ||
+ | TEMP2=\$RANDOM | ||
+ | let "TEMP2 %= 90" | ||
+ | let "TEMP2 = TEMP2 + 4" | ||
+ | TEMP1=\${TEMP1}.\${TEMP2} | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 \$TEMP" | ||
+ | echo "--|>" | ||
+ | |||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Your output:" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat userOut.org | ||
+ | echo "--|>" | ||
+ | echo "" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Expected output: " | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat expectedOut.org | ||
+ | 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 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 | ||
+ | } | ||
+ | |||
+ | for TEMP in \$TEMP1 ; do | ||
+ | |||
+ | echo \$TEMP > input | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 | ||
+ | |||
+ | #--- compute difference --- | ||
+ | diff -y -w --ignore-all-space userOut expectedOut > diff.out | ||
+ | |||
+ | #--- reject if different --- | ||
+ | if ((\$? > 0)); then | ||
+ | incorrectOutput | ||
+ | grade=65 | ||
+ | # --------------------- REWARD IF CORRECT OUTPUT ----------------- | ||
+ | else | ||
+ | #--- good output --- | ||
+ | echo "Comment :=>>- Congrats, your output is correct." | ||
+ | echo "Comment :=>> --------------------------------." | ||
+ | echo "<|--" | ||
+ | echo "Your program tested with \$TEMP" | ||
+ | echo "" | ||
+ | cat userOut | ||
+ | echo "--|>" | ||
+ | grade=100 | ||
+ | fi | ||
+ | |||
+ | done | ||
+ | |||
+ | # ================================================= | ||
+ | # Report grade | ||
+ | if (( grade > 100 )); then | ||
+ | grade=100 | ||
+ | fi | ||
+ | echo "Grade :=>> \$grade" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | EEOOFF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===hw3.py=== | ||
+ | <source lang="bash"> | ||
+ | def main(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = eval( amount ) | ||
+ | amount = abs( amount ) | ||
+ | originalAmount = amount | ||
+ | |||
+ | # break down float into two ints, the dollar part, and | ||
+ | # the number of pennies. | ||
+ | intAmount = abs( int( amount ) ) | ||
+ | pennies = abs( int ( round ( (amount - intAmount) * 100 ) ) ) | ||
+ | |||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = intAmount // 20 | ||
+ | intAmount = intAmount % 20 | ||
+ | |||
+ | no10s = intAmount // 10 | ||
+ | intAmount = intAmount % 10 | ||
+ | |||
+ | no5s = intAmount // 5 | ||
+ | no1s = intAmount % 5 | ||
+ | |||
+ | # computer quarters, dimes, nickels, cents | ||
+ | quarters = pennies // 25 | ||
+ | pennies = pennies % 25 | ||
+ | |||
+ | dimes = pennies // 10 | ||
+ | pennies = pennies % 10 | ||
+ | |||
+ | nickels = pennies // 5 | ||
+ | cents = pennies % 5 | ||
+ | |||
+ | # output result | ||
+ | print( "Withdrawal amount: ", originalAmount ) | ||
+ | print( "Please lift your keyboard and find: " ) | ||
+ | print( no20s, "$20-bill(s)" ) | ||
+ | print( no10s, "$10-bill(s)" ) | ||
+ | print( no5s, "$5-bill(s)" ) | ||
+ | print( no1s, "$1-bill(s)" ) | ||
+ | print( quarters, "quarter(s)" ) | ||
+ | print( dimes, "dime(s)" ) | ||
+ | print( nickels, "nickel(s)" ) | ||
+ | print( cents, "cent(s)" ) | ||
+ | |||
+ | main() | ||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | ==Problem 6== | ||
+ | ===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=hw3.py | ||
+ | \$python \$prog | ||
+ | |||
+ | EOF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===vpl_evaluate.sh=== | ||
+ | <source lang="bash"> | ||
+ | #! /bin/bash | ||
+ | # D. Thiebaut | ||
+ | |||
+ | cat > vpl_execution <<EEOOFF | ||
+ | #! /bin/bash | ||
+ | #set -x | ||
+ | |||
+ | # --- program tested (no extension) --- | ||
+ | prog=hw3.py | ||
+ | solutionProg=hw3sol.py | ||
+ | |||
+ | # --- Python ---- | ||
+ | python=/usr/local/bin/python3.4 | ||
+ | #python=/usr/bin/python3.3 | ||
+ | |||
+ | # ================================================= | ||
+ | # Pick 3 random inputs to test program with | ||
+ | TEMP1=\$RANDOM | ||
+ | let "TEMP1 %= 130" | ||
+ | let "TEMP1 = TEMP1 + 20" | ||
+ | |||
+ | |||
+ | # ================================================= | ||
+ | # 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 \$TEMP" | ||
+ | echo "--|>" | ||
+ | |||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Your output:" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat userOut.org | ||
+ | echo "--|>" | ||
+ | echo "" | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "Comment :=>>- Expected output: " | ||
+ | echo "Comment :=>> ---------------" | ||
+ | echo "<|--" | ||
+ | cat expectedOut.org | ||
+ | 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 removes non-digits, extra spaces, and extra blank lines from text file. | ||
+ | cleanup () { | ||
+ | if [ "\$1" ]; then # if there's a parameter | ||
+ | cp \$1 dummy.out | ||
+ | |||
+ | #--- 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 | ||
+ | } | ||
+ | |||
+ | for TEMP in \$TEMP1 ; do | ||
+ | |||
+ | echo \$TEMP > input | ||
+ | |||
+ | # ================================================= | ||
+ | # 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 | ||
+ | |||
+ | #--- compute difference --- | ||
+ | #diff -y -w --ignore-all-space userOut expectedOut > diff.out | ||
+ | diff -y -w userOut expectedOut > diff.out | ||
+ | |||
+ | #--- reject if different --- | ||
+ | if ((\$? > 0)); then | ||
+ | incorrectOutput | ||
+ | grade=65 | ||
+ | # --------------------- REWARD IF CORRECT OUTPUT ----------------- | ||
+ | else | ||
+ | #--- good output --- | ||
+ | echo "Comment :=>>- Congrats, your output is correct." | ||
+ | echo "Comment :=>> --------------------------------." | ||
+ | echo "<|--" | ||
+ | echo "Your program tested with \$TEMP" | ||
+ | echo "" | ||
+ | cat userOut | ||
+ | echo "--|>" | ||
+ | grade=100 | ||
+ | fi | ||
+ | |||
+ | done | ||
+ | |||
+ | # ================================================= | ||
+ | # Report grade | ||
+ | if (( grade > 100 )); then | ||
+ | grade=100 | ||
+ | fi | ||
+ | echo "Grade :=>> \$grade" | ||
+ | |||
+ | |||
+ | exit | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | EEOOFF | ||
+ | |||
+ | chmod +x vpl_execution | ||
+ | |||
+ | </source> | ||
+ | ===hw3.py=== | ||
+ | <source lang="bash"> | ||
+ | def main(): | ||
+ | # get amount | ||
+ | amount = input( "Please enter amount to withdraw: " ) | ||
+ | amount = int( eval( amount ) ) | ||
+ | amount = abs( amount ) | ||
+ | |||
+ | originalAmount = amount | ||
+ | |||
+ | # compute no20s, no10s, no5s and no1s | ||
+ | no20s = amount // 20 | ||
+ | amount = amount % 20 | ||
+ | |||
+ | no10s = amount // 10 | ||
+ | amount = amount % 10 | ||
+ | |||
+ | no5s = amount // 5 | ||
+ | no1s = amount % 5 | ||
+ | |||
+ | # output result | ||
+ | print() | ||
+ | bar = "+--------------------------------+" | ||
+ | print( bar ) | ||
+ | print( "| Withdrawal amount: ${0:<10} |".format( originalAmount ) ) | ||
+ | print( "| $20-bill(s): {0:<10} |".format( no20s ) ) | ||
+ | print( "| $10-bill(s): {0:<10} |".format( no10s ) ) | ||
+ | print( "| $5-bill(s): {0:<10} |".format( no5s ) ) | ||
+ | print( "| $1-bill(s): {0:<10} |".format( no1s ) ) | ||
+ | print( bar ) | ||
+ | |||
+ | main() | ||
+ | |||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | </onlydft> | ||
+ | |||
<br /> | <br /> | ||
<br /> | <br /> |
Latest revision as of 16:40, 12 February 2015
--D. Thiebaut (talk) 10:42, 9 February 2015 (EST)
The homework is always released right after Lab Session 4 (3-5 p.m. Thursday). Homework 3 was accidentally released early...
<showafterdate after="20150212 17:00" before="20200601 00:00">
The problems in this assignment slowly take you from the program we solved in class, of a simple teller machine problem that expects integers and returns $20, $10, $5, and $1-bills, to a more sophisticated program that is robust enough to deal with erroneous inputs, and even inputs including pennies, and outputs the right amount of information in a nicely formatted way.
Contents
Problem 1: Teller Machine: Version 1
Rewrite the program we saw in class that asks the user for some amount of dollars, and outputs the number of $20, $10, $5 and $1 that needs to be distributed. Call your program hw3.py.
In this version, we assume that the user is well behaved and will enter only valid integer numbers.
Make sure you test your program well, so that it works well with particular withdrawal values, such as 0, 1, 5, 10, and 20.
Submit your program to the Moodle HW 3 PB 1 section. Note that the Moodle test program removes words from the output of your program and concentrates only on whether the numbers are correct or not.
Here is an example of how your program should behave. The user enters 139 when prompted for a value:
Please enter amount to withdraw: 139 Withdrawal amount: 139 Please lift your keyboard and find: 6 $20-bill(s) 1 $10-bill(s) 1 $5-bill(s) 4 $1-bill(s)
Problem 2: Teller Machine: User sometimes inputs floats
This version of your program should be robust enough to work well, even when the user enters a number of the form 10.25. In such a case we assume that the teller machine does not return coins. So your program will only treat the integer part of the sum entered by the user, and will discard the decimal digits. So 10.25 will be treated as 10.
Call your program hw3.py. You will have to take the string returned by the input() function and one or more functions (such as abs(), round(), int(), eval(), for example) to transform the input into an integer. You will find the page on built-in functions at https://docs.python.org/3/library/functions.html very useful for figuring out which function to use!
Submit your program to the Moodle HW 3 PB 2 section.
Example of user interaction with the program, where the user enters 139.55:
Please enter amount to withdraw: 139.55 Withdrawal amount: 139 Please lift your keyboard and find: 6 $20-bill(s) 1 $10-bill(s) 1 $5-bill(s) 4 $1-bill(s)
Problem 3: The User sometimes inputs negative numbers
Make your program more robust so that if the user enters a minus sign in front of the number, by mistake, your program will discard it. In other words, if the user enters -30.50, your program will treat this number as 30. If the user enters -10, the program will treat it as 10.
Submit your program hw3.py program to the Moodle HW 3 PB 3 section.
Example of user interaction: this time the user enters -122.99
Please enter amount to withdraw: -122.99 Withdrawal amount: 122 Please lift your keyboard and find: 6 $20-bill(s) 0 $10-bill(s) 0 $5-bill(s) 2 $1-bill(s)
Problem 4: Teller Machine with $50-bills
Your new program, also called hw3.py, will now be able to accept negative numbers or floats as input, and will also output $50-bills, in addition to $20, $10, $5, and $1-bills.
Submit your program, called hw3.py, to the Moodle HW 3 PB 4 section.
Problem 5: Teller Machine That Returns Coins
This time the program accepts inputs of the form 123.55 and will output the change expressed in $20, $10, $5, and $1-bills, along with a number of quaters, dimes, nickels, and cents.
Submit your new version of hw3.py to the Moodle HW 3 PB 5 section.
Here is an example of an interaction with the user, who enters 124.46 as the amount to withdraw. We assume that the user may enter -124.46, in which case your program should treat that value as +124.46.
Please enter amount to withdraw: 124.46 Withdrawal amount: 124.46 Please lift your keyboard and find: 6 $20-bill(s) 0 $10-bill(s) 0 $5-bill(s) 4 $1-bill(s) 1 quarter(s) 2 dime(s) 0 nickel(s) 1 cent(s)
Problem 6: Formatted output
Use your solution for Problem 3, and make it output the result in a box, nicely formatted, as illustrated below. The Moodle test program will be checking with random positive amounts, and your output must match exactly the output below. Unlike the previous tests, this time Moodle does not discard anything in your output, and will test it directly to the solution program's output. In the example below, the user input is 234. Note that there is a blank line before the first bar of the box. It is important to have one blank line between the input and the box for Moodle to test your program properly.
Please enter amount to withdraw: 234
+--------------------------------+
| Withdrawal amount: $234 |
| $20-bill(s): 11 |
| $10-bill(s): 1 |
| $5-bill(s): 0 |
| $1-bill(s): 4 |
+--------------------------------+
Submit your solution program in Section HW3 PB 6.
</showafterdate>
<showafterdate after="20150217 23:55" before="20150601 12:00">
Solution Program
# hw3Solutions.py
# D. Thiebaut
# solution programs for Homework #3
#
def main1():
# get amount
amount = int( input( "Please enter amount to withdraw: " ) )
originalAmout = amount
# compute no20s, no10s, no5s and no1s
no20s = amount // 20
amount = amount % 20
no10s = amount // 10
amount = amount % 10
no5s = amount // 5
no1s = amount % 5
# output result
print( "Withdrawal amount: ", originalAmout )
print( "Please lift your keyboard and find: " )
print( no20s, "$20-bill(s)" )
print( no10s, "$10-bill(s)" )
print( no5s, "$5-bill(s)" )
print( no1s, "$1-bill(s)" )
def main2():
# get amount
amount = input( "Please enter amount to withdraw: " )
amount = int( eval( amount ) )
originalAmout = amount
# compute no20s, no10s, no5s and no1s
no20s = amount // 20
amount = amount % 20
no10s = amount // 10
amount = amount % 10
no5s = amount // 5
no1s = amount % 5
# output result
print( "Withdrawal amount: ", originalAmout )
print( "Please lift your keyboard and find: " )
print( no20s, "$20-bill(s)" )
print( no10s, "$10-bill(s)" )
print( no5s, "$5-bill(s)" )
print( no1s, "$1-bill(s)" )
def main3():
# get amount
amount = input( "Please enter amount to withdraw: " )
amount = int( eval( amount ) )
amount = abs( amount )
originalAmout = amount
# compute no20s, no10s, no5s and no1s
no20s = amount // 20
amount = amount % 20
no10s = amount // 10
amount = amount % 10
no5s = amount // 5
no1s = amount % 5
# output result
print( "Withdrawal amount: ", originalAmout )
print( "Please lift your keyboard and find: " )
print( no20s, "$20-bill(s)" )
print( no10s, "$10-bill(s)" )
print( no5s, "$5-bill(s)" )
print( no1s, "$1-bill(s)" )
def main4():
# get amount
amount = input( "Please enter amount to withdraw: " )
amount = int( eval( amount ) )
amount = abs( amount )
originalAmout = amount
# compute no20s, no10s, no5s and no1s
no50s = amount // 50
amount = amount % 50
no20s = amount // 20
amount = amount % 20
no10s = amount // 10
amount = amount % 10
no5s = amount // 5
no1s = amount % 5
# output result
print( "Withdrawal amount: ", originalAmout )
print( "Please lift your keyboard and find: " )
print( no50s, "$50-bill(s)" )
print( no20s, "$20-bill(s)" )
print( no10s, "$10-bill(s)" )
print( no5s, "$5-bill(s)" )
print( no1s, "$1-bill(s)" )
def main5():
# get amount
amount = input( "Please enter amount to withdraw: " )
amount = eval( amount )
amount = abs( amount )
originalAmount = amount
# break down float into two ints, the dollar part, and
# the number of pennies.
intAmount = abs( int( amount ) )
pennies = abs( int ( round ( (amount - intAmount) * 100 ) ) )
# compute no20s, no10s, no5s and no1s
no20s = intAmount // 20
intAmount = intAmount % 20
no10s = intAmount // 10
intAmount = intAmount % 10
no5s = intAmount // 5
no1s = intAmount % 5
# computer quarters, dimes, nickels, cents
quarters = pennies // 25
pennies = pennies % 25
dimes = pennies // 10
pennies = pennies % 10
nickels = pennies // 5
cents = pennies % 5
# output result
print( "Withdrawal amount: ", originalAmount )
print( "Please lift your keyboard and find: " )
print( no20s, "$20-bill(s)" )
print( no10s, "$10-bill(s)" )
print( no5s, "$5-bill(s)" )
print( no1s, "$1-bill(s)" )
print( quarters, "quarter(s)" )
print( dimes, "dime(s)" )
print( nickels, "nickel(s)" )
print( cents, "cent(s)" )
def main7():
# get amount
amount = input( "Please enter amount to withdraw: " )
amount = int( eval( amount ) )
amount = abs( amount )
originalAmount = amount
# compute no20s, no10s, no5s and no1s
no20s = amount // 20
amount = amount % 20
no10s = amount // 10
amount = amount % 10
no5s = amount // 5
no1s = amount % 5
# output result
bar = "+--------------------------------+"
print( bar )
print( "| Withdrawal amount: ${0:<10} |".format( originalAmount ) )
print( "| $20-bill(s): {0:<10} |".format( no20s ) )
print( "| $10-bill(s): {0:<10} |".format( no10s ) )
print( "| $5-bill(s): {0:<10} |".format( no5s ) )
print( "| $1-bill(s): {0:<10} |".format( no1s ) )
print( bar )
main1()
main2()
main3()
main4()
main6()
main7()
</showafterdate>