0% found this document useful (0 votes)
40 views

Chap 4

This document provides information about modular programming with functions in C programming. It discusses how to divide a complex problem into smaller tasks or modules to solve each task separately and then combine the solutions. Functions allow programmers to break a program into reusable modules. Well-designed functions perform specific, well-defined tasks, may take parameters, and may return a value. The document provides examples of predefined library functions like printf() and sin(), as well as programmer-defined functions like a distance calculation function. It covers key function concepts like function prototypes, calls, implementations, parameters, and return types.

Uploaded by

Aliya G
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
40 views

Chap 4

This document provides information about modular programming with functions in C programming. It discusses how to divide a complex problem into smaller tasks or modules to solve each task separately and then combine the solutions. Functions allow programmers to break a program into reusable modules. Well-designed functions perform specific, well-defined tasks, may take parameters, and may return a value. The document provides examples of predefined library functions like printf() and sin(), as well as programmer-defined functions like a distance calculation function. It covers key function concepts like function prototypes, calls, implementations, parameters, and return types.

Uploaded by

Aliya G
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 71

CS 2073

Computer Programming w/Eng.


Applications
Ch 4
Modular Programming With Functions

Turgay Korkmaz
Office: SB 4.01.13
Phone: (210) 458-7346
Fax: (210) 458-4437
e-mail: [email protected]
web: www.cs.utsa.edu/~korkmaz

1
Name Addr Content

Lecture++;
Lecture 16

2
4.1 Modularity
 How do you solve a big/complex problem?
 Divide it into small tasks and solve each
task. Then combine these solutions.

Divide and Conquer


3
4.1 Modularity (cont’d)
 In C we use Structure Chart

functions also
referred to as
modules to
perform specific
tasks that we Shows how the program
separated into tasks and which
determined in our tasks reference other tasks.
solution NOTE: It does NOT indicate the
sequence of steps in the
program! 4
Advantages 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 don’t need to know how it does it

5
4.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)

6
Function definition

return_type function_name (parameters)


