IPC144 Lab #5 - Functions (Mr. Saul's Sections)
Weekly Tip: The value of each argument in a function call is
copied into the corresponding function parameter.
The scope of each function parameter is the body
of the function. Each parameter is distinct from
its corresponding argument in the function call.
In this lab, you will work with functions. As with the previous labs, if you
get stuck, don't be shy about asking for help - that is what the lab sessions are for.
NOTE: When you have completed this lab, and placed answers into the file called "lab5.txt", follow the instructions (at the bottom of this lab) to submit your answers to Murray Saul's e-mail account...
Start by compiling and testing the following program (call it lab5a.c):
#include <stdio.h>
#include <math.h>
/* The distance between two points is the square root of
the sum of the squares of the differences between the
matching coordinates.
This function returns the distance between points (x,y)
and (x1,y1). The return value is a double.
*/
double distance(double x, double y, double x1, double y1) {
double dx, dy;
dx = x - x1;
dy = y - y1;
return sqrt(dx * dx + dy * dy);
}
main() {
double x1, y1, x2, y2;
printf("Enter the x and y coordinates of a point: ");
scanf("%lf %lf", &x1, &y1);
printf("Enter the x and y coordinates of another point: ");
scanf("%lf %lf", &x2, &y2);
printf("The distance between those two points is %.3lf\n",
distance(x1, y1, x2, y2));
}
- On phobos, no matter how correctly you've typed in this program, it
won't compile properly even though no syntax errors are found.
You should receive an error message to the effect that the compiler
cannot find the sqrt (square root) function, which is declared in
the header file <math.h>. This is becuase on Unix systems, the "math" library is not normally searched,
unless you specifically indicate that it should be searched. In Unix, the library whose
functions are declared in <math.h> is /usr/lib/libm.a
You can specify this library by compiling as follows:
cc lab5a.c /usr/lib/libm.a
Test the program by using "0 4" and "3 0" as the data points.
There is a shortcut that doesn't require you to remember the library name and path.
You can search the math library by adding the switch "-lm" to the
compile command line. The command line switch -lm means "also
search the library named libm.a in the standard library directory". For example, you can recompile with the command:
cc lab5a.c -lm
Note that the library whose functions are declared in <stdio.h>
is automatically searched, so you don't have to state that
this particular library should be searched.
- Carefully note the relationship between the main function's
variables x1, y1, x2, and y2, and the distance function's
variables x, y, x1, and y1.
To which variables in distance are main's x1 and y1 related?
_________________________________________________________
To which variables in distance are main's x2 and y2 related?
_________________________________________________________
Note that the dx and dy variables used in distance are totally
unknown to main. We say that the scope of these variables is the body of the
function distance.
- Copy lab5a.c to lab5b.c. In lab5b.c, change the order of the "distance" function and the "main"
function so that main appears before distance.
(If you are using nled to type in your programs, an easy way to
do this is to move to the start of main and press <Esc> then b
to "mark the beginning of a block". Then move just past the end
of main and press <Esc> then e to "mark the end of the block".
Finally move just before the distance function and press <Esc>
then m to "move the block".)
Now recompile your reordered source. What message did you get?
________________________________________________
Now declare the distance function before main, by prototyping
it with the line:
double distance(double x, double y, double x1, double y1);
Note the semi-colon at the end of this statement, as compared to the
function heading where no semi-colon follows the parentheses.
Now recompile your updated source. Did it successfully compile?
_________________________________________________
In general, if you don't want to worry about the order in which
you write functions, you should prototype each function before you
start to code any of them. Note that you never need to prototype main, however, since your
own code will never call it.
- Copy lab5b.c to lab5c.c. In lab5c.c, take out the names x, y, x1 and y1 from the distance function
prototype (but not from the function header line for distance). Now recompile your source
code. Did it compile successfully?
__________________________________________
Note that the names that you give to the parameters are only important when
you code the function distance. If you are specifying a function
prototype the compiler only needs to know the datatype of each
parameter; names are optional for parameters in function prototypes.
- Copy lab5c.c to lab5d.c. In lab5d.c, change the data types of the main function's x1, y1, x2 and y2
variables from double to int (don't forget to also change the format
strings in the scanf statements), but leave the distance function
unchanged. Recompile your source and test the program. Did you get any error messages?
__________________________________________________________________
One of the purposes of prototyping a function before calling it
is to let the compiler know if it needs to perform any automatic
data conversions (int to double, in this case) when copying the
argument data to the function.
- [If you have time] Modify the program so that it takes 3
dimensional coordinates (x, y and z coordinates) for each point. Note:
The distance between two 3-D points is the square root of the
sum of the 3 squares of the differences between all three
matching coordinates.
Submission Requirements:
If you are in Murray Saul's class, issue the following command
to send your lab #5 answers to Murray Saul:
mail -s "144lab5" -c $USER@learn.senecac.on.ca murray.saul@senecac.on.ca < lab5.txt
The option -s "144lab5" makes subject line appear as "144lab5" so instructor can filter these e-mails in a directory to collect all lab5 submissions.
The option -c $USER@learn.senecac.on.ca sends a copy of the e-mail message to YOUR learn account. The variable $USER is your Matrix id name assuming that you are issuing this command when logged into your Matrix account. Please keep this e-mail for the remainder of this term as proof that you sent your lab by the required deadline...