recursion: function calling itselfcse.iitkgp.ac.in/pds/current/ls/lectureslides_week5.pdf ·...

61
02/06/2020 1 RECURSION: FUNCTION CALLING ITSELF Programming and Data Structure 1 Programming and Data Structure 2 Recursion A process by which a function calls itself repeatedly. Either directly. X calls X. Or cyclically in a chain. X calls Y, and Y calls X. Used for repetitive computations in which each action is stated in terms of a previous result. fact(n) = n * fact (n-1)

Upload: others

Post on 01-Oct-2020

23 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

1

RECURSION: FUNCTION CALLING ITSELF

Programming and Data Structure 1

Programming and Data Structure 2

Recursion

• A process by which a function calls itself repeatedly.

– Either directly.

• X calls X.

– Or cyclically in a chain.

• X calls Y, and Y calls X.

• Used for repetitive computations in which each action is stated in terms of a previous result.

fact(n) = n * fact (n-1)

Page 2: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

2

Programming and Data Structure 3

Contd.

• For a problem to be written in recursive form, two conditions are to be satisfied:

– It should be possible to express the problem in recursive form.

– The problem statement must include a stopping condition.

fact(n) = 1, if n = 0

= n * fact(n-1), if n > 0

Programming and Data Structure 4

• Examples:

– Factorial: fact(0) = 1

fact(n) = n * fact(n-1), if n > 0

– GCD: gcd (0, n) = n

gcd (m, 0) = m

gcd (m, n) = m, if m = n

gcd (m, n) = gcd (m%n, n), if m > n

gcd (m, n) = gcd (m, n%m), if m < n

– Fibonacci series (0, 1, 1, 2, 3, 5, 8, 13, ….) fib (0) = 0

fib (1) = 1

fib (n) = fib (n-1) + fib (n-2), if n > 1

Page 3: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

3

Example 1 :: Factorial

Programming and Data Structure 5

long int fact (n)

int n;

{

if (n == 0)

return (1);

else

return (n * fact(n-1));

}

Programming and Data Structure 6

Example 2 :: GCD

int gcd (m, n)

int m, n;

{

if (m == 0) return n;

if (n == 0) return m;

if (m == n) return (m);

if (m > n)

return gcd (m%n, n);

else

return gcd (m, n%m);

}

Page 4: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

4

Programming and Data Structure 7

• Mechanism of execution

– When a recursive program is executed, the recursive function calls are not executed immediately.

• They are kept aside (on a stack) until the stopping condition is encountered.

• The function calls are then executed in reverse order.

Programming and Data Structure 8

Example :: Calculating fact(4)

– First, the function calls will be processed: fact(4) = 4 * fact(3)

fact(3) = 3 * fact(2)

fact(2) = 2 * fact(1)

fact(1) = 1 * fact(0)

– The actual values return in the reverse order: fact(0) = 1

fact(1) = 1 * 1 = 1

fact(2) = 2 * 1 = 2

fact(3) = 3 * 2 = 6

fact(4) = 4 * 6 = 24

Page 5: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

5

Programming and Data Structure 9

Example 3 :: Fibonacci number

• Fibonacci number f(n) can be defined as:

f(0) = 0 f(1) = 1

f(n) = f(n-1) + f(n-2), if n > 1

– The successive Fibonacci numbers are:

0, 1, 1, 2, 3, 5, 8, 13, 21, …..

• Function definition:

int f (int n)

{

if (n < 2) return (n);

else return (f(n-1) + f(n-2));

}

Programming and Data Structure 10

Tracing Execution

• How many times the function is called when evaluating f(4) ?

• Inefficiency:

– Same thing is computed several times.

f(4)

f(3) f(2)

f(1) f(2) f(0) f(1)

f(1) f(0)

called 9 times

Page 6: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

6

Performance Tip

• Avoid Fibonacci-style recursive programs which result in an exponential “explosion” of calls.

• Avoid using recursion in performance situations.

• Recursive calls take time and consume additional memory.

Programming and Data Structure 11

Fibonacci number: iterative version

Programming and Data Structure 12

#include <stdio.h>

int f (int x);

int main()

{

printf (“\n %d %d %d %d”, f(2), f(3), f(4), f(5));

}

int f (int n)

{

int a = 0, b = 1, temp, i;

for (i=2; i<=n; i++)

{

temp = a + b;

a = b;

b = temp;

}

return (b);

}

Output:

1 2 3 5

Page 7: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

7

Programming and Data Structure 13

Example 4 :: Towers of Hanoi Problem

5

4

3 2 1

LEFT CENTER RIGHT

Programming and Data Structure 14

• The problem statement:

– Initially all the disks are stacked on the LEFT pole.

– Required to transfer all the disks to the RIGHT pole.

• Only one disk can be moved at a time.

• A larger disk cannot be placed on a smaller disk.

– CENTER pole is used for temporary storage of disks.

Page 8: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

8

Programming and Data Structure 15

• Recursive statement of the general problem of n disks.

– Step 1:

• Move the top (n-1) disks from LEFT to CENTER.

– Step 2:

• Move the largest disk from LEFT to RIGHT.

– Step 3:

• Move the (n-1) disks from CENTER to RIGHT.

Programming and Data Structure 16

#include <stdio.h>

void transfer (int n, char from, char to, char temp);

main()

