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 0
s; let’s say we want to create a string of n 0
s. 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.