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

4. Functions

Uploaded by

yoyoshyam
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views

4. Functions

Uploaded by

yoyoshyam
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 43

Slide 1

Functions
Slide 2

Recall Activity

Have you see any predefined functions in C so far?

If yes, then list down all the predefined functions you remember.

2
Slide 3

What is a Function?

 A function is a block of code that performs a particular task.


 A function can be called from the same or another function whenever
required. Hence we can avoid rewriting the same code. It also
improves the readability of the program.
 Function may take some input in the form of parameters and sent out
some output in the form of return value.

A function is a set of statement(s) which are written to perform a same operation every time. A C program
is a collection of functions. A function may or may not get inputs from the user who calls it. Functions are
used to have our C programs more structured, compact and easy to understand.

To execute any function, user has to call that function in the program and after executing all the
appropriate statements in the function, a function may or may not return a value. But after successful
execution of a function control goes back to the calling function and continues the execution from next
line from where this function is being called. Any function can be called multiple times in any C program
so, this help us in avoiding writing the same statements again where ever required to perform same
operation.

A simple example of a function can be an addition operation on 2 integers. This addition function would
just take 2 integers as an input, adds the both an just return the resultant. So in our program when ever
we need to add 2 integers we can just call this function instead of writing multiple lines of similar code to
perform addition operation.
Slide 4

Function without argument and return type

/* Using function :program to determine if an integer


greater than 100 entered by the user is a prime
number */
int num; num is declared as global variable so that
it is accessible by all the functions.
int main(){
while(1){
printf("enter an integer greater than 100 ");
scanf("%d",&num);
if(num<100) continue;
printprime();
break;}}
primef1.c
4
Slide 5

void printprime()
{
int j,i,flag=1;
j=num/2;

for (i=2;i<=j;i++){
if(num%i==0){
flag=0;
printf("Not prime");
break;
}
}
if (flag) printf("Prime number");
}
5
Slide 6

Return value

 Some compiler throws a warnings if function does not return a integer


value.
 A function must either return a value or must be declared as void.

It’s always a good practice to have explicit return statement at


the end of every function even if the function is not returning any
value.

6
Slide 7

Function declaration

return_type function_name (argument-list)

Where argument-list is
Data-type var-name1, Data-type var-name2,… Data-type var-nameN

 If return_type is not specified it is assumed to be an int.


 argument-list can contain 0 one or more arguments.
 function_name must be unique. It should not clash with any variable
name or other function name.
 Variables declared inside the function and the argument-list variables are
local to the function. They cannot be accessed outside the function.

7
Slide 8

return

 The return statement is used to return a value from a function.


 When return is encountered the control go back to the calling
function.
 Example:
 return (a);
 return (15);
 return 0;
 return; Used with void. Does not return anything!

8
Slide 9

Prototyping

 If the function definition is before the call is made, then compiler has
the knowledge about the parameters that the function takes (signature)
and return type.
 But if a function is called before it is defined, we need to inform the
compiler about the parameters and return type. This is done through
prototyping.
 Prototyping is declaring the function that needs to be called .
 Declaration of a function is different from definition of a function.
 Prototype declaration can be either local or global.
 In a large project that consists of several files, the prototypes are
shared using header files. (We will see how to work with this later)

Generally, C Compiler while compiling checks all the files and if it encounters any call to a function before
a declaration of that function it throws an error. To avoid this we can do following:

• Rework on your C program to make sure that function definition appears before that function is being
called in the program.
• Have function prototype (declaration) at the beginning of the c program to make sure that C compiler
read the declaration first before it‟s being called in the program later.

Note that some compilers complaint if the return type is not int. In such case, any function that returns
types other than int must inform the compiler by what is called prototyping.
Slide 10

Example - Changing the prime number code

int num;
int main(){ Declaring the called function in the calling
void pprime(); function since called function returns void.
while(1){
printf("enter an integer greater than 100 ");
scanf("%d",&num);
if(num<100) continue;
pprime();
break;
}
return 0}

10
Slide 11

void pprime() Defining the called function


{
int j,i,flag=1;
j=num/2;

for (i=2;i<=j;i++){
if(num%i==0){
flag=0;
printf("Not prime");
break;
}
}
if (flag) printf("Prime number");
return; Optional
}

11
Slide 12

Lab Exercise

 Write a function to print the square of all the numbers from 1 to 100.
(10 mins)

 Write a function to find the prime factors of a number.


(10 mins)

 Assuming that there will be 2 numbers provided as an input, write the


functions for performing following operations:

 Addition
 Subtraction
 Multiplication
 Division
(20 mins)

12
Slide 13

Function with parameters

 It is possible for the calling function to pass values into the called
function through what is called parameters or arguments.

13
Slide 14

Example - function with parameters

/* program that has a function which calculates the


gross salary given the basic salary*/
main(){
double basic,gross;
double calculateGross(double basic);
printf("enter basic salary ");
scanf("%lf",&basic);
gross= calculateGross(basic);
printf("Gross=%lf",gross);
}

14
Slide 15