{

int n; /* Number of disks */

scanf (%d, &n);

transfer (n, ’L’, ’R’, ’C’);

}

void transfer (int n, char from, char to, char temp)

{

if (n > 0) {

transfer (n-1, from, temp, to);

printf (Move disk %d from %c to %c \n, n, from, to);

transfer (n-1, temp, to, from);

}

return;

}

Page 9: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

9

Programming and Data Structure 17

3

Move disk 1 from L to R

Move disk 2 from L to C

Move disk 1 from R to C

Move disk 3 from L to R

Move disk 1 from C to L

Move disk 2 from C to R

Move disk 1 from L to R

4

Move disk 1 from L to C

Move disk 2 from L to R

Move disk 1 from C to R

Move disk 3 from L to C

Move disk 1 from R to L

Move disk 2 from R to C

Move disk 1 from L to C

Move disk 4 from L to R

Move disk 1 from C to R

Move disk 2 from C to L

Move disk 1 from R to L

Move disk 3 from C to R

Move disk 1 from L to C

Move disk 2 from L to R

Move disk 1 from C to R

Programming and Data Structure 18

Move disk 5 from L to R

Move disk 1 from C to L

Move disk 2 from C to R

Move disk 1 from L to R

Move disk 3 from C to L

Move disk 1 from R to C

Move disk 2 from R to L

Move disk 1 from C to L

Move disk 4 from C to R

Move disk 1 from L to R

Move disk 2 from L to C

Move disk 1 from R to C

Move disk 3 from L to R

Move disk 1 from C to L

Move disk 2 from C to R

Move disk 1 from L to R

5

Move disk 1 from L to R

Move disk 2 from L to C

Move disk 1 from R to C

Move disk 3 from L to R

Move disk 1 from C to L

Move disk 2 from C to R

Move disk 1 from L to R

Move disk 4 from L to C

Move disk 1 from R to C

Move disk 2 from R to L

Move disk 1 from C to L

Move disk 3 from R to C

Move disk 1 from L to R

Move disk 2 from L to C

Move disk 1 from R to C

Page 10: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

10

Programming and Data Structure 19

Recursion vs. Iteration

• Repetition

– Iteration: explicit loop

– Recursion: repeated function calls

• Termination

– Iteration: loop condition fails

– Recursion: base case recognized

• Both can have infinite loops

• Balance

– Choice between performance (iteration) and good software engineering (recursion).

Programming and Data Structure 20

How are function calls implemented?

• The following applies in general, with minor variations that are implementation dependent.

– The system maintains a stack in memory.

• Stack is a last-in first-out structure.

• Two operations on stack, push and pop.

– Whenever there is a function call, the activation record gets pushed into the stack.

• Activation record consists of:

– the return address in the calling program,

– the return value from the function, and

– the local variables inside the function.

Page 11: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

11

Programming and Data Structure 21

main()

{

……..

x = gcd (a, b);

……..

}

int gcd (int x, int y)

{

……..

……..

return (result);

}

Return Addr

Return Value

Local Variables

Before call After call After return

STA

CK

Activation record

Programming and Data Structure 22

main()

{

……

x=ncr(a,b);

……

}

int ncr (int n,int r)

{

return (fact(n)/

fact(r)/fact(n-r));

}

LV1, RV1, RA1

Before call Call fact ncr returns

int fact (int n)

{

………

return(result);

}

3 times

LV1, RV1, RA1

fact returns

LV1, RV1, RA1

LV2, RV2, RA2

Call ncr

3 times

Page 12: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

12

Programming and Data Structure 23

What happens for recursive calls?

• What we have seen ….

– Activation record gets pushed into the stack when a function call is made.

– Activation record is popped off the stack when the function returns.

• In recursion, a function calls itself.

– Several function calls going on, with none of the function calls returning back.

• Activation records are pushed onto the stack continuously.

• Large stack space required.

• Activation records keep popping off, when the termination condition of recursion is reached.

Programming and Data Structure 24

• We shall illustrate the process by an example of computing factorial.

– Activation record looks like:

Return Addr

Return Value

Local

Variables

Page 13: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

13

Programming and Data Structure 25

Example:: main() calls fact(3)

int fact (n)

int n;

{

if (n == 0)

return (1);

else

return (n * fact(n-1));

}

main()

{

int n;

n = 3;

printf (”%d \n”, fact(n) ); }

Programming and Data Structure 26

RA .. main

-

n = 3

RA .. main

-

n = 3

RA .. fact

-

n = 2

RA .. main

-

n = 3

RA .. fact

-

n = 2

RA .. fact

-

n = 1

RA .. main

-

n = 3

RA .. fact

-

n = 2

RA .. fact

-

n = 1

RA .. fact

1

n = 0

RA .. main

-

n = 3

RA .. fact

-

n = 2

RA .. fact

1*1 = 1

n = 1

RA .. main

-

n = 3

RA .. fact

2*1 = 2

n = 2

RA .. main

3*2 = 6

n = 3

TRACE OF THE STACK DURING EXECUTION

main calls fact

fact returns to main

Page 14: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

14

Programming and Data Structure 27

Do Yourself

• Trace the activation records for the following version of Fibonacci

sequence.

#include <stdio.h>

int f (int n)

{

int a, b;

if (n < 2) return (n);

else {

a = f(n-1);

b = f(n-2);

return (a+b);

}

}

main() {

printf(Fib(4) is: %d \n, f(4));

}

