C Programming
C Programming
C Programming
Salokhe
http://www.geocities.com/arutacomp/
or mail me on
Thank you.
Rajendra Salokhe
C FOR ENGINEERS R.G.Salokhe
The C language was created, designed and written by Dennis Ritchie in 1972 at Bell
Laboratories. C was designed to run under UNIX operating system on the DEC, PDP11
computer.
Features of C :-
a) Portability :- The best feature for which C gained popularity is the portability of
code. The C language programs could be run on variety of computers with a little or no
change in the source code. Which means the C language code can be used under various
operating systems.
b) Efficiency :- The C language is efficient in two ways I) The source code is very
compact ii) Memory Management through C is very efficient.
e) Flexible level :- C programs can be written with the features of high level languages
as well as that of low level languages. C thus fits in between the two. C is not a ‘strongly
typed’ language. There are no bounds to number of array elements.
f) Case Sensitivity :- C is case sensitive. Which means the upper case and lower case
characters are treated differently in variable names, function names etc.
ANSI C :- ANSI stands for American National Standard Institute. The ANSI set a
standard for C language in 1990. This was for the various compiler developers to use this
standard. However many compilers are not strictly adhering to the ANSI standard.
>>> >>>
input Function output
C FOR ENGINEERS R.G.Salokhe
4 2
Numeric Numeric
Input Output
30 SINE 1/2
degrees number
/*PROG1.C */ Comment
# include < stdio.h > Header
main ( ) Function Main
{ Body of Main starts
; Null statement
} Main ( ) ends
We have written the program name as comments. The comments, spaces, tabs, newline
characters are ignored by the C Compiler.
At this stage we will keep aside the discussion on header file. just remember that ‘ stdio ‘
stands for standard input output.
C FOR ENGINEERS R.G.Salokhe
Every set of C programs should have one main ( ) function. This is called the driving
function. The program execution starts at ‘ { ‘, the opening brace of the main function
body and ends at the ‘ } ‘ closing brace.
We have included a null statement, a statement which does not mean anything in the
body of the main ( ) function. Every statement in C ends with a ‘ ; ‘ ( semicolon ).
The above prgram will run but would not produce any results. Let us slightly modify the
program;
/* PROG2.C */
# include < stdio.h >
main ( )
{
printf ( "Hello friends! " ) ;
}
Output -
Hello friends!
printf ( ) is another function available in the C library and declared in the stdio.h file.
Thus whichever functions we use, we have to include corresponding header files into our
programs.
/* PROG3.C */
# include < stdio.h >
main ( )
{
printf ( " Hello friends ! \ n " )
printf ( " How are you ? \ n " ) ;
}
Output -
Hello friends!
How are you?
The \ ( backslash ) causes escape from the normal printing process and \n causes the
computer to skip one line while printing. Other escape sequences are ;
\b backspace \t tab
C FOR ENGINEERS R.G.Salokhe
C character set :-
C uses the following character set;
Variable Names :-
As a very basic concept we can say that a variable is an entity whose value changes. We
use a lot of variables in Algebra. When we say
a = 5;
Coming to a better concept a variable is the name assigned to the address of a cell in the
memory.
Memory cell
Name a
Address 2529
Value 5
a =6;
Then the value 5 vanishes and the value of 6 is put into the cell.
a = a+6;
is a wrong algebric equation but it is a valid computer equation as it means add 6 to the
present value of a and assign the resulting value to a. Thus a becomes 12.
a + 5 = 6 ; / * wrong * /
The above equation is wrong for the computer as you can not add anything to the name.
We have used a as a variable name. We can use any name for the variable within the
following rules.
1) The variable name can not have a space, comma or characters like ( #,?,&,$,!,| ) - why
use funny characters?
2) The name uses underscore, alphabet and numeric characters only. e.g.
_ total
BASIC
D_A
etc.
3) The language reserved words or key words can not be used as variable names. e.g.
double, int,auto etc.
Data Types :-
Larger the value, larger is the space required in memory to store the number. If
you are using a variable whose value varies between 0 and 255 then there is no need to
allocate more space in memory for storing this number. The data types are created for
efficient use of the memory.
How much memory is alloted for the various types depends on the machine.
The basic data types is the character variable. Character variable occupies 1 byte of the
memory. 1 byte comprises of 8 bits and the maximum value of 8 bit binary number is
255.
1 byte = 8 bits
27 26 25 24 23 22 21 20
If the character is unsigned then it can store values from 0 to 255. In other words we can
say that total values that can be stored in 8 bits is 28 or 256.
/ * PROG4.C * /
# include < stdio.h >
main ( )
{
char a ; a is declared to be of character type.
a=‘A‘;
printf ( " A = %c ", a ) ;
}
output -
A=A
Variable a is declared as character type and then assigned a value 'A' which is a character
constant. A character enclosed in single quotes makes a character constant.
signed char can store values from -128 to 127 ( 128 + 127 + 1 for zero = 256 )
C has a unique feature by which numeric values can be mixed with characters or
characters can be treated as numbers.
/ * PROG5.C * /
C FOR ENGINEERS R.G.Salokhe
output -
Decimal value of a is 65
Character value of a is A
The ASCII value of A is 65. B is 66 etc. Thus A can mean 65 or B can mean 66. ASCII
value of lower case a is 97 and that of b is 98 etc. This feature can be used to convert
upper case letters into lower case and vice versa.
/ * PROG6.C * /
# include < stdio.h >
main ( )
{
char a, b ;
a = 'A'
print f ( " value of a is % c\ n", a ) ;
a = a +32; Adding 32 to character converts upper case to lower case.
printf ( " now a is %c " , a ) ;
}
output -
value of a is A
now a is a
Initially we have assigned upper case A to variable a. Later we have added 32 to variable
a. Now the value stored in variable a is lower case a.
We have used char type in above examples. However the char type can be declared in
three ways;
C FOR ENGINEERS R.G.Salokhe
char
signed char
unsigned char
Simply mentioning char declares the variable to be of signed char type ( However for
some compilers it is unsigned char.)
The range for char varies from -128 to 127 and for unsigned char it is 0 to 255, total
256 numbers.
The characters have a space of 1 byte or 8 bits available. The first bit is taken up by the
sign
and the maximum number that can be stored in the remaining 7 bits is 127. So how can
you store the number -128 ?
1 0 0 0 0 0 0 0 -128
1 0 0 0 0 0 0 1 -127
1 0 0 0 0 0 1 0 -126
Integer Type :-
Integer variables store a value which are whole numbers i.e. a number with or without
sign but no fractional part and hence are declared as;
int i;
Integers have the following range ;
C FOR ENGINEERS R.G.Salokhe
a) The int word may be ommitted in all the cases except where you want to declare the
variable as int only. eg.
int i;
long i ;
unsigned long i ;
/ * PROG7.C * /
# include < stdio.h >
main ( )
{
int i;
i=5;
printf ( " Value of i is = %d\n", i);
i=6;
printf ( " Value of i is = %d\n", i);
C FOR ENGINEERS R.G.Salokhe
output -
Value of i is = 5
Value of i is = 6
1) Mantissa :- The digits are stored in the Mantissa part. The number of digits of accuracy
is decided by the Mantissa part.
2) Exponent :- The exponent part decides the 10s power the Mantissa is to be raised to
and thus the range of the number.
/ * PROG8.C * /
main( )
{
float f ;
f = 3.142 ;
printf ( " %f " , f ) ;
}
output -
3.142000
6 digits are printed.
For more accuracy the floating point numbers can also be declared as double or
long double. Modifier L is used in printf to denote long double as;
printf ( “ %Lf “ , f ) ;
If you declare i to be a character then the values stored in i will range from -128 to 127.
If you assign a value of +128 to i then i becomes -127. Value of 129 will make i equal to
-127 and so on.
/ *PROG9.C * /
main ( )
{
int i = 320 ;
char j ;
j=i;
printf ( " %c " , j ) ;
}
output -
@
j can take a maximum value of 127, after 127 it will become -128. we have to go on
substracting 128 from 320 till we get a feasible value.
320
- 128
-----------
192
- 128
-----------
64
j, a
since 64 falls in the range of the character whose ASCII value is 64 will be printed.
Instead of i = 320 if you make it 321 then the value of j will be 65 and A will be printed.
C FOR ENGINEERS R.G.Salokhe
/* PROG10.C */
main()
{
int i=32;
i=i*(i/3)*100+800;
printf( "%d",i);
}
Output :-
-32736
Here again i/3 will be 10 because i is integer and it can not store fractional part.
We are trying to assign a new value which is 32*10*100+800 = 32800 to i. This is out of
range of the integer.
-32768+32800 = 32
-32768+32 = -32736
You must have observed that assigning float value to integer truncates the fractional part.
If you change the program as
/* PROG11.C */
main()
{
int i=32;
long j;
j=i*(i/3)*100+800
printf (" %d",j);
}
Output :-
-32736
You may think that because j is of long type it will hold the value 32800, but before the
value is assigned to j, the right hand side evaluates to an integer value which is -32736.
Try the following to get the correct result.
j=i*(i/3)*100+800l;
Constants :-
C FOR ENGINEERS R.G.Salokhe
We deal with the constant since our childhood. Constant is an entity whose value
does not change. All the numbers are constants. However we have to have diffrent types
in constant as that of variables for efficient management of memory.
Named Constants :-
Named constant will have a name like variable but the value of the named constant would
not change as
float PI=3.142;
Here you declare PI as floating type variable but you are not supposed to change the
value of PI.
However you may accidently change the value of PI. To avoid this you can use
const key word in the declaration as
Now the compiler itself would not allow you to change the value of PI and you can use
PI into any expression as;
c=2*PI*j;
#define PI 3.142
When you compile the C program the preprocessor gets an instruction from the above
statement to substitue PI with 3.142. Whereever it finds PI written in the program the
same is substituted by 3.142. PI is not a variable name. PI is not a variable it cannot be
used as the variable .
C FOR ENGINEERS R.G.Salokhe
/* PROG12.C */
#define PI 3.142
main()
{
float c;
int r;
r=15;
c=2*PI*r; ( 3.142 is substitued in place of PI. )
printf( "%f ",c);
}
Integer Constants :-
Numbers without fractional parts constitued integers.eg.
i=5 ;
long int i;
i=1234567 l;
Character Constants :-
The characters constants are enclosed in the single inverted comma or single quotation
mark. eg.
You can have only one character inside the quotation mark.
char ch;
ch='A';
C FOR ENGINEERS R.G.Salokhe
Charater constants also represent the type int . The value then is the ASCII value of the
character. eg. ASCII value of A is 65, that of B is 66 etc. and thus A also means 65.
char ch;
ch='A';
ch=ch+1;
printf(“ %c”,ch);
will print 'B'
'Hello' is printed on first line and 'Hi' is printed on the next line.\n If
is not there the
printout will be HelloHi;
The use of \ before a printable character to print non- printable character is also called
escape sequence. The escape sequences available are.
/* PROG13.C */
main()
C FOR ENGINEERS R.G.Salokhe
{
char ch,ch1;
ch='\a';
ch1='\n';
printf (" %c",ch);
printf ("Hello");
printf ("%c",ch1);
printf ("\x0a Hello "); "\x0a can be used in place of \n
printf ("\x07 Hello "); "\x07 bell
}
Output :-
* bell *
Hello
Hello *bell* Hello
String is a array of characters. ( We will discuss about this later ). The characters
enclosed in double quotes represent a srting. The string may or may not contain any
characters.
" " - empty string
"Hello"
are the examples of strings. If we want a double quotes and back slash in the string then
we have to put a back slash before this as.
"\" Hello \" "
"\\ Hello "
The string is automatically terminated with the null \0 character. This is always the last
character of the string. The string "Hello" is actually stored in memory as;
H E L L O \0
/* PROG 14.C */
main( )
{
char ch[]= "Hello"; ( ch declared as array of characters )
printf ("%s",ch);
}
Output :-
Hello
Octal Constants :-
Octal constants use digits from 0 to 7 like the decimal constants which use digits from
C FOR ENGINEERS R.G.Salokhe
0 to 9
83 82 81 80
512 64 8 1
1 7 =8+7 = 15 in decimal
7 4 56+4 = 60
Hexadecimal constants :-
Hexadecimal constants use digits from 0 to 15 and thus powers of 16. The numbers after
9 are represented with A,B,C,D,E,F.
1 7 = 16+7 = 23 in decimal
3 F = 48+15= 63 in decimal
int day-of-week ;
The compiler will point out the error, since there is a spelling difference in the variable
declared and the variable you are trying to use. In some interpreter languages another
variable day-of-wek will be created causing errors and mishaps to the logic of the
program.
C FOR ENGINEERS R.G.Salokhe
Defining the variables means setting aside memory for the variables. Since the
statements so far used by us also set aside memory for the variable we are doing the job
of declaring and defining at the same time.
We are informing the compiler that we are going to use a variable name called i , i is
going to be of integer type and a memory of 2 bytes should be alloted to i . The size of
memory alloted depends on the type and machine.
The variables is required to be decleared before use. The declarations are made at the
beginning of the block.
examples :
int i=0;
int i,j;
float x;
i=j=0;
here color is the tag name and it can be used to declare a variable of enum type .
Yellow, Cyan, and Magenta are named constants and their values will be;
Yellow = 0; Cyan =1; Magenta =2 and so on if you have more names in the bracket.
\*PROG15.C * \
main ( )
{
enum color (yellow, cyan, Magenta);
enum color Y,C,M ;
Y=Yellow ;
C=Cyan;
C FOR ENGINEERS R.G.Salokhe
M=Magenta;
printf ("%d \n",Y);
printf ("%d \n" ,C);
printf ("%d \n" ,M);
}
Output :-
0
1
2
Since Y, C and M are declared of enum color type their values can vary only from 0 to 2.
‘Yellow ‘ means 0, ‘Cyan’ means 1, Magenta means 2 and thus;
Y=Yellow;
will store 0 in y
You can however assign a different value to Yellow or Cyan or Magenta in the
declaration. The subsequent values will also change. eg.
in this case Yellow will have a value of 5, Cyan will have a value of 6 and Magenta will
have value of 7.
We have so far used the printf( ) function to output information on the screen. Let us
discuss the printf( ) function in a little detail.
The printf( ) function is a formatted output function. You have to specify the format in
which you want the output. The format is specified in double quotes.
Conversion
specification for
the argument
d or i - decimal
u - unsigned
o - octal
x or X - hexadecimal
f - fixed floating point
e or E - exponential
g or G - shortesh of f and e
c - character
s - string
p - pointer
The width fields specifies the minimum width in which the number should be printed.
However if the width of the number to be printed exceeds the specified width then the
specified width is ignored. The width may be specified with leading 0 so that 0 are
printed leading the number.
The Precision field decides the number of digits to be printed after the decimal point. If
no precision is specified then the default width is 6. Though integer numbers do not have
a fractional field the precision may be specifed. In that case the precision decides the
maximum number of digits to print. For g or G type the precision specifies the
maximum number of digits to be printed after the decimal point. For s type the
precision decides the number of characters to be printed.
\* PROG16 .C *\
main( )
{
int i=1234;
printf (" %d \n ",i);
printf (" %-5d \n ",i); /* negatative flag */
printf (" %5d \n ",i);
printf (" %3d \n" ,i); /* width less than number */
printf (" %+d \n",i);
printf (" %d \n ",i); /* space before type */
printf (" %05d \n",i);
printf (" %.5d \n ",i); /* precision specification */
printf (" % 5.2d \n ",i);
}
Output :-
1234 left justified
1234 left justified
1234
+1234
01234
01234
1234
\* PROG17.C*\
C FOR ENGINEERS R.G.Salokhe
main( )
{
float f =3.142 ;
printf (" %f \n ",f);
printf (" %e \n ",f);
printf (" %.2f \n ",f);
printf (" %.2e \n ",f);
printf (" %6.2f \n ",f);
}
Output :-
3.142000
3.142000e+00
3.14
4.14e+00
3.14
the 6.2 width means total width of 6 including decimal points and fractional digits.
1 3 . 1 4
Do not try use wrong type specification for the values. It will give wrong results, as
float i =3.5;
printf ( "%d \n ",i);
or
int i = 7.2;
printf ( "%f \n ", i);
The assignment int i = 7.2 ; is however correct. That case the value of i will be 7.
You must be starting for a function which can accept values from the key board. scanf( )
is the function used for this purpose. scanf( ) is a little tricky function in the sence that it
requires the address of the variable in its parameters. why ? we will learn when we learn
the functions. Let us see what the address means.
So far we have learned that every variable declared will have a name, a value and a type.
The further parameter the variable will have will be the address in the memory where the
variable is stored.
NAME VALUE
i 35
TYPE ADDRESS
int 4099
VARIABLE
/* PROG18.C*/
main( )
{
int i = 35;
printf(" %d \n ",&i);
}
Output :-
4099 you may get a diffrent answer. This is the address where value of i is
stored.
\*PROG19.C*\
main( )
{
int i ;
printf(" Type a number ");
scanf(" %d ", &i);
printf( " \n You typed %d ",i);
}
Input / Output
Type a number 35
You typed 35
C FOR ENGINEERS R.G.Salokhe
\*PROG20.C*\
main( )
{
float i,j ;
printf(" Type two values ");
scanf(" %f %f ", &i,&j );
printf(" \n Sum is %f ", i+j);
printf(" \n Multiplication is %f ",i*j);
printf(" \n Division is %f ", i/j);
}
Input / Output
Sum is 24.000000
Multiplication is 63.000000
Division is 7.000000
If you want to input the values seperated by comma then you can use
scanf(" %f , %f ", &i , &j );
You may specify the field width and not separate the values as
scanf(" %3d%2d ", &i,&j );
You can type 23145 and the value of i will be 231 and that of j will be 45. You can also
use scanf( ) for inputting characters and strings but scanf() is little tricky for string.
/*PROG21.C*/
main ( )
{
char ch [30]; string is array of characters
scanf("%s",ch); & is not used for arrays.
printf (" \n Good Morning Mr. %S",ch);
}
printf ("type a Name \n");
input output
Type a Name
Satish
C FOR ENGINEERS R.G.Salokhe
If you type Satish Sharma then also Good Morning Mr. Satish will be printed. Scanf ( )
will just ignore the surname as it is followed by a space. You can solve the problem by
writing the scanf function something like.
scanf("%[A-Z a-z]\n",ch)
space is required here.
/*PROG22.C*/
Main ( )
{
char c1,c2 ;
printf ("Type two charcters\n");
scanf ("%c%c", &c1,&c2);
printf ("First charcter % c\n",c1);
printf ("Second character % c\n",c2);
}
Input/Output
First Character A
Second Character B
Because space is also a character you do not separate the characters with space. If you
have to separate the input characters with a space then you have to write the scanf ( ) as.
Incase of floating point numbers "%f %f" and "%f %f " will mean the same thing.
Normally scanf ( ) will follow printf ( ) so that the operator is prompted as to what is
requested to inputed. You have to also ensure that the data types inputed are correct as
per format.
/* PROG23.C*/
main ( )
{
float fa,ce;
printf ("Enter fahrenneit temperature\n");
scanf ("%f",&fa);
ce= (5/9-0) * (fa-32);
printf ("Fahrenneit = %f",fa);
printf ("Centigrade = %f",ce);
}
Input/Output
Fahrenneit = 32.000000
Centigrade = 0 .000000
Note that if you write 5/9 instead of 5/9-0 it will work out to be 0 because the division
of two integers will be an integer number without fractional part.
Function gets( )
The scanf function puts a limitation on the input when a string is entered. If you write
/*PROG24.C*/
main ( )
{
char ch[ ];
scanf ("% s", ch);
printf ("% s", ch);
}
Input/Output
Rajendra Salokhe
Rajendra
C FOR ENGINEERS R.G.Salokhe
The surname has vanished in the output. scanf scans the string till a white space is
encountered. There is a better function available which inputs the string till new line or
end of file (^z) is reached.
/*PROG25.C*/
main ( )
{
char ch[ ];
gets (ch);
puts (ch);
}
Input/Output
Rajendra Salokhe
Rajendra Salokhe
We have also used the puts function which outputs the string on the screen.
/*PROG26.C*/
main ( )
{
char c,d;
scanf ("%c%c", c,d);
printf ("% d\n",c);
printf ("% d\n",d):
}
Input/Output
A
65
10
You want to input two values for c and d. When you type A and press enter the enter key
is considered as another character. Thus value for A=65 and values of enter key=10 is
outputed. The computer does not wait for another character. How do you input the value
of d ? It is by two methods;
To handle characters and strings c has made available some other functions.
C FOR ENGINEERS R.G.Salokhe
getch( )/getehe( )
Both this functions allow to input a character from the keyboard with a little difference;
/*PROG27.C*/
# include <conio.h>
main( )
{
char ch;
ch=getch( );
printf ("\n%c\n", ch);
ch= getehe( );
printf ("\n%c\n", ch);
}
Input/Output
A This is not shown on the screen.
These are also other functions available to output the character. We will use these
functions with another input function.
/*PROG28.C*/
# include < conio.h >
main( )
{
char ch;
ch= getehar( ); getehar( ) needs an enter key to be pressed.
putchar (ch); output to standared output device.
ch= getch ( );
putch (ch); output to text window, for now it is same as putehar( )
}
Input/Output
r Enter key is requited
If you recollect our discussion about the functions we know that all the functions output
something or return some value. and the function represents the output value. That is
why we can assign.
C FOR ENGINEERS R.G.Salokhe
ch=getch( );
We have to remember that all the input functions discussed by us return an integer value
and not the character value. It is thus advisable that insted of declaring ch as character.
ch should be declared as integer as.
int ch;
Another thing to note that we have included the conio.h (pronounced con-eye-o) file in
the program because gethe( ), getch( ) and putch( ) functions are declared in the conio.h
file.
Also note that getehar( ) is not a function but is macro extracted from fgetchar( )
function. Macro is something you obtain with a #define statement.
In the above context even the printf( ) function returns an integer value for printf it is
number of characters printed.
/*PROG29.C*/
main( )
{
printf("% d", printf("Hello"));
}
Output 5
Type Conversions
When you write an expression you come across mixing various types in the expression as
5+2.5
Integer Float
Here we are adding an integer constand to the constant of float type. This type of
addition is not easy for the computer. as integer and floats are stored in different formats.
The process required to be done is to convert the integer into float and then do the
addition. Since we may mix a lot of different types the rules followed by C are in the
following steps
Step6 :- Since all the operands are convereted into a single type the result will be
calculated in that type.
'A'+3+5.0
Char is converted to int Float converted to double.
65+3+5.0
Integers converted to double
65.0+3.0+5.0
Result is double
73.0
ASSIGNMENT CONVERSION :-
Evaluating the expression to a certain type and assigning it some other vanable are
different things. While the expressions as discussed above evaluate to maximum
accuracy the assignment works in the reverse fation.
Float=Double;
Value is rounded and truncated eg.
Long=Float;
Fraction part of float is truncated. In the above example the value stored in long will be
12345679.
Int=Long;
When the value exceeds that of type int it goes back to - 32768 and starts add in further.
In any case the value thus obtained may be unpredictable and will cause errors in the
program.
ARITHMATIC OPERATORS :-
We are aware of some of the arithmatic operators. These are as follows
Unary :-
Unary operators work only on one operand eg.
-5, -d, f
C FOR ENGINEERS R.G.Salokhe
They change the value of the operand to negative if the operand is positive and positive if
the value of operand in negative.
+ Operator :-
The plus operator does various addition. (We will come across other additions later).
Grouping of + operator is done from left to night.
d= a+b+c;
d= (a+b)+c;
a and b are first added and then c is added to the addition.
- Operator :-
d=5+12
=17
If addition has higher precedance then the above expression will evaluate as
/ Operator:-
This operator performs division .Interger type divided by integer yields interger type.
Thus 5/9 will always give and answer equal to 0.
% Modulus operator
The moudulus operator works on interger data types and yields in the result equal to the
remainder of the division.
e.g. 7%5=2
7%6=1
7%7=0
7%8=7 ( 7 * 0 = 0 and remainder is 7 ).
C FOR ENGINEERS R.G.Salokhe
RELATIONAL OPERATORS :-
< (Less than ), <= (less than or equal to ) , > (greater than ), >= (greater than or equal to )
are the relational operators which are used to test the conditions between two operands.
/* PROG30.C */
main ( )
{
int i;
printf ( " Type a number " );
scanf ( " %d " , & i);
if ( i > 0 ) printf ( " \n the number is positive ");
}
The program is self explainatory . The important point you have to remember is that the
experssion
(i >0 ) evaluates to be 1(true) or 0 (false). If you write
EQUITY OPERATORS:-
= = ( equal to ) and ! = ( not equal to ) are the equity operators which work similar to
relational operators.They compare the operands. The students many a times confuse
between (= equal to) assignment operator and = = equity operator. The assignment
actually assigns value to the variable but the = = operator just compares the values. e.g.
LOGICAL OPERATORS :-
&& ( logical and )
| | ( logical or )
! ( logical not )
are the logical operators.
/* PROG31.C */
main ( )
{
int i,j;
printf ( " Input two values " );
scanf ( " %d %d ",i ,j);
C FOR ENGINEERS R.G.Salokhe
Remember to put two times & while using the logical & operator .
/*PROG32.C */
main ( )
{
printf ( " %d ", 3&&4);
}
Output 1
3 is true and 4 is true, so that 3&&4 is true which is 1.
Let us analyse the results.
Thus
True && true is true
True && false is false
False && true is false
False && false is false
/*PROG33.C*/
{
int i=0;
if (!i) printf ("number is zero");
}
Increment and decrement operators are unary operators. Which means they operate on a
single operand. They increase or decrease the value of the operand. eg.
Consider a = 5, b = 6
c = a + b + +;
c = a +( b + + );
c = a + b; b = b + 1;
c becomes 11, b becomes 7.
While if we write
c = a + + + b;
c = a + ( + + b );
b = b + 1; c = a + b
b becomes 7, c becomes 12.
output
1
2
k = i + + + + + j;
k=(i++)+(++j);
k=0+1=1
i becomes 1 after its value 0 is used. After executing the above statements the value of all
i,jand k becomes 1.
Conditional Expression:-
C FOR ENGINEERS R.G.Salokhe
( a> b ) ? a : b;
if the value of a is greater than b then the value of a is returned otherwise the value of b
will be returned.
/*PROG33.C*/
main ( )
{
int i,j,k,max;
printf ("Type two numbers\n");
scanf ("%d %d", i,j );
max = ( i>j ) ? i:j ;
printf ("Maximum is %d", max );
}
Input/ output
2 3
Maximum is 3
The conditional expression can be used to find out the maximum of 3 numbers as;
CONTROL STATEMENTS :-
We have so far seen small programs which are executed line by line. However the major
requirement of programs is to have forward and backward jumps to different lines. The
statements which allow such jumps are called control statements.
If Statements:-
If statements allows forward jumps depending upon the condition specified. If has
following two formats;
true
if (condition ) statement;
false
if ( condition) {
Statement 1;
Statement 2;
} No semicolon.
false
/*PROG34.C*/
main ( )
{
int i,j,max;
printf ( " Type two numbers \n ");
scanf ( "%d %d ", i,j);
max=i;
if ( i<j ) max=j;
printf ("\n Maximum of two is %d",max);
}
C FOR ENGINEERS R.G.Salokhe
/*PROG35.C*/
main ( )
{
/* I has to be maximum */
int i,j,t;
printf ( "Type two numbers \n ");
scanf ( "%d %d ", &i,&j);
if ( i > j) {
t=i;
i=j; Interchanging values of i and j. (swapping)
j=t;
} no semicolon
printf ( "\n i = %d j=%d \n ", i, j);
}
We have used a technique of swapping the values of i and j variables. For this you have
to first store the value of i into a temporary variable t .Then you can equate i to j and then
j to t. So that values of i and j are interchanged. Another technique you can use is .
float i =5, j=6; i j
i = i *j; 30.0 5.0
j = i /j ; 30.0 6.0
i = i /j ; 5.0 6.0
The above method will not work for integers .
if ; else ; statement :-
if (expression ) statement 1;
else statement 2;
C FOR ENGINEERS R.G.Salokhe
if (expression )
TRUE
{
statement1;
FALSE statement2;
} No semicolon.
else
{
Statement 3;
Statement 4;
} No semicolon.
/* PROG36.C*/
/*Maximum of two numbers*/
main ( )
{
int max,i=5,j=7;
if (i >j ) max =i ;
else max =j; Note semicolons.
printf ( "\n %d is max \n ",max );
}
/*PROG37.C*/
/* Roots of quadratic equation*/
#include < stdlib.h> for exit ( )
#include <math.h> for sqrt ( )
main ( )
{
double x1,x2,a,b,c,t;
printf ("Type values of a b c ");
scanf ("%d %d %d ", &a,&b,&c);
if (b*b -4*a*c<0) {
printf ( "Roots are imaginary \n ");
exit (0 );
} No semicolon.
else {
t=sqrt (b*b -4*a*c);
x1=(-b+t)/(2*d);
x2=(-b-t )/(2*a);
printf ("The roots are %f %f ",x1,x2);
} No semicolon
}
C FOR ENGINEERS R.G.Salokhe
input 4 2 5
Nested if :-
The if statement can be nested in following ways.
if (condition )
if (condition)
statement; This if is attached to else.
else
statement;
/* PROG38.C*/
main ( )
{
int i;
scanf ( "%d ",&n);
if (n >0)
if (n<100)
printf ( "Number is between 0 and 100 ");
else
printf ( "Number is greater than 100 ");
}
The else statement does not correspond to the first if . The else statement is marked to
second if so that when n is not less than 100 the else is executed. If we want to match the
else statement to the first if then it can be done in two ways.
if (n >0) {
if (n<100)
printf ("Number is between 0 and 100");
}
else
printf( "Number is less than 100");
or
if (n >0)
if (n<100)
printf ("Number is between 0 and 100");
else ; Dummy else.
else
printf ("Number is less than 100");
C FOR ENGINEERS R.G.Salokhe
/* PROG39.C*/
main ( )
{
int mark;
char rank;
scanf ("%d ",&mark);
if mark >80 rank = 'E';
else if mark >70 rank= 'A';
else if mark >60 rank= 'B';
else if mark >50 rank= 'C';
else rank = 'F';
printf ( "Rank is %c",rank);
}
/* PROG40.C*/
/*Printing a number in reverse order */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main ( )
{
clrscr( );
int i ;
int t ,h, ten,o;
printf ( "Enter a 4 digits no \n");
scanf ( "%d",& i);
t= i /1000 ;
printf ("t =%d",t);
h= (i - t* 1000)/100;
printf ("h =%d",h);
ten= (i -t*1000 - h*100)/10;
C FOR ENGINEERS R.G.Salokhe
Switch Statement :-
The switch statement is equivalent to writing series of if statements. The structure of
switch is;
switch (experssion )
{
case constant1 : statement;
statement;
case constant2 : statement;
statement;
|
default : statement;
statement;
}
/*PROG41.C*/
main ( )
{
int i,j,op;
float ans=0.0;
printf ("Type two numbers ");
scanf ("%d %d ",&i,&i);
printf ("\n Type operation +, -, /, * \n");
scanf ("%d",&op);
switch (op) {
case '+' : ans = i+j ; break;
case '-' : ans = i-j ; break;
case '/' : ans = i /j ; break;
case '*' : ans = i*j ; break;
default : printf ("Invalid operation \n ");
}
printf ( "%f ",ans );
}
C FOR ENGINEERS R.G.Salokhe
The important thing to remember about the switch statement is that you have include the
break statement after each case. Otherwise all the cases after the matching conditions are
executed.
/*PROG42.C*/
main ( )
{
int ch, digit, space, other;
int count = 0
while ( ( ch = getehar( ) ) ! = EOF ) {
switch (ch) {
case '0':
case '1':
case '2':
if character case '3':
input is '3' case '4':
all the case '5':
cases upto case '6':
'9' are case '7':
executed. case '8':
case '9': digit ++;count++;break;
case ' ':
case'\n':
case'\t': space ++; count ++; break;
default : other ++; count ++;
}
}
break transfers control here
printf ( "Total characters %d\n", count ) ;
printf ( " Digits typed %d\n",digit);
printf ( " White spaces %d\n", space);
}
You can input a string terminated by control Z to terminate the while loop.
TRUE
{
statement;
statement;
} No semicolon
/*PROG43.C*/
main ( )
{
int i ;
Note semicolons
for ( i = 1 ; i < = 5; i + + )
printf ( "%d %d\n", i, i * i );
}
Output
1 1
2 4
3 9
4 16
5 25
The initial value of i is taken as 1. The first values of i and i * i are printed. Then the
value of i is increased by 1. so i becomes 2 and, 2 and 4 are printed.
We can find out the pairs of three numbers i, j, k such that i2 =j2 +k2 which means i, j, k
are sides of right angle triangle.
C FOR ENGINEERS R.G.Salokhe
main ( )
{
int i,j,k;
for ( i = 1; i < = 100; i + + )
for ( j = 1; j < = 10; j + + )
for ( k =1; k< = 10; k + +)
if ( k<i && j <i)
if ( i * i = j * j + k * k)
printf ("%d%d%d\n",i,j,k);
}
Initially
i=1 j=1 k=1
j=1 k=2
j=1 k=3
j=1 k=10
j=2 k=1
j=2 k=2
___
___
___
k=10
===
j=10 k=1
---
k=10
i=2 ----- j=1--- k=1
/*PROG44.C*/
/* sum of first 5 numbers */
main( )
{
int i ; int sum = 0 ;
for ( i=1 ; i<=5 ; i+ +) make this i<=100 and
you get sum of 100 nos.
{
sum=sum +i ; }
printf ("sum is =%d\n", sum);
C FOR ENGINEERS R.G.Salokhe
Output
sum is=15
Let us draw a flow chart of the above logic and the memory map.
i=1
sum = 0 i sum
1 0 initial
NO print 1 1
is i <=5? sum 2 1+2=3
3 3+3=6
i=i+1 yes 4 6+4=10
5 10+5=15
sum=sum+i
A simple modification in the program will help us find out the factorial.
/*PROG45.C*/
/*Program to find factorial*/
main ( )
{
float i;fact=1.0;
for (i=1 ; i<=5 ; i+ +){
fact= fact * i ; }
printf ("%f", fact);
}
Output
120.000000
You can modify the program asking for the input value and write
C FOR ENGINEERS R.G.Salokhe
/*PROG46.C*/
main ( )
{
float x, power=0.0;
int n;
printf (" Type a number \n");
scanf ("% f",&x);
printf (" Raise this number to\n");
scanf ("%d", &n);
for( i=1; i<=n; i+ +){
power= power*x;}
printf ("% f Raised to %d is % f", x,n,power);
}
/*PROG47.C*/
/* Printing a triangle of Numbers */
main ( )
{
int i, n, j ;
printf ("Type a number \n");
scanf ("%d", &n);
for (i=1 ; i<n ; i+ +){
for (i=1 ; j<=i ; i+ +)
Note i here
printf ("%3d", j);
printf ("\n");
}
Output :
Type a number
5
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
C FOR ENGINEERS R.G.Salokhe
/*PROG48.C*/
/* Pascal Triangle*/
main ( )
int nn,i Ξ =, m =1
int k,n,j =40, l = 0;
clrscr ( ); clears the screen.
printf ("Type No \n");
scanf (" %d", &nn);
for(k =1;k < = nn; k =k+2) {
for (n =1;n < =39-3*m;n++ ) printf (" ");
for (i =m++;i< =k; ++i) printf ("%3d", i);
for (i =k-1, j = l++; j > =1; j- -,i - -)printf ("%3d",i);
printf ("\n");
}
getch ( );
}
output
9
1
2 3 2
3 4 5 4 3
4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5
k decides the middle column and thus varies as 1, 3, 5, 7,9
In forth for loop i starts with k thus when k becomes 3 i becomes k-1=2 next time it
becomes 4 then 6 and 8. This prints the right side as
2
i in second 43
for loop 654
8765
C FOR ENGINEERS R.G.Salokhe
The second for loop is for bringing the display into center of the screen. It prints spaces
39-3m times = 36 times for first line and 39 - 3*2 = 33 times for second time etc.
1
Edge 36 space
of 232
screen 33 space
34543
30 space
There is program which print the range of integer variables. We have already discussed
that the range varius from - 32768 to 32767.
/*PROG 49.C*/
main ( )
{
int low, high, i,i ;
low = high= 0 ; Note the type of assignment
for (i=1 ; high<= 0; i=i+2){
for (low=1, i=1 ; k=i ; i + +)
low = -2*low ;
high = low -1 ;
}
printf ("Range for integers %d, %d", low,high);
}
In C you will come across very interesting and intelligent logic. In the above program i
various from 1 in the steps of 2 . So value of i becomes 1, 3, 5, 7 etc.
When i becomes 3 the second for loop is executed 3 times and the values of low changes
as follows ;
Value of low will go on increasing but to the negative side. Since we are assigning high
= low-1 the value of high remains negative till low becomes - 32768 When we subtract 1
from - 32768 it becomes + 32767 We have already discussed in earlier chapters the
effect of increasing the range of data types. ( 32767+1 becomes - 32768 )
-1 0 -1
C FOR ENGINEERS R.G.Salokhe
-2 2
3
-3 4
-32767
-32768 +32767
32767+1 becomes - 32768
Thus when value of low is - 32768 the value of high becomes + 32767 and the first for
loop terminates. The control is transferred to printf statement.
We have seen that the for statement can initialise any number of variables as for
(i =1, j =2 ; i <=5 ; i + +, j+ +);
\*PROG50.C*\
# include <ctype.h>
main( )
{
int c, vowels =0 , count =0 ;
for ( ; ;){
c= getche( );
switch (toupper((c)) {
case 'A' :
case 'E' :
case 'I' :
case 'O' :
case 'U' : vowels + +;
count + +;
break ; Breaks
default : count + +;
}
if(c = = EOF) break ; Breaks the for loop
printf ("Total characters %d %n" , count);
printf ("Vowels are %d %n" , vowels);
}
Toupper( ) function converts the character into upper case if it is lower case. This
function is included in ctype.h file
Evaluating a series :-
sum =1 + (1/2)2 + (1/3)3 + (1/4)4
C FOR ENGINEERS R.G.Salokhe
/*PROG51.C*/
# include <math.h>
main( )
{
double term , sum;
int i, n;
printf ("Type no. of terms for series\n");
scanf ("%d", &n);
for (i =1; i <=n; i + +){
term =1/(double)i ; Type casting
/*PROG52.C*/
main( )
{
int i, n, denominator =1;
float x, sum, term;
printf ("Type value of x\n");
scanf ("%f",&x);
printf ("Type number of terms\n");
scanf ("%f", &n);
for (sum =x, term =x, i =2; i<=n; + +i){
denominator = (2*i-2) (2*i-1);
term*= (-x * x) / (float) denominator;
sum + = term;
}
printf ("value of series is = %f", sum);
}
i denominator Term
2 2*3 =3! (+x) (-x2)/3! = -x3/3!
3 4*5 - x3/3! * -x2/4*5 = +x5/5!
The series is Obtained by adding two precious numbers to obtain the third number eg.
1 1 2 3 5 8 13 21 34 etc.
1+1 =2
1+2 =3
2+3 =5
3+5 =8 and so on
/*PROG53.C*/
# include <stdio.h>
main( )
{
int next =0 ; int n;
int last =1;
for next =0; next <1000;){
n= next + last;
next = last;
last = n;
}
}
next last n
0 1 1
1 1 1 next = last, last = n
1 1 2
1 2 3
2 3 5
: : :
FALSE TRUE
while ( expression ) {
statement 1;
statement 2;
-------
The statement are evaluated as long as the expression is true. When the condition
becomes false jump is made to out side of the body of while.
\*PROG54.C*\
main( )
{
int n =999;
while (n< =999,) scanf ("%d"&n);
printf ("%d", n);
}
This program will allow you to enter the number till the number is less than or equal to
999. Which means the loop will not break till you enter a number which is greater than
999 that is a four digit number.
/*PROG55.C*/
# define YES 1
# define NO 0
void main( )
{
int c, nl, nw, nc, inward;
inward =NO;
nl =nw =nc =0;
while ( (c =getche ( ))! =EOF){
+ +nc;
if (c = =' ' | | c = \n'
=' | | c = ='
\t '){
if (c ='\n') nl + +;
inward =NO; }
else if (inward = = NO){
inward = YES;
C FOR ENGINEERS R.G.Salokhe
+ +nw; }
}
printf ("NO of lones %d words %d character %d", nl, nw, nc);
}
}
(c =getehe ( )) !=EOF
Accept character from keyboard. Assign it to c. check it the character is EOF(^z) which
numbers the while loop terminated when the character input from keyboard is ^z.
+ +nc nc is incremented every time a character is input.
Then the character is checked if it is a white space character. Let us take an example.
if you want only an alphabetic character to be inputed you can use the while loop as
char ch ='a' ;
while( ch <= ' z' && ch> = 'A' | |
ch<= 'g' && ch> ='&'){
scanf ("%d",&c);}
/*PROG56.C*/
/* program to display a series of prime no.s */
main( )
{
int no, chk; int prime =1; no=1;
while (no<=400){
for (chk=2; chk<=no/2; chk)
if (no%chk = =0){
C FOR ENGINEERS R.G.Salokhe
prime =0;
break; Break passes control here
if (prime = =1) printf("%d",no);
prime=1;
}
}
no % chk will be 0 when no is divisible by 2 and the if is execute which makes prime =0
and breaks the loop since prime is 0 the number is not printed. prime becomes 1 and
while is executed.
or
do {
statement 1;
statement 2;
----
} while ( condition );
Let us take the earlier example where we want to allow numbers greater than 1000 to be
entered. We can write the program as
/*PROG57.C*/
main( )
{
C FOR ENGINEERS R.G.Salokhe
int n;
do scanf ("%d",&n);
while (n<1000);
printf ("%d",n);
}
This program will go on executing the scanf till you enter a number which is greater than
or equal to 1000. Let us take another example.
/*PROG58.C*/
main( )
{
int n;
int sum;
do {printf ("\n Enter a number \n");
scanf ("%d, &n);
sum+ = n;
} while (n>0);
}
This program will allow you to enter the numbers and sum them till the number is
greaterr than 0. If you enter a negative number the same will be added to sum. The
program will terminate.
Break Statement
We have used the break statement in switeh.... case and for loops. The break statement
psses control out of the do, for, while and switeh statement.
for ( ; ; ){
---;
---;
C FOR ENGINEERS R.G.Salokhe
if( ) break;
for (; ;){
- - -;
- - -;
if( ) break;
- - -;
- - -;
}
}
Continue Statement
The continue statement jumps to one line before the break statement. i.e. at the end of the
body of for ,do or while loop.
for ( ; ; ){
- - - -;
- - - -;
if ( ) continue;
for ( ; ; ){
- - - -;
- - - -;
if ( ) continue;
- - - -;
}
}
/*PROG59.C*/
/* Adding numbers 1+3+5+7 with continue */
main( )
{
int sum =0 ;
int i = 1, z = -1 ;
for (i= 1; i<=100; i++)
{
C FOR ENGINEERS R.G.Salokhe
z= -z;
if (z<0) continue;
sum+ = i ;
}
printf("\n%d \n", sum);
}
Initially f = -1 and t = -z will make z as +1 the statement sum + =i will be executed next
time when i becomes 2 z will become -1 and continue will pass control to and of for
loop thus not executing sum + =i statement. Thus t will vary between +1 and -1 making
the continue statement execute alternatively.
/*PROG60.C*/
/* binary to decimal conversion */
# include <math.h>
main( )
{
long binary;
int dec=0, i=0;
printf ("\n Enter a binary No\n");
scanf ("%d", &binary);
while(binary>0)
{
dec + =(binary% 10)*pow(2,i++);
binary/=10;
}
printf ("your no. converted to decimal is %d", dec);
}
This is a very interesting logic. supposing your binary number is 101 which is 22+0+20
=5
In next interation
In next interation
C allows a non conditional jump with goto statement. However such jumps are not
adviced and the program looses structurality.
The syntax is
goto LABEL;
-------
-------
LABEL :
/*PROG61.C*/
main( )
{
float i, i;
printf("Enter devisor\n");
scanf ("%f", &i);
printf("Enter dividor\n");
scanf("%f", &j);
if(j= =0) goto CRASH;
printf("%f", i/j);
exit(0);
CRASH :
printf("dividor cannot be zero");
}
/*PROG.62C*/
/* finding square root of a number */
# include <math.h>
main( )
{
float x, y,z ;
C FOR ENGINEERS R.G.Salokhe
fabs( ) function is used to return the absolute value of floating point numbers.
If you type 4 as the number the following changes take place in the value of z and y.
z y
4 2.5
1.6 2.05
1.95 2.006
1.999 2.000
2.0 2.00 The final output is 2.
C FOR ENGINEERS R.G.Salokhe
FUNCTIONS
We now enter into the soul of C language. As discussed in the I st chapter C is the
language of functions main ( ) itself is a function. We have been introduced to some
standard functions as printf( ), scanf( ), etc. We will now write our own function.
/* */
main( )
{
void print( ); Function declaration or prototype.
Print( ) ; Function call.
}
void print( ) No semicolon.
{
int i ;
for (i=1; i<=10; i ++) printf( "*" );
}
Output **********
The print function is not accepting any parameters and is not returning anything as the
value of the function.
The function is defined below the body of the main. When you call the function as
print( );
The print function is executed which prints ten asterisks and returns to main. We will
now pass a parameters the function.
/ /
main( )
{
int i ;
void print(int);
printf("Type a number");
scanf("%a", & i);
print(i); Value of i is passed to this i
printf("\n");
print(i);
}
C FOR ENGINEERS R.G.Salokhe
Output
Type a number 5
*****
*****
/* */
main( )
{
int i=5;
void change(int);
change (i);
printf("%a",i);
}
void change (int i)
{
i=10; Changing the value of i in the function
} would not change the value in main( ).
Output 5
Finding out the maximum of two numbers using mfunction
/* */
main( )
{
int i, j , k;
int max (int,int);
printf("Type two numbers\n");
scanf("%a%a", i,j);
k= max(i,j);
printf("Maxmum of the two is");
printf("%a",k);
}
int max(int i, int j)
{
int m;
m= i>j?i:j;
return m;
C FOR ENGINEERS R.G.Salokhe
}
In this example the function max is made to return an integer value
int max(int, int);
Function will
return integer value.
The value returned by the function is returned by the statement
return m ;
which returns the value of m
Which is maximum of i and j. When you want to do the calculators repeatedly the
function comes fo your resume. Let us see how we can evaluate the series.
/* */
main( )
{
long fact(int n);
float sum=1.0;
int i=1;
for (i=1; i<=5; i ++){
sum=sum + (1.0/fact(i));}
}
long fact(int n)
{
long x=1;
int i=1;
for(i=1; i<=n; i+ +) x=x*i ;
return x ;
}
The function may be called any time from other functions and the value returned by
functions may or may not be assigned to any variable.
/* */
main( )
{
int i;
for(i=1; i<=10; i+ +)
printf("%3d %5d %7d", i, Sq(i) cube(i))
Sq(10); Sq ( ) is called but it's value is not assigned
}
int Sq(int i)
{
return i*i;
}
C FOR ENGINEERS R.G.Salokhe
int cube(i)
{ Sq( ) function is called from cube( )
return i* Sq(i);
}
Output
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
SCOPE OF VARIABLES :-
As there is no print in unnecessarily occupies the memory by using lot of variables, the
variables are given other properties as visibility and life time. So that the variables can
be available in the particular segments of the program and they can die after their use.
The scope of the variable is the section of the program in which the variable is available.
There are basically two types of scopes.
1) Global Scope
2) Local Scope
The variables declared outside any function have global scope and are refered to as global
variable.
/* */
int i=1; i is global
main( )
{
printf("%a",i); i is available in both
void print( ); main( )&print( )
print( );
}
void print( ) {
printf( "%a",i);
}
Global variables are visible the point of declaration to the end of the program and are
initialized to 0 if not initialized.
/* */
main( )
{
C FOR ENGINEERS R.G.Salokhe
int i;
}
int y=5; y is global but not available in main( )
void print ( ){
printf("%a",y); variable is available
} in print( ) and print 1( )
void print1( ){
printf("%a",y);
}
The local variables are declared inside the body of the function and they can be used in
that function only. Thus they loose scope outside the function and thus variable with
same name can be used in the other function. Which has no relation with one declared in
the other function.
/* */
main( )
{
int x =5;
void print( );
printf("%a" ,x);
}
Output 10/5
/* */
int i=6; Globle
main( )
{
int j=5 available in the body of main( )
int j;
void print(int);
if(i= =5){
int i; Available in body of if
i=9;
printf("in if %d\n",i);
}
printf("In main %d\n",i);
for (j=1, j<=2, j+ +){
int i=17; Available in body a for
print("in body a for %d\n",i);}
print(i);
}
void print(int k)
{
printf("in function %d\n",i); Value from global variable.
}
Output
in If 9
in MAIN
in Body of for 17
in Body of for 17
in function pr 6
All the variables also have a life. They must die sooner or later to free the memory. The
global variables die when the program is exited.
The life of the variable is determined by the storage class specified for the variables.
The storage classes are
1) Auto
2) Static
3) Extern
4) Register
Extern storage class is available only for global variables.
AUTOMATIC VARIABLES
If no class is specified for the local variables then they are considered to be up to auto
variables. They are created when a particular function is called and die where the
execution of the function is completed. Most of the variable used and declared by us so
far were of upto type.
C FOR ENGINEERS R.G.Salokhe
STATIC VARIABLES
The variables declared static are visible only in the function in which they are declared
but are not destroyed when the function is exited. Instead they retain their values which
can be again used in the same function.
/* */
main( )
{
void pr( );
pr( );
pr( );
pr( );
}
void pr( )
{
static int i=1;
printf("%d\n",i + +);
}
Output
1
2
3
When the function pr( ) is first called the value of i is initialized to 1. This value is
printed and i becomes 2. When the function is exited i does not loose the value 2.
However i will not be available in main or any other functions. When the function is
called again the value of i=2 is available to the function and i is not initialized again.
Static variables are initialized to 0 no initial value assigned.
EXTERNAL VARIABLES
External variable are available from one program to another. Supposing you have two
defferent programs as
/* */ /* */
int i; extern int i;
main( ) void pr( )
{ {
i=5
printf("%d",i) printf("%d",i)
} }
We used the declaration extern in the second program which means that i is declared
some where else and the second program is supposed to us that i.
REGISTER VARIABLES
C FOR ENGINEERS R.G.Salokhe
Register variables are similar to automatic variables expect that instead of storing into the
random access memory the same are stored into register of microprocessor. This way
they can be accessed faster. There is a limitation on the number of register variables you
can declare. In case there is no space available for the register variable in the registers
then the same are treated as automatic variables register variables are declared as register
int i;
Global Variables
Static Before all Entire file but not other files initialized Global
functions to 0 if not assigned a value.
Local Variable
RECURSION
Whenever a function is called the automatic variables declared in the function are pushed
in to the memory area called stack. These variables have a life fill the function ends. We
end the function either by a return statement or by the conduding braces. Before the
function ends you can called the same function again. Thus another set of variables is
C FOR ENGINEERS R.G.Salokhe
pushed in the memory. The process of a function calling itself is called decursion.
However some where the function has to terminate.
\* *\
\* finding factorial by decudsion *\
main( )
{
int n;
float fact( );
printf(" Enter a number ");
scanf("% d%f",n,fact(n));
}
float fact(int n)
{
if (= =1) return(1);
else return n*fact(n-1);
}
The function fact is calling inself back with n-1. The process takes place as
1 2 3 4 5
1 2*1 3*2*1 4*3*2*1 5*4*3*2*1
copy copy copy copy copy
5 4 3 2 1
Fact( ) calls its copy2 with 4 which calls copy3 with3 and so on. The copy5 returns 1,
copy4 returns 2*1, copy 3 returns 3*2*1 and finally 5! Is returned.
\* *\
main( )
{
int fab(int);
int n;
for(n=1; n<=10; n + +)
printf("%d", fab(n));
}
int fab (n)
{
if (n= =1 | | n= =2) return 1;
C FOR ENGINEERS R.G.Salokhe
/* */
/* reversing a string with recursion */
main( )
{
int n;
void reverse ( );
printf("Type no of characters to reverse");
scanf("%d",&n);
printf("\n");
reverse(n);
puts("\n");
}
void reverse(int n)
{
char c;
if(n= 1){
c= getche( );
puts("/n");
putch(c);
}
else
{
c=getche( );
reverse(- -n);
putch(c);
}
return;
}
Input 5 abcde
Output edcba
here we call the same function reverse before it is completed in the else block. The
putch(c) in the else is thus kept pending. When n becomes 1 the last copy of reverse is
complete and the function start returning. At the time of returning the pending putch( ) is
executed which prints the characters typed by you in reverse order.
C FOR ENGINEERS R.G.Salokhe
http://www.geocities.com/arutacomp/
or mail me on
Thank you.