Exercise

Reservation 5

We will use the previous Reservation class to handle the reservation of a new customer. Write a function called reservation_5 with 4 parameters:

• reservations, a list of previous reservations (each object of class Reservation).
• all_seats, a list of all seats in the theater
• name, name of a new customer who wants to buy tickets.
• count, the number of seats he/she wants to reserve.

The function should search for count many consecutive, empty seats. If you find the appropriate seats, then return an object of type Reservation which contains the new reservation (name and the reserved seats). If you cannot find such seats then return a None.

Hint: Use the solutions of the previous exercises.

Reservation 6

Modify he previous reservation_5 function, if there are not enough seats then instead of doing nothing, raise a RuntimeError exception and the error message should be: "Not enough seats!"

The new function should be called reservation_6. You have to do the previous 5 first.

Divisor Iterate

Write a class which is iterable and iterates over the divisors of a given number. The class should be called Divisors

Its constructor should store one positive integer. Define the __iter__ and __next__ methods. When you iterate over it, return the divisors of the number.

For example:

for i in Divisors(6):
print i
should result:
1
2
3
6

Hint: iter should return self, but next should return an integer.

range

Write an iterable class like range, but without returning a whole list, but storing only the actual element.

class Range:
def __init__( ... ):
...
def __iter__( ... ):
...
def __next__( ... ):
...
• Its constructor should have one parameter: a number or a string. The iteration should go up that number, from 0 with 1 steps.
• If the number is not positive, then the iteration should take 0 steps.
• If you get a string then try to convert it to a number. It it cannot be converted, then raise a ValueError exception.
• If it is a valid integer, then calculate with that.
• If you get the string "inf" then make the iteration go endless (infinite loop)!

Shapes

Write a class called Shape.

• Let it have two members: x and y, the coordinates of the shape on the plane (center of mass).
• Define a move method, with one parameter v: a list of length 2, a vector to translate the shape with. After this method the coordinates should be changed.

Define the following classes as children of Shape:

• Ellipse with additional parameters (except the (x, y) coordinates): a and b the x and y axes radii
• Rectangle with additional parameters (except the (x, y) coordinates) a and b the length of the sides

Write an area method for both, which calculates the area!

Define an equation method for printing the equation of the Ellipse! Something like:

((x-1)/2)^2 + ((y-2)/3)^2 = 1

Inheritance and constructors

If the child class (e.g. Ellipse) you want to call the parents class' constructor then you have two ways:

class B(A):
def __init__(self, x, y, a, b):
A.__init__(self, x, y)
# OR
super().__init__(x, y)

The first explicitly calls the parents __init__

A.__init__(self, x, y)

The second one calls the parent of B which happens to be A:

super().__init__(x, y)