Return Addr

(either main,

or X, or Y)

Return Value

Local

Variables

(n, a, b)

X

Y

main

Storage Class of Variables

Page 15: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

15

Programming and Data Structure 29

What is Storage Class?

• It refers to the permanence of a variable, and its scope within a program.

• Four storage class specifications in C: – Automatic: auto

– External: extern

– Static: static

– Register: register

Programming and Data Structure 30

Automatic Variables

• These are always declared within a function and are local to the function in which they are declared.

– Scope is confined to that function.

• This is the default storage class specification. – All variables are considered as auto unless explicitly

specified otherwise.

– The keyword auto is optional.

– An automatic variable does not retain its value once control is transferred out of its defining function.

Page 16: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

16

Programming and Data Structure 31

#include <stdio.h>

int factorial(int m)

{

auto int i;

auto int temp=1;

for (i=1; i<=m; i++)

temp = temp * i;

return (temp);

}

main()

{

auto int n;

for (n=1; n<=10; n++)

printf (%d! = %d \n,

n, factorial (n));

}

Programming and Data Structure 32

Static Variables

• Static variables are defined within individual functions and have the same scope as automatic variables.

• Unlike automatic variables, static variables retain their values throughout the life of the program.

– If a function is exited and re-entered at a later time, the static variables defined within that function will retain their previous values.

– Initial values can be included in the static variable declaration.

• Will be initialized only once.

• An example of using static variable: – Count number of times a function is called.

Page 17: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

17

Programming and Data Structure 33

#include <stdio.h>

int factorial (int n)

{

static int count=0;

count++;

printf (n=%d, count=%d \n, n, count);

if (n == 0) return 1;

else return (n * factorial(n-1));

}

main()

{

int i=6;

printf (Value is: %d \n, factorial(i));

}

EXAMPLE 1

Programming and Data Structure 34

• Program output: n=6, count=1

n=5, count=2

n=4, count=3

n=3, count=4

n=2, count=5

n=1, count=6

n=0, count=7

Value is: 720

Page 18: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

18

Programming and Data Structure 35

#include <stdio.h>

int fib (int n)

{

static int count=0;

count++;

printf (n=%d, count=%d \n, n, count);

if (n < 2) return n;

else return (fib(n-1) + fib(n-2));

}

main()

{

int i=4;

printf (Value is: %d \n, fib(i));

}

EXAMPLE 2

Programming and Data Structure 36

• Program output:

n=4, count=1 n=3, count=2

n=2, count=3

n=1, count=4

n=0, count=5

n=1, count=6

n=2, count=7

n=1, count=8

n=0, count=9

Value is: 3 [0,1,1,2,3,5,8,….]

f(4)

f(3) f(2)

f(1) f(2) f(0) f(1)

f(1) f(0)

Page 19: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

19

Programming and Data Structure 37

Register Variables

• These variables are stored in high-speed registers within the CPU.

– Commonly used variables may be declared as register variables.

– Results in increase in execution speed.

– The allocation is done by the compiler.

Programming and Data Structure 38

External Variables

• They are not confined to single functions.

• Their scope extends from the point of definition through the remainder of the program.

– They may span more than one functions.

– Also called global variables.

• Alternate way of declaring global variables.

– Declare them outside the function, at the beginning.

Page 20: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

20

Programming and Data Structure 39

#include <stdio.h>

int count=0; /** GLOBAL VARIABLE **/

int factorial (int n)

{

count++;

printf (n=%d, count=%d \n, n, count);

if (n == 0) return 1;

else return (n * factorial(n-1));

}

main() {

int i=6;

printf (Value is: %d \n, factorial(i));

printf (Count is: %d \n, count);

}

SOME EXAMPLES ON RECURSION

Programming and Data Structure 40

Page 21: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

21

GCD Computation … Correct Version #include <stdio.h>

int gcd (m, n)

int m, n;

{

if (m == 0) return n;

if (n == 0) return m;

if (m == n) return (m);

if (m > n)

return gcd (m%n, n);

else

return gcd (m, n%m);

}

int main()

{

int num1, num2;

scanf ("%d %d", &num1, &num2);

printf ("\nGCD of %d and %d is %d", num1, num2, gcd(num1,num2));

}

Programming and Data Structure 41

GCD of 12 and 12 is 12

GCD of 15 and 0 is 15

GCD of 0 and 25 is 25

GCD of 156 and 66 is 6

GCD of 75 and 925 is 25

Compute power ab

// Compute a to the power b

#include <stdio.h>

long int power (int a, int b)

{

if (b == 0) return (1);

else return (a * power(a,b-1));

}

int main()

{

int x, y;

long int result;

scanf ("%d %d", &x, &y);

result = power (x, y);

printf ("\n%d to the power %d is %ld", x, y, result);

}

Programming and Data Structure 42

3 to the 4 is 81

2 to the power 16 is 65536

2 to the power 8 is 256

17 to the power 4 is 83521

436 to the power 0 is 1

Page 22: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

22

Sum of digits of a number

// Find sum of the digits of a number

#include <stdio.h>

int digitsum (int num)

{

int digit;

if (num == 0) return (0);

else {

digit = num % 10;

return (digit + digitsum(num/10));

}

}

int main()

{

int a;

scanf ("%d", &a);

printf ("\nSum of digits of %d is %d", a, digitsum(a));

}