{
declarations;
statements; int my_add_func(int a, int b)
}
{
int sum;
sum = a + b;
return sum;
} 7
Programmer-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! 8
Example: Pre-defined Functions
So far, we used several pre-defined
double functions!
sin(double radian);
#include <stdio.h>
double sin(double radian)
#include <math.h>
{
int main(void) /* details of computing sin */
{ }
double angle;
printf(“Input angle in radians: \n“);
scanf(“%lf”, &angle);
printf(“The sine of the angle is %f\n“,
sin(angle) );
return 0; 9
Example: Programmer-defined
Functions
#include <stdio.h> #include <stdio.h>
double distance(double x1,y1,x2,y2);
int main(void) int main(void)
{ {
double x1,y1,x2,y2, dist; double x1,y1,x2,y2, dist;
printf(“Enter x1 y1 x2 y2 :”); printf(“Enter x1 y1 x2 y2 :”);
scanf(“%lf %lf %lf %lf”, scanf(“%lf %lf %lf %lf”,
&x1,&y1,&x2,&y2); &x1,&y1,&x2,&y2);
dist = sqrt(pow((x2-x1),2) dist = distance(x1,y1,x2,y2);

+ pow((y2-y1),2)); printf(“Distance is %lf\n”, dist);


printf(“Distance is %lf\n”, return 0;
dist); }
return 0; double distance(double x1,y1,x2,y2)
} {
return sqrt(pow((x2-x1),2)
+ pow((y2-y1),2));
}

10
Exercise
(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)
11
Value 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

12
Void 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

13
Exercise: void function
#include <stdio.h>
 Write a program to void print_i_star(int i);

generate the main()


{
following output? int i;
for (i=1; i<=5; i++) {
* print_i_star( i );
** }
*** }
**** void print_i_star(int i)
***** {
int j;
for (i=1; i<=5; i++) { for (j=1; j<=i; j++)
for (j=1; j<=i; j++) printf(“*”);
printf(“*”); printf(“\n”);
printf(“\n”); return;
} } 14
Example: value returning
function
n!=n*(n-1)*…*1, 0! = 1 by definition

Function name
Return Type

int fact(int n)
Parameter Declarations
{
Declarations int factres = 1;
while(n>1)
{
Statements
factres = factres*n;
n--;
}
return(factres); 15
}
Example – use fact()

#include <stdio.h>
int fact(int n); /* prototype */
int main(void)
{ t=5
int t= 5,s;
s=?
s = fact(t) + fact(t+1);
Function call

printf(“result is %d\n”, s);


return 0;
}
16
Example – execution of factorial
function (cont’d)
fact( 5 )
t=5
int fact(int n)
{
int factres = 1; s=?

while(n>1)
{
factres = factres*n; n=5
n--;
} factres = 1
return(factres);
} 17
Example – execution of factorial
function (cont’d)

t=5
int fact(int n)
{ s=?
int factres = 1;

while(n>1)
{
factres = factres*n; n=5 4 3 2 1
n--;
} factres = 1 5 20
return(factres); 60 120
} 18
Example – execution of factorial
function (cont’d)

#include <stdio.h>
int fact(int n); /* prototype */
int main(void)
{ t=5
int t= 5,s;
s=?
s = 120 + fact(t+1);
Function call
printf(“result is %d\n”, s);
return 0;
}
19
Example – execution of factorial
function (cont’d)
fact( 6 )
t=5
int fact(int n)
{ s=?
int factres = 1;
t+1

while(n>1)
{
factres = factres*n; n=6
n--;
} factres = 1
return(factres);
} 20
Example – execution of factorial
function (cont’d)

t=5
int fact(int n)
{ s=?
int factres = 1;

while(n>1)
{
factres = factres*n; n=6 5 4 3 2 1
n--;
} factres = 1 6 30
return(factres); 120 360 720
} 21
Example – execution of
factorial function (cont’d)

#include <stdio.h>
int fact(int n); /* prototype */
int main(void)
{ t=5
int t= 5,s;
s = 840
s = 120 + 720;

printf(“result is %d\n”, s);


return 0;
result is 840
}
22
Example – reuse of factorial
function
 Write a statement to compute
X ! Z !*5
y
K ! D!
Enter X, Z, K, D

y=(fact(X)+fact(Z)*5)/(fact(K)-fact(D));
23
Example – reuse of factorial
function in another function
 Write a select function that takes n and k and
computes “n choose k” where
n n!
  
 k  (n  k )!k!
int select(int n, int k)
{
return fact(n)/(fact(n-k)*fact(k));
}
24
Name Addr Content

Lecture++;
Lecture 17

25
Function Examples

26
Exercise
 Write a function to compute maximum and
minimum of two numbers
int max(int a, int b)
{ int min(int a, int b)
if (a > b) {
return a; if (a < b)
else return a;
return b; else
} return b;
} 27
Exercise
 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,4+3*2);
temp = max(x,max(y,z));
}

28
Example for void function

void print_date(int mo, int day, int year)


{
/*output formatted date */
printf(“%i/%i/%i\n”, mo, day, year );
return;
}

29
Exercise
 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

30
Solution
char get_letter_grade(int score)
{
char grade;
if ((score >= 80) && (score <=100))
grade = 'A';
else if ((score >= 60) && (score <= 79))
grade = 'B';
else if ((score >= 40) && (score <= 59))
grade = 'C';
else if ((score >= 0) && (score <= 39))
grade = 'D';
return grade;
} 31
Exercise
 Write a function to compute logba
log10 a
log b a 
log10 b

double log_any_base(double a, double b)


{
return log(a)/log(b);
}
32
Exercise: Trace functions
 What is the output of the following program
#include <stdio.h>
int function1(int x)
{
x = 2;
printf("Out1 = %d\n",x);
return(x+1); Output
}
int main() Out1 = 2
Out2 = 4
{ Out3 = 3
int x = 4, y;
y = function1(x);
printf("Out2 = %d\n",x);
printf("Out3 = %d\n",y);
return 0;
33
}
Exercise
 What is the output of the following program