double calculateGross(double basic){


double hra,ta,da, gross;
da=0.5 * basic;
hra=0.1 *basic;
if(basic<10000)
ta=1000;
else
if(basic>=10000 && basic<20000)
ta=2000;
else
ta=3000;
gross=basic+hra+ta+da;

return gross;
} 15
Slide 16

Without static variable


 Suppose we attempt to write a code that prints the number of times
a function is called.
main(){
void callMe();
callMe();
callMe();}
void callMe(){
int count;
count++;
printf("you called me %d times\n" , count);}
 When we execute the following code it prints garbage value for
count because count is not initialized.
16
Slide 17

 If we initialize count to 0 then print “you called me 1 times” three times.


main(){
void callMe();
callMe(); callMe();
callMe();}
void callMe(){
int count=0;
count++;
printf("you called me %d times\n" , count);}

 This is because the value of count gets initialized each time the function
is called.
 What we want is a way in which count value can be retained.

17
Slide 18

static variable

 Solution to this is to declare the count variable as static variable.


 Static variables are automatically initialized the first time to 0.
 It retains the value between the function calls.

18
Slide 19

Count example corrected

main(){
void callMe(); Prints:
you called me 1 times
callMe();
you called me 2 times
callMe(); you called me 3 times
callMe();
}
void callMe(){
static int count;
count++;
printf("you called me %d times\n" , count);
}
19
Slide 20

Revisiting Storage class specifiers

 static local:
 scope: variables declared and accessed only inside block
 default:0
 Retains the value between function calls
 static keyword is specified with declaration

20

Refer to „Storage Classes in C‟ in Chapter 6 (Page 219) of “Let us C “ by Yashvant Kanitkar


Slide 21

Call by value

