Lab Dates: Thursday, 18 October & Wednesday, 24 October 2012

Today's lab focuses on functions from Chapter 6.

### Graphing functions with functions

Since our first day of class, we have been using functions. This chapter revisits functions in more depth. In python, we indicate a function by following a name with parenthesis. For example, print() and main() are examples of functions. The print() is a built-in function in python, while the main() function is one that we write.

To define a function, we say:

```	def functionName(anyInputsGoHere):

```

Let's write a program that defines multiple functions. Start your program with the following:

```# Demonstration program to graph function entered by user.
# Prof. Melvin Fitting
# October 24, 2011

from graphics import *
from math import *

def main():
print("This program will graph a function...")
#Get user data
#Set up window
#Graph the function
#Close the window

main()
```
We've set up an outline, in comments for our program. Let's fill in each part with a function. To make our main program easier to read, we will use functions, each of which does one part of the program. We will give our functions descriptive names so by reading through the main function we have an idea of what the program does.

We first need to get user data, so, let's make a function called getUserData(). It will take no input (also called parameters) but will need to return the data the user entered.

```# Demonstration program to graph function entered by user.
# Prof. Melvin Fitting
# October 24, 2011

from graphics import *
from math import *

def main():
print("This program will graph a function...")
#Get user data
function, left, right, top, bottom = getUserData()
#Set up window
#Graph the function
#Close the window

def getUserData():
print("This program graphs an arbitrary math function.")
print("You must enter the x and y ranges to be displayed.")
left = eval(input("Enter x coordinate for left edge of window: "))
right = eval(input("Enter x coordinate for right edge of window: "))
bottom = eval(input("Enter y coordinate for lower edge of window: "))
top = eval(input("Enter y coordinate for upper edge of window: "))
function = input("Enter function expression to be graphed, with x as variable: ")
return function, left, right, top, bottom

main()
```
What happens when you run this program? The main() function is called first. It prints the message, This program ... and then calls the getUserData() function. The getUserData() function is defined below the main() function. It prints a message and then prompts the user for the coordinates of the window and the function that should be graphed. Try running your program. Some inputs that you can use to test the program are: 0, 10, -100, 100, sin(x)*x**2. Nothing much will happen yet, since all we have done is asked for input.

Let's add more to the program. The next step is to set up the window. Add to the main() function:

```	win = setUpWindow(left, right, top, bottom, function)
```
(this line should go right below the #Set up window comment).

After the getUserData, add in the function definition for the function that will set up a window:

```def setUpWindow(left, right, top, bottom, function):
win = GraphWin("Graph of " + function, 500, 500)
win.setCoords(left, bottom, right, top)
Line(Point(left, 0), Point(right, 0)).draw(win)
Line(Point(0, bottom), Point(0, top)).draw(win)
return win
```

Take a look at you program before you run it. When you type main(), it calls (or `invokes') the function main(). Inside main(), a message is printed, then there is a call to getUserData() function which returns 5 values that are assigned to the variables, function, left, right, top, bottom. The next line calls the function setUpWindow(). setUpWindow() takes 5 input parameters and creates a window object, win.

Looking at the main() function, there are still two last items to fill out in our outline of comments:

```    #Graph the function
drawGraph(win, function, left, right)
#Close the window
win.getMouse()
win.close()
```
We need to add in a definition for the function drawGraph()
```def drawGraph(win, function, left, right):
increment = (right-left)/100
x = left
rightPoint = Point(x, eval(function))
for n in range(100):
leftPoint = rightPoint
x += increment
rightPoint = Point(x, eval(function))
Line(leftPoint, rightPoint).draw(win)
```
Add this function definition after the one for setUpWindow(). We now have a complete program that makes multiple function calls. Try running it with the inputs: 0, 10, -100, 100, sin(x)*x**2.

Here's an overview of what happens when you run this program:

1. When you type main() function, the statements in the body of the function are executed one after another.
2. First it prints a message to the screen.
3. Next, it calls getUserData() which asks the user for data to draw a window and what function should be graphed. These are returned to the main() and stored in the variables function, left, right, top, bottom.
4. Next, using the variables function, left, right, top, bottom as inputs, we call the setUpWindow() function which creates a window and returns it to the main() function.
5. Next, we call the drawGraph() function. It takes 4 inputs: the window we're drawing on, the function to be drawn, and the left and right range of the window. This method draws the function by breaking it down into 100 short intervals, and drawing a line across each interval. The x coordinate starts at the left side, and goes up by 1/100's of the width each time. The y coordinate is the value of the function at each value of x.

After completing your program, go to Labs in Blackboard and click on the link: Lab 7 and answer the questions (if you do not get the answers right the first time, try again until you do). Use the file upload interface to upload your program. Remember to click the Submit button before closing the lab exercise.

With the remaining time, start Problem Set 6.