#include <stdio.h> void function3()
{
void function2() printf("In function 3\n");
{ function2();
printf("In function 2\n"); }
}
int main()
void function1() { Output
{ function1();
function2(); function3(); In function 2
printf("In function 1\n"); return 0; In function 1
} } In function 3
In function 2

34
Parameter 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

35
Scope 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 <stdio.h>
int fact(int n); /* prototype */
int main(void)
{
int t= 5,s;
t=5
s = fact(t) + fact(t+1);
printf(“result is %d\n”, s);
return 0;
s=?
}

int fact(int n)
{
int factres = 1; n=5
while(n>1) {
factres = factres*n; factres = 1
n--;
}
return(factres);
} 36
Scope of a function or variable
 Same variable name can be used in
different functions
#include <stdio.h>
int fact(int n); /* prototype */
int main(void)
{
int t= 5,s;
t=5
s = fact(t) + fact(t+1);
printf(“result is %d\n”, s);
return 0;
s=?
}

int fact(int t)
{
int s = 1; t=5
while(t>1) {
s = s*t; s=1
t--;
}
return(s);
} 37
Scope
 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.

38
Global vs Local Variable
#include <stdio.h>
int z = 2;
void function1() z=2 5 9 12
{ int a = 4;
printf("Z = %d\n",z);
z = z+a; a=4
}

int main()
{ int a = 3; a=3
z = z + a;
function1();
printf("Z = %d\n",z); Output
z = z+a;
return 0; Z=5
} Z=9
39
Storage 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.

40
Skip
 Study section 4.3 from the textbook

41
Name Addr Content

Lecture++;
Lecture 18

42
4.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?
43
Uniform 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?

44
Uniform Random numbers
(cont’d)
 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?

45
Pseudo-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

46
Example: generate 10 RNs
#include <stdio.h>
#include <stdlib.h>

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 (k=1; k<=10; k++)
printf("%i ",rand());
printf("\n");

/* Exit program. */
return 0;
} 47
RNs 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-a+1) + a;
}
48
Floating-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;
} 49
Example: 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 <stdio.h>
#include <stdlib.h>

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;
50
}
int rand_int(int a,int b)
{
return rand()%(b-a+1) + a;
}

void playHiLo(int s)
{
int i, guess;

for(i=1; i <=6; i++){


printf("Enter your guess : ");
scanf("%d", &guess);
if (guess > s)
printf("It is Higher than secret\n");
else if (guess < s)
printf("It is Lower than secret\n");
else {
printf("Cong! you won\n");
return;
}
}
printf("Sorry! Try again\n");
return;
51
}
Exercise: 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

52
Random Number Summary
#include <stdlib.h>
srand(seed);
rn = rand(); /* [0 RAND_MAX] (e.g., 32,767) */
int rand_int(int a,int b)
{
return rand()%(b-a+1) + a;
}
double rand_float(double a,double b)
{
return ((double)rand()/RAND_MAX)*(b-a)+a;
}
53
4.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

54
Analytical 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-3r2+r3,
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/1000=0.6.
 Can you write a simulation program for any configuration where reliability of each
component could be different

55
#include <stdio.h> /* Determine simulation reliability
#include <stdlib.h> estimates. */
#include <math.h> for (k=1; k<=n; k++) {

double rand_float(double a,double b); num1 = rand_float(0,1);


