Functions What is function Function is a self

  • Slides: 88
Download presentation
Functions

Functions

What is function? ? • Function is a self contained block of statements that

What is function? ? • Function is a self contained block of statements that perform a coherent task of some kind. • Every C++ program can be a thought of the collection of functions. • main( ) is also a function.

Types of Functions. • Library functions – These are the in- -built functions of

Types of Functions. • Library functions – These are the in- -built functions of ‘C++ ’library. – These are already defined in header files. – e. g. Cout<<; is a function which is used to print at output. It is defined in ‘iostream. h ’ file. • User defined functions. – Programmer can create their own function in C++ to perform specific task

a) Actual arguments: -the arguments of calling function are actual arguments. b) Formal arguments:

a) Actual arguments: -the arguments of calling function are actual arguments. b) Formal arguments: -arguments of called function are formal arguments. c) Argument list: -means variable name enclosed within the paranthesis. they must be separated by comma d) Return value: -it is the outcome of the function. the result obtained by the function is sent back to the calling function through the return statement.

Why use function?

Why use function?

 • Writing functions avoids rewriting of the same code again and again in

• Writing functions avoids rewriting of the same code again and again in the program. • Using function large programs can be reduced to smaller ones. It is easy to debug and find out the errors in it. • Using a function it becomes easier to write program to keep track of what they are doing.

