Module 4. Functions

Lesson 14

FUNCTIONS IN C  PART II

(Library Functions and Recursion)

14.1  Library Functions

A function, which is predefined in C is known as library function, e.g., printf, scanf, getch, etc., are library functions. Mind it carefully that appropriate header files must be included in the programme for using the library functions. A list of various library functions vis-เ-vis header files (adopted from Gottfried, 1998) is given in Table-14.1 below.

Example 1: Modified programme (using inbuilt library functions) for Example-2 of Lesson-9 to compute real roots of a quadratic equation (See Example-2 of Lesson-2 for pseudo code and flowchart; and Example-2 of Lesson-9 for simple programme for this problem).

#include <stdio.h>

#include <math.h>

int main()

{

float a,b,c,d, x_1, x_2;

printf(Enter a, b and c: );

scanf(%f %f %f, &a, &b, &c);

d=sqrt(pow(b,2)-4ืaืc); //inbuilt functions used

x_1=(-b+d)/(2*a);

x_2=(-b-d)/(2*a);

printf(a, b, c, x_1, x_2: %5.2f, %5.2f, %5.2f,
%5.2f,%5.2f",a, b, c, x_1, x_2);

return 0;

}

`Test Output:`
`Enter a, b and c: 2 3 1`
`a, b, c, x_1, x_2:  2.00,  3.00,  1.00, -0.50,-1.00`
`Table 14.1 C Library functions vis-เ-vis header files`
 Function Type Purpose Header File abs(i) int Returns the absolute value of i. stdlib.h acos(d) double Returns the arc cosine of d. math.h asin(d) double Returns the arc sine of d. math.h atan(d) double Returns the arc tangent of d. math.h atan2(d1,d2) double Returns the arc tangent of d1/d2. math.h atof(s) double Converts string s to a double-precision quantity. stdlib.h atoi(s) int Converts string s to an integer. stdlib.h atol(s) long Converts string s to a long integer. stdlib.h calloc(u1,u2) void* Allocates memory for an array having u1elements, each of length u2 bytes. Returns a pointer to the beginning of the allocated space. malloc.h, or stdlib.h ceil(d) double Returns a value rounded up to the next higher integer. math.h cos(d) double Returns the cosine of d. math.h cosh(d) double Returns the hyperbolic cosine of d. math.h difftime(l1, l2) double Returns the time difference l1  l2, where l1 and l2 represent elapsed times beyond a designated base time (see the time function). time.h exit(u) void Closes all files and buffers, and terminate the programme. (Value of u is assigned by function, to indicate termination status). stdlib.h exp(d) double Raises e to the power d (e= 2.7182818 is the base of the natural (Naperian) system of logarithms). math.h fabs(d) double Returns the absolute value of d. math.h fclose(f) double Closes file f. Returns 0 if file is successfully closed. stdio.h feof(f) int Determines if an end-of-file condition has been reached. If so, returns a nonzero value; otherwise, returns 0. stdio.h fgetc(f) int Enters a single character from file f. stdio.h fgets(s, i,f) char* Enters string s, containing i characters, from file f. stdio.h floor(d) double Returns a value rounded down to the next lower integer. math.h fmod(d1,d2) double Returns the remainder of d1/d2 (with same sign as d1). math.h fopen(s1,se) file* Opens a file named s1 of type s2. Returns a pointer to the file. stdio.h fprintf(f,) int Sends data items to file f (remaining arguments are complicated stdio.h fputc(c,f) int Sends a single character to file f. stdio.h fputs(s,f) int Sends string s to file f. stdio.h fread (s,i1,i2,f) int Enters i2 data items, each of size i1 bytes, from file f to string s. stdio.h free(p) void Frees a block of allocated memory whose beginning is indicated by p. malloc.h, or stdlib.h fscanf(f,) int Enters data items from file f (remaining arguments are complicated. stdio.h fseek(f,l,i) int Moves the pointer for f a distance 1 bytes from location i (i may represent the beginning of the file, the current pointer position, or the end of the file). stdio.h ftell(f) long int Returns the current pointer position within file f. stdio.h fwrite(s, i1,i2,f) int Sends i2 data items, each of size i1 bytes, from string s to file f. stdio.h getc(f) int Enters a single character from file f. stdio.h getchar() int Enters a single character from the standard input device. stdio.h gets(s) char* Enters string s from the standard input device. stdio.h isalnum(c) int Determines if argument is alphanumeric. Returns a nonzero value if true; 0 otherwise. ctype.h isalpha(c) int Determines if argument is alphabetic. Returns a nonzero value if true; 0 otherwise. ctype.h isascii (c) int Determines if argument is an ASCII character.  Returns a nonzero value if true; 0 otherwise. ctype.h iscntrl(c) int Determines if argument is ASCII control character. Returns a nonzero value if true; 0 otherwise. ctype.h isdigit(c) int Determines if argument is decimal digit. Returns a nonzero value if true; 0 otherwise. ctype.h isgraph(c) int Determines if argument is graphic ASCII character (hex 0x21-0x7e; octal 041-176). Returns a nonzero value if true; 0 otherwise. ctype.h islower(c) int Determines if argument is lowercase. Returns a nonzero value if true; 0 otherwise. ctype.h isodigit(c) int Determines if argument is an octal digit. Returns a nonzero value if true; 0 otherwise. ctype.h isprint(c) int Determines if argument is printing ASCII character (hex 0x20-0x7e; octal 040-176). Returns a nonzero value if true; 0 otherwise. ctype.h ispunct(c) int Determines if argument is a punctuation character. Returns a nonzero value if true; 0 otherwise. ctype.h isspace(c) int Determines if argument is white space character. Returns a nonzero value if true; 0 otherwise. ctype.h isupper(c) int Determines if argument is uppercase. Returns a nonzero value if true; 0 otherwise. ctype.h isxdigit(c) int Determines if argument is a hexadecimal digit. Returns a nonzero value if true; 0 otherwise. ctype.h labs(l) long int Returns the absolute value of 1. math.h log(d) double Returns the natural logarithm of d. math.h log10(d) double Returns the logarithm (base 10 of d.) math.h malloc(u) void* Allocates u bytes of memory. Returns a pointer to the beginning of the allocated space. malloc.h, or stdlib.h pow(d1,d2) double Returns d1 raised to the d2 power. math.h printf() int Sends data items to the standard output device (arguments are complicated). stdio.h putc(c,f) int Sends a single character to file f. stdio.h putchar(c) int Sends a single character to the standard output device. stdio.h puts(s) int Sends string s to the standard output device. stdlib.h rand() int Returns a random positive integer. stdio.h rewind(f) void Moves the pointer to the beginning of file f. stdio.h scanf() int Enters data items from the standard input device (arguments are complicated) stdio.h sin(d) double Returns the sine of d. math.h sinh(d) double Returns the hyperbolic sine of d. math.h sqrt(d) double Returns the square root of d. math.h srand(u) void Initialises the random number generator. stdlib.h strcmp(s1,s2) int Compares two strings lexicographically. Returns a negative value if s1s2. string.h strcmpi(s1,s2) int Compares two strings lexicographically, without regard to case. Returns a negative value if s1s2. string.h strcpy(s1,s2) char* Copies string s2 to string s1. string.h strlen(s) int Returns the number of characters in a string. string.h strset(s,c) char* Sets all characters within s to c (excluding the terminating null character \0). string.h system(s) int Passes command s to the operating system. Returns 0 if the command is successfully executed; otherwise, returns a nonzero value, typically -1. stdlib.h tan(d) double Returns the tangent of d. math.h tanh(d) double Returns the hyperbolic tangent of d. math.h time(p) long int Returns the number of seconds elapsed beyond a designated base time. time.h toascii(c) int Converts value of argument to ASCII. ctype.h tolower(c) int Converts letter to lowercase. ctype.h, or stdlib.h toupper(c) int Converts letter to uppercase. ctype.h, or stdlib.h

Note: Type refers to data type of the quantity that is returned by the function. An asterisk
(*) denotes a pointer. c denotes a character-type argument. d denotes a double-precision argument.

Example 2: Write a function to calculate the real roots of a quadratic equation. Revised version of Example-1 given above.

#include <stdio.h>

#include <math.h>

float quad(float a1, float b1, float c1);

main()

{

float a,b,c;

printf("Enter a, b and c: ");

scanf("%f %f %f", &a, &b, &c);

return 0;

}

float quad(float a1, float b1, float c1)

{

float d, x_1, x_2;

d=sqrt(pow(b1,2)-4*a1*c1);

x_1=(-b1+d)/(2*a1);

x_2=(-b1-d)/(2*a1);

printf("a, b, c, x_1, x_2: %5.2f, %5.2f, %5.2f,%5.2f, %5.2f", a1,

b1, c1, x_1, x_2);

return 0;

}

Test Output:

Enter a, b and c: 2 3 1

a, b, c, x_1, x_2:  2.00,  3.00,  1.00,-0.50, -1.00

14.2 Recursion

Recursion is a process by which a function calls itself repeatedly, until some specified condition has been satisfied. This process is useful for repetitive computations in which each action is expressed in terms of a previous result. Many iterative problems can be written in this form. In order to solve a problem recursively, two conditions must be satisfied. First, the problem must be written in a recursive form; and second, the problem statement must include a stopping criterion.

// Programme to demonstrate function recursion.

#include <stdio.h>

#include <conio.h>

recursion()

{

int num;

printf("\nRecursion... ");

printf("\n\n Enter Number : ");

scanf("%d",&num);

if (num==3)

{     printf("End of Recursion Function.\n");

exit(0);}

else

recursion();

return 0;

}

void main()

{

clrscr();

recursion();

}

Test Output

Recursion...

Enter Number : 4

Recursion...

Enter Number : 55

Recursion...

Enter Number : 6543

Recursion...

Enter Number : 3

End of Recursion Function.

Example 3: Programme to multiply two integer numbers by recursion.

#include<stdio.h>

int multiply(int x,int y);

int main(){

int a,b,product;

printf("Enter any two integers: ");

scanf("%d%d",&a,&b);

product = multiply(a,b);

printf("Multiplication of two integers is %d",product);

return 0;

}

int multiply(int x,int y){

static int product=0,i=0;

if(i < x){

product = product + y;

i++;

multiply(x,y);

}

return product;

}

Test Output:

Enter any two integers: 5 8

Multiplication of two integers is 40.

Example 4: Programme to find the sum of first n natural numbers by recursion:

#include<stdio.h>

int main(){

int n,sum;

printf("Enter the value of n: ");

scanf("%d",&n);

sum = getSum(n);

printf("Sum of n numbers: %d",sum);

return 0;

}

int getSum(n){

static int sum=0;

if(n>0){

sum = sum + n;

getSum(n-1);

}

return sum;

}

Test output:

Enter the value of n: 10

Sum of n numbers: 55

Note that recursion can be used as an alternative to looping structures.

Example 5: Programme to compute factorial of a positive integer number.

Commonly, this problem is defined as , where n is the given integer number. However, you can express this problem in another way, by writing  This is a recursive statement of the problem, in which the desired action is expressed in terms of previous result. Also, you know that  by definition, therefore, this provides the stopping criterion. The following programme accomplishes this task.

#include <stdio.h>

long int factorial(int n);

void main()

{

int n;

long int factorial(int n);

printf(n = );

scanf(%d, &n);

printf(n! = %ld\n, factorial(n));

}

long int factorial(int n)

{

if (n <= 1)

return(1);

else

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

}

Test Output

n = 10

n! = 3628800

Explanation:

The main portion of the programme simply reads the integer quantity n and then references the long-integer recursive function, factorial. Note that the long integers are used for this calculation as factorials of even modest values of n are large integer quantities. The function, factorial accesses itself recursively, with an actual argument (n-1) that decreases in magnitude for each successive access. The recursive access terminates when the value of the actual argument becomes equal to 1. Note that when the programme is executed, the function, factorial will be accessed repeatedly, once in main and (n-1) times within itself, though the end-user using this programme will not be aware of this. Only resultant value will be displayed. For example, for the value of n=10, the factorial is 3628800. The input and output of the programme is:

n = 10

n! = 3628800