Programming and Data Structure 43

Sum of digits of 25 is 7

Sum of digits of 23863 is 22

Sum of digits of 11111 is 5

Sum of digits of 0 is 0

Sum of digits of 9999 is 36

Decimal to Binary // Print a decimal number in binary

#include <stdio.h>

void dec2bin (int n)

{

if (n == 0) return;

else {

dec2bin (n/2);

printf ("%2d", n%2);

}

}

int main()

{

int dec;

scanf ("%d", &dec);

printf ("\nBinary of %d is",

dec);

dec2bin (dec);

}

Programming and Data Structure 44

Binary of 25 is 1 1 0 0 1

Binary of 12 is 1 1 0 0

Binary of 128 is 1 0 0 0 0 0 0 0

Binary of 254 is 1 1 1 1 1 1 1 0

Page 23: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

1

Arrays in C

Programming and Data Structure 2

Basic Concept

• Many applications require multiple data items that have common characteristics.

– In mathematics, we often express such groups of data items in indexed form:

x1, x2, x3, …, xn

• Why are arrays essential for some applications?

– Take an example.

– Finding the minimum of a set of numbers.

Page 24: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

2

Programming and Data Structure 3

if ((a <= b) && (a <= c))

min = a;

else

if (b <= c)

min = b;

else

min = c;

if ((a <= b) && (a <= c) && (a <= d))

min = a;

else

if ((b <= c) && (b <= d))

min = b;

else

if (c <= d)

min = c;

else

min = d;

3 numbers

4 numbers

Programming and Data Structure 4

The Problem

• Suppose we have 10 numbers to handle.

• Or 20.

• Or 100.

• How to tackle this problem?

• Solution:

– Use arrays.

Page 25: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

3

Programming and Data Structure 5

Using Arrays

• All the data items constituting the group share the same name.

int x[10];

• Individual elements are accessed by specifying the index.

x[0] x[1] x[2] x[9]

x is a 10-element one-dimensional array

Programming and Data Structure 6

• The name of the array also denotes the starting address of the array in memory.

– Example: int x[10];

x[0], x[1], x[2], … indicates the contents of the successive array locations.

x indicates the starting address in memory for the array.

Page 26: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

4

Programming and Data Structure 7

An Example

#include <stdio.h>

main()

{

int x[10];

x[0] = 15;

x[1] = x[0] + 5;

printf (”\n%d %d %d %u \n”, x[0], x[1], x[2], x);

}

Output:

15 20 1107384350 3221224640

Garbage Address

Declaring Arrays

• Like variables, the arrays that are used in a program must be declared before they are used.

• General syntax:

type array-name[size];

– type specifies the data type of element that will be contained in the array (int, float, char, etc.).

– size is an integer constant which indicates the maximum number of elements that can be stored inside the array.

• Example: int marks[5];

– marks is an array containing a maximum of 5 integers.

Programming and Data Structure 8

Page 27: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

5

Programming and Data Structure 9

• Examples:

int x[10]; char line[80];

float points[150];

char name[35];

• If we are not sure of the exact size of the array, we can define an array of a large size.

int marks[50];

though in a particular run we may only be using, say, 10 elements.

Programming and Data Structure 10

How an array is stored in memory?

• Starting from a given memory location, the successive array

elements are allocated space in consecutive memory

locations.

x: starting address of the array in memory

k: number of bytes allocated per array element

– Element a[i] :: allocated memory location at address x + i*k

– First array index assumed to start at zero.

Array a

x x+k x+2k

int a[10];

Page 28: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

6

Programming and Data Structure 11

Accessing Array Elements

• A particular element of the array can be accessed by specifying two things:

– Name of the array.

– Index (relative position) of the element in the array.

• In C, the index of an array starts from zero.

• Example:

– An array is defined as int x[10];

– The first element of the array x can be accessed as x[0], fourth element as x[3], tenth element as x[9], etc.

Programming and Data Structure 12

Contd.

• The array index must evaluate to an integer between 0 and n-1 where n is the number of elements in the array.

• Any integer expression can be given as the index.

a[x+2] = 25; b[3*x-y] = a[10-x] + 5;

Page 29: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

7

Programming and Data Structure 13

A Warning

• In C, while accessing array elements, array bounds are not checked.

• Example: int marks[5];

:

:

marks[8] = 75;

– The above assignment would not necessarily cause an error.

– Rather, it may result in unpredictable program results.

Programming and Data Structure 14

Initialization of Arrays

• General form:

type array_name[size] = {list of values};

• Examples:

int marks[5] = {72, 83, 65, 80, 76};

char name[4] = {’A’, ’m’, ’i’, ’t’};

• Some special cases:

– If the number of values in the list is less than the number of elements, the remaining elements are automatically set to zero. float total[5] = {24.2, -12.5, 35.1};

total[0]=24.2, total[1]=-12.5, total[2]=35.1,

total[3]=0, total[4]=0

Page 30: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

8

Programming and Data Structure 15

Contd.

– The size may be omitted. In such cases the compiler automatically allocates enough space for all initialized elements.

int flag[] = {1, 1, 1, 0};

char name[] = {’A’, ’m’, ’i’, ’t’};

Programming and Data Structure 16

Example 1: Find the minimum of a set of 10 numbers

#include <stdio.h>

main()

