CS6202 Programming and Data Structures I Lecture Notes Regulation 2013
CS6202 Programming and Data Structures I Lecture Notes Regulation 2013
html
UNIT-1
m
C PROGRAMMING FUNDAMENTALS
.co
CONTROL STATEMENTS
In C language the control statements are classified into two types. They are:
lus
1. Conditional Statements
2. Unconditional Statements
hip
Control Statements
Conditional Unconditional
art
Selective Loop goto break continue
dy
In conditional statements, the flow of execution may be transferred from one part to another part based
ww
The Conditional statements are further classified in to selective and loop constructs.
The Unconditional construct is further classified into goto, break and continue statements.
Conditional Statements
m
Simple if statement:
.co
Simple if statement is used to execute some statements for a particular conditions the general
form of if statement is
if (condition)
lus
{
statement 1;
hip
statement-2;
Example
if (category==sports)
Vi
marks=marks+bonus marks;
}
w.
printf(%d,marks);
ww
if else statement
m
if...else statement is used to execute one group of statements if the conditions is true the
other group of statements are executed when the condition is false
.co
The general form is:
if (condition)
lus
statement-1;
else
hip
{
statement-2;
statement3;
art
If the condition is true the statement 1 is executed and then the control is transferred to
statement3 if the condition is false the control is transferred directly to the statement2 and then
statement3.
dy
Eg:
If ( a>b)
Vi
printf(A is Big);
w.
else
ww
Printf( B is Big);
m
Nested if -else statement:
.co
if..else is contained completely within another construct, then it is called nesting of ifs.
Syntax:
if(condition-1)
lus
{
if(condition-2)
hip
statement-1;
else
{
art
statement-2;
}
dy
else
ststement-3;
Vi
}
w.
statement-4;
if the condition 1 is false, the statement-3 will be executed. Otherwise it continues to test
ww
condition-2. if the condition-2 is true the statement-1 will be executed; otherwise the statement-2 will
be executed and then the control is transferred to statement-4.
m
Example
.co
if(sex is female)
if (balance>5000)
lus
{
bonus=0.05*balance;
else
bonus=0.02*balance;
hip
art
}
else
{
dy
bonus=0.02*balance;
}
Vi
There is another way of putting ifs together when multipath decisions are involved. The
conditions are evaluated from top to bottom.
w.
if(condition-1)
statement-1;
ww
elseif(condition-2)
statement-2;
m
elseif(condition-n}
statement-n;
.co
else
default statement;
When a true condition is evaluated, the statement associated with it is executed and the rest of
lus
the ladder is omitted. if none of the condition is true then default statement is executed. if the default
statement is not present, no action takes place when all conditions are false
Example:
..........
if(marks>74) hip
printf(first class with distinction);
art
elseif(marks>59)
printf(first class);
elseif(marks>39)
dy
printf(second class);
else
Vi
printf(fail);
Switch statement:
group of statements. These groups of statements are selected from many groups. The selection is based
upon the value of the expression. This expression is included within the switch statement.
ww
switch(expression)
case constant1;
m
statement-1;
break;
.co
case constant-2;
statement-2;
break;
lus
:
case constant-N:
default;
statement-N;
break;
hip
art
default statement;
break;
}
dy
statement-x;
Vi
Where switch, case and default are the keywords. The expression following switch must
be enclosed in parenthesis and the body of the switch must be enclosed within curly braces.
Expression may be variable or integer expression. Case labels can be only integer or character
constants. Case labels do not contain any variables names. Case labels must all be different.
w.
(1) The order of the case may be in any order. it is not necessary that order may be in as
ascending or descending.
(2) If multiple statements are to be executed in each case there is no need to enclose within a
m
pair of braces
(3) If default statement is not present, then the program continues with the next instruction.
.co
Example:
main()
lus
{
char ch;
int a,b,c=0;
hip
scanf(%d%d,&a,&b);
scanf(%c,&ch); or ch=getchar();
switch ch()
{
art
case +:c=a+b;
break;
dy
case -:c=a-b;
break;
case *:c=a*b;
Vi
break;
case/:c=a/b;
w.
break;
}
ww
m
.co
LOOPING STATEMENTS
Loops are used to execute a same set of instructions for much times.the number of times a loop
executed is given by some condition. The loop structures available in c are
lus
1. The while loop
2. The do..while
While Loop
hip
It is one type of looping statement. this is entry control statement ,that mean first check the
condition then execute the statement is called entry control statement
art
The general format of the while loop is
while (condition)
{
dy
}
Vi
Where body of the loop is either a single statement or a block of statements. The condition may
be any expression. The loop repeats while the condition is true. When the condition is false the
control will be transferred out of the loop.
w.
example:
ww
main()
int i=1;
while (i<=100)
m
{
printf(%d,i);
.co
i++;
lus
do..while loop:
This statement is exit control statement. Therefore the body of the loop is always executed at
hip
least once; evenif the condition is false initially. The general form of the do..while loop is
do
{
art
body of the loop
}
dy
while(condition);
The do..while loop repeats until the condition becomes false. In the do..while the body of the
loop is executed first, then the condition is checked . When the condition becomes false, control is
transferred to the statement after the loop.
Vi
for loop:
w.
for loop is used to repeat a statement or a block of statements for a known number of times.
The general format of the for loops
Initialization is an assignment statement, that is used to set the loop control variable. The condition is
m
a relational or logical expression which determines when to end the loop. The increment is a unary or
an assignment expression.
.co
Execution of the for loop:
* The value of the control variable is tested using condition test. If the value is true, the body of
lus
the loop will be executed; otherwise the loop determinate.
Example:
main()
int i;
for (i=1;i<=10;i++)
hip
art
printf(%d,i);
Jumps in Loop:
dy
Loops perform a set of operations repeatedly until the control variables fails to satisfy the
test conditions. The number of times the loop is repeated is decided in advance and the test
conditions is returned to achieve this. Sometimes, when executing a loop it becomes desirable
to skip a part of the loop or to leave the loop as soon as a certain conditions occurs.
Vi
Syntax:
While( condition-1)
w.
statements1;
if (condition-2)
ww
break;
statements2;
m
};
When the condition2 is true means, control will out of the loop.
.co
Example:
Int t=1;
lus
While ( t <= 10)
sum = sum + t;
if ( sum = = 5)
break;
t=t+1;
hip
art
}
FUNCTION
DEFINITION OF FUNCTION
dy
A function in C can perform a particular task, and supports the concept of modular programming design
techniques. We have already been exposed to functions. The main body of a C program, identified by
the keyword main and enclosed by the left and right braces is a function. It is called by the operating
Vi
system when the program is loaded, and when terminated, returns to the operating system.
FUNCTION DECLARATION
w.
Where return type refers to the datatype of the data returned by the functions, and the
function name refers the user defined function name.
Category of functions
m
A functions , depending on whether arguments are present or not and whether a value is
returned or not, may belong to one of the following categories.
.co
1. Functions with no arguments and no return values.
2. Functions with arguments and no return values.
3. Functions with arguments and return values.
4. Functions with no arguments and return values.
lus
Functions with no arguments and no return values
When functions has no arguments , it does not receive any data from the calling function.
hip
Similarly , when it does not return a value, the calling function does not receive any data from the
called function. In effect , there is no data transfer between the calling function and the called
function.
art
Eg:
Void main()
{
dy
void add();
add()
}
Vi
void add()
Calling function send arguments to called functions, but called function does not return
ww
void add(a,b);
m
int a,b;
scanf(%d%d,&a,&b);
.co
add(a,b)
lus
{
int c;
c= x+y;
printf( %d,c);
hip
Functions with arguments and one return values
Calling function send arguments to called functions, as well as called function return a
art
value to calling program.
{
dy
int add(a,b);
int a,b,c;
Vi
scanf(%d%d,&a,&b);
c=add(a,b);
printf(%d,c);
w.
{
ww
int c;
c= x+y;
return(c);
m
Functions with no arguments but return values
Calling function does not send any arguments to called functions, but called function return
.co
a value to calling program.
lus
{
void add();
int c;
hip
c=add();
printf(%d,c);
int add()
art
{
int a,b,c;
scanf(%d%d,&a,&b);
dy
c= x+y;
return(c);
Vi
statement is possible.
Void main()
ww
{
int add (int a, int b, int c);
int a,b,c,d;
Scanf(%d%d%d,&a,&b,&c);
D=add(a,b,c);
m
Printf(%d,d);
.co
int add (int x, int y, int z)
if ((x>y)&&(x>z))
lus
return(x);
else if (y > z)
return(y);
else
}
return(z);
Nesting of Functions
hip
art
C permits nesting of functions freely. Main can call function1, which calls functions2, which calls
function3 etc. and so on. Consider the following program.
Void main()
{
dy
void add();
add()
Vi
void add ()
{
w.
printf( PROGRAMMING);
add1();
ww
void add1()
printf(LANGUAGE);
m
}
.c o
PASSING ARGUMENT TO FUNCTION :
1. In C Programming we have different ways of parameter passing schemes such as Call by Value and
Call by Reference.
2. Function is good programming style in which we can write reusable code that can be called
us
whenever require.
3. Whenever we call a function then sequence of executable statements gets executed. We can pass
some of the information to the function for processing called argument.
ipl
Two Ways of Passing Argument to Function in C Language:
1. Call by value
2. Call by Reference
rth
3) CALL BY VALUE:
#include<stdio.h>
int main() {
int num1=50,num2=70;
interchange(num1,num2);
printf("\nNumber 1 : %d",num1);
printf("\nNumber 2 : %d",num2);
w
return(0);
om
Output :
Number 1 : 50
Number 2 : 70
s .c
Explanation: Call by Value
1. While Passing Parameters using call by value, Xerox copy of original parameter is created and
passed to the called function.
plu
2. Any update made inside method will not affect the original value of variable in calling function.
3. In the above example num1 and num2 are the original values and Xerox copy of these values is
passed to the function and these values are copied into number1, number2 variable of sum function
respectively.
4. As their scope is limited to only function so they cannot alter the values inside main function.
thi
w
4) CALL BY REFERENCE/POINTER/ADDRESS:
ww
#include<stdio.h>
m
int temp;
temp = *num1;
*num1 = *num2;
*num2 = *num1;
}
int main() {
int num1=50,num2=70;
interchange(&num1,&num2);
printf("\nNumber 1 : %d",num1);
printf("\nNumber 2 : %d",num2);
return(0);
}
rt
Output :
Number 1 : 70
Number 2 : 50
idy
m
.co
lus
Point Call by Value hip
Summary of Call By Value and Call By Reference
Call by Reference
art
Copy Duplicate Copy of Original Actual Copy of Original Parameter is Passed
Parameter is Passed
ARRAY
w.
Arrays are collection of similar items (i.e. ints, floats, chars) whose memory is allocated in a contiguous
block of memory.
ww
Pointers and arrays have a special relationship. To reference memory locations, arrays use
pointers. Therefore, most of the times, array and pointer references can be used interchangeably.
INITIALIZATION OF ARRAYS:
We can initialize the element of arrays in the same. The same Way as the ordinary variables when they
m
are declared. The general form of initialization of arrays is
.c o
The values in the list are separated by commas for example the statement.
int member[5]={1,2,3,4,5};
In the example, the size of the array is 5 and the values 1,2,3,4,5 will be assigned to the
variable number[0],number[1],number[2],number[3] and number[4] respectively.
lus
DECLARING ARRAYS
To declare an array in C, a programmer specifies the type of the elements and the number of elements
required by an array as follows:
hip
This is called a single-dimensional array. The array Size must be an integer constant greater than zero
and type can be any valid C data type. For example, to declare a 10-element array called balance of type
double, use this statement:
art
double balance[10];
The array which is used to represent and store data in a linear form is called as 'single or one
dimensional array.'
Syntax:
Example:
m
Output:
Numbers are : 9 4 6_
s .c
Features:
ip
rth
Disadvantages:
Syntax:
<data-type> <array_nm> [row_subscript][column-subscript];
Example:
int a[3][3];
In above example, a is an array of type integer which has storage size of 3 * 3 matrix. The total
size would be 3 * 3 * 2 = 18 bytes.
w
Whenever we declare a variable, the system allocates, somewhere in the memory, an appropriate
m
location to hold the value of the variable. Since, every byte has a unique address number; this location
will have its own address number.
.co
Quantity ------- variable
lus
5000 ------- address
During execution of the program, the system always associates the name quantity with the address
ad
5000. We may have access to the value 179 by using either the name quantity or the address 5000.
hip
The content of any pointer variable can be accessed with the help of * operator. if p is an pointer
variable then *p is used to access the content of the pointer variable p.
for example the statement t=*p is used to assign the content of the pointer variable p.
art
int * p;
int a=30;
dy
p=&a;
For defining a pointer variable * symbol is used. a pointer variable must be declared with * preceding
Vi
the variable name. The general structure for declaring a pointer variable is
data_type*ptr_name;
for example the statement int*p declares p as a pointer variable that points to an integer data type.
w.
Example:
ww
main()
int*p;
int i=30;
m
p=&i;
.co
p 30
lus
Pointer variables contain addresses that belong to a separate data type, they must be declared as
pointers before we use them. The declaration of a pointer variable takes the following form:
hip
1. The asterisk (*) tells that the variable pt_name .
2. pt_name needs a memory location.
art
3. pt-name pointes to a variable of type data type.
Example:
Int *p;
dy
Example 2:
float a,b;
Vi
int x, *p;
p= &a;
w.
b= *p;
another variable in memory. The value of pointers points to a variable, which may be accessed
indirectly with the special pointer operators * and & .
Example:
main()
m
{
int*p;
.co
int i=30;
p=&i;
lus
Chain of Pointers:
hip
Any pointer variable points to another pointer variable to access the content of other
memory location of variable is called chain of pointers.
Pointer expression:
art
Pointer variables can also be used in expressions. Assume a and c are pointer variables. The following is
an example of pointer expression.
c=*a+1;
dy
The above expression adds the value 1 to the contents of address stored in a and assign the new value
to c. the following are valid expression
x=*a**b;
Vi
b=b+10;
We are able to increment the address of the pointer variable. We have seen the pointers
can incremented like
P1 = P2 + 2;
ww
P1 = P1 + 1;
P1++;
Will cause the pointer P1 to point to the next value of its type .
m
POINTERS ARITHMETIC
C pointer is an address which is a numeric value. Therefore, you can perform arithmetic
operations on a pointer just as you can a numeric value. There are four arithmetic operators
that can be used on pointers: ++, --, +, and -
To understand pointer arithmetic, let us consider that ptr is an integer pointer which points to
the address 1000. Assuming 32-bit integers, let us perform the following arithmetic operation
on the pointer:
ptr++
Now after the above operation, the ptr will point to the location 1004 because each time ptr is
incremented, it will point to the next integer location which is 4 bytes next to the current
location. This operation will move the pointer to next memory location without impacting
actual value at the memory location. If ptr points to a character whose address is 1000, then
above operation will point to the location 1001 because next character will be available at
1001.
Incrementing a Pointer
ar
We prefer using a pointer in our program instead of an array because the variable pointer can
be incremented, unlike the array name which cannot be incremented because it is a constant
pointer. The following program increments the variable pointer to access each succeeding
element of the array:
id
#include <stdio.h>
V
int main ()
w.
{
int var[] = {10, 100, 200};
int i, *ptr;
ww
m
printf("Address of var[%d] = %x\n", i, ptr );
printf("Value of var[%d] = %d\n", i, *ptr );
.c o
/* move to the next location */
ptr++;
}
return 0;
}
lus
When the above code is compiled and executed, it produces result something as follows:
Decrementing a Pointer
a
The same considerations apply to decrementing a pointer, which decreases its value by the
idy
#include <stdio.h>
int main ()
{
w.
ptr = &var[MAX-1];
for ( i = MAX; i > 0; i--)
{
m
printf("Value of var[%d] = %d\n", i, *ptr );
.c o
ptr--;
}
return 0;
}
us
When the above code is compiled and executed, it produces result something as follows:
Pointer Comparisons
ar
Pointers may be compared by using relational operators, such as ==, <, and >. If p1 and p2 point
to variables that are related to each other, such as elements of the same array, then p1 and p2
can be meaningfully compared.
The following program modifies the previous example one by incrementing the variable pointer
so long as the address to which it points is either less than or equal to the address of the last
element of the array, which is &var[MAX - 1]:
V
#include <stdio.h>
w.
int main ()
{
ww
ptr = var;
m
i = 0;
while ( ptr <= &var[MAX - 1] )
{
.c o
printf("Address of var[%d] = %x\n", i, ptr );
printf("Value of var[%d] = %d\n", i, *ptr );
lus
ptr++;
i++;
}
return 0;
hip
}
When the above code is compiled and executed, it produces result something as follows:
Pointers and arrays have got close relationship. In fact array name itself is a pointer. some times
V
The array name always points to the five element of the array for example and array int a[5].
w.
value 1 2 3 4 5
for example
int a[5]
m
int i;
A(a+2)=30.
.co
here x(a+2) actually refers to a[2].
All operations on strings were performed by indexing the character array. However , most
lus
string operations in C are usually performed by pointers to the array and pointer arithmetic
because pointer are faster and easier to use.
Void main()
char s[80];
char *p1;
do{
hip
art
p1 = s;
gets(s);
}
Vi
Array of pointers:
w.
Pointer may be arrayed just like any other data type. The declaration for an int pointer array of
size 10 is
Int *x[10];
ww
To assign the address of an integer variable called var to the third element of the pointer
array, you would write
Int var;
m
The only values that the array elements may hold are the addresses of integer variables.
.co
When we pass addresses to function, the parameters receiving the addresses should be
pointers. The process of calling a function using pointers to pass the addresses of variable is known as
call by reference. (You know, the process of passing the actual value of variables is known as call by
value .) The function which is called by reference can change the value of the variable used in the
call. Consider the following code:
lus
Main ()
int x;
x = 20;
change(&x);
printf(%d \n,x);
hip
art
}
change(p);
dy
int *p;
*p = *p + 10;
Vi
Calling function passes address of a variable to a function and returns back the value to main
program.
ww
m
type(* pointer-name)();1
.co
int * sqr(), square();
sqr=square;
sqr is pointer to a function and sqr points to the function square. To call the function square, the
lus
pointer sqr is with the list of parenthesis. That is
(*sqr)(a.b)
is equal to
hip
square(a,b)
char name[30];
dy
int number;
float price;
Vi
Product [2],*ptr;
This statement declare product as an array of two elements, each of the type struct inventory and ptr
w.
Ptr = product;
Would assign the address of the zeros element of product to ptr. That is, the pointer ptr will now point
ww
to product [0]. Its members can be accessed using the following notation.
Ptr -> name
UNIT-2
m
C PROGRAMMING ADVANCED FEATURES
.c o
INTRODUCTION TO STRUCTURE IN C
1. As we know that Array is collection of the elements of same type, but many time we have to store
the elements of the different data types.
lus
2. Suppose Student record is to be stored, then for storing the record we have to group together all the
information such as Roll name, Percent which may be of different data types.
3. Ideally Structure is collection of different variables under single name.
4. Basically Structure is for storing the complicated data.
hip
5. A structure is a convenient way of grouping several pieces of related information together.
Structure Initialization:
The members of the structure can be initialized to constant valued by enclosing the values to be
assigned within the braces after the structure definition
art
struct date{
int date;
int month;
idy
int year;
Initializes the member variable data, month, year of republic to 26, 1, 1950 respectively.
V
2) DEFINITION OF STRUCTURE IN C:
Structure is composition of the different variables of different data types, grouped under same
w.
name.
typedef struct {
char name[64];
char course[128];
int age;
int year;
} student;
w
m
1. Each member declared in Structure is called member.
char name[64];
char course[128];
int age;
int year;
.c
are some examples of members.
lus
student
3. Structure member may be of different data type including user defined data-type also
typedef struct {
char name[64];
char course[128];
book b1;
int year;
} student;
Here book is user defined data type.
h
art
3) STRUCTURE DECLARATION
In C we can group some of the user defined or primitive data types together and form another
compact way of storing complicated information is called as Structure. Let us see how to declare
idy
struct tag
{
data_type1 member1;
data_type2 member2;
data_type3 member3;
};
w
struct <structure_name>
{
structure_Element1;
structure_Element2;
m
structure_Element3;
...
...
};
s .c
Some Important Points Regarding Structure in C Programming:
1. Struct keyword is used to declare structure.
2. Members of structure are enclosed within opening and closing braces.
plu
3. Declaration of Structure reserves no space.
4. It is nothing but the Template / Map / Shape of the structure.
5. Memory is created, very first time when the variable is created /Instance is created.
struct date
{
int date;
char month[20];
int year;
};
m
struct Book
{
int pages;
char name[20];
int year;
lus
Arrays of Structures:
Arrays of structures are commonly used in a large number of similar records required to be processed
together. If there were one hundred employees in an organization , this data can be organized in an
struct emp-data
{
hip
array of structures. consider the following example:
art
char name[30];
int age;
};
idy
the first record is referred as employee[0], second record is referred by employee[1], and so on.
V
employee[0].age = 25
employee*1+.name = raja3
ww
employee[1].age = 35
m
A structure can have an array within it.
Char name[30];
.co
Like this is a structure can have no. of arrays as members.
Eg:
Struct student
lus
{
char name[25];
int sem;
char branch[10];
int mark[3];
}
hip
art
In the above example there are four members. Out of these four fields, name, branch and mark
are arrays.
A structure within structure means nesting of structures. a structure can be declared within another
structure. Consider the following emp-data structure. In this case the structure date may be placed
inside the structure.
struct date{
Vi
int date,month,year;
};
w.
struct emp-data
{
ww
char name[30];
};
m
Example
main()
.co
{
printf(%s,raja.name);
lus
printf(%d%d%d,raja.dob.date,raja.dob.month, raja.dob.year);
hip
This method is to pass each member of the structure as an actual arguments of the
function call. The actual arguments are then treated independently ordinary variables. This is the
most elementary methods and becomes inefficient when the structure size is large.
Syntax:
art
Function name (Structure variable name)
UNION
dy
Unions are quite similar to the structures in C. Union is also a derived type as structure.
Union can be defined in same manner as structures just the keyword used in defining union
in union where keyword used in defining structure was struct.
Vi
union car{
char name[50];
int price;
};
w.
union car{
ww
char name[50];
int price;
}c1, c2, *c3;
OR;
m
union car{
char name[50];
int price;
};
.co
-------Inside Function-----------
union car c1, c2, *c3;
In both cases, union variables c1, c2 and union pointer variable c3 of type union car is
lus
created.
The member of unions can be accessed in similar manner as that structure. Suppose, we you
hip
want to access price for union variable c1 in above example, it can be accessed as c1.price.
If you want to access price for union pointer variable c3, it can be accessed as (*c3).price
or as c3->price.
Union:
art
Union is another compound data type like structure. Union is used to minimize memory utilization.
In structure each member has the separate storage location. but in union all the members share
the common place of memory. so a union can handle only one member at a time.
Declaration of Union:
dy
union tagname
Vi
datatype member1;
datatype member2;
w.
..
...
ww
datatype member N;
};
Where union is the keyword. Tag name is any user defined data types.
Example:
m
union personal
.co
char name[25];
int age;
float height;
lus
};
In the above example union bio has 3 members first member is a character array name having
to 10 character (10 bytes)second member is an integer age that requires 2 bytes third member
is a float as four bytes, all the three members are different data types.
hip
Here all these 3 members are allocated with common memory . They all share the same memory.
the compiler allocates a piece of storage that is large enough to hold the largest type in the
union.
Example:
union test
{
Vi
int sum;
float average;
w.
};
#include <stdio.h>
struct student{
m
char name[50];
int roll;
.c o
float marks;
};
int main(){
lus
struct student s;
scanf("%s",s.name);
scanf("%d",&s.roll);
hip
art
printf("Enter marks: ");
scanf("%f",&s.marks);
printf("\nDisplaying Information\n");
idy
printf("Name: %s\n",s.name);
printf("Roll: %d\n",s.roll);
printf("Marks: %.2f\n",s.marks);
V
return 0;
}
w.
Output
w
m
Source Code to Store Information of 10 students Using Structure
#include <stdio.h>
.co
struct student{
char name[50];
int roll;
lus
float marks;
};
int main(){
int i;
s[i].roll=i+1;
dy
scanf("%s",s[i].name);
scanf("%f",&s[i].marks);
w.
printf("\n");
}
ww
for(i=0;i<10;++i)
m
printf("Name: ");
puts(s[i].name);
.co
printf("Marks: %.1f",s[i].marks);
return 0;
lus
}
Output
Enter marks: 98
hip
art
For roll number 2
Enter marks: 89
.
Vi
Name: Tom
Marks: 98
m
Source Code Demonstrate the Dynamic Memory Allocation for Structure
#include <stdio.h>
.co
#include<stdlib.h>
struct name {
int a;
lus
char c[30];
};
int main(){
int i,n;
printf("Enter n: ");
hip
art
scanf("%d",&n);
/* allocates the memory for n structures with pointer ptr pointing to the base address. */
dy
for(i=0;i<n;++i){
Vi
scanf("%s%d",&(ptr+i)->c, &(ptr+i)->a);
}
w.
printf("Displaying Infromation:\n");
for(i=0;i<n;++i)
ww
printf("%s\t%d\t\n",(ptr+i)->c,(ptr+i)->a);
return 0;
m
Output
Enter n: 2
.co
Enter string and integer respectively:
Programming
22
lus
Enter string, integer and floating number respectively:
Structure
33
Displaying Information:
Programming
Structure 33
22
hip
art
Program to demonstrate UNION
#include <stdio.h>
char name[32];
float salary;
Vi
int worker_no;
}u;
Struct job1 {
w.
char name[32];
float salary;
ww
int worker_no;
}s;
int main(){
m
printf("\nsize of structure = %d", sizeof(s));
return 0;
.c o
}
Output
lus
Size of union = 32
Size of structure = 40
There is difference in memory allocation between union and structure as suggested in above example.
hip
The amount of memory required to store a structure variables is the sum of memory size of all
members.
art
But, the memory required to store a union variable is the memory required for largest element of an
dy
union.
w.
ww
m
File Handling & File Manipulations in C Language
In this section, we will discuss about files which are very important for storing
information permanently. We store information in files for many purposes, like data processing
by our programs.
What is a File?
Essentially there are two kinds of files that programmers deal with text files and binary
files. These two classes of files will be discussed in the following sections.
A text file can be a stream of characters that a computer can process sequentially. It is
not only processed sequentially but only in forward direction. For this reason a text file is
usually opened for only one kind of operation (reading, writing, or appending) at any given
time.
Similarly, since text files only process characters, they can only read or write data one
w
character at a time. (In C Programming Language, Functions are provided that deal with lines of
text, but these still essentially process data one character at a time.) A text stream in C is a
m
special kind of file. Depending on the requirements of the operating system, newline characters
may be converted to or from carriage-return/linefeed combinations depending on whether
data is being written to, or read from, the file. Other character conversions may also occur to
satisfy the storage requirements of the operating system. These translations occur
transparently and they occur because the programmer has signaled the intention to process a
text file.
Binary files
Binary files can be either processed sequentially or, depending on the needs of the application,
they can be processed using random access techniques. In C Programming Language,
processing a file using random access techniques involves moving the current file position to an
appropriate place in the file before reading or writing data. This indicates a second
characteristic of binary files. They a generally processed using read and writes operations
simultaneously.
For example, a database file will be created and processed as a binary file. A record
update operation will involve locating the appropriate record, reading the record into memory,
modifying it in some way, and finally writing the record back to disk at its appropriate location
in the file. These kinds of operations are common to many binary files, but are rarely found in
w
m
Creating a file and output some data
In order to create files we have to learn about File I/O i.e. how to write data into a file
and how to read data from a file. We will start this section with an example of writing data to a
file. We begin as before with the include statement for stdio.h, then define some variables for
use in the example including a rather strange looking new type.
us
/* Program to create a file and write some data the file */
#include <stdio.h>
#include <stdio.h>
main( )
{
FILE *fp;
char stuff[25];
int index;
fp = fopen("TENLINES.TXT","w"); /* open for writing */
strcpy(stuff,"This is an example line.");
for (index = 1; index <= 10; index++)
fprintf(fp,"%s Line number %d\n", stuff, index);
fclose(fp); /* close the file before ending program */
}
i
The type FILE is used for a file variable and is defined in the stdio.h file. It is used to
define a file pointer for use in file operations. Before we can write to a file, we must open it.
What this really means is that we must tell the system that we want to write to a file and what
the file name is. We do this with the fopen() function illustrated in the first line of the program.
The file pointer, fp in our case, points to the file and two arguments are required in the
parentheses, the file name first, followed by the file type.
The file name is any valid DOS file name, and can be expressed in upper or lower case
letters, or even mixed if you so desire. It is enclosed in double quotes. For this example we have
w
chosen the name TENLINES.TXT. This file should not exist on your disk at this time. If you have a
file with this name, you should change its name or move it because when we execute this
m
program, its contents will be erased. If you dont have a file by this name, that is good because
we will create one and put some data into it. You are permitted to include a directory with the
file name. The directory must, of course, be a valid directory otherwise an error will occur. Also,
because of the way C handles literal strings, the directory separation character \ must
be written twice. For example, if the file is to be stored in the \PROJECTS sub directory then the
file name should be entered as \\PROJECTS\\TENLINES.TXT. The second parameter is the file
attribute and can be any of three letters, r, w, or a, and must be lower case.
Reading (r)
When an r is used, the file is opened for reading, a w is used to indicate a file to be used
for writing, and an indicates that you desire to append additional data to the data already in an
existing file. Most C compilers have other file attributes available; check your Reference Manual
for details. Using the r indicates that the file is assumed to be a text file. Opening a file for
reading requires that the file already exist. If it does not exist, the file pointer will be set to
NULL and can be checked by the program.
dy
Here is a small program that reads a file and displays its contents on screen.
c = getc(fp);
om
fclose(fp);
}
Writing (w)
When a file is opened for writing, it will be created if it does not already exist and it will
be reset if it does, resulting in the deletion of any data already there. Using the w indicates that
the file is assumed to be a text file.
Here is the program to create a file and write some data into the file.
p
#include <stdio.h>
int main()
{
FILE *fp;
file = fopen("file.txt","w");
/*Create a file and add text*/
fprintf(fp,"%s","This is just an example :)"); /*writes data to the file*/
fclose(fp); /*done!*/
return 0;
}
d
Vi
Appending (a)
When a file is opened for appending, it will be created if it does not already exist and it
will be initially empty. If it does exist, the data input point will be positioned at the end of the
present data so that any new data will be added to any data that already exists in the file. Using
the indicates that the file is assumed to be a text file.
Here is a program that will add text to a file which already exists and there is some text in the
file.
w
#include <stdio.h>
m
int main()
{
FILE *fp
file = fopen("file.txt","a");
fprintf(fp,"%s","This is just an example :)"); /*append some text*/
fclose(fp);
return 0;
}
u
Outputting to the file
The job of actually outputting to the file is nearly identical to the outputting we have
already done to the standard output device. The only real differences are the new function
names and the addition of the file pointer as one of the function arguments. In the example
program, fprintf replaces our familiar printf function name, and the file pointer defined earlier
is the first argument within the parentheses. The remainder of the statement looks like, and in
fact is identical to, the printf statement.
Closing a file
To close a file you simply use the function fclose with the file pointer in the parentheses.
Actually, in this simple program, it is not necessary to close the file because the system will
close all open files before returning to DOS, but it is good programming practice for you to close
all files in spite of the fact that they will be closed automatically, because that would act as a
reminder to you of what files are open at the end of each program.
You can open a file for writing, close it, and reopen it for reading, then close it, and open
it again for appending, etc. Each time you open it, you could use the same file pointer, or you
could use a different one. The file pointer is simply a tool that you use to point to a file and you
decide what file it will point to. Compile and run this program. When you run it, you will not get
any output to the monitor because it doesnt generate any. After running it, look at your
w
directory for a file named TENLINES.TXT and type it; that is where your output will be. Compare
the output with that specified in the program; they should agree! Do not erase the file named
m
TENLINES.TXT yet; some of the other examples in this section.
Now for our first program that reads from a file. This program begins with the familiar include,
some data definitions, and the file opening statement which should require no explanation
except for the fact that an r is used here because we want to read it.
l
#include <stdio.h>
main( )
{
FILE *fp;
char c;
funny = fopen("TENLINES.TXT", "r");
if (fp == NULL)
printf("File doesn't exist\n");
else
{
do
{
c = getc(fp); /* get one character from the file */
putchar(c); /* display it on the monitor */
}
while (c != EOF); /* repeat until EOF (end of file) */
}
fclose(fp);
}
In this program we check to see that the file exists, and if it does, we execute the main
body of the program. If it doesnt, we print a message and quit. If the file does not exist, the
w
system will set the pointer equal to NULL which we can test. The main body of the program is
one do while loop in which a single character is read from the file and output to the monitor
m
until an EOF (end of file) is detected from the input file. The file is then closed and the program
is terminated. At this point, we have the potential for one of the most common and most
perplexing problems of programming in C. The variable returned from the getc function is a
character, so we can use a char variable for this purpose. There is a problem that could develop
here if we happened to use an unsigned char however, because C usually returns a minus one
for an EOF which an unsigned char type variable is not
capable of containing. An unsigned char type variable can only have the values of zero to 255,
so it will return a 255 for a minus one in C. This is a very frustrating problem to try to find. The
program can never find the EOF and will therefore never terminate the loop. This is easy to
prevent: always have a char or int type variable for use in returning an EOF. There is another
problem with this program but we will worry about it when we get to the next program and
solve it with the one following that.
After you compile and run this program and are satisfied with the results, it would be a
good exercise to change the name of TENLINES.TXT and run the program again to see that the
NULL test actually works as stated. Be sure to change the name back because we are still not
finished with TENLINES.TXT.
idy
This C Program creates a file & store information. We frequently use files for storing
information which can be processed by our programs. In order to store information
V
permanently and retrieve it we need to use files and this program demonstrate file creation
and writing data in that.
w.
Here is source code of the C program to create a file & store information. The C program
is successfully compiled and run on a Linux system. The program output is also shown below.
ww
/* C program to create a file called emp.rec and store information about a person, in
m
terms of his name, age and salary. */
#include <stdio.h>
.co
void main()
FILE *fptr;
lus
char name[20];
int age;
float salary;
hip
/* open for writing */
if (fptr == NULL)
{
art
printf("File does not exists \n");
return;
}
dy
scanf("%s", name);
Vi
scanf("%d", &age);
w.
scanf("%f", &salary);
fclose(fptr); }
OUTPUT:
m
Enter the name
Raj
.co
Enter the age
40
Enter the salary
4000000
lus
Binary files
Binary files are very similar to arrays of structures, except the structures are in a disk-file
files:
hip
rather than an array in memory. Binary files have two features that distinguish them from text
3. After you have opened the binary file, you can read and write a structure or seek a
dy
specific position in the file. A file position indicator points to record 0 when the file is
opened.
4. A read operation reads the structure where the file position indicator is pointing to.
Vi
After reading the structure the pointer is moved to point at the next structure.
5. A write operation will write to the currently pointed-to structure. After the write
operation the file position indicator is moved to point at the next structure.
w.
6. The fseek function will move the file position indicator to the record that is
requested.
7. Remember that you keep track of things, because the file position indicator can not
ww
only point at the beginning of a structure, but can also point to any byte in the file.
m
A memory address
.co
Number of blocks to read
A file variable
For example:
lus
fread(&my_record,sizeof(struct rec),1,ptr_myfile);
This fread statement says to read x bytes (size of rec) from the file ptr_myfile into
hip
memory address &my_record. Only one block is requested. Changing the one into ten will read
in ten blocks of x bytes at once.
/* Our structure */
dy
struct rec
{
Vi
int x,y,z;
};
w.
int main()
int counter;
ww
FILE *ptr_myfile;
m
ptr_myfile=fopen("test.bin","wb");
if (!ptr_myfile)
.co
{
return 1;
lus
}
}
hip
my_record.x= counter;
return 0;
dy
}
Vi
In this example we declare a structure rec with the members x,y and z of the type
integer. In the main function we open (fopen) a file for writing (w). Then we check if the file is
open, if not, an error message is displayed and we exit the program. In the for loop we fill the
w.
structure member x with a number. Then we write the record to the file. We do this ten times,
thus creating ten records. After writing the ten records, we will close the file (dont forget this).
So now we have written to a file, lets read from the file we have just created. Take a
ww
m
#include<stdio.h>
/* Our structure */
.co
struct rec
int x,y,z;
lus
};
int main()
int counter;
FILE *ptr_myfile;
hip
art
struct rec my_record;
dy
ptr_myfile=fopen("test.bin","rb");
if (!ptr_myfile)
Vi
return 1;
w.
fread(&my_record,sizeof(struct rec),1,ptr_myfile);
printf("%d\n",my_record.x);
m
fclose(ptr_myfile);
return 0;
.co
}
The only two lines that are changed are the two lines in the for loop. With the fread
lus
we read-in the records (one by one). After we have read the record we print the member x (of
that record).
hip
The only thing we need to explain is the fseek option. The function fseek must be
declared like this:
art
int fseek(FILE * stream, long int offset, int whence);
dy
The fseek function sets the file position indicator for the stream pointed to by the
stream. The new position, measured in characters from the beginning of the file, is obtained by
adding offset to the position specified by whence. Three macros are declared in stdio.h called:
Vi
If the position declared by whence is SEEK_SET, then the position is the beginning of the
file. The SEEK_END can be used if you want to go to the end of the file. (Using negative numbers
w.
it is possible to move from the end of the file.) If when SEEK_CUR then the position is set, x
bytes, from the current position.
ww
#include<stdio.h>
struct rec
m
int x,y,z;
.co
};
int main()
lus
int counter;
FILE *ptr_myfile;
hip
ptr_myfile=fopen("test.bin","rb");
if (!ptr_myfile)
art
{
return 1;
}
Vi
{
w.
fseek(ptr_myfile,sizeof(struct rec)*counter,SEEK_SET);
fread(&my_record,sizeof(struct rec),1,ptr_myfile);
ww
printf("%d\n",my_record.x);
fclose(ptr_myfile);
m
return 0;
.co
}
In this example we are using fseek to seek the last record in the file. This record we read
with fread statement and with the printf statement we print member x of the structure
my_record. As you can see the for loop also changed. The for loop will now countdown to
lus
zero. This counter is then used in the fseek statement to set the file pointer at the desired
record. The result is that we read-in the records in the reverse order.
hip
A last note: if you set the file position indicator to a position in a file and you want the
first position in a file then you can use the function rewind to the first position in the file. The
function rewind can be used like this:
art
#include<stdio.h>
/* Our structure */
dy
struct rec
{
Vi
int x,y,z;
};
w.
int main()
{
ww
int counter;
FILE *ptr_myfile;
ptr_myfile=fopen("test.bin","rb");
m
if (!ptr_myfile)
.co
printf("Unable to open file!");
return 1;
lus
fseek(ptr_myfile, sizeof(struct rec), SEEK_END);
rewind(ptr_myfile);
hip
for ( counter=1; counter <= 10; counter++)
{
art
fread(&my_record,sizeof(struct rec),1,ptr_myfile);
printf("%d\n",my_record.x);
dy
fclose(ptr_myfile);
Vi
return 0;
}
w.
With the fseek statement in this example we go to the end of the file. Then we rewind
to first position in the file. Then read-in all records and print the value of member x. Without
ww