# 7.5. Functions Calling Functions - 1¶

Much in the same way we can use a procedure `drawSquare`

to help write code for a more
complex procedure like `drawGrid`

, we can use existing functions to help write new functions.

When solving complex problems, we can use this trick to avoid repeating code and to make abstractions that make a program easier to read and write.

Say we are starting with the coordinates of the three points of a triangle and we want to
calculate the area of the shape. There is a formula called *Heron’s formula* that we can use
to find the area of a triangle: \(\sqrt{s (s - a) (s - b) (s - c)}\) where **s** is the
semi-perimeter (half the perimeter) and **a, b, c** are the lengths of the three sides.

That sounds too complex to do in a short amount of code. So let’s break down the problem. Before we can use that formula, we need to know the lengths of the three sides. We can use the distance formula to calculate them: \(\sqrt{(x2-x1)^2 + (y2-y1)^2}\). Let’s make a function to do that job.

When designing functions, we need to define them in terms of their inputs (parameters) and
their outputs (what they return). Our `distance`

functions will take in two x,y pairs and it
will return the distance between them:

```
def distance(x1, y1, x2, y2):
Do work to calculate distance.
return distance
```

Let’s start by writing that and testing it. We will make a function `distance`

that has parameters for
the x and y of two different points.

This program has the function, and tests for `sideA`

and `sideB`

. Try running it. Then
add a test for `sideC`

that connects point1 and point3. Call the distance formula with the correct
arguments and store the result into `sideC`

(Hint, the correct answer is
~3.16, but you must actually use the distance function to calculate it.)