Title: Modular%20Programming%20With%20Functions
1Modular Programming With Functions
CS 2073 Computer Programming w/Eng. Applications
Ch 4
Turgay Korkmaz Office SB 4.01.13 Phone (210)
458-7346 Fax (210) 458-4437 e-mail
korkmaz_at_cs.utsa.edu web www.cs.utsa.edu/korkmaz
2Name Addr Content
Lecture 16
Lecture
34.1 Modularity
- How do you solve a big/complex problem?
- Divide it into small tasks and solve each task.
Then combine these solutions.
44.1 Modularity (contd)
- In C we use functions also referred to as modules
to perform specific tasks that we determined in
our solution
Shows how the program separated into tasks and
which tasks reference other tasks. NOTE It does
NOT indicate the sequence of steps in the program!
5Advantages of using modules
- Modules can be written and tested separately
- Modules can be reused
- Large projects can be developed in parallel
- Reduces length of program, making it more
readable - Promotes the concept of abstraction
- A module hides details of a task
- We just need to know what this module does
- We dont need to know how it does it
64.2 Programmer Defined Functions
- Every C program starts with main()function
- Additional functions are called or invoked when
the program encounters function names - Functions could be
- Pre-defined library functions (e.g., printf, sin,
tan) or - Programmer-defined functions (e.g., my_printf,
area) - Functions
- Perform a specific task
- May take arguments
- May return a single value to the calling function
- May change the value of the function arguments
(call by reference)
7Function definition
return_type function_name (parameters)
declarations statements
int my_add_func(int a, int b) int sum sum
a b return sum
8Programmer-Defined Functions Terminology
- Function Prototype describes how a function is
called - int my_add_func(int a, int b)
- Function Call
- result my_add_func(5, X)
- Function implementation
- int my_add_func(int a, int b)
-
-
-
- Function parameters
- Formal parameters
- Actual parameter
- Formal parameters must match with actual
parameters in order, number and data type. - If the type is not the same, type conversion will
be applied (coercion of arguments). But this
might cause some errors (double?int) so you need
to be careful!
9Example Pre-defined Functions
So far, we used several pre-defined
functions! include ltstdio.hgt include
ltmath.hgt int main(void) double angle
printf(Input angle in radians \n)
scanf(lf, angle) printf(The sine of the
angle is f\n, sin(angle) ) return
0
double sin(double radian) double sin(double
radian) / details of computing sin /
10Example Programmer-defined Functions
- include ltstdio.hgt
- int main(void)
-
- double x1,y1,x2,y2, dist
- printf(Enter x1 y1 x2 y2 )
- scanf(lf lf lf lf, x1,y1,x2,y2)
- dist sqrt(pow((x2-x1),2)
- pow((y2-y1),2))
- printf(Distance is lf\n, dist)
- return 0
- include ltstdio.hgt
- double distance(double x1,y1,x2,y2)
- int main(void)
-
- double x1,y1,x2,y2, dist
- printf(Enter x1 y1 x2 y2 )
- scanf(lf lf lf lf, x1,y1,x2,y2)
- dist distance(x1,y1,x2,y2)
- printf(Distance is lf\n, dist)
- return 0
-
- double distance(double x1,y1,x2,y2)
-
- return sqrt(pow((x2-x1),2)
- pow((y2-y1),2))
11Exercise
(6,8)
(-3,5)
(4,-1)
- Suppose you are given the coordinate points of a
triangle as shown above, write a program that can
find the length of each edge - User enters (x1, y1), (x2, y2), and (x3, y3)
12Value Returning Functions
- Function returns a single value to the calling
program - Function definition declares the type of value to
be returned - A return expression statement is required in the
function definition - The value returned by a function can be assigned
to a variable, printed, or used in an expression
13Void Functions
- A void function may be called to
- perform a particular task (clear the screen)
- modify data
- perform input and output
- A void function does not return a value to the
calling program - A return statement can be used to exit from
function without returning any value
14Exercise void function
include ltstdio.hgt void print_i_star(int
i) main() int i for (i1 ilt5 i)
print_i_star( i ) void
print_i_star(int i) int j for (j1 jlti
j) printf() printf(\n)
return
- Write a program to generate the following output?
for (i1 ilt5 i) for (j1 jlti j)
printf() printf(\n)
15Example value returning function
n!n(n-1)1, 0! 1 by definition
int fact(int n) int factres 1
while(ngt1) factres factresn n--
return(factres)
16Example use fact()
include ltstdio.hgt int fact(int n) / prototype
/ int main(void) int t 5,s s
fact(t) fact(t1) printf(result is d\n,
s) return 0
t 5
s ?
Function call
17Example execution of factorial function (contd)
fact( 5 )
t 5
s ?
n 5
factres 1
int fact(int n) int factres 1
while(ngt1) factres factresn n--
return(factres)
18Example execution of factorial function (contd)
t 5
s ?
n 5 4 3 2 1
factres 1 5 20 60 120
int fact(int n) int factres 1
while(ngt1) factres factresn n--
return(factres)
19Example execution of factorial function (contd)
include ltstdio.hgt int fact(int n) / prototype
/ int main(void) int t 5,s s 120
fact(t1) printf(result is d\n, s)
return 0
t 5
s ?
Function call
20Example execution of factorial function (contd)
fact( 6 )
t 5
s ?
n 6
factres 1
int fact(int n) int factres 1
while(ngt1) factres factresn n--
return(factres)
t1
21Example execution of factorial function (contd)
t 5
s ?
n 6 5 4 3 2 1
factres 1 6 30 120 360 720
int fact(int n) int factres 1
while(ngt1) factres factresn n--
return(factres)
22Example execution of factorial function (contd)
include ltstdio.hgt int fact(int n) / prototype
/ int main(void) int t 5,s s 120
720 printf(result is d\n, s) return
0
t 5
s 840
result is 840
23Example reuse of factorial function
- Write a statement to compute
- Enter X, Z, K, D
-
- y(fact(X)fact(Z)5)/(fact(K)-fact(D))
24Example reuse of factorial function in another
function
- Write a select function that takes n and k and
computes n choose k where - int select(int n, int k)
-
- return fact(n)/(fact(n-k)fact(k))
-
25Name Addr Content
Lecture 17
Lecture
26Function Examples
27Exercise
- Write a function to compute maximum and minimum
of two numbers
int max(int a, int b) if (a gt b) return
a else return b
int min(int a, int b) if (a lt b) return
a else return b
28Exercise
- Are following calls to max function valid?
- What will be the result?
- int max(int a, int b)
- int min(int a, int b)
- int main()
-
- int x 2, y 3, z 7, temp
- temp max(x,y)
- temp max(4,6)
- temp max(4,432)
- temp max(x,max(y,z))
29Example for void function
- void print_date(int mo, int day, int year)
-
- /output formatted date /
- printf(i/i/i\n, mo, day, year )
- return
30Exercise
- Write a function that takes score as parameter
and computes and returns letter grade based on
the scale below. - 80-100 A
- 60-79 B
- 40-59 C
- 0-39 D
31Solution
- char get_letter_grade(int score)
-
- char grade
- if ((score gt 80) (score lt100))
- grade 'A'
- else if ((score gt 60) (score lt 79))
- grade 'B'
- else if ((score gt 40) (score lt 59))
- grade 'C'
- else if ((score gt 0) (score lt 39))
- grade 'D'
- return grade
32Exercise
- Write a function to compute logba
double log_any_base(double a, double b)
return log(a)/log(b)
33Exercise Trace functions
- What is the output of the following program
include ltstdio.hgt int function1(int x) x
2 printf("Out1 d\n",x)
return(x1) int main() int x 4, y y
function1(x) printf("Out2 d\n",x)
printf("Out3 d\n",y) return 0
Output Out1 2 Out2 4 Out3 3
34Exercise
- What is the output of the following program
include ltstdio.hgt void function2()
printf("In function 2\n") void function1()
function2() printf("In function 1\n")
void function3() printf("In function 3\n")
function2() int main() function1()
function3() return 0
Output In function 2 In function 1 In function
3 In function 2
35Parameter Passing
- Call by value
- formal parameter receives the value of the actual
parameter - function can NOT change the value of the actual
parameter (arrays are an exception) - Call by reference
- actual parameters are pointers (ch 5 and 6)
- function can change the value of the actual
parameter
36Scope of a function or variable
- Scope refers to the portion of the program in
which - It is valid to reference the function or variable
- The function or variable is visible or accessible
include ltstdio.hgt int fact(int n) / prototype
/ int main(void) int t 5,s s fact(t)
fact(t1) printf(result is d\n, s)
return 0 int fact(int n) int factres
1 while(ngt1) factres factresn n--
return(factres)
t 5
s ?
n 5
factres 1
37Scope of a function or variable
- Same variable name can be used in different
functions
include ltstdio.hgt int fact(int n) / prototype
/ int main(void) int t 5,s s fact(t)
fact(t1) printf(result is d\n, s)
return 0 int fact(int t) int s 1
while(tgt1) s st t-- return(s)
t 5
s ?
t 5
s 1
38Scope
- Local scope
- a local variable is defined within a function or
a block and can be accessed only within the
function or block that defines it - Global scope
- a global variable is defined outside the main
function and can be accessed by any function
within the program file.
39Global vs Local Variable
- include ltstdio.hgt
- int z 2
- void function1()
- int a 4
- printf("Z d\n",z)
- z za
-
- int main()
- int a 3
- z z a
- function1()
- printf("Z d\n",z)
- z za
- return 0
z2 5 9 12
a4
a3
Output Z 5 Z 9
40Storage Class - 4 types
- Storage class refers to the lifetime of a
variable - automatic - key word auto - default for local
variables - Memory set aside for local variables is not
reserved when the block in which the local
variable was defined is exited. - external - key word extern - used for global
variables - Memory is reserved for a global variable
throughout the execution life of the program. - static - key word static
- Requests that memory for a local variable be
reserved throughout the execution life of the
program. The static storage class does not
affect the scope of the variable. - register - key word register
- Requests that a variable should be placed in a
high speed memory register.
41Skip
- Study section 4.3 from the textbook
42Name Addr Content
Lecture 18
Lecture
434.4 Random Numbers
- What is a random number?
- Tossing a coin (0, 1) Rolling a die (1, 2,6)
- Min, Max, Avg, possible outcomes are equally
likely or not, - Engineering problems require use of random
numbers - How can you compute the area of an irregular
shape?
44Uniform Random numbers
- All outcomes are equally likely
- For example fair die, where each outcome has the
same probability of 1/6, - So we can generate uniform random numbers between
1 and 6 by rolling a die. - What if we need random numbers in another range?
For example, 1 and 100?
45Uniform Random numbers (contd)
- In Standard C library, we have a function rand()
to generate random numbers between 0 and RAND_MAX
- RAND_MAX is a system dependent constant (e.g.,
32,767) defined in stdlib.h - What will be the output of the following
- printf(d d d\n,rand(), rand(), rand())
- What will be the output, if we re-run the same
program?
46Pseudo-random Numbers
- Computers generate random numbers using a seed
number and an algorithm. - So, if you give the same seed, you will always
get the same sequence of pseudo-random numbers - In Standard C library, we have a function
srand(int seed) to give a new seed number
47Example generate 10 RNs
include ltstdio.hgt include ltstdlib.hgt int
main(void) / Declare variables. /
unsigned int seed int k / Get seed
value from the user. / printf("Enter a
positive integer seed value \n")
scanf("u",seed) srand(seed) /
Generate and print ten random numbers. /
printf("Random Numbers \n") for (k1 klt10
k) printf("i ",rand())
printf("\n") / Exit program. /
return 0
48RNs in a specified range a b
- Generate a RN between 0 and 7
- x rand() 8
- Generate a RN between 10 and 17
- x 10 rand() 8
int rand_int(int a,int b) return
rand()(b-a1) a
49Floating-Point RNs in a specified range a b
- x rand() / RAND_MAX will give a random number
between 0.0 and 1.0 - x rand() / RAND_MAX (b-a) will give a RN
between 0.0 and b-a - The value is then shifted into range a b by
adding a
double rand_float(double a,double b) return
((double)rand()/RAND_MAX)(b-a)a
50Example HiLo Game
/ Write a program that allows a user to play
HiLo game. User wins if
he/she can guess the number between 1-100 within
at most 6 iterations / include
ltstdio.hgt include ltstdlib.hgt int rand_int(int
a,int b) / prototype / void playHiLo( int
s) int main(void) unsigned int seed /
Declare variables / int secret
printf("Enter a positive integer seed value
\n") scanf("u",seed) srand(seed)
while(1) secret rand_int(1,100)
playHiLo(secret) return 0
51int rand_int(int a,int b) return
rand()(b-a1) a void playHiLo(int s)
int i, guess for(i1 i lt6 i)
printf("Enter your guess ") scanf("d",
guess) if (guess gt s) printf("It is
Higher than secret\n") else if (guess lt s)
printf("It is Lower than secret\n")
else printf("Cong! you won\n")
return printf("Sorry! Try
again\n") return
52Exercise Another guess the number game
- Computer selects a random number s between 1000
9999 - User tries to guess it by entering g
- Computer tells how many digits are in place, out
of place, not in secret number - For example, if s is 6234
- User enters g as 7436, then computer says
- 1 digit is in place
- 2 digits are out of place
- 1 digit is not in secret number
- User keeps trying until he finds the secret number
53Random Number Summary
- include ltstdlib.hgt
- srand(seed)
- rn rand() / 0 RAND_MAX (e.g., 32,767) /
- int rand_int(int a,int b)
-
- return rand()(b-a1) a
-
- double rand_float(double a,double b)
-
- return ((double)rand()/RAND_MAX)(b-a)a
-
544.5 Use of Floating-Point RNs Instrumentation
Reliability
- Reliability the portion of the time that the
component works properly. For example, 0.8 means
80 of the time the component is OK - Given the reliability of each component, can you
determine the reliability of the whole system? - Analytical vs. Simulation
55Analytical vs. Simulation
- Suppose the reliability for each component in
previous slide is the same and given by r - We can then analytically compute the overall
reliability for the systems in (a) and (b) as r3
and 3r-3r2r3, respectively. (how) - OR, we can simulate the system using RNs
- Simulate each component by generating random
numbers between 0 and 1. - If this number is less than r, then we consider
the given component works properly. - If all three in (a) or at least one in (b) works
properly, then we consider the whole system works
properly. - We repeat the above experiment (say) 1000 times
and find that 600 times the whole system worked
properly. Then overall reliability is
600/10000.6. - Can you write a simulation program for any
configuration where reliability of each component
could be different
56 / Determine simulation reliability
estimates. / for (k1 kltn k)
num1 rand_float(0,1) num2
rand_float(0,1) num3 rand_float(0,1)
if (((num1ltcomponent_reliability)
(num2ltcomponent_reliability))
(num3 ltcomponent_reliability))
series_success if (((num1ltcomponent_rel
iability) (num2ltcomponent_reliabilit
y)) (num3 ltcomponent_reliability))
parallel_success
printf("Analytical Reliability \n")
printf("Series .3f Parallel .3f \n",
a_series,a_parallel) printf("Simulation
Reliability \n") printf(" Number of trials
i \n",n) printf("Series .3f Parallel .3f
\n", (double)series_success/n,
(double)parallel_success/n) return
0 double rand_float(double a,double b)
return ((double)rand()/RAND_MAX)(b-a) a
include ltstdio.hgt include ltstdlib.hgt include
ltmath.hgt double rand_float(double a,double
b) int main(void) unsigned int seed
int n, k double component_reliability,
a_series, a_parallel,
series_success0, parallel_success0,
num1, num2, num3 / Get information for the
simulation. / printf("Enter individual \
component reliability ") scanf("lf",
component_reliability) printf("Enter number
of trials \n") scanf("i", n)
printf("Enter unsigned integer seed \n")
scanf("u", seed) srand(seed)
printf("\n") / Compute Analytical
reliabilities. / a_series
pow(component_reliability,3) a_parallel
3component_reliability -
3pow(component_reliability,2)
pow(component_reliability,3)
57Exercise
- What will be the if condition in the simulation
code of the following system
if ( ( (num1ltr1 num2ltr2)
(num4ltr4 (num3ltr3num5ltr5)) )
(num6ltr6) ) success
58SKIP REST
- Study 4.6 and 4.7 from the textbook
594.8 Macros
- define macro_name(parameters) macro_text
- macro_text replaces macro_name in the program
- Examples
- define area_tri(base,height) (0.5(base)(height)
) - define PI 3.14
- zx tri(3, 5) y ? zx (0.5(3)(5)) y
- k2PIr ? k23.14r
604.9 Recursive Functions
- A function that invokes itself is a recursive
function. - int fact(int k)
-
- if (k 0)
- return 1
- else
- return kfact(k-1)
k!k(k-1)!
61include ltstdio.hgt int fact(int k) if (k
0) return 1 else return
kfact(k-1) int main() int n int nf
printf("Enter n\n") scanf("d",n) nf
fact(n) printf("Factorial d\n", nf)
system("pause") return(0)
62Fibonacci Numbers
- Sequence f0,f1,f2,. First two values (f0,f1)
are 1, each succeeding number is the sum of
previous two numbers. - 1 1 2 3 5 8 13 21 34
- F(0)1, F(1) 1
- F(i) F(i-1)F(i-2)
63Fibonacci Numbers
- int fibonacci(int k)
-
- int term
- term 1
- if (kgt1)
- term fibonacci(k-1)fibonacci(k-2)
- return term
64include ltstdio.hgt int fibonacci(int k) int
term 1 if (kgt1) term
fibonacci(k-1)fibonacci(k-2)
return(term) int main() int n int
nfib printf("Enter n\n") scanf("d",n)
nfib fibonacci(n) printf("Fibonacci
d\n",nfib) system("pause") return(0)
/ Iterative Version of Fibonacci Function
/ int fibonacci(int k) int a,b,c,i if
(klt1) return 1 else a 1
b 1 i 2 while (iltk) c
a b a b b c i i 1
return(c)
65Extra examples
66Exercise
- Given radius and height of a cylinder. Write a
function to compute the surface area. - A 2pir(rh)
- define PI 3.14
- double area(double radius, double height)
-
- return 2PIradius(radiusheight)
-
67Exercise
- Given radius and height of a cylinder. Write a
function to compute the volume. - V pir2h
- define PI 3.14
- double volume(double radius, double height)
-
- return(PIradiusradiusheight)
-
68Exercise
- Write a function to compute the median of 3
numbers x, y and z. - Possible order of numbers
- xltyltz -gt median y
- xltzlty -gt median z
- yltxltz -gt median x
- yltzltx -gt median z
- zltxlty -gt median x
- zltyltx -gt median y
69Solution
- int median(int x, int y, int z)
-
- if (((xlty) (yltz)) ((zlty) (yltx)))
- return y
- else if (((yltx) (xltz)) ((zltx) (xlty)))
- return x
- else
- return z
70Exercise
- Assume you have maximum and minimum functions
implemented. Use these to find median of 3
numbers - a lt b lt c -gt median is b
- Consider 3 pairs (a,b),(b,c),(a,c)
- min(a,b) a
- min(b,c) b Max(a,b,a) b
- min(a,c) a
71 Solution
int median(int x, int y, int z) return(max(min(
x,y),min(x,z),min(y,z)))