# Topic #5b – Putting Things Together¶

What have we seen so far?

Values

Types

Variables

Print

Input

Functions

Booleans

Logic

If/Else

A car rental place needs our help. They want a simple program to calculate how much a customer is to be charged based on their rental agreement, age, how far they drove, and how long they had the car.

**Rules:**

- We will get the customer’s:
Age

Rental agreement classification code (B or D)

Number of days rented

Starting odometer reading

Ending odometer reading

- If the classification code is
**B** Base charge of $20.00/day

Plus $0.30 for every km driven

- If the classification code is
- If the classification is
**D** Base charge of $50.00/day

Plus $0.30 for every km driven above the 100km/day average allowance

- If the classification is
All renters under the age of 25 are charged an additional $10.00/day

Print out the final total cost

**Step 1**

Freak out

**Step 2**

Let’s take a deep breath and break this problem down

- Half of the description is IO
Let’s save this for last because it’s super easy

- The only beefy part of this is the calculation
Freak out again

Then realize we can break it down into bits and pieces that we can solve

**Let’s look at the requirements:**

*If*the classification code is BBase charge of $20.00/days

Plus $0.30

*for every km*driven

*If*the classification is DBase charge of $50.00/days

Plus $0.30

*for every km*driven*above*the 100km/day*average*allowance.

**What do I see?**

- I see
`if`

statements there Well I know how to do that

- I see
- I see that there is some math, which isn’t too bad
I can do simple math

- Looks like we need to know the total kms
I can do that

- Need to know the average number of kms driven
Easy stuff

- Need to know how many kms above 100 we are
So just figure out if a number is greater than 100?

**Step 3:**

Based on this, I will write:

Function to calculate the kms

Function to calculate average kms

Function to calculate the number of kms above the 100 allowance

Function to calculate the total charge

Warning

THERE ARE LITERALLY INFINITE WAYS YOU COULD DO THIS. THIS IS JUST ONE!

- Function to calculate the total number of kms. What do we know?
Odometer readings!

```
1def total_kms(odometer_start, odometer_finish):
2 '''
3 This function calculates the total number of kilometers driven based
4 on starting and ending odometer readings.
5
6 :param odometer_start: The number of kms the car had before renting
7 :param odometer_finish: The number of kms the car had after rending
8 :return: The total kms driven during the rental period
9 '''
10
11 return odometer_finish - odometer_start
```

**Who thought that was too easy?**

- Function to calculate the daily average number of kms. What do we know?
We have a function to calculate the total kms

We also know the number of days the car was rented.

```
1def average_kms_per_day(num_days, num_kms):
2 '''
3 Calculate the average number of kilometers driven per day
4 over the rental period
5
6 :param num_days: The total number of days the car was rented
7 :param num_kms: The total number of kilometers driven during the rental period
8 :return: The average number of kilometers driven per day
9 '''
10
11 return num_kms/num_days
```

**Who thought that was also too easy?**

- Ok. Now for something harder… Number of kms over the daily average allowance. What do we know?
Function to calculate the daily average

```
1def num_kms_above_average(num_days, num_kms):
2 '''
3 Calculates the number of kms the renter went over of their daily allowance.
4 We will use the customer's average daily kms.
5
6 :param num_days: Number of days the renter had the car
7 :param num_kms: Number of kms the renter drove in total
8 :return: The number of kms over 100 they went (return 0 if it's less than 100)
9 '''
10
11 # Calculate the number of kms traveled per day.
12 kms_per_day = average_kms_per_day(num_days, num_kms)
13
14 # If the average kms traveled is above 100,
15 # return how much above
16 if kms_per_day > 100:
17 return kms_per_day - 100
18 else:
19 return 0
```

**Who thought that wasn’t too bad?**

- Now for the tough one… calculate the total cost. What do we know?
age

class

odometer readings

number of days

the above functions

```
1def calculate_total_charge(num_days, age, code, odometer_start, odometer_finish):
2 '''
3 Calculate how much the renter needs to be charged based on the classification,
4 the number of kms travelled and the age of the driver.
5
6 :param num_days: Number of days the car was rented.
7 :param age: Age of the driver.
8 :param code: The classification code (B ord D).
9 :param odometer_start: Odometer when the renter took the car.
10 :param odometer_finish: Odomoter when the renter returned the car.
11 :return: The amount to charge the renter.
12 '''
13
14 # Setup a variable for our total charge
15 total_charge = 0
16
17 # Calculate the number of kilometres traveled.
18 total_kms_traveled = total_kms(odometer_start, odometer_finish)
19
20 # If B, $20/day + km charge of 0.30/km
21 if code == 'B':
22 total_charge = 20.00 * num_days + 0.30 * total_kms_traveled
23 # If D, $50 base charge, + 0.30/km OVER 100km
24 else:
25 total_charge = 50.00 * num_days + 0.30 * num_kms_above_average(num_days, total_kms_traveled)
26
27 # if they're young, add an additional $10/day charge.
28 if age < 25:
29 total_charge += (10 * num_days)
30
31 # return the result
32 return total_charge
```

**Hmm, defo was tricker, but still not too bad at all!**

Now just do the IO part, which we have done a bunch of times before

```
1age = int(input('Age: '))
2classification = input('Classification Code: ')
3number_of_days = int(input('Number of Days Rented: '))
4starting_kms = float(input('Odometer reading at start: '))
5ending_kms = float(input('Odometer reading at end: '))
6
7total_charge = calculate_total_charge(number_of_days, age, classification, starting_kms, ending_kms)
8
9print('The total charge is: ' + str(total_charge))
```

Let’s try: Google colab.

Activity

- Think about how you would write this differently
Would you use all the same functions?

Would you change how the functions worked?

Would you move where you called the functions?

Would you add additional functions?

Would you use constants? (say yes)

So, why did I write it the way I did?

Honestly, just

*because*No other reason other than it was the way I wrote it

What matters here is that it worked

But I could write this so so so many other ways and still have it work

This is NORMAL