Professional Documents
Culture Documents
Lecture 05
Lecture 05
Lecture 05
Functions as Procedures
1 / 24
Lecture Outline
Defining procedures
Function call statement / return statement
Procedures for
– Program output
– Multiple function output
Function output parameter
Example: finding mean and variance
2 / 24
C Functions
# of arguments
0 multiple
0 rarely used procedures
# of return values
1 rarely used value-returning functions
3 / 24
Function Header
functionHeader
,
parameter
type identifier
4 / 24
Function Call and Return Statements
functionCallStatement
identifier ( ) ;
expression
,
returnStatement
return ;
expression
5 / 24
Procedure: Program Output
6 / 24
Procedure: Multiple Function Output
A function can only return at most one value
Example: Given a time duration (in seconds), compute the
equivalent number of hours, minutes and seconds
Solution #1: do-it-yourself!
#include <stdio.h>
int main(void)
{
int t, h, m, s;
printf("Enter duration (secs): ");
scanf("%d", &t);
h = t/3600;
m = (t%3600)/60;
s = t%60;
printf("Duration: %d:%d:%d\n", h,m,s);
return 0;
}
7 / 24
Procedure: Multiple Function Output
Solution #2: Get a procedure to do it. Does this work?
#include <stdio.h>
void splitTime(int t, int h, int m, int s);
int main(void)
{
int t, h, m, s;
printf("Enter duration (secs): ");
scanf("%d", &t);
splitTime(t,h,m,s);
printf("Duration: %d:%d:%d\n", h,m,s);
return 0;
}
void splitTime(int t, int h, int m, int s)
{
h = t/3600;
m = (t%3600)/60;
s = t%60;
return;
}
8 / 24
Pass-by-Value Revisited
Recall pass-by-value
main splitTime
9999 t 9999 t
?a h ?a h
*
9999,?a,?b,?c
?b m ?b m
?c s ?c s
splitTime(t,h,m,s);
9 / 24
Pass-by-Value Revisited
main splitTime
9999 t 9999 t
?a h 2 h
*
9999,?a,?b,?c
?b m 46 m
?c s 39 s
splitTime(t,h,m,s);
10 / 24
Variable Access Across Functions
11 / 24
Function Output Parameter
12 / 24
Function Output Parameter
main splitTime
t 9999 9999 t
h ?a h
m ?b m
s ?c s
splitTime(t,&h,&m,&s); -
9999,&h,&m,&s
13 / 24
Function Output Parameter
main splitTime
t 9999 9999 t
h 2 h
m 46 m
s 39 s
splitTime(t,&h,&m,&s); -
9999,&h,&m,&s
14 / 24
Example: Swapping Variable Contents
15 / 24
Example: Swapping Variable Contents
16 / 24
Example: Finding Mean and Standard Deviation
17 / 24
Using only the main function
#include <stdio.h>
#include <math.h>
int main(void)
{
int n=0;
double data, sum=0, sumSq=0, mean, stdev;
scanf("%lf", &data);
while (data >= 0)
{
sum = sum + data;
sumSq = sumSq + (data * data);
n++;
scanf("%lf", &data);
}
if (n > 0)
{
mean = sum/n;
stdev = sqrt((sumSq - (sum*sum/n))/(n));
printf("mean=%f; stdev=%f\n", mean, stdev);
}
else
printf("No data\n");
return 0;
}
18 / 24
Modularizing readData
#include <stdio.h>
#include <math.h>
void readData(int *n, double *sum, double *sumSq);
int main(void)
{
int n=0;
double sum=0, sumSq=0, mean, stdev;
readData(&n,&sum,&sumSq);
if (n > 0)
{
mean = sum/n;
stdev = sqrt((sumSq - (sum*sum/n))/(n));
printf("mean=%f; stdev=%f\n", mean, stdev);
}
else
printf("No data\n");
return 0;
}
19 / 24
Modularizing readData
/*
readData reads n values until a sentinel (< 0) and outputs
the values of n, sum and sumSq (sum of square values)
Precondition: none
Postcondition: n >= 0, sum >= 0, sumSq >= 0
*/
void readData(int *n, double *sum, double *sumSq)
{
double data;
*n = 0; *sum = 0; *sumSq = 0;
scanf("%lf", &data);
while (data >= 0)
{
*sum = *sum + data;
*sumSq = *sumSq + (data*data);
(*n)++;
scanf("%lf", &data);
}
return;
}
20 / 24
Modularizing readData for End-of-File Marker
Use End-of-File marker instead of sentinel value
scanf function returns EOF when end-of-file is reached
/*
readData reads n values until EOF and outputs
the values of n, sum and sumSq (sum of square values)
Precondition: none
Postcondition: n >= 0, sum >= 0, sumSq >= 0
*/
void readData(int *n, double *sum, double *sumSq)
{
double data;
*n = 0; *sum = 0; *sumSq = 0;
while (scanf("%lf", &data) != EOF)
{
*sum = *sum + data;
*sumSq = *sumSq + (data*data);
(*n)++;
}
return;
}
21 / 24
Modularizing findStats
#include <stdio.h>
#include <math.h>
void readData(int *n, double *sum, double *sumSq);
void findStat(int n, double sum, double sumSq,
double *mean, double *stdev);
int main(void)
{
int n=0;
double sum=0, sumSq=0, mean, stdev;
readData(&n,&sum,&sumSq);
if (n > 0)
{
findStat(n,sum,sumSq,&mean,&stdev);
printf("mean=%f; stdev=%f\n", mean, stdev);
}
else
printf("No data\n");
return 0;
}
22 / 24
Modularizing findStats
/*
readData reads n values until EOF and outputs
the values of n, sum and sumSq (sum of square values)
Precondition: none
Postcondition: n >= 0, sum >= 0, sumSq >= 0
*/
void readData(int *n, double *sum, double *sumSq)
{
double data;
*n = 0; *sum = 0; *sumSq = 0;
while (scanf("%lf", &data) != EOF)
{
*sum = *sum + data;
*sumSq = *sumSq + (data*data);
(*n)++;
}
return;
}
/*
findStats outputs the mean and stdev of n values given
n, sum and sumSq (sum of square values).
Precondition: n > 0
*/
void findStat(int n, double sum, double sumSq, double *mean, double *stdev)
{
*mean = sum / n;
*stdev = sqrt((sumSq - (sum*sum)/n)/(n));
return;
}
23 / 24
Lecture Summary
24 / 24