This assignment will give you a little practice in defining and working with classes. It uses no graphics.
Counter classYour first task is to define a class Counter for a
counter that counts down. When it gets down to 0 and counts down again,
it wraps back to a limit, minus 1. For example, if the limit is 60, the
counter’s value is 0, and it counts down, its next value is 59.
The Counter class must support the following
methods:
__init__(self, limit, initial = 0, min_digits = 1)
is automatically called by the Counter constructor (but you
knew that, right?). The parameters are the counter’s limit (60 in the
example above), an initial value, and a minimum number of digits
(explained below). If the initial value supplied as a parameter is
between 0 and limit–1, then that’s the counter’s initial value.
Otherwise, an error message is printed and the counter’s initial value
is limit–1.
get_value(self) just returns the counter’s value, as
an int.
__str__(self) returns the counter’s value, as a
string. If the counter’s value would print with fewer than the
min_digits parameter supplied to the __init__
method, then the string contains min_digits characters,
padded on the left with zeros. For example, if min_digits
is 4 and the counter’s value is 15, then the __str__ method
should return the string 0015.
tick(self) decrements the counter’s value, but if
the value would go negative, then it becomes limit–1. For example, if
the counter’s limit is 12 and its current value is 0, then after calling
tick, the counter’s value should be 11. This method also
returns to its caller a boolean value indicating whether it wrapped
around, i.e., did the value wrap from 0 back to limit–1.
True means that it wrapped, False means that
it did not.
Define instance variables as appropriate, though I’d be surprised if you needed anything other than three.
To pad with zeros in the __str__ method, you can
determine the length of the counter’s value as a string (by calling the
str function on the counter’s value), and then concatenate
as many zeros as necessary (the difference between
min_digits and the length of this string).
There are a couple of ways to create a string of a given number of
0s; let’s say we want to create a string of n 0s. The first way is to use
a loop. Start with an empty string, and repeatedly concatenate a
0 n times. The second
way uses another cool feature of Python. If you want a list or string
that is just a value repeated a number of times, you can use the
* operator. For example, '0' * 4 gives the
string 0000, because it says to repeat the string
0 four times. If the repeat count is zero or negative, you
get an empty string (which is just what you want here). This operator
works for lists, too, so that [0] * 4 gives the list
[0, 0, 0, 0], though you won’t need to work with lists for
this assignment.
Counter driverA driver is a piece of code that exists solely to exercise some other piece of code. A driver is typically not interesting in and of itself.
Write a driver for the Counter class. It should create
two or more Counter objects and demonstrate that all the
methods in the Counter class work properly by printing to
the console.
Timer classYour next task is to define a class Timer for a 24-hour
hours:minutes:seconds timer that counts down. It must have instance
variables that reference Counter objects for the hours,
minutes, and seconds. Your Timer class must support the
following methods:
__init__(self, hours, minutes, seconds) creates a
timer whose initial values for its hours, minutes, and seconds are given
by the parameters. This method must create three Counter
objects and save the references given back by the Counter
constructors in instance variables for the Timer object. If
any of the values given for hours, minutes, or seconds is out of range,
then the initial value used should be the value that the corresponding
Counter object would use.
__str__(self) returns a string giving the timer’s
current time, in the format hh:mm:ss. That is, two digits for the hours,
followed by a colon, followed by two digits for the minutes, followed by
a colon, followed by two digits for the seconds. For example, if the
timer currently reads 1 hour, 7 minutes, and 52 seconds,
__str__ should return the string
01:07:52.
tick(self) ticks down the timer by one second. For
example, if a timer reads 01:07:52, then after calling
tick, it should read 01:07:51. If a timer
reads 01:07:00, then after calling tick, it
should read 01:06:59. If a timer reads
01:00:00, then after calling tick, it should
read 00:59:59. Finally, if a timer reads
00:00:00, then after calling tick, it should
read 23:59:59.
is_zero(self) returns a boolean that is
True if the timer currently reads
00:00:00.
These methods should call the appropriate methods on the appropriate
Counter objects.
tick method of the Timer
classRemember that the tick method of Counter
not only ticks the Counter down, but it also returns a
boolean telling you whether the Counter wrapped. If you
call the tick method of Counter on the seconds
counter, and this call returns True, then you need to call
the tick method on the minutes counter. And if you call the
tick method of Counter on the minutes counter,
and this call returns True, then you need to call the
tick method on the hours counter. What about if you call
the tick method of Counter on the hours
counter, and this call returns True? It doesn’t matter; you
don’t have to do anything when the hours counter wraps.
Because each call of the tick method of
Counter does two things—decrements the
Counter’s value and returns a boolean telling you
whether the Counter wrapped—you need exactly one
call of tick for each of the three Counter
objects each time you tick the Timer. I was able to write
the body of the tick method of Timer in three
lines, each containing a call of tick on a
Counter (and possibly some other actions as well).
Timer driverFinally, write a driver for the Timer class. It should
start a timer at 01:30:00 and count it down to 00:00:00, printing to the
console all the times between and including 01:30:00 and 00:00:00.
Turn in counter.py, containing your Counter class;
timer.py, containing your Timer class; your driver for
Counter; and your driver for Timer. Also turn
in text files containing the console output from your
Counter driver and Timer driver.
The consequences of violating the Honor Code can be severe. Please always keep in mind the word and spirit of the Honor Code.