{

int a[10], i, min;

for (i=0; i<10; i++)

scanf (%d, &a[i]);

min = 99999; /* or, min=a[0] */

for (i=0; i<10; i++)

{

if (a[i] < min)

min = a[i];

}

printf (\n Minimum is %d, min);

}

Page 31: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

9

Programming and Data Structure 17

Example 1: Find the minimum of a set of 10 numbers

#include <stdio.h>

main()

{

int a[10], i, min;

for (i=0; i<10; i++)

scanf (%d, &a[i]);

min = a[0];

for (i=0; i<10; i++)

{

if (a[i] < min)

min = a[i];

}

printf (\n Minimum is %d, min);

}

Programming and Data Structure 18

#include <stdio.h>

#define size 10

main()

{

int a[size], i, min;

for (i=0; i<size; i++)

scanf (%d, &a[i]);

min = a[0];

for (i=0; i<size; i++)

{

if (a[i] < min)

min = a[i];

}

printf (\n Minimum is %d, min);

}

Alternate

Version 1

Change only one line to change the

problem size

Page 32: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

10

Programming and Data Structure 19

#include <stdio.h>

main()

{

int a[100], i, min, n;

scanf (%d, &n);

/* Number of elements */

for (i=0; i<n; i++)

scanf (%d, &a[i]);

min = a[0];

for (i=0; i<n; i++)

{

if (a[i] < min)

min = a[i];

}

printf (\n Minimum is %d, min);

}

Alternate

Version 2

Define an array of large size and use only the required

number of elements

Programming and Data Structure 20

Example 2: Computing gpa

#include <stdio.h>

#define nsub 6

main()

{

int grade_pt[nsub], cred[nsub], i,

gp_sum=0, cred_sum=0;

float gpa;

for (i=0; i<nsub; i++)

scanf (%d %d, &grade_pt[i],&cred[i]);

for (i=0; i<nsub; i++)

{

gp_sum += grade_pt[i] * cred[i];

cred_sum += cred[i];

}

gpa = (float) gp_sum / cred_sum;

printf (\n GPA is: %f, gpa);

}

Handling two arrays at the same time

Page 33: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

11

Things you cannot do

• You cannot

– use “=” to assign one array variable to another:

a = b; /* a and b are arrays */

– use “==” to directly compare array variables:

if (a == b) ………

– directly scanf or printf arrays:

printf (”……”, a);

Programming and Data Structure 21

int a[20], b[20];

Programming and Data Structure 22

How to copy the elements of one array to another?

• By copying individual elements:

int a[25], b[25];

……

for (j=0; j<25; j++)

a[j] = b[j];

Page 34: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

12

Programming and Data Structure 23

How to read the elements of an array?

• By reading them one element at a time.

int a[25]; ……

for (j=0; j<25; j++)

scanf (%f, &a[j]);

• The ampersand (&) is necessary.

• The elements can be entered all in one line or in different lines.

Programming and Data Structure 24

How to print the elements of an array?

• By printing them one element at a time.

for (j=0; j<25; j++)

printf (\n %f, a[j]);

– The elements are printed one per line.

printf (\n); for (j=0; j<25; j++)

printf ( %f, a[j]);

– The elements are printed all in one line (starting with a new line).

Page 35: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

13

Passing Arrays to a Function

How to pass arrays to a function?

• An array name can be used as an argument to a function.

– Permits the entire array to be passed to the function.

– The way it is passed differs from that for ordinary variables.

• Rules:

– The array name must appear by itself as argument, without brackets or subscripts.

– The corresponding formal argument is written in the same manner.

• Declared by writing the array name with a pair of empty brackets.

Programming and Data Structure 26

Page 36: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

14

Programming and Data Structure 27

An Example with 1-D Array

main()

{

int n;

float list[100], avg;

:

avg = average(n,list);

:

}

float average(a,x)

int a;

float x[];

{

:

sum = sum + x[i];

}

We can also write

float x[100];

But the way the function is written makes it general; it works with arrays of any size.

Programming and Data Structure 28

main()

{

int n;

float list[100], avg;

:

avg = average(n,list);

:

}

float average(int a, float x[])

{

:

sum = sum + x[i];

}

Same program, with the parameter types specified in the same line as the function definition.

Page 37: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

15

Programming and Data Structure 29

main()

{

int n, i;

float list[100], avg;

scanf (“%d”, &n);

for (i=0; i<n; ++)

scanf (%d, &list[i]);

avg = average (n, list);

printf (\nAverage is: %d, avg);

}

float average(int a, float x[])

{

float sum = 0; int index;

for (index=0; index<a; index++)

sum = sum + x[i];

return sum;

}

The Actual Mechanism

• When an array is passed to a function, the values of the array elements are not passed to the function.

– The array name is interpreted as the address of the first array element.

– The formal argument therefore becomes a pointer to the first array element.

– When an array element is accessed inside the function, the address is calculated using the formula stated before.

– Changes made inside the function are thus also reflected in the calling program.

Programming and Data Structure 30

Page 38: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

16

Programming and Data Structure 31

Contd.

• Passing parameters in this way is called

call-by-reference.

• Normally parameters are passed in C using

call-by-value.

• Basically what it means?

– If a function changes the values of array elements, then these changes will be made to the original array that is passed to the function.

Programming and Data Structure 32

Example: Parameter passed as a value

#include <stdio.h>

void swap (int a, int b)

