Problem

Python

Consider the simplest program for evaluating the formula $y(t) = v_0t-\frac{1}{2}gt^2$,

v0 = 3; g = 9.81; t = 0.6
y = v0*t - 0.5*g*t**2
print(y)

(A) Write a program that takes in the above necessary input data ($t$,$v_0$) as command-line arguments.

(B) Extend your program from part (A) with exception handling such that missing command-line arguments are detected. For example, if the user has entered enough input arguments, then the code should raise IndexError exception. In the except IndexError block, the code should use the input function to ask the user for the missing input data.

(C) Add another exception handling block that tests if the $t$ value read from the command line, lies between $0$ and $2v_0/g$. If not, then it raises a ValueError exception in the if the block on the legal values of $t$, and notifies the user about the legal interval for $t$ in the exception message.

Here are some example runs of the code,

$ ./projectile.py
Both v0 and t must be supplied on the command line
v0 = ?
5
t = ?
4
Traceback (most recent call last):
  File "./projectile.py", line 17, in <module>
    'must be between 0 and 2v0/g = {}'.format(t,2.0*v0/g))
ValueError: t = 4.0 is a non-physical value.
must be between 0 and 2v0/g = 1.019367991845056
$ ./projectile.py
Both v0 and t must be supplied on the command line
v0 = ?
5
t = ?
0.5
y = 1.27375
$ ./projectile.py 5 0.4
y = 1.2151999999999998
$ ./projectile.py 5 0.4 3
y = 1.2151999999999998

Solution

Python

Here is an example implementation.

#!/usr/bin/env python
import sys
g = 9.81
try:
    v0 = float(sys.argv[1])
    t = float(sys.argv[2])
except IndexError:
    print('Both v0 and t must be supplied on the command line')
    v0 = float(input('v0 = ?\n'))
    t = float(input('t = ?\n'))
except ValueError:
    print('v0 and t must be pure numbers')
    sys.exit(1)

if t < 0 or t > 2 * v0 / g:
    raise ValueError('t = {} is a non-physical value.\n'
                     'must be between 0 and 2v0/g = {}'.format(t,2.0*v0/g))
    sys.exit(1)

y = v0 * t - 0.5 * g * t ** 2
print('y = {}'.format(y))

Comments