Function Declaration ret_type func_name(data_type par 1, data_type par 2); Function Defination ret_type func_name(data_type par

Function Declaration ret_type func_name(data_type par 1, data_type par 2); Function Defination ret_type func_name(data_type par 1, data_type par 2) { } Function Call func_name(data_type par 1, data_type par 2);

Function prototype • A prototype statement helps the compiler to check the return type

Function prototype • A prototype statement helps the compiler to check the return type and arguments type of the function. • A prototype function consist of the functions return type, name and argument list. • Example – int sum( int x, int y);

Example #include<iostream. h> #include<conio. h> void main() { clrscr(); void sum(int, int); // function

Example #include<iostream. h> #include<conio. h> void main() { clrscr(); void sum(int, int); // function declaration int a, b, c; cout<<“enter the two no”; cin>>a>>b>>c; sum(a, b); // function calling getch(); } void sum( int x, int y)// function definition { c=x+y; cout<< “ sum is”<<c; }

#include<conio. h> void main() { clrscr(); int a=10, b=20; int sum(int, int); int c=sum(a,

#include<conio. h> void main() { clrscr(); int a=10, b=20; int sum(int, int); int c=sum(a, b); /*actual arguments Cout<<“sum is” << c; getch(); } int sum(int x, int y) /*formal arguments { int s; s=x+y; return(s); /*return value }

Categories of functions • A function with no parameter and no return value •

Categories of functions • A function with no parameter and no return value • A function with parameter and return value • A function without parameter and return value

A function with no parameter and no return value #include<conio. h> void main() {

A function with no parameter and no return value #include<conio. h> void main() { clrscr(); void print(); /*func declaration Cout<<“no parameter and no return value”; print(); /*func calling getch(); } void print() /*func defination { For(int i=1; i<=30; i++) { cout<<“*”; } Cout<<“n”; }

A function with no parameter and no return value • There is no data

A function with no parameter and no return value • There is no data transfer between calling and called function • The function is only executed and nothing is obtained • Such functions may be used to print some messages, draw stars etc

A function with parameter and no return value #include<conio. h> void main() { clrscr();

A function with parameter and no return value #include<conio. h> void main() { clrscr(); int a=10, b=20; void mul(int, int); mul(a, b); /*actual arguments getch(); } void mul(int x, int y) /*formal arguments { int s; s=x*y; Cout<<“mul is” << s; }

A function with parameter and return value #include<conio. h> void main() { clrscr(); int

A function with parameter and return value #include<conio. h> void main() { clrscr(); int a=10, b=20, c; int max(int, int); c=max(a, b); Cout<<“greatest no is” <<c; getch(); } int max(int x, int y) { if(x>y) return(x); else { return(y); } }

A function without parameter and return value #include<conio. h> void main() { clrscr(); int

A function without parameter and return value #include<conio. h> void main() { clrscr(); int a=10, b=20; int sum(); int c=sum(); /*actual arguments Cout<<“sum is”<< c; getch(); } int sum() /*formal arguments { int x=10, y=30; return(x+y); /*return value }

Some important points • A function declaration, defination, and call must match in number,

Some important points • A function declaration, defination, and call must match in number, type and order of actual and formal arguments. • A function can b called from other function but a function cannot be defined inside another function • Function defined and function call order can b different • The actual arguments in a function can be variables, constants, or expression where as formal arguments must be variables

ARGUMENT PASSING TECHNIQUES

ARGUMENT PASSING TECHNIQUES

Argument passing techniques • Pass By Value • Pass By Reference • Pass By

Argument passing techniques • Pass By Value • Pass By Reference • Pass By Pointeraddress

Call By Value • It is a default mechanism for argument passing. • When

Call By Value • It is a default mechanism for argument passing. • When an argument is passed by value then the copy of argument is made know as formal arguments which is stored at separate memory location • Any changes made in the formal argument are not reflected back to actual argument, rather they remain local to the block which are lost once the control is returned back to calling program

Example void main() { int a=10, b=20; int swap(int, int); Cout<<“before function calling”<<a<<b; swap(a,

Example void main() { int a=10, b=20; int swap(int, int); Cout<<“before function calling”<<a<<b; swap(a, b); Cout<<“after function calling”<<a<<b; getch(); Return 0;

void swap(int x, int y) { int z; z=x; x=y; y=z; Cout<<“value is”<<x<<y; }

void swap(int x, int y) { int z; z=x; x=y; y=z; Cout<<“value is”<<x<<y; }

Output: before function calling a=10 b=20 value of x=20 and y= 10 after function

Output: before function calling a=10 b=20 value of x=20 and y= 10 after function calling a=10 b=20

Call By pointer/address • In this instead of passing value, address are passed. •

Call By pointer/address • In this instead of passing value, address are passed. • Here formal arguments are pointers to the actual arguments • Hence change made in the argument are permanent. • The address of arguments is passed by preceding the address operator(&) with the name of the variable whose value you want to modify. • The formal arguments are processed by asterisk (*) which acts as a pointer variable to store the addresses of the actual arguments

Example Void main() { int a=10 , b=25; void swap(int *, int *); Cout<<“before

Example Void main() { int a=10 , b=25; void swap(int *, int *); Cout<<“before function calling”<<a<<b; swap(&a, &b); Cout<<“after function calling”<<a<<b; getch(); }

void swap(int *x, int *y) { int z; z=*x; *x=*y; *y=z; Cout<<“value is”<<*x<<*y; }

void swap(int *x, int *y) { int z; z=*x; *x=*y; *y=z; Cout<<“value is”<<*x<<*y; }

Output: before function calling a= 10 b= 25 value of x=25 and y=10 after

Output: before function calling a= 10 b= 25 value of x=25 and y=10 after function calling a=25 b= 10

Using Reference Variables with Functions • To create a second name for a variable

Using Reference Variables with Functions • To create a second name for a variable in a program, you can generate an alias, or an alternate name • In C++ a variable that acts as an alias for another variable is called a reference variable, or simply a reference

Declaring Reference Variables • You declare a reference variable by placing a type and

Declaring Reference Variables • You declare a reference variable by placing a type and an ampersand in front of a variable name, as in double &cash; and assigning another variable of the same type to the reference variable double some. Money; double &cash = some. Money; • A reference variable refers to the same memory address as does a variable, and a pointer holds the memory address of a variable

Pass By Reference void main() { int i=10; int &j=i; // j is a

Pass By Reference void main() { int i=10; int &j=i; // j is a reference variable of I cout<<“value”<<i<<“t”<<j; j=20; cout<<“modified value”<<i<<“t”<<j; getch(); }

Output: Value 10 10 modified value 20 20

Output: Value 10 10 modified value 20 20

Declaring Reference Variables • There are two differences between reference variables and pointers: –

Declaring Reference Variables • There are two differences between reference variables and pointers: – Pointers are more flexible – Reference variables are easier to use • You assign a value to a pointer by inserting an ampersand in front of the name of the variable whose address you want to store in the pointer • It shows that when you want to use the value stored in the pointer, you must use the asterisk to dereference the pointer, or use the value to which it points, instead of the address it holds

 • Call by value. This method copies the actual value of an argument

• Call by value. This method copies the actual value of an argument into the formal parameter of the function. In this case, changes made to the parameter inside the function have no effect on the argument.

 • . Call by pointer. This method copies the address of an argument

• . Call by pointer. This method copies the address of an argument into the formal parameter. Inside the function, the address is used to access the actual argument used in the call. This means that changes made to the parameter affect the argument.

 • Call by reference. This method copies the reference of an argument into

• Call by reference. This method copies the reference of an argument into the formal parameter. Inside the function, the reference is used to access the actual argument used in the call. This means that changes made to the parameter affect the argument.

INLINE FUNCTIONS

INLINE FUNCTIONS

Inline Functions • Each time you call a function in a C++ program, the

Inline Functions • Each time you call a function in a C++ program, the computer must do the following: – Remember where to return when the function eventually ends – Provide memory for the function’s variables – Provide memory for any value returned by the function – Pass control to the function – Pass control back to the calling program • This extra activity constitutes the overhead, or cost of doing business, involved in calling a function.

 • Solution to this is to replace each function call with the necessary

• Solution to this is to replace each function call with the necessary code instead of making function. • Inline function is a function which gets expanded inline at each point in the program where it is called. • In other words inline functions are those functions whose function body is inserted in place of the function call during the compilation process. • Syntax: inline ret_type func_name(parameter_list) {

inline int max(int x, int y) { return (x>y? x: y); } int main()

inline int max(int x, int y) { return (x>y? x: y); } int main() { int m=10, n=25; int a, b; a=max(6, 8); cout<<“greatest is”<<a; b=max(m, n); cout<<“greates of m=“<<m<<“ and n=“<<n <<“is “<<b; getch(); return 0; }

 • Output : Greatest of 6 and 8=8 Greatest of m=10 and n=25

• Output : Greatest of 6 and 8=8 Greatest of m=10 and n=25 is 25

 • An inline function is a small function with no calling overhead •

• An inline function is a small function with no calling overhead • Overhead is avoided because program control never transfers to the function • A copy of the function statements is placed directly into the compiled calling program • The inline function appears prior to the main(), which calls it • Any inline function must precede any function that calls it, which eliminates the need for prototyping in the calling function

 • When you compile a program, the code for the inline function is

• When you compile a program, the code for the inline function is placed directly within the main() function • You should use an inline function only in the following situations: – When you want to group statements together so that you can use a function name – When the number of statements is small (one or two lines in the body of the function) – When the function is called on few occasions

Disadvantages: • All functions that uses the inline function must be recompiled if any

Disadvantages: • All functions that uses the inline function must be recompiled if any changes are made to the inline function. • Although inline function reduces the execution time. It increases the size of the executable file as multiple copies of the inline functions body are inserted in the programs. So it is always recommended to use inline functions for small frequently used functions. • The definition of inline function should appear before the function call.

DEFAULT ARGUMENTS

DEFAULT ARGUMENTS

DEFAULT ARGUMENTS • Default arguments is useful in situation where a arguments has the

DEFAULT ARGUMENTS • Default arguments is useful in situation where a arguments has the same value in most function calls. • When the desired value is different from the default value, the desired value can be specified explicity in a function call. • This changes the default value of the argument to be overridden for the duration of function call. • If in the function call the arguments are not

void volume(int l=10, int w=10, int h=10); //function declatration int main() { volume ();

void volume(int l=10, int w=10, int h=10); //function declatration int main() { volume (); volume(5); volume(8, 6); volume(6, 4, 5); getch(); return 0; } void volume(int l, intw, int h) { Cout<<“volume =“<<l*w*h<<endl; } Output: Volume: 1000 Volume: 500 Volume: 480 Volume: 120

Using Default Arguments • When you don’t provide enough arguments in a function call,

Using Default Arguments • When you don’t provide enough arguments in a function call, you usually want the compiler to issue a warning message for this error • Sometimes it is useful to create a function that supplies a default value for any missing parameters

Using Default Arguments • Two rules apply to default parameters: – If you assign

Using Default Arguments • Two rules apply to default parameters: – If you assign a default value to any variable in a function prototype’s parameter list, then all parameters to the right of that variable also must have default values – If you omit any argument when you call a function that has default parameters, then you also must leave out all arguments to the right of that argument

Examples of Legal and Illegal Use of Functions with Default Parameters

Examples of Legal and Illegal Use of Functions with Default Parameters

RECURSIVE FUNCTIONS

RECURSIVE FUNCTIONS

Recursion • When function call itself repeatedly , until some specified condition is met

Recursion • When function call itself repeatedly , until some specified condition is met then this process is called recursion. • It is useful for writing repetitive problems where each action is stated in terms of previous result. • The need of recursion arises if logic of the problem is such that the solution of the problem depends upon the repetition of certain set of statements with different input values an with a condition.

Two basic requirements for recursion : 1. The function must call itself again and

Two basic requirements for recursion : 1. The function must call itself again and again. 2. It must have an exit condition.

int main() { int factorial (int); int x, fact; cout<<“enter a number=“; cin>>x; fact=factorial(x);

int main() { int factorial (int); int x, fact; cout<<“enter a number=“; cin>>x; fact=factorial(x); cout<<“n factorial of”<<x<<“=“<<fact; getch(); return 0; } int factorial(int a) { int b; if(a==1) return (1);

 • Output: Enter a number=3 Factorial 0 f 3=6

• Output: Enter a number=3 Factorial 0 f 3=6

Stack representation . 3*2*fact(1) . 3*fact(2) fact(3) 3*2*1 3*2*fact(1) 3*fact(2) fact(3)

Stack representation . 3*2*fact(1) . 3*fact(2) fact(3) 3*2*1 3*2*fact(1) 3*fact(2) fact(3)

Fibonacci using recursion int main() { int fib(int); int n; cout<<“enter the number of

Fibonacci using recursion int main() { int fib(int); int n; cout<<“enter the number of terms=“; cin>>n; for(int i=1; i<=n; i++) cout<<fib(i)<<“ “; getch(); return o; } int fib(int m) { if(m==1|| m==2)

Advantages of recursion 1. It make program code compact which is easier to write

Advantages of recursion 1. It make program code compact which is easier to write and understand. 2. It is used with the data structures such as linklist, stack, queues etc. 3. It is useful if a solution to a problem is in repetitive form. 4. The compact code in a recursion simplifies the compilation as less number of lines need to be compiled.

Disadvantages 1. Consume more storage space as recursion calls and automatic variables are stored

Disadvantages 1. Consume more storage space as recursion calls and automatic variables are stored in a stack. 2. It is less efficient in comparison to normal program in case of speed and execution time 3. Special care need to be taken for stopping condition in a recursion function 4. If the recursion calls are not checked , the computer may run out of memory.

FUNCTION OVERLOADING

FUNCTION OVERLOADING

Polymorphism • The word polymorphism is derived from Greek word Poly which means many

Polymorphism • The word polymorphism is derived from Greek word Poly which means many and morphos which means forms. • Polymorphism can be defined as the ability to use the same name for two or more related but technically different tasks. • Eg-woman plays role of daughter, sister, wife, mother etc.

Overloading in C++ q. What is overloading – Overloading means assigning multiple meanings to

Overloading in C++ q. What is overloading – Overloading means assigning multiple meanings to a function name or operator symbol – It allows multiple definitions of a function with the same name, but different signatures. q. C++ supports – Function overloading – Operator overloading

Why is Overloading Useful? q Function overloading allows functions that conceptually perform the same

Why is Overloading Useful? q Function overloading allows functions that conceptually perform the same task on objects of different types to be given the same name. q Operator overloading provides a convenient notation for manipulating user-defined objects with conventional operators.

Function Overloading • Is the process of using the same name for two or

Function Overloading • Is the process of using the same name for two or more functions • Requires each redefinition of a function to use a different function signature that is: – different types of parameters, – or sequence of parameters, – or number of parameters • Is used so that a programmer does not have to remember multiple function names

Function Overloading • Two or more functions can have the same name but different

Function Overloading • Two or more functions can have the same name but different parameters • Example: int max(int a, int b) { if (a>= b) return a; else return b; } float max(float a, float b) { if (a>= b) return a; else return b; }

Overloading Function Call Resolution q Overloaded function call resolution is done by compiler during

Overloading Function Call Resolution q Overloaded function call resolution is done by compiler during compilation – The function signature determines which definition is used q a Function signature consists of: – Parameter types and number of parameters supplied to a function q a Function return type is not part of function signature and is not used in function call resolution

void sum(int, int); void sum(double, double); void sum(char, char); void main() { int a=10,

void sum(int, int); void sum(double, double); void sum(char, char); void main() { int a=10, b=20 ; double c=7. 52, d=8. 14; char e=‘a’ , f=‘b’ ; sum(a, b); //calls sum(int x, int y) sum(c, d); //calls sum (double x, double y) sum(e, f); // calls sum(char x, char y) } void sum(int x, int y) { vout<<“n sum of integers are”<<x+y; } void sum(double x, double y) { cout<<“n sum of two floating no are”<<x+y; } void sum(char x, char y) { cout<<“n sum of characters are”<<x+y;

 • Output: Sum of integers 30 sum of two floating no are 15.

• Output: Sum of integers 30 sum of two floating no are 15. 66 sum of characters are 195

Void area(int) Void area(int, int); Int main() { Int side=10, le=5, br=6, a=4, b=5,

Void area(int) Void area(int, int); Int main() { Int side=10, le=5, br=6, a=4, b=5, c=6; Area(side); Area(le, br); Area(a, b, c); Getch(); Return 0; } Void area(int x) { cout<<“area is”<<x*x; } Void area(int x, int y) {cout<<“area of rectang; e”=<<x*y; }

SCOPE RULES

SCOPE RULES

Scope • The scope of a variable is the portion of a program where

Scope • The scope of a variable is the portion of a program where the variable has meaning (where it exists). • A global variable has global (unlimited) scope. • A local variable’s scope is restricted to the function that declares the variable. • A block variable’s scope is restricted to the block in which the variable is declared.

Understanding Scope • Some variables can be accessed throughout an entire program, while others

Understanding Scope • Some variables can be accessed throughout an entire program, while others can be accessed only in a limited part of the program • The scope of a variable defines where it can be accessed in a program • To adequately understand scope, you must be able to distinguish between local and global variables

Local variables • Parameters and variables declared inside the definition of a function are

Local variables • Parameters and variables declared inside the definition of a function are local. • They only exist inside the function body. • Once the function returns, the variables no longer exist! – That’s fine! We don’t need them anymore!

Block Variables • You can also declare variables that exist only within the body

Block Variables • You can also declare variables that exist only within the body of a compound statement (a block): { int foo; … … }

Global variables • You can declare variables outside of any function definition – these

Global variables • You can declare variables outside of any function definition – these variables are global variables. • Any function can access/change global variables. • Example: flag that indicates whether debugging information should be printed.

Distinguishing Between Local and Global Variables • Celebrity names are global because they are

Distinguishing Between Local and Global Variables • Celebrity names are global because they are known to people everywhere and always refer to those same celebrities • Global variables are those that are known to all functions in a program • Some named objects in your life are local • You might have a local co-worker whose name takes precedence over, or overrides, a global one

A note about Global vs. File scope • A variable declared outside of a

A note about Global vs. File scope • A variable declared outside of a function is available everywhere, but only the functions that follow it in the file know about it. • The book talks about file scope, I’m calling it global scope.

Block Scope int main(void) { int y; { int a = y; cout <<

Block Scope int main(void) { int y; { int a = y; cout << a << endl; } s e do a – r ck! o r o Er e bl th e t ’ n x o ist u e d i ts

MANIPULATOR FUNCTIONS

MANIPULATOR FUNCTIONS

 • These are special stream functions that change certain characteristics of input and

• These are special stream functions that change certain characteristics of input and output. • The main advantage of using manipulator functions is that they facilitate the formatting of input and output stream. • To carry out the operations of these manipulator functions the header file <iomanip. h> must be included.

Following are the standard manipulators normally used in the stream classes: • endl •

Following are the standard manipulators normally used in the stream classes: • endl • hex, dec, oct • setbase • setw • setfill • setprecision

endl • It is an output manipulator to generate a next line character. •

endl • It is an output manipulator to generate a next line character. • cout<<“a”<<endl<<“b”

Setbase() • Used to convert the base of one numeric value into another base

Setbase() • Used to convert the base of one numeric value into another base #include<iomanip. h> Void main() { int value; Cout<<“enter number”<<endl; Cin>>value; Cout<<“decimal base “<<setbase(10)<<value; cout<<“hexadecimal base”<<setbase(16)<<value; Cout<<“octal base”<<setbase(8)<<value;

 • Output: Enter number 10 Decimal base 10 Hexadecimal base=a Octal base 12

• Output: Enter number 10 Decimal base 10 Hexadecimal base=a Octal base 12

Setw() • It is used to specify the minimum number of character position on

Setw() • It is used to specify the minimum number of character position on the output field a variable will consume. void main() { int a=200, b=300; cout<<setw(5)<<a<<setw(5)<<b<<endl; cout<<setw(6)<<a<<setw(6)<<b<<endl; cout<<setw(7)<<a<<setw(7)<<b<<endl;

 • Output: 200 200 300 300

• Output: 200 200 300 300

Setfill() • It is used to specify a different character to fill the unused

Setfill() • It is used to specify a different character to fill the unused field width of the value. void main() int a=200, b=300; cout<<“setfill(‘*’); cout<<setw(5)<<a<<setw(5)<<b<<endl; cout<<setw(6)<<a<<setw(6)<<b<<endl; } Output:

Setprecision() It is used to control the number of digits of an output stream

Setprecision() It is used to control the number of digits of an output stream display of a floating point value. The default precision is 6 void main() { float a=5, b=3, c=a/b; cout<<setprecision(1)<<c<<endl; cout<<setprecision(2)<<c<<endl; cout<<setprecision(3)<<c<<endl; } Output: 1. 7 1. 667