{

int temp;

temp=a;

a=b;

b=temp;

}

main()

{

int x,y;

x=10; y=15;

printf(x=%d y=%d \n, x, y);

swap(x,y);

printf(x=%d y=%d \n, x, y);

}

Output: x=10 y=15

x=10 y=15

Page 39: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

17

Programming and Data Structure 33

Example: Minimum of a set of numbers

#include <stdio.h>

int minimum (int x[], int y);

main()

{

int a[100], i, n;

scanf (%d, &n);

for (i=0; i<n; i++)

scanf (%d, &a[i]);

printf (\n Minimum is %d,

minimum(a,n));

}

int minimum (x, size)

int x[], size;

{

int i, min = x[0];

for (i=0;i<size;i++)

if (min > x[i])

min = x[i];

return (min);

}

Parameter x passed by reference, size by value.

Programming and Data Structure 34

Example: Square each element of array

#include <stdio.h>

void square (int a[], int b);

main()

{

int a[100], i, n;

scanf (%d, &n);

for (i=0; i<n; i++)

scanf (”%d”, &a[i]);

square (a, n);

printf (\nNew array is:);

for (i=0; i<n; i++)

printf ( %d, a[i]);

}

void square (x,size)

int x[], size;

{

int i;

for (i=0;i<size;i++)

x[i] = x[i] * x[i];

return;

}

Page 40: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

18

Introduction to Pointers

• What is the concept?

– Pointer is a variable which stores the address of memory location of another variable.

– When declared, we must specify the data type of the variable being pointed to.

– Examples:

int *p;

float *x, *y;

char *flag;

Programming and Data Structure 35

• A pointer variable can be assigned the address of another variable. int a, *p;

a=10;

p = &a; /* Address of ‘a’ assigned to ‘p’ */

printf (”%d %d”, a, *p);

/* Will print “10 10” */

• Point to note:

– Array name indicates pointer to first array element. int num[10], *xyz;

xyz = num; /* Points to x[0] */

Programming and Data Structure 36

Page 41: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

19

– When an integer expression E is added to or subtracted from a pointer, actually scale factor times E is added or subtracted.

• Scale factor indicates size of the data item being pointed to in number of bytes.

• Scale factor for char is 1, int is 4, float is 4, double is 8, etc.

int a, *p;

p = &a; /* p is assigned address of ‘a’

(say, 2500) */

p++; /* p will become 2504 */

p = p – 10; /* p will become 2464 */

Programming and Data Structure 37

Programming and Data Structure 38

• Consider the declaration:

int x[5] = {1, 2, 3, 4, 5}; int *p;

– Suppose that the base address of x is 2500, and each integer requires 4 bytes.

Element Value Address

x[0] 1 2500

x[1] 2 2504

x[2] 3 2508

x[3] 4 2512

x[4] 5 2516

Page 42: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

20

Programming and Data Structure 39

Contd.

Both x and &x[0] have the value 2500.

p = x; and p = &x[0]; are equivalent.

• Relationship between p and x: p = &x[0] = 2500

p+1 = &x[1] = 2504

p+2 = &x[2] = 2508

p+3 = &x[3] = 2512

p+4 = &x[4] = 2516

*(p+i) gives the

value of x[i]

• An example:

int x[ ] = {1,2,3,4,5,6,7,8,9,10};

int *p;

p = x + 3; /* Point to 4th element of x */

printf (%d, *p); /* Will print 4 */

printf (%d, *(p+5));

/* Will print 9 */

printf (%d %d, p[3], p[-1]);

/* Will print 7 and 3 */

Programming and Data Structure 40

Page 43: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

21

Programming and Data Structure 41

Example: function to find average

#include <stdio.h>

main()

{

int x[100], k, n;

scanf (”%d”, &n);

for (k=0; k<n; k++)

scanf (”%d”, &x[k]);

printf (”\nAverage is %f”, avg (x, n));

}

float avg (array, size)

int array[], size;

{

int *p, i , sum = 0;

p = array;

for (i=0; i<size; i++)

sum = sum + *(p+i);

return ((float) sum / size);

}

Programming and Data Structure 42

Example: SWAP revisited

#include <stdio.h>

void swap (int *a, int *b)

{

int temp;

temp = *a;

*a = *b;

*b = temp;

}

main()

{

int x, y;

x=10; y=15;

printf (x=%d y=%d \n, x,y);

swap (&x, &y);

printf (x=%d y=%d \n, x,y);

}

Output: x=10 y=15

x=15 y=10

Page 44: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

22

Character String

What we should learn about strings

– Representation in C

– String Literals

– String Variables

– String Input/Output

• printf, scanf, gets, fgets, puts, fputs

– String Functions

• strlen, strcpy, strncpy, strcmp, strncmp, strcat, strncat, strchr, strrchr, strstr, strspn, strcspn, strtok

– Reading from/Printing to Strings

• sprintf, sscanf

Programming and Data Structure 44

Page 45: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

23

Programming and Data Structure 45

Introduction

• A string is an array of characters.

– Individual characters are stored in memory in ASCII code.

– A string is represented as a sequence of characters terminated by the null (‘\0’) character.

‘\0’ l e H o l “Hello”

String Literals

• String literal values are represented by sequences of characters between double quotes (“)

• Examples

– represents empty string

– hello

• a versus ‘a’

– ‘a’ is a single character value (stored in 1 byte) as the ASCII value for the letter, a.

