# 2nd Homework

Download hw_2.tar.gz and extract it. Then add your homework solutions in the contained directory. Rename the directory according to the rules in the syllabus before submitting it as compressed archive.

1. Numeric computation
Write a program that asks for the radius and height of a spherical cap and prints its surface and volume (rounded to 3 digits).
A sample run of this program:
Enter the radius: 3.4
Enter the height: 2.1
The spherical cap has a surface of 44.862
The volume of the spherical cap is 37.407

Name the program file: spherical_cap.py
2. Fix the program below
There are a few bugs in the code below. The code should calculate the two solutions to quadratic equations like $ax^2+bx+c=0$. One issue is that the code was written for Python 2, but there are more problems... [hint: the main bugs are conceptual errors - those are particularly evil, because the Python interpreter will not report an error] The results should be rounded to two digits.
from math import sqrt
a = input("a: ")
b = input("b: ")
c = input("c: ")
q = sqrt(b**2 - 4 * a * c)
x1 = (-b + q) / 2a
x2 = (-b - q) / 2a
print x1, x2

3. Even numbers
Print the squares of all even numbers starting with 0 up to a value of the square supplied by the user.
A sample run of this program:
Upper limit: 48
0
4
16
36

Name the program file: even.py
4. Calculating a sum Write a program that adds up all numbers between 1 and a user-defined upper limit. However, only numbers that can be divided by a given positive integer without a remainder should be added. The upper limit has to be integral and must be included in the sum. [hint: one way to solve this is to read about the modulo operator in the documentation; however, if you use pencil and paper to really understand the problem, there is a nicer solution available]
A sample run of this program:
Denominator: 7
Upper limit: 63
Sum: 315

Name the program file: special_sum.py
5. Simple search Write a program that asks the user for two strings. The first string is a comma-separated list of relative filenames. The program should then count the non-overlapping occurrences of the second string in all the given files. The comparison must not be case sensitive. Note: non-overlapping means that searching for 'ha' in 'hahah' leads to two results while searching for 'hah' in 'hahah' leads to only one result as the second occurance of 'hah' would overlap with the first.
A sample run of this program:
Files: f1.txt,f2.txt
Needle: lorem
Occurrences: 12

Name the program file: search.py
6. Downloading data Write a script that downloads a file from the internet. The file contains a fictitious weather forecast for the next seven days. Once you can access the file's content, calculate the average temperature for the next weekend (Saturday and Sunday). Based on this average, the program should then suggest an activity for the weekend.
>25 C
swimming
>12 - 25 C
hiking
>5 - 12 C
watching movies
>-5 - 5 C
relaxing in the local hot springs
≤-5 C
skiing
The fictitious weather forecast is available at http://find-santa.eu/teaching/cms/data/fc.txt
A sample run of this program:
Next weekend, hiking would be a good activity.

7. VRPTW instances
The vehicle routing problem with time windows is a well known combinatorial optimization problem. There are many heuristics and local search methods available that help obtaining good results. However, before any instance can be solved, the input files have to be read.
Develop a small Python script that downloads the file r101.txt and then reads it line by line (using a for loop). Doing so, print the sum of the demand of all entries. [hint: ''.split(.) is your friend]
A sample run of this program:
Total demand: 1458.0

Name the program file: print_demand.py
8. Financial Data
Using your favorite web browser, go to http://finance.yahoo.com/ and search for a company of your choice. Then click on "Historical Data" and select a date range which provides at least 50 values. Click on Apply (even if you didn't adjust the date range) followed by "Download Data" to obtain the data in the CSV format.
Write a Python script that reads each data line's closing price. The script then needs to calculate the average closing price over the entire period. Print the average closing price (two digits after the decimal point) and indicate whether it is higher or lower than the most recent closing price.
A sample run of this program:
File to analyze: ${YOURFILE} The average closing price was${AVERAGE_CLOSING_PRICE}.
The most recent closing price (...) was ... above the average.

Name the program file: financial_data.py
9. Factoring of integers
Write a program that prints out all the factors of a given number.
A sample run of this program:
Integer: 60
60 = 2 * 2 * 3 * 5

Name the program file: factor.py
10. ROT13 (hard!)
ROT13 is a simple substitution cipher. Read about it at http://en.wikipedia.org/wiki/Rot13. It is built on the fact that each character has an integer ordinal (i = ord(c); c = chr(i)).
Read an entire file into a single string and convert it to uppercase (for simplicity). Then encrypt/ decrypt the text using ROT13. To translate the text, iterate over all characters in the string. Characters other than A-Z should not be changed. Test your code with the provided rot13.txt file. Besides asking the user for an input filename, the only output of the program must be the decoded content of the file. [note: you are not allowed to use Python's translate function or dictionaries; A has the ordinal 65, Z has the ordinal 90]
A sample run of this program:
File to decode: rot13.txt
[Patient, little bird - start working on this task...*]

* this is not the actual output as it would be a spoiler to know the result before even starting to try to figure out the solution yourself ;)
Name the program file: rot13.py