- The Concept of Function
- The Basics of Using Functions
- Local and Global Variables
- Recursive Functions
- Games and More Games
- Chapter 4 Summary

## The Basics of Using Functions

I recommend the following approach for creating and calling user-defined functions:

- At the beginning of your program,
*declare*the function. - Somewhere in your program,
*define*the function. - Other functions can then call the function.

### Step 1: Declare (Prototype) the Function

A function declaration (or *prototype*) provides type information only. It has this syntax:

return_typefunction_name(argument_list);

The *return_type* is a data type indicating what kind of value the function returns (what it passes back). If the function does not return
a value, use **void**.

The *argument_list* is a list of zero or more argument names—separated by commas if there are more than one—each preceded by the corresponding
type. (Technically, you don’t need the argument names in a prototype, but it is a good programming practice.) For example,
the following statement declares a function named avg, which takes two arguments of type **double** and returns a **double** value.

double avg(double x, double y);

The *argument_list* may be empty, which indicates that it takes no arguments.

### Step 2: Define the Function

The function definition tells what the function does. It uses this syntax:

return_type function_name(argument_list) {statements}

Most of this looks like a declaration. The only thing that’s different is that the semicolon is replaced by zero or more statements between two braces ({}). The braces are required no matter how few statements you have. For example:

double avg(double x, double y) { return (x + y) / 2; }

The **return** statement causes immediate exit, and it specifies that the function returns the amount (x + y) / 2. Functions with no return
value can still use the **return** statement but only to exit early.

return;

### Step 3: Call the Function

Once a function is declared and defined, it can be used—or rather, *called*—any number of times, from any function. For example:

n = avg(9.5, 11.5); n = avg(5, 25); n = avg(27, 154.3);

A function call is an expression: As long as it returns a value other than **void**, it can be used inside a larger expression. For example:

z = x + y + avg(a, b) + 25.3;

When the function is called, the values specified in the function call are passed to the function arguments. Here’s how a
call to the avg function works, with sample values 9.5 and 11.5 as input. These are *passed* to the function, as arguments. When the function returns, the value in this case is assigned to z.

Another call to the function might pass different values—in this case, 6 and 26. (Because these are integer values, they are
implicitly converted, or *promoted*, to type **double**.)

#### Example 4.1. The avg() Function

This section shows a simple function call in the context of a complete program. It demonstrates all three steps: declare a function, define it, and call it.

**avg.cpp**

#include <iostream> using namespace std; // Function must be declared before being used. double avg(double x, double y); int main() { double a = 0.0; double b = 0.0; cout << "Enter first number and press ENTER: "; cin >> a; cout << "Enter second number and press ENTER: "; cin >> b; // Call the function avg(). cout << "Average is: " << avg(a, b) << endl; system("PAUSE"); return 0; } // Average-number function definition // double avg(double x, double y) { return (x + y)/2; }

### How It Works

This code is a very simple program, but it demonstrates the three steps I outlined earlier:

*Declare*(that is, prototype) the function at the beginning of the program.*Define*the function somewhere in the program.*Call*the function from within another function (in this case,**main**).

Although function declarations (prototypes) can be placed anywhere in a program, you should almost always place them at the beginning. The general rule is that functions must be declared before being called. (They do not, however, have to be defined before being called, which makes it possible for two functions to call each other.)

double avg(double x, double y);

The function definition for the avg function is extremely simple, containing only one statement. In general, though, function definitions can contain as many statements as you want.

double avg(double x, double y) { return (x + y)/2; }

The **main** function calls avg as part of a larger expression. The computed value (in this case, the average of the two inputs, a and
b) is returned to this statement in **main**, which then prints the result.

cout << "Average is: " << avg(a, b) << endl;

### Function Call a Function!

A program can have any number of functions. For example, you could have two functions in addition to **main**, as in the following version of the program. Lines that are new or changed are in bold.

**avg2.cpp**

#include <iostream> using namespace std; // Functions must be declared before being used.void print_results(double a, double b);double avg(double x, double y); int main() { double a = 0.0; double b = 0.0; cout << "Enter first number and press ENTER: "; cin >> a; cout << "Enter second number and press ENTER: "; cin >> b;// Call the function pr_results().print_results(a, b);system("PAUSE"); return 0; }// print_results function definition//void print_results(double a, double b) {cout << "Average is: " << avg(a, b) << endl;}// Average-number function definition // double avg(double x, double y) { return (x + y)/2; }