– a is an array with two characters, the first is a, the second is the character value \0.

46 Programming and Data Structure

Page 46: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

24

Referring to String Literals

• String literal is an array, can refer to a single character from the literal as a character

• Example:

printf(”%c”, ”hello”[1]);

outputs the character ‘e’

• During compilation, C creates space for each string literal (number of characters in the literal + 1)

47 Programming and Data Structure

Duplicate String Literals

• Each string literal in a C program is stored at a different location.

– Even if the string literals contain the same string, they are not equal (in the == sense)

• Example:

char string1[6] = hello;

char string2[6] = hello;

– but string1 does not equal string2 (they are stored in different memory locations).

48 Programming and Data Structure

Page 47: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

25

Programming and Data Structure 49

Declaring String Variables

• A string is declared like any other array:

char string-name[size];

– size determines the number of characters in string_name.

• When a character string is assigned to a character array, it automatically appends the null character (‘\0’) at the end of the string.

– size should be equal to the number of characters in the string plus one.

Programming and Data Structure 50

Examples

char name[30]; char city[15];

char dob[11];

• A string may be initialized at the time of declaration.

char city[15] = Calcutta; char city[15] = {'C', 'a', 'l', 'c', 'u',

't', 't', 'a’, ’\0'};

char dob[] = 12-10-1975;

Equivalent

Page 48: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

26

Changing String Variables

• Cannot change string variables connected to string constants, but can change pointer variables that are not tied to space.

• Example:

char *str1 = hello; /* str1 unchangeable */

char *str2 = goodbye; /* str2 unchangeable */

char *str3; /* Not tied to space */

str3 = str1; /* str3 points to same space as str1 */

str3 = str2;

51 Programming and Data Structure

Changing String Variables (cont)

• Can change parts of a string variable:

char str1[6] = hello;

str1[0] = 'y’; /* str1 is now “yello” */

str1[4] = '\0’; /* str1 is now “yell” */

• Have to stay within limits of the array.

– Responsibility of programmer.

Programming and Data Structure 52

Page 49: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

27

Programming and Data Structure 53

Reading Strings from the Keyboard

• Two different cases will be considered:

– Reading words

– Reading an entire line

Programming and Data Structure 54

Reading “words”

• scanf can be used with the “%s” format specifier.

char name[30];

:

scanf (%s, name);

– The ampersand (&) is not required before the

variable name with %s.

• Because name represents an address.

– The problem here is that the string is taken to be upto

the first white space (blank, tab, carriage return, etc.)

• If we type Rupak Biswas

• name will be assigned the string Rupak

Page 50: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

28

Programming and Data Structure 55

Reading a “line of text”

• In many applications, we need to read in an entire line of

text (including blank spaces).

• We can use the getchar() function for the purpose.

Programming and Data Structure 56

char line[81], ch;

int c = 0;

:

:

do

{

ch = getchar();

line[c] = ch;

c++;

}

while (ch != '\n');

c = c – 1;

line[c] = '\0';

Read characters until CR (‘\n’) is encountered

Make it a valid string

Page 51: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

29

Programming and Data Structure 57

Reading a line :: Alternate Approach

char line[81];

:

:

scanf (%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ], line);

char line[81];

:

:

scanf (%[^\n], line);

Reads a string containing uppercase

characters and blank spaces

Reads a string containing any characters

More on String Input

• Edit set input %[ListofChars]

– ListofChars specifies set of characters (called scan set)

– Characters read as long as character falls in scan set

– Stops when first non scan set character encountered

– Any character may be specified except ]

– Putting ^ at the start to negate the set (any character BUT list is

allowed)

• Examples: scanf (%[+0123456789], Number);

scanf (%[^\n], Line); /* read until newline char */

Programming and Data Structure 58

Page 52: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

30

Programming and Data Structure 59

Writing Strings to the Screen

• We can use printf with the “%s” format specification.

char name[50];

:

:

printf (\n %s, name);

Input / Output Example

#include <stdio.h>

void main( )

{

char LastName[11];

char FirstName[11];

printf(Enter your name (last, first): );

scanf(%10s%*[^,],%10s, LastName, FirstName);

printf(Nice to meet you %s %s\n, FirstName, LastName);

}

60 Programming and Data Structure

Page 53: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

31

String Functions

Programming and Data Structure 62

Processing Character Strings

• There exists a set of C library functions for character string manipulation.

– strcpy :: string copy

– strlen :: string length

– strcmp :: string comparison

– strtcat :: string concatenation

• It is required to add the line #include <string.h>

Page 54: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

32

Programming and Data Structure 63

strcpy()

• Works like a string assignment operator. char *strcpy (char *str1, char *str2);

– Assigns the contents of str2 to str1.

– Returns address of the destination string.

• Examples:

strcpy (city, Calcutta); strcpy (city, mycity);

• Warning:

– Assignment operator do not work for strings.

city = Calcutta ; INVALID

Programming and Data Structure 64

strlen()

• Counts and returns the number of characters in a string. int strlen (char *str);

• Example: len = strlen (string);

/* Returns an integer */

–The null character (‘\0’) at the end is not counted.

–Counting ends at the first null character.

Page 55: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

33

Programming and Data Structure 65

char city[15];

int n;

:

:

strcpy (city, Calcutta);

n = strlen (city);

n is assigned 8