num2 = rand_float(0,1);
int main(void) num3 = rand_float(0,1);
{
unsigned int seed; if (((num1<=component_reliability) &&
int n, k; (num2<=component_reliability)) &&
double component_reliability, (num3 <=component_reliability))
a_series, a_parallel, series_success++;
series_success=0, parallel_success=0,
num1, num2, num3; if (((num1<=component_reliability) ||
/* Get information for the simulation. */ (num2<=component_reliability)) ||
printf("Enter individual \ (num3 <=component_reliability))
component reliability: "); parallel_success++;
scanf("%lf", &component_reliability); }
printf("Enter number of trials: \n");
scanf("%i", &n); printf("Analytical Reliability \n");
printf("Enter unsigned integer seed: \n"); printf("Series: %.3f Parallel: %.3f \n",
scanf("%u", &seed); a_series,a_parallel);
srand(seed);
printf("\n"); printf("Simulation Reliability \n");
printf(" Number of trials %i \n",n);
/* Compute Analytical reliabilities. */ printf("Series: %.3f Parallel: %.3f \n",
a_series = pow(component_reliability,3); (double)series_success/n,
a_parallel = 3*component_reliability (double)parallel_success/n);
- 3*pow(component_reliability,2) return 0;
+ pow(component_reliability,3); }
double rand_float(double a,double b)
{
return ((double)rand()/RAND_MAX)*(b-a) + a;
}
56
Exercise
 What will be the “if condition” in the
simulation code of the following system
Comp1, r1 Comp2, r2

Comp6, r6

Comp3, r3
Comp4, r4
Comp5, r5

if ( ( (num1<=r1 && num2<=r2) ||


(num4<=r4 && (num3<=r3||num5<=r5)) ) &&
(num6<=r6) )
success++; 57
SKIP REST
 Study 4.6 and 4.7 from the textbook

58
4.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

 z=x * tri(3, 5) + y;  z=x * (0.5*(3)*(5)) + y;


 k=2*PI*r;  k=2*3.14*r;

59
4.9 Recursive Functions*
 A function that invokes itself is a recursive function.

int fact(int k)
{ k!=k*(k-1)!
if (k == 0)
return 1;
else
return k*fact(k-1);
}

60
#include <stdio.h>

int fact(int k)
{
if (k == 0)
return 1;
else
return k*fact(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);
} 61
Fibonacci 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)

62
Fibonacci Numbers
int fibonacci(int k)
{
int term;
term = 1;
if (k>1)
term = fibonacci(k-1)+fibonacci(k-2);
return term;
}
63
#include <stdio.h>
/* Iterative Version of
int fibonacci(int k)
Fibonacci Function */
{
int term = 1;
int fibonacci(int k)
{
if (k>1)
int a,b,c,i;
term = fibonacci(k-1)+fibonacci(k-2);
if (k<=1)
return(term);
return 1;
}
else
{
int main()
a = 1;
{
b = 1;
int n;
i = 2;
int nfib;
while (i<=k)
{
printf("Enter n\n");
c = a + b;
scanf("%d",&n);
a = b;
b = c;
nfib = fibonacci(n);
i = i + 1;
}
printf("Fibonacci = %d\n",nfib);
return(c);
}
system("pause");
}
return(0);
} 64
Extra examples

65
Exercise
 Given radius and height of a cylinder. Write a
function to compute the surface area.
 A = 2*pi*r*(r*h)

#define PI 3.14

double area(double radius, double height)


{
return 2*PI*radius*(radius+height);
}

66
Exercise
 Given radius and height of a cylinder. Write a
function to compute the volume.
 V = pi*r2*h

#define PI 3.14

double volume(double radius, double height)


{
return(PI*radius*radius*height);
}

67
Exercise
 Write a function to compute the median of 3
numbers x, y and z.
 Possible order of numbers
 x<y<z -> median y

 x<z<y -> median z

 y<x<z -> median x

 y<z<x -> median z

 z<x<y -> median x

 z<y<x -> median y

68
Solution
int median(int x, int y, int z)
{
if (((x<y) && (y<z)) || ((z<y) && (y<x)))
return y;
else if (((y<x) && (x<z)) || ((z<x) && (x<y)))
return x;
else
return z;
}

69
Exercise
 Assume you have maximum and minimum
functions implemented. Use these to find
median of 3 numbers
 a < b < c -> 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

70
Solution

int median(int x, int y, int z)


{
return(max(min(x,y),min(x,z),min(y,z)));
}

71

You might also like