void main(){
void f(int i,int j);
int i=0, j=0;
printf("Before calling f(): value of i=%d and value of
j=%d\n", i,j);
f(i,j);
printf("After calling f(): value of i=%d and value of
j=%d\n", i,j);
}

21
Slide 22

void f(int i,int j){


printf("In f() before changing : value of i=%d and value
of j=%d\n", i,j);

i++;
j++;

printf("In f() after changing: value of i=%d and value


of j=%d\n", i,j);}
Result of execution:

Before calling f(): value of i=0 and value of j=0


In f() before changing : value of i=0 and value of j=0
In f() after changing: value of i=1 and value of j=1
After calling f(): value of i=0 and value of j=0

22
Slide 23

main()

i=0 1000
f() i=1
j=0 1001
Calls j=1

Value of i and j in
1000 and 1001 i=0 2000
remain the same!
j=0 2001

i++;
j++;

In memory
23
Slide 24

Observation

Did do you observe?

 The parameter values changed in the called function code are not
reflected in the calling function.
 This is because the parameters are passed by value to the function.
 Both functions have their own copy of the variables. Only the values
of the variables of the calling function get copied to the variables of
the called function

24
Slide 25

Test Your Understanding?

void increment();
int main(){
increment(); Where should we insert the following
statement in the program to make it
printf("%d\n",i); compile successfully and get the output
} value of i as 11?

void increment(){ int i = 10;


i++;
}

Read “Calling Convention” – Chapter 5 – Functions & Pointers (Page 168-


169) of „Let Us C’ by Yashwant Kanetkar

25
Slide 26

Lab Exercise

 Write a function pow(a,b) where a and b are numbers and the function
returns the value of ab.
(10 mins)
 Write a function which takes a number as an argument and returns the
sum of digits in the number.
Example:
1. Input = 234
Output = 9
2. Input 3484
Output = 19
(20 mins)
26
Slide 27

Lab Exercise

 For Numerology application, Read date of birth(DDMMYYYY), using


recursive function find out the birth number still it gets the single digit
number. For example, if birth date is August 28, 1991, then the input is
28081991. Now add the entire numbers like this
2+8++0+8+1+9+9+1 = 38
Result is not a single digit number, now add these digits still it is getting
single digit number
3 + 8 = 11
1 + 1 = 2
Display the output as ‘Birthnumber is 2’
(15 mins)

27
Slide 28

Call by reference

 What should be done so that the changed values of i and j are


reflected in the calling function?
 There should be some way in which we pass the addresses of the
variables of i and j from the calling function to the called function.
 The called function should receive these variables in a way such that
they point to values rather than just receiving the values.
 &variable-name represents the address of the variable.
 Address of a variable is of unsigned long int.
 We need a special kind of variable that is capable of holding an
address and using which we can retrieve the value stored in the
address.
 Such a kind of variable is called a „Pointer‟.
28
Slide 29

Introduction to pointers

 A pointer is a variable that holds an address of a variable in memory


and using this pointer we can access the value stored in that location.
 Declaration:
 Data-type *variable_name;
 Data-type in the above syntax represents what type of data the pointer
points to.
 Example:
 double i=10;
 double *p=&i;

29
Slide 30

Getting the address and value

 *variable-name returns the value stored in the address that variable-


name points to.
 variable-name returns the address value.
 Example:
double i=10;
double *p=&i;
printf(“%lf”,*p); Prints 10
printf(“%d”,p); Prints the address

30
Slide 31

Tell me why?

The data-type of a pointer variable is always integer. Then what is the


significance of specifying data-type in the declaration syntax?

 It is important to specify the appropriate data-type in the syntax if you


want to use pointer arithmetic.
 You can use ++ and – operators on the pointer which allows pointer to
jump to next location. Whether the jump has to be 1 byte , 2 bytes , 4
bytes, 8 bytes or 10 bytes is determined by the data-type of the
pointer.

31
Slide 32

Call by reference – Using Pointers

/* program : call by value demo */


void main(){
void f(int *i,int *j);
int i=0, j=0;
printf("Before calling f(): value of i=%d and value of
j=%d\n", i,j);
f(&i,&j);
printf("After calling f(): value of i=%d and value of
j=%d\n", i,j);
}

32
Slide 33

Test your understanding

void f(int *i,int *j)


{
printf("In f() before changing : value of i=%d and
value of j=%d\n", *i,*j);

*i++;
*j++;

printf("In f() after changing: value of i=%d and value


of j=%d\n", *i,*j);
}

Do you see any problem with the code ?

33

The problem is with the lines


*i++;
*j++;
It should have been
(*i)++;
(*j)++;
Slide 34

Recursion
 A function that calls itself is a recursive function.
 It is very important that a recursive function has an exit point. Otherwise it
will get into infinite loop.

int i; int i;
main(){ main(){
f();} f();}
int f(){ int f(){
f(); i++;
} if(i>5) return ;
f();}

Without termination condition : Termination condition specified.


infinite loop Executes successfully.

34
Slide 35

Prime number using recursion

/* prime number using recursion */


int num,k;
main(){
printf("enter an integer ");
scanf("%d",&num);
/* do the checks on num before calling the function*/
k=prime(2);
if(k==0)
printf("not prime");
else
printf("prime"); }

35
Slide 36

int prime(int i){


if(num%i==0) return 0;
i++;
if(i>num/2) return 1;
else
prime(i);
}

36
Slide 37

Flow for prime

Assume num=9
prime(2) 1 {if(num%i==0) return 0; 9%2!=0
i++;2++ 3
if(i>num/2) return 1;3>(9/2) No!
Return value: 0 else
4 prime(i);  prime(3)
}
2 3 Return value: 0

{if(num%i==0) return 0; 9%3


i++;
if(i>num/2) return 1;
else
prime(i);
}

37
Slide 38

Fibonacci numbers
Non-recursive Recursive
main(){
main(){
void fibo(int f1, int f2);
int f1=0,f2=1,f3,i;
int f1=0,f2=1,f3,i;
printf("%d, %d,",
printf("%d, %d,", f1,f2);
f1,f2);
fibo(f1,f2);
for(i=0;i<8;i++)
}
{
void fibo(int f1, int f2){
f3=f1+f2;
static int count;
f1=f2;
int f3; Termination condition
f2=f3;
if(count>8) return;
printf("%d,", f2);
f3=f1+f2;
}
f1=f2; f2=f3;
}
printf("%d,", f2);
count++;
fib.c fibo(f1,f2);}
fibr.c

38

What are Fibonacci Numbers?

A Fibonacci sequence starts with a 0 and followed by 1. Then onwards each subsequent number is
actually the sum of previous two numbers.

0,1,1,2,3,5,8,13,21,...
Slide 39

Use of recursion

 Recursive programs sometime seem rather difficult in comparison to


non-recursive ones.
 But in some cases it is actually easier to use recursion.
 For example in cases where you have a mathematical formula based
on iterative value of n.
 For example- factorial value of n.
 Mathematical formula:
 FIB(N+1)=FIB(N)+F(N-1)
 fact(n)= n*fact(n-1) for all n<1

39
Slide 40

Recursive code

main(){
int num, res;
printf("enter a number");
scanf("%d",&num);
res=fact(num);
printf("%d",res);
}
int fact(int n){
int f;
if(n==1) return 1;
f=n*fact(n-1);
return f;
}
40
Slide 41

Flow for factorial


num=3
fact(3)
Return 6

{int f;
if(n==1) return 1;  n=3
f=n*fact(n-1); 3*fact(2) Return 2
return f;}
{int f;
if(n==1) return 1;  n=2
f=n*fact(n-1); 2*fact(1)
return f;}
{
int f;
if(n==1) return 1;  n=1 Return 1
f=n*fact(n-1);
return f;}
41
Slide 42

Word of caution!

 Recursive code may be difficult to understand and debug. Hence it


should be used only in places where it makes the overall program
simpler.
 Recursive code adds to overhead of multiple function calls.

42
Slide 43

Lab Exercise
 Write a program that asks the user to type an integer N and computes the
sum of the cubes from 5 to the power 3 to N the power 3. Use recursive
function.
(10 mins)

 Write a main program to estimate the value of the constant e (the base of
natural logarithms) using finite number of terms (the number of terms will
be given by the user) of the following series.

(15 mins)
 Write a program to print the series: 0,1,4,9,16,.....625
(10 mins)
 Write a program in to generate a Fibonacci series till 40.
(10 mins)

43

You might also like