Programming and Data Structure 66

strcmp()

• Compares two character strings. int strcmp (char *str1, char *str2);

– Compares the two strings and returns 0 if they are identical; non-zero otherwise.

• Examples:

if (strcmp(city, Delhi) == 0) { …… }

if (strcmp(city1, city2) != 0)

{ …… }

Page 56: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

34

• Actually, the function returns the difference in ASCII

values of the first letter of mismatch.

– Less than 0

• If the ASCII value of the character they differ at is smaller for

str1, or str2 is longer than str1

– Greater than 0

• If the ASCII value of the character they differ at is greater for

str1, or str1 is longer than str2

– Equal to 0

• If the two strings are identical

Programming and Data Structure 67

strcmp examples: strcmp(hello, hello) -- returns 0

strcmp(yello, hello) -- returns value > 0

strcmp(Hello, hello) -- returns value < 0

strcmp(hello, hello there) -- returns value < 0

strcmp(some diff, some dift) -- returns value < 0

• Expression for determining if two strings s1, s2 hold the same string value: !strcmp(s1, s2)

Programming and Data Structure 68

Page 57: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

35

String Comparison (strncmp)

Sometimes we only want to compare first n chars: int strncmp(char *s1, char *s2, int n)

Works the same as strcmp except that it stops at the nth character

looks at less than n characters if either string is shorter than n

strcmp(some diff, some DIFF) -- returns value > 0

strncmp(some diff, some DIFF,4) -- returns 0

Programming and Data Structure 69

String Comparison (ignoring case)

int strcasecmp(char *str1, char *str2)

• similar to strcmp except that upper and lower case characters

(e.g., ‘a’ and ‘A’) are considered to be equal

int strncasecmp(char *str1, char *str2, int n)

• version of strncmp that ignores case

Programming and Data Structure 70

Page 58: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

36

Programming and Data Structure 71

strcat()

• Joins or concatenates two strings together. char *strcat (char *str1, char *str2);

– str2 is appended to the end of str1.

– The null character at the end of str1 is removed, and str2 is joined at that point.

• Example:

strcpy(name1, Amit );

strcpy(name2, Roy);

strcat(name1, name2);

‘\0’ i m A t

‘\0’ y o R

i m A t ‘\0’ y o R

Programming and Data Structure 72

Example:: count uppercase

/* Read a line of text and count the number of

uppercase letters */

#include <stdio.h>

#include <string.h>

main()

{

char line[81];

int i, n, count=0;

scanf (%[^\n], line);

n = strlen (line);

for (i=0; i<n; i++)

if (isupper(line[i]) count++;

printf (\n The number of uppercase letters in

the string %s is %d, line, count);

}

Page 59: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

37

Programming and Data Structure 73

Example:: compare two strings

#include <stdio.h>

int my_strcmp (char s1[],char s2[])

{

int i=0;

while(s1[i]!='\0' && s2[i]!='\0'){

if (s1[i]!=s2[i]) return(s1[i]-s2[i]);

else i++;

}

return(s1[i]-s2[i]);

}

Parameters passed as character array

Programming and Data Structure 74

main()

{

char string1[100],string2[100];

printf(Give two strings \n);

scanf(%s %s, string1, string2);

printf (Comparison result: %d \n, my_strcmp(string1,string2));

}

Give two strings IITKGP IITMUMBAI

Comparison result: -2

Give two strings KOLKATA KOLKATA

Comparison result: 0

Page 60: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

38

Searching for a Character/String

char *strchr (char *str, int ch)

• returns a pointer to the first occurrence of ch in str

• returns NULL if ch does not occur in str

• can subtract original pointer from result pointer to

determine which character in array

char *strstr (char *str, char *searchstr)

• similar to strchr, but looks for the first occurrence of the

string searchstr in str

char *strrchr (char *str, int ch)

• similar to strchr except that the search starts from the end of

string str and works backward

Programming and Data Structure 75

Printing to a String

• The sprintf function allows us to print to a string argument

using printf formatting rules.

• First argument of sprintf is string to print to, remaining

arguments are as in printf.

Example:

char buffer[100];

sprintf (buffer, %s, %s, LastName, FirstName);

if (strlen(buffer) > 15)

printf(Long name %s %s\n, FirstName, LastName);

Programming and Data Structure 76

Page 61: RECURSION: FUNCTION CALLING ITSELFcse.iitkgp.ac.in/pds/current/ls/LectureSlides_Week5.pdf · –Choice between performance (iteration) and good software engineering (recursion). Programming

02/06/2020

39

Reading from a String

• The sscanf function allows us to read from a string argument

using scanf rules

• First argument of sscanf is string to read from, remaining

arguments are as in scanf

Example: char buffer[100] = A10 50.0;

sscanf (buffer, %c%d%f, &ch, &inum, &fnum);

/* puts ‘A’ in ch, 10 in inum and 50.0 in fnum */

Programming and Data Structure 77

Example: Duplicate Removal

Write a C function that takes a string as an argument and

modifies the string so as to remove all consecutive

duplicate characters, e.g., mississippi -> misisipi

void remove_duplicates (char word[]) {

int k, j;

char prev = '\0';

for (k = j = 0; word[k]!='\0'; k++) {

if (prev != word[k]) word[j++] = word[k];

prev = word[k];

}

word[j] = '\0';

}

Programming and Data Structure 78