This version is a little less efficient, but it illustrates an important principle: You are not limited to only one or two functions. The program creates a flow of control as follows:

main() → print_results() → avg()

### Exercises

**Exercise 4.1.1.**Write a program that defines and tests a factorial function. The factorial of a number is the product of all whole numbers from 1 to N. For example, the factorial of 5 is 1 * 2 * 3 * 4 * 5 = 120. (Hint: Use a**for**loop as described in Chapter 3.)**Exercise 4.1.2.**Write a function named print_out that prints all the whole numbers from 1 to N. Test the function by placing it in a program that passes a number n to print_out, where this number is entered from the keyboard. The print_out function should have type**void**; it does not return a value. The function can be called with a simple statement:print_out(n);

#### Example 4.2. Prime-Number Function

Chapter 2 included an example that was actually useful: determining whether a specified number was a prime number. We can also write the prime-number test as a function and call it repeatedly.

The following program uses the prime-number example from Chapters 2 and 3 but places the relevant C++ statements into their own function, is_prime.

**prime2.cpp**

#include <iostream> #include <cmath> using namespace std; // Function must be declared before being used. bool prime(int n); int main() { int i; // Set up an infinite loop; break if user enters 0. // Otherwise, evaluate n from prime-ness. while (true) { cout << "Enter num (0 = exit) and press ENTER: "; cin >> i; if (i == 0) // If user entered 0, EXIT break; if (prime(i)) // Call prime(i) cout << i << " is prime" << endl; else cout << i << " is not prime" << endl; } system("PAUSE"); return 0; } // Prime-number function. Test divisors from // 2 to sqrt of n. Return false if a divisor // found; otherwise, return true. bool prime(int n) { int i; for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) // If i divides n evenly, return false; // n is not prime. } return true; // If no divisor found, n is prime. }

### How It Works

As always, the program adheres to the pattern of 1) declaring function type information at the beginning of the program (*prototyping* the function), 2) defining the function somewhere in the program, and 3) calling the function.

The prototype says that the prime function takes an integer argument and returns a **bool** value, which will be either **true** or **false**. (Note: If you have a really old compiler, you may have to use the **int** type instead of **bool**.)

bool prime(int n);

The function definition is a variation on the prime-number code from Chapter 3, which used a **for** loop. If you compare the code here to Example 3.2 on page 75, you’ll see only a few differences.

bool prime(int n) { int i; for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) // If i divides n evenly, return false; // n is not prime. } return true; // If no divisor found, return true. }

Another difference is that instead of setting a Boolean variable, is_prime, this version returns a Boolean result. The logic here is as follows:

For all whole numbers from 2 to the square root of n,

If n is evenly divisible by the loop variable (i),

Return the value false immediately.

Remember that the modulus operator (%) carries out division and returns the remainder. If this remainder is 0, that means
the second number divides the second evenly—in other words, it is a *divisor* or *factor* of the second number.

The action of the **return** statement here is key. This statement returns immediately—causing program execution to exit from the function and passing
control back to **main**. There’s no need to use **break** to get out of the loop.

The loop in the main function calls the prime function. The use of a **break** statement here provides an exit mechanism, so the loop isn’t really infinite. As soon as the user enters 0, the loop terminates
and the program ends. Here I’ve put the exit lines in bold.

while (true) { cout << "Enter num (0 = exit) and press ENTER: "; cin >> i;if (i == 0)// If user entered 0, EXITbreak;if (prime(i)) // Call prime(i) cout << i << " is prime" << endl; else cout << i << " is not prime" << endl; }

The rest of the loop calls the prime function and prints the result of the prime-number test. Note that the prime function, in this case, returns a true/false value, and so the call to prime(i) can be used as an if/else condition.

### Exercises

**Exercise 4.2.1.**Optimize the prime-number function by calculating the square root of n only once during each function call. Declare a local variable sqrt_of_n of type**double**. (Hint: A variable is local if it is declared inside the function.) Then use this variable in the loop condition.**Exercise 4.2.2.**Rewrite**main**so that it tests all the numbers from 2 to 20 and prints out the results, each on a separate line. (Hint: Use a**for**loop, with i running from 2 to 20.)**Exercise 4.2.3.**Write a program that finds the first prime number greater than 1 billion (1,000,000,000).**Exercise 4.2.4.**Write a program that lets the user enter any number n and then finds the first prime number larger than n.