C Programming Note
C Programming Note
C is a general-purpose high level language that was originally developed by Dennis Ritchie for the Unix
operating system. It was first implemented on the Digital Equipment Corporation PDP-11 computer in
1972.
The Unix operating system and virtually all Unix applications are written in the C language. C has now
become a widely used professional language for various reasons.
Easy to learn
Structured language
It produces efficient programs.
It can handle low-level activities.
It can be compiled on a variety of computers.
Facts about C
Why to use C ?
C was initially used for system development work, in particular the programs that make-up the
operating system. C was adopted as a system development language because it produces code that runs
nearly as fast as code written in assembly language. Some examples of the use of C might be:
Operating Systems
Language Compilers
Assemblers
Text Editors
Print Spoolers
Network Drivers
Modern Programs
Data Bases
Language Interpreters
Utilities
C Compilers
When you write any program in C language then to run that program you need to compile that program
using a C Compiler which converts your program into a language understandable by a computer. This is
called machine language (ie. binary format). So before proceeding, make sure you have C Compiler
available at your computer. Some examples of C compilers are Turbo C and Borland C.
C - Program Structure
C is a case sensitive programming language. It means in C printf and Printf will have
different meanings.
C has a free-form line structure. End of each C statement must be marked with a semicolon.
Multiple statements can be one the same line.
White Spaces (ie tab space and space bar ) are ignored.
Statements can continue over multiple lines.
A C language programmer has to tell the system before-hand, the type of numbers or characters he is
using in his program. These are data types. There are many data types in C language. A C programmer
has to use appropriate data type as per his requirement.
1. Integer int
2. Character char
3. Floating Point float
4. Double precision floating point double
5. Void void
Integer Type :
Integers are whole numbers with a machine dependent range of values. A good programming language
as to support the programmer by giving a control on a range of numbers and storage space. C has 3
classes of integer storage namely short int, int and long int. All of these data types have signed and
unsigned forms. A short int requires half the space than normal integer values. Unsigned numbers are
always positive and consume all the bits for the magnitude of the number. The long and unsigned
integers are used to declare a longer range of values.
Void Type :
Using void data type, we can specify the type of a function. It is a good practice to avoid functions that
does not return any values to the calling function.
Character Type :
A single character can be defined as a defined as a character type of data. Characters are usually stored
in 8 bits of internal storage. The qualifier signed or unsigned can be explicitly applied to char. While
unsigned characters have values between 0 and 255, signed characters have values from –128 to 127.
Where v1, v2, v3 are variable names. Variables are separated by commas. A declaration statement must
end with a semicolon.
Example:
Int sum;
Int number, salary;
Double average, mean;
Character char
Signed Short Integer signed short int (or) short int (or) short
Signed Long Integer signed long int (or) long int (or) long
here type represents existing data type and ‘identifier’ refers to the ‘row’ name given to the data type.
Example:
Here salary symbolizes int and average symbolizes float. They can be later used to declare variables as
follows:
Therefore dept1 and dept2 are indirectly declared as integer datatype and section1 and section2 are
indirectly float data type.
The second type of user defined datatype is enumerated data type which is defined as follows.
The identifier is a user defined enumerated datatype which can be used to declare variables that have
one of the values enclosed within the braces. After the definition we can declare variables to be of this
‘new’ type as below.
The enumerated variables V1, V2, ….. Vn can have only one of the values value1, value2 ….. value n
Example 1:
Example 2:
#include <stdio.h>
int main() {
enum {RED=5, YELLOW, GREEN=4, BLUE};
RED = 5
YELLOW = 6
GREEN = 4
BLUE = 5
C Character-Set Table
Special Characters
Identifiers refers to the name of user-defined variables, array and functions. A variable should be
essentially a sequence of letters and or digits and the variable name should begin with a character.
Both uppercase and lowercase letters are permitted. The underscore character is also permitted in
identifiers.
Constants
A constant value is the one which does not change during the execution of a program. C supports
several types of constants.
1. Integer Constants
2. Real Constants
3. Single Character Constants
4. String Constants
Integer Constants
An integer constant is a sequence of digits. There are 3 types of integers namely decimal integer, octal
integers and hexadecimal integer.
Decimal Integers consists of a set of digits 0 to 9 preceded by an optional + or - sign. Spaces, commas
and non digit characters are not permitted between digits. Example for valid decimal integer constants
are
123
-31
0
562321
+ 78
Octal Integers constant consists of any combination of digits from 0 through 7 with a O at the
beginning. Some examples of octal integers are
O26
O
O347
O676
Hexadecimal integer constant is preceded by OX or Ox, they may contain alphabets from A to F or a to
f. The alphabets A to F refers to 10 to 15 in decimal digits. Example of valid hexadecimal integers are
OX2
OX8C
OXbcd
Ox
Real Constants
Real Constants consists of a fractional part in their representation. Integer constants are inadequate to
represent quantities that vary continuously. These quantities are represented by numbers containing
fractional parts like 26.082. Example of real constants are
0.0026
-0.97
435.29
+487.0
Real Numbers can also be represented by exponential notation. The general form for exponential
notation is mantissa exponent. The mantissa is either a real number expressed in decimal notation or an
integer. The exponent is an integer number with an optional plus or minus sign.
A Single Character constant represent a single character which is enclosed in a pair of quotation
symbols.
'5'
'x'
';'
''
All character constants have an equivalent integer value which are called ASCII Values.
String Constants
A string constant is a set of characters enclosed in double quotation marks. The characters in a string
constant sequence may be a alphabet, number, special character and blank space. Example of string
constants are
"SUMANT"
"1234"
Constant Meaning
'\a' Audible Alert (Bell)
'\b' Backspace
'\f' Formfeed
'\n' New Line
'\r' Carriage Return
'\t' Horizontal tab
'\v' Vertical Tab
'\'' Single Quote
'\"' Double Quote
'\?' Question Mark
'\\' Back Slash
'\0' Null
Variables
A variable is a value that can change any time. It is a memory location used to store a data value. A
variable name should be carefully chosen by the programmer so that its use is reflected in a useful way
in the entire program. Variable names are case sensitive. Example of variable names are
Sun
number
Salary
Emp_name
average1
1. They must always begin with a letter, although some systems permit underscore as the first character.
2. The length of a variable must not be more than 8 characters.
3. White space is not allowed and
4. A variable should not be a Keyword
5. It should not contain any special characters.
123
(area)
6th
%abc
1. Arithmetic Operators
All the basic arithmetic operations can be carried out in C. All the operators have almost the same
meaning as in other languages. Both unary and binary operations are available in C language. Unary
operations operate on a singe operand, therefore the number 5 when operated by unary – will have the
value –5.
Arithmetic Operators
Operator Meaning
x + y = 32
x – y = 22
x * y = 115
x%y=2
x/y=5
x + y = 18.0
x – y = 10.0
x * y = 56.0
x / y = 3.50
Mixed mode arithmetic
When one of the operand is real and other is an integer and if the arithmetic operation is carried out on
these 2 operands then it is called as mixed mode arithmetic. If any one operand is of real type then the
result will always be real thus 15/10.0 = 1.5
2. Relational Operators
Often it is required to compare the relationship between operands and bring out a decision and program
accordingly. This is when the relational operator come into picture. C supports the following relational
operators.
Operator Meaning
< is less than
<= is less than or equal to
> is greater than
>= is greater than or equal to
== is equal to
!= is not equal to
It is required to compare the marks of 2 students, salary of 2 persons, we can compare them using
relational operators.
A simple relational expression contains only one relational operator and takes the following form.
Where exp1 and exp2 are expressions, which may be simple constants, variables or combination of
them. Given below is a list of examples of relational expressions and evaluated values.
3. Logical Operators
C has the following logical operators, they compare or evaluate logical and relational expressions.
Operator Meaning
|| Logical OR
! Logical NOT
Example
a > b && x = = 10
The expression to the left is a > b and that on the right is x == 10 the whole expression is true only if
both expressions are true i.e., if a is greater than b and x is equal to 10.
Logical OR (||)
The logical OR is used to combine 2 expressions or the condition evaluates to true if any one of the 2
expressions is true.
Example
a < m || a < n
The expression evaluates to true if any one of them is true or if both of them are true. It evaluates to true
if a is less than either m or n and when a is less than both m and n.
For example
! (x >= y) the NOT expression evaluates to true only if the value of x is neither greater than or equal to
y
4. Assignment Operators
The Assignment Operator evaluates an expression on the right of the expression and substitutes it to the
value or variable on the left of the expression.
Example
x=a+b
Here the value of a + b is evaluated and substituted to the variable x.
In addition, C has a set of shorthand assignment operators of the form.
var oper = exp;
Example
x + = 1 is same as x = x + 1
The commonly used shorthand assignment operators are as follows
Shorthand assignment operators
Statement with simple Statement with
assignment operator shorthand operator
a=a+1 a += 1
a=a–1 a -= 1
a = a * (n+1) a *= (n+1)
a = a / (n+1) a /= (n+1)
a=a%b a %= b
The increment operator ++ adds the value 1 to the current value of operand and the decrement operator
– – subtracts the value 1 from the current value of operand. ++variable name and variable name++
mean the same thing when they form statements independently, they behave differently when they are
used in expression on the right hand side of an assignment statement.
Consider the following
m = 5;
y = ++m; (prefix)
For example
a = 10;
b = 15;
x = (a > b) ? a : b
Here x will be assigned to the value of b. The condition follows that the expression is false therefore b
is assigned to x.
/* Example : to find the maximum value using conditional operator)
#include
void main() //start of the program
{
int i,j,larger; //declaration of variables
printf (“Input 2 integers : ”); //ask the user to input 2 numbers
scanf(“%d %d”,&i, &j); //take the number from standard input and store it
larger = i > j ? i : j; //evaluation using ternary operator
printf(“The largest of two numbers is %d \n”, larger); // print the largest number
} // end of the program
Output
Input 2 integers : 34 45
The largest of two numbers is 45
7. Bitwise Operators
C has a distinction of supporting special operators known as bitwise operators for manipulation data at
bit level. A bitwise operator operates on each bit of data. Those operators are used for testing,
complementing or shifting bits to the right on left. Bitwise operators may not be applied to a float or
double.
Operator Meaning
& Bitwise AND
| Bitwise OR
^ Bitwise Exclusive
<< Shift left
>> Shift right
8. Special Operators
C supports some special operators of interest such as comma operator, size of operator, pointer
operators (& and *) and member selection operators (. and ->). The size of and the comma operators are
discussed here. The remaining operators are discussed in forth coming chapters.
The Comma Operator
The comma operator can be used to link related expressions together. A comma-linked list of
expressions are evaluated left to right and value of right most expression is the value of the combined
expression.
Source: www.csitnepal.com Page 14
First assigns 10 to x and 5 to y and finally assigns 15 to value. Since comma has the lowest precedence
in operators the parenthesis is necessary. Some examples of comma operator are
In for loops:
for (n=1, m=10; n <=m; n++,m++)
In while loops
While (c=getchar(), c != ‘10’)
Exchanging values
t = x, x = y, y = t;
Notice the way the increment operator ++ works when used in an expression. In the statement c = ++a –
b; new value a = 16 is used thus giving value 6 to C. That is a is incremented by 1 before using in
expression.
However in the statement d = b++ + a; The old value b = 10 is used in the expression. Here b is
incremented after it is used in the expression.
We can print the character % by placing it immediately after another % character in the control string.
This is illustrated by the statement.
Assumes the value 0 when c is less than d and 1 when c is greater than d.
Arithmetic Expressions
An expression is a combination of variables constants and operators written according to the syntax of
C language. In C every expression evaluates to a value i.e., every expression results in some value of a
certain type that can be assigned to a variable. Some examples of C expressions are shown in the table
given below.
Algebraic C Expression
Expression
axb–c a*b–c
(m + n) (x + y) (m + n) * (x + y)
(ab / c) a*b/c
3x2 +2x + 1 3*x*x+2*x+1
(x / y) + c x/y+c
Evaluation of Expressions
Expressions are evaluated using an assignment statement of the form
Variable = expression;
Variable is any valid C variable name. When the statement is encountered, the expression is evaluated
first and then replaces the previous value of the variable on the left hand side. All variables used in the
expression must be assigned values before evaluation is attempted.
x=a*b–c
y=b/c*a
z = a – b / c + d;
High priority * / %
Low priority + -
Source: www.csitnepal.com Page 17
The operators of same precedence are evaluated from right to left or from left to right depending on the
level. This is known as associativity property of an operator.
Introduction
One of the essential operations performed in a C language programs is to provide input values to the
program and output the data produced by the program to a standard output device. We can assign values
to variable through assignment statements such as x = 5 a = 0 ; and so on. Another method is to use the
Input then scanf() which can be used to read data from a key board. For outputting results we have used
extensively the function printf() which sends results out to a terminal. There exists several functions in
‘C’ language that can carry out input output operations. These functions are collectively known as
standard Input/Output Library. Each program that uses standard input / out put function must contain
the statement.
at the beginning.
Variable name is a valid ‘C’ variable, that has been declared already and that possess the type char.
Example program :
# include < stdio.h > // assigns stdio-h header file to your program
void main ( ) // Indicates the starting point of the program.
{
char C, // variable declaration
printf (“Type one character:”) ; // message to user
C = getchar () ; // get a character from key board and
Stores it in variable C.
Printf (” The character you typed is = %c”, C) ; // output
} // Statement which displays value of C on
// Standard screen.
The putchar function which in analogus to getchar function can be used for writing characters one at a
time to the output terminal. The general form is
Where variable is a valid C type variable that has already been declared Ex:-
putchar ( );
#include < stdio.h > // Inserts stdio.h header file into the Pgm
void main ( ) // Beginning of main function.
{
The function gets accepts the name of the string as a parameter, and fills the string with characters that
are input from the keyboard till newline character is encountered. (That is till we press the enter key).
All the end function gets appends a null terminator as must be done to any string and returns.
The puts function displays the contents stored in its parameter on the standard screen.
The format field is specified by the control string and the arguments
arg1, arg2, …………….argn specifies the addrss of location where address is to be stored.
The control string specifies the field format which includes format specifications and optional number
specifying field width and the conversion character % and also blanks, tabs and newlines.
The Blanks tabs and newlines are ignored by compiler. The conversion character % is followed by the
type of data that is to be assigned to variable of the assignment. The field width specifier is optional.
If the values input are 175 and 1342 here value 175 is assigned to sum1 and 1342 to sum 2. Suppose the
input data was follows 1342 and 175.
The number 134 will be assigned to sum1 and sum2 has the value 2 because of %3d the number 1342
will be cut to 134 and the remaining part is assigned to second variable sum2. If floating point numbers
are assigned then the decimal or fractional part is skipped by the computer.
To read the long integer data type we can use conversion specifier % ld & % hd for short integer.
Field specifications are not to be use while representing a real number therefore real numbers are
specified in a straight forward manner using % f specifier.
Scanf (% f “, &variable);
Example:
If the number input is a double data type then the format specifier should be % lf instead of %f.
% xc or %xs
Where C and S represents character and string respectively and x represents the field width.
The address operator need not be specified while we input strings.
Example :
The most simple output statement can be produced in C’ Language by using printf statement. It allows
you to display information required to the user and also prints the variables we can also format the
output and provide text labels. The simple statement such as
Output:
Both the messages appear in the output as if a single statement. If you wish to print the second message
to the beginning of next line, a new line character must be placed inside the quotation marks.
For Example :
printf (“Hello!\n);
OR
printf (“\n Welcome to the world of Engineering”);
Syntax
Printf (“conversion string”, variable list);
The conversion string includes all the text labels, escape character and conversion specifiers required
for the desired output. The variable includes all the variable to be printed in order they are to be printed.
There must be a conversion specifies after each variable.
Specifier Meaning
%c – Print a character
%d – Print a Integer
%i – Print a Integer
%e – Print float value in exponential form.
%f – Print float value
%g – Print using %e or %f whichever is smaller
%o – Print octal value
%s – Print a string
%x – Print a hexadecimal integer (Unsigned) using lower case a – f
%X – Print a hexadecimal integer (Unsigned) using upper case A – F
%a – Print a unsigned integer.
%p – Print a pointer value
%hx – Print hex short
%lo – Print an octal long
%ld – Print a long integer
Branching
The C language programs presented until now follows a sequential form of execution of statements.
Many times it is required to alter the flow of the sequence of instructions. C language provides
statements that can alter the flow of a sequence of instructions. These statements are called control
statements. These statements help to jump from one part of the program to another. The control transfer
may be conditional or unconditional.
if Statement:
The simplest form of the control statement is the If statement. It is very frequently used in decision
making and allowing the flow of program execution.
The if structure has the following syntax
if (condition)
statement;
The statement is any valid C’ language statement and the condition is any valid C’ language expression,
frequently logical operators are used in the condition statement. The condition part should not end with
a semicolon, since the condition and statement should be put together as a single statement. The
command says if the condition is true then perform the following statement or If the condition is fake
the computer skips the statement and moves on to the next instruction in the program.
Example program
The if else is actually just on extension of the general format of if statement. If the result of the
condition is true, then program statement 1 is executed, otherwise program statement 2 will be
executed. If any case either program statement 1 is executed or program statement 2 is executed but not
both when writing programs this else statement is so frequently required that almost all programming
languages provide a special construct to handle this situation.
#include <stdio.h> //include the stdio.h header file in your program
void main () // start of the main
{
int num // declare variable num as integer
printf ("Enter the number") // message to the user
scanf ("%d", &num) // read the input number from keyboard
if (num < 0) // check whether number is less than zero
printf ("The number is negative") // if it is less than zero then it is negative
else // else statement
printf ("The number is positive") // if it is more than zero then the given number is positive
In the above program the If statement checks whether the given number is less than 0. If it is less than
zero then it is negative therefore the condition becomes true then the statement The number is negative
is executed. If the number is not less than zero the If else construct skips the first statement and prints
the second statement declaring that the number is positive.
Syntax
The statement ‘b’ uses the logical operator or (||) to group different expression to be checked. In this
case if any one of the expression if found to be true the whole expression considered to be true, we can
also uses the mixed expressions using logical operators and and or together.
Nested if Statement
The if statement may itself contain another if statement is known as nested if statement.
Syntax:
if (condition1)
if (condition2)
statement-1;
else
statement-2;
else
statement-3;
The if statement may be nested as deeply as you need to nest it. One block of code will only be
executed if two conditions are true. Condition 1 is tested first and then condition 2 is tested. The second
if condition is nested in the first. The second if condition is tested only when the first condition is true
else the program flow will skip to the corresponding else statement.
if (condition1)
statement – 1;
else if (condition2)
statement2;
else if (condition3)
statement3;
else if (condition)
statement n;
else
default statement;
statement-x;
This construct is known as if else construct or ladder. The conditions are evaluated from the top of the
ladder to downwards. As soon on the true condition is found, the statement associated with it is
executed and the control is transferred to the statement – x (skipping the rest of the ladder. When all the
condition becomes false, the final else containing the default statement will be executed.
/* Example program using If else ladder to grade the student according to the following rules.
Marks Grade
70 to 100 DISTINCTION
60 to 69 IST CLASS
50 to 59 IIND CLASS
40 to 49 PASS CLASS
0 to 39 FAIL
if (marks <= 100 && marks >= 70) //check whether marks is less than 100 or greater than 70
printf ("\n Distinction") //print Distinction if condition is True
else if (marks >= 60) //else if the previous condition fails Check
printf("\n First class") //whether marks is > 60 if true print Statement
else if (marks >= 50) //else if marks is greater than 50 print
printf ("\n second class") //Second class
else if (marks >= 35) //else if marks is greater than 35 print
printf ("\n pass class") //pass class
else
printf ("Fail") //If all condition fail apply default condition print Fail
}
In the first If condition statement it checks whether the input value is lesser than 100 and greater than
70. If both conditions are true it prints distinction. Instead if the condition fails then the program control
is transferred to the next if statement through the else statement and now it checks whether the next
condition given is whether the marks value is greater than 60 If the condition is true it prints first class
and comes out of the If else chain to the end of the program on the other hand if this condition also fails
the control is transferred to next if statements program execution continues till the end of the loop and
executes the default else statement fails and stops the program.
Switch (expression)
{
Case case-label-1;
Case case-label-2;
Case case-label-n;
………………
Case default
}
When the switch statement is executed the control expression is evaluated first and the value is
compared with the case label values in the given order. If the label matches with the value of the
expression then the control is transferred directly to the group of statements which follow the label. If
none of the statements matches then the statement against the default is executed. The default statement
is optional in switch statement in case if any default statement is not given and if none of the condition
matches then no action takes place in this case the control transfers to the next statement of the if else
statement.
Example:
#include <stdio.h>
void main ()
{
int num1, num2, result
char operator
switch (operator)
{
case '+':
result = num1 + num2
break
case '-':
In the above program the break statement is need after the case statement to break out of the loop and
prevent the program from executing other cases.
Syntax
a> b>
goto label; label:
………… …………
………… …………
………… …………
Label: goto label;
Statement;
The goto requires a label in order to identify the place where the branch is to be made. A label is a valid
variable name followed by a colon.
The label is placed immediately before the statement where the control is to be transformed. A program
may contain several goto statements that transferred to the same place when a program. The label must
be unique. Control can be transferred out of or within a compound statement, and control can be
transferred to the beginning of a compound statement. However the control cannot be transferred into a
compound statement. The goto statement is discouraged in C, because it alters the sequential flow of
logic that is the characteristic of C language.
Sample Code
Looping
During looping a set of statements are executed until some conditions for termination of the loop is
encountered. A program loop therefore consists of two segments one known as body of the loop and
other is the control statement. The control statement tests certain conditions and then directs the
repeated execution of the statements contained in the body of the loop.
The test may be either to determine whether the loop has repeated the specified number of times or to
determine whether the particular condition has been met.
Here the given test condition is evaluated and if the condition is true then the body of the loop is
executed. After the execution of the body, the test condition is once again evaluated and if it is true, the
body is executed once again. This process of repeated execution of the body continues until the test
condition finally becomes false and the control is transferred out of the loop. On exit, the program
continues with the statements immediately after the body of the loop. The body of the loop may have
one or more statements. The braces are needed only if the body contained two are more statements
Example program for generating ‘N’ Natural numbers using while loop:
Do
{
statement;
}
while(expression);
Here the statement is executed, then expression is evaluated. If the condition expression is true then the
body is executed again and this process continues till the conditional expression becomes false. When
the expression becomes false. When the expression becomes false the loop terminates.
To realize the usefulness of the do while construct consider the following problem. The user must be
prompted to press Y or N. In reality the user can press any key other than y or n. IN such case the
message must be shown again and the user should be allowed to enter one of the two keys, clearly this
is a loop construct. Also it has to be executed at least once. The following program illustrates the
solution.
Continue statement:
During loop operations it may be necessary to skip a part of the body of the loop under certain
conditions. Like the break statement C supports similar statement called continue statement. The
continue statement causes the loop to be continued with the next iteration after skipping any statement
in between. The continue with the next iteration the format of the continue statement is simply:
Continue;
Consider the following program that finds the sum of five positive integers. If a negative number is
entered, the sum is not performed since the remaining part of the loop is skipped using continue
statement.
When the control enters for loop the variables used in for loop is initialized with the starting value such
as I=0,count=0. The value which was initialized is then checked with the given test condition. The test
condition is a relational expression, such as I < 5 that checks whether the given condition is satisfied or
not if the given condition is satisfied the control enters the body of the loop or else it will exit the loop.
The body of the loop is entered only if the test condition is satisfied and after the completion of the
execution of the loop the control is transferred back to the increment part of the loop. The control
variable is incremented using an assignment statement such as I=I+1 or simply I++ and the new value
of the control variable is again tested to check whether it satisfies the loop condition. If the value of the
control variable satisfies then the body of the loop is again executed. The process goes on till the control
variable fails to satisfy the condition.
We can include multiple expressions in any of the fields of for loop provided that we separate such
expressions by commas. For example in the for statement that begins
Sets up two index variables I and j the former initialized to zero and the latter to 100 before the loop
begins. Each time after the body of the loop is executed, the value of I will be incremented by 1 while
the value of j is decremented by 10.
Just as the need may arise to include more than one expression in a particular field of the for statement,
so too may the need arise to omit on or more fields from the for statement. This can be done simply by
omitting the desired filed, but by marking its place with a semicolon. The init_expression field can
simply be “left blank” in such a case as long as the semicolon is still included:
For(;j!=100;++j)
The above statement might be used if j were already set to some initial value before the loop was
entered. A for loop that has its looping condition field omitted effectively sets up an infinite loop, that is
a loop that theoretically will be executed for ever.
/* The following is an example that finds the sum of the first fifteen positive natural numbers*/
#include < stdio.h > //Include stdio.h file
void main() //start main program
{
int I; //declare variable
int sum=0,sum_of_squares=0; //declare and initialize variable.
for(I=0;I < = 30; I+=2) //for loop
{
sum+=I; //add the value of I and store it to sum
sum_of_squares+=I*I; //find the square value and add it to sum_of_squares
The declaration int values[10]; would reserve enough space for an array called values that could hold up
to 10 integers. Refer to the below given picture to conceptualize the reserved storage space.
values[0]
values[1]
values[2]
values[3]
values[4]
Initialization of arrays:
We can initialize the elements in the array in the same way as the ordinary variables when they are
declared. The general form of initialization off arrays is:
type array_name[size]={list of values};
The values in the list care separated by commas, for example the statement
int number[3]={0,0,0};
Will declare the array size as a array of size 3 and will assign zero to each element if the number of
values in the list is less than the number of elements, then only that many elements are initialized. The
remaining elements will be set to zero automatically.
In the declaration of an array the size may be omitted, in such cases the compiler allocates enough space
for all initialized elements. For example the statement
int counter[]={1,1,1,1};
Will declare the array to contain four elements with initial values 1. this approach works fine as long as
we initialize every element in the array.
Example:
int table[2][3]={0,0,01,1,1};
Initializes the elements of first row to zero and second row to 1. The initialization is done row by row.
The above statement can be equivalently written as
int table[2][3]={{0,0,0},{1,1,1}}
By surrounding the elements of each row by braces.
C allows arrays of three or more dimensions. The compiler determines the maximum number of
dimension. The general form of a multidimensional array declaration is:
date_type array_name[s1][s2][s3]…..[sn];
Where s is the size of the ith dimension. Some examples are:
int survey[3][5][12];
float table[5][4][5][3];
Survey is a 3 dimensional array declared to contain 180 integer elements. Similarly table is a four
dimensional array containing 300 elements of floating point type.
Assignment:
Give an example program to add two matrices & store the results in the 3rd matrix .
the keyword struct declares a structure to holds the details of four fields namely title, author
pages and price. These are members of the structures. Each member may belong to different or
same data type. The tag name can be used to define objects that have the tag names structure.
The structure we just declared is not a variable by itself but a template for the structure.
We can declare structure variables using the tag name any where in the program. For example
the statement,
declares book1,book2,book3 as variables of type struct lib_books each declaration has four
elements of the structure lib_books. The complete structure declaration might look like this
struct lib_books
{
char title[20];
char author[15];
int pages;
float price;
};
structures do not occupy any memory until it is associated with the structure variable such as
book1. the template is terminated with a semicolon. While the entire declaration is considered
as a statement, each member is declared independently for its name and type in a separate
statement inside the template. The tag name such as lib_books can be used to declare structure
variables of its data type later in the program.
We can also combine both template declaration and variables declaration in one statement, the
declaration
declares book1,book2,book3 as structure variables representing 3 books but does not include a
tag name for use in the declaration.
A structure is usually defines before main along with macro definitions. In such cases the
structure assumes global status and all the functions can access the structure.
For example:
Book1.price
Is the variable representing the price of book1 and can be treated like any other ordinary
variable. We can use scanf statement to assign values like
scanf(“%s”,book1.file);
scanf(“%d”,& book1.pages);
strcpy(book1.title,”basic”);
strcpy(book1.author,”Balagurusamy”);
book1.pages=250;
book1.price=28.50;
Assignment to Students:
Explain how to access array elements and to display those elements under two topics : (i)
Accessing array elements (ii) displaying array elements.
#include<stdio.h>
#include<conio.h>
void fun(float,int);
void main()
{
struct student{
float marks;
int id;
};
struct student s1={67.5,14};
fun(s1.marks,s1.id);
getch();
}
void fun(float marks,int id)
{ printf("\nMarks:%f",marks);
printf("\nID:%d",id);
}
It can be realized that to pass individual elements would become more tedious as the number of
structure elements go on increasing a better way would be to pass the entire structure variable
at a time.
# include stdio.h>
{
int emp_id;
char name[25];
char department[10];
float salary; };
void main()
{ static struct employee emp1= { 12, “sadanand”, “computer”, 7500.00 };
structure information
{ int id_no;
char name[20]; char address[20];
char combination[3]; int age;
} student[100];
An array of structures can be assigned initial values just as any other array can. Remember that
each element is a structure that must be assigned corresponding initial values as illustrated
below.
the structure student contains another structure date as its one of its members.
union item
{
int m;
float p;
char c;
}
code;
this declares a variable code of type union item. The union contains three members each with a
different data type. However we can use only one of them at a time. This is because if only one
location is allocated for union variable irrespective of size. The compiler allocates a piece of
storage that is large enough to access a union member we can use the same syntax that we use
to access structure members. That is
code.m
code.p
code.c
are all valid member variables. During accessing we should make sure that we are accessing
the member whose value is currently stored.
For example a statement such as
code.m=456;
code.p=456.78;
printf(“%d”,code.m);
More on Structure:
typedef Keyword
There is an easier way to define structs or you could "alias" types you create. For example:
typedef struct{
char firstName[20];
char lastName[20];
char SSN[10];
float gpa;
}student;
Now you can use student directly to define variables of student type without using struct
keyword. Following is the example:
student student_a;
You can use typedef for non-structs:
typedef long int *pint32;
pint32 x, y, z;
A function is a complete and independent program which is used (or invoked) by the main program or
other subprograms. A subprogram receives values called arguments from a calling program, performs
calculations and returns the results to the calling program.
2. The length of the source program can be reduced by using functions at appropriate places. This
factor is critical with microcomputers where memory space is limited.
4. A function may be used by many other programs this means that a c programmer can build on what
others have already done, instead of starting over from scratch.
5. A program can be used to avoid rewriting the same sequence of code at two or more locations in a
program. This is especially useful if the code involved is long or complicated.
6. Programming teams does a large percentage of programming. If the program is divided into
subprograms, each subprogram can be written by one or two team members of the team rather than
having the whole team to work on the complex program
We already know that C support the use of library functions and use defined functions. The library
functions are used to carry out a number of commonly used operations or calculations. The user-defined
functions are written by the programmer to carry out various individual tasks.
Function definition:
[ data type] function name (argument list)
argument declaration;
{
local variable declarations;
statements;
[return expression]
}
Example :
mul(a,b)
int a,b;
{
int y;
y=a+b;
return y;
}
When the value of y which is the addition of the values of a and b. the last two statements ie,
y=a+b; can be combined as
return(y)
return(a+b);
In the above example there is no data transfer between the calling function and the called function.
When a function has no arguments it does not receive any data from the calling function. Similarly
when it does not return value the calling function does not receive any data from the called function. A
function that does not return any value cannot be used in an expression it can be used only as
independent statement.
value (500,0.12,5)
Would send the values 500,0.12 and 5 to the function value (p, r, n) and assign values 500 to p, 0.12 to r
and 5 to n. the values 500,0.12 and 5 are the actual arguments which become the values of the formal
arguments inside the called function.
Both the arguments actual and formal should match in number type and order. The values of actual
arguments are assigned to formal arguments on a one to one basis starting with the first argument as
function1(f1,f2,f3….fn);
{
function body;
}
here a1,a2,a3 are actual arguments and f1,f2,f3 are formal arguments.
The no of formal arguments and actual arguments must be matching to each other suppose if actual
arguments are more than the formal arguments, the extra actual arguments are discarded. If the number
of actual arguments are less than the formal arguments then the unmatched formal arguments are
initialized to some garbage values. In both cases no error message will be generated.
The formal arguments may be valid variable names, the actual arguments may be variable names
expressions or constants. The values used in actual arguments must be assigned values before the
function call is made.
When a function call is made only a copy of the values actual arguments is passed to the called
function. What occurs inside the functions will have no effect on the variables used in the actual
argument list.
in the above program we could make the calling function to read the data from the terminal and pass it
on to the called function. But function does not return any value.
Recursion:
Recursive function is a function that calls itself. When a function calls another function and that second
function calls the third function then this kind of a function is called nesting of functions. But a
recursive function is the function that calls itself repeatedly.
An example program to find out factorial of a given number using Recursion:
int fact(int);
void main()
{
int n, fac;
clrscr();
printf("Enter the value of n");
scanf("%d",&n);
fac=fact(n);
printf("The factorial of %d is %d",n,fac);
getch(); }
int fact(int n)
{if(n= =1)
return(1);
else
return fact(n-1)*n;
}
For example:
Largest(a,n);
will pass all the elements contained in the array a of size n. the called function expecting this call must
be appropriately defined. The largest function header might look like:
float smallest(array,size);
float array[];
int size;
The function smallest is defined to take two arguments, the name of the array and the size of the array
to specify the number of elements in the array. The declaration of the formal argument array is made as
follows:
float array[];
The above declaration indicates to compiler that the arguments array is an array of numbers. It is not
necessary to declare size of the array here. While dealing with array arguments we should remember
one major distinction. If a function changes the value the value of an array elements then these changes
will be made to the original array that passed to the function. When the entire array is passed as an
argument, the contents of the array are not copied into the formal parameter array instead information
// Global variables
int a;
int b;
int Add()
{
return a + b;
}
int main()
{
int answer; // Local variable
a = 5;
b = 7;
answer = Add();
printf("%d\n",answer);
return 0;
}
main()
{
int x=50, y=70;
interchange(&x,&y);
printf(“x=%d y=%d”,x,y);
}
Source: www.csitnepal.com Page 49
Here the function is called by reference. In other words address is passed by using symbol & and the
value is accessed by using symbol *.
The main difference between them can be seen by analyzing the output of program1 and program2.
*x=70 *y=50
x=70 y=50
This is because in case of call by value the value is passed to function named as interchange and there
the value got interchanged and got printed as
x1=70 y1=50
and again since no values are returned back and therefore original values of x and y as in main function
namely
x=50 y=70 got printed.
In c a pointer is a variable that points to or references a memory location in which data is stored. Each
memory cell in the computer has an address that can be used to access that location so a pointer variable
points to a memory location we can access and change the contents of this memory location via the
pointer.
Pointer declaration:
A pointer is a variable that contains the memory location of another variable. The syntax is as shown
below. You start by specifying the type of data stored in the location identified by the pointer. The
asterisk tells the compiler that you are creating a pointer variable. Finally you give the name of the
variable.
type * variable name
Example:
int *ptr;
float *string;
Address operator:
Once we declare a pointer variable we must point it to something we can do this by assigning to the
pointer the address of the variable you want to point as in the following example:
ptr=#
This places the address where num is stores into the variable ptr. If num is stored in memory 21260
address then the variable ptr has the value 21260.
/* A program to illustrate pointer declaration*/
main()
{
int *ptr;
int sum;
sum=45;
ptr=∑
printf (“\n Sum is %d\n”, sum);
printf (“\n The sum pointer is %d”, ptr);
}
We will get the same result by assigning the address of num to a regular(non pointer) variable. The
benefit is that we can also refer to the pointer variable as *ptr the asterisk tells to the computer that we
are not interested in the value 21260 but in the value stored in that memory location. While the value of
pointer is 21260 the value of sum is 45 however we can assign a value to the pointer * ptr as in *ptr=45.
This means place the value 45 in the memory address pointer by the variable ptr. Since the pointer
contains the address 21260 the value 45 is placed in that memory location. And since this is the location
of the variable num the value also becomes 45. this shows how we can change the value of pointer
directly using a pointer and the indirection pointer.
/* Program to display the contents of the variable their address using pointer variable*/
include< stdio.h > cptr=&ch;
{ floptr=&x;
int num, *intptr; printf(“Num %d stored at address
float x, *floptr; %u\n”,*intptr,intptr);
char ch, *cptr; printf(“Value %f stored at address
num=123; %u\n”,*floptr,floptr);
x=12.34; printf(“Character %c stored at address
ch=’a’; %u\n”,*cptr,cptr);
intptr=&x; }
Source: www.csitnepal.com Page 51
y=*p1**p2;
sum=sum+*p1;
z= 5* - *p2/p1;
*p2= *p2 + 10;
C allows us to add integers to or subtract integers from pointers as well as to subtract one pointer from
the other. We can also use short hand operators with the pointers p1+=; sum+=*p2; etc.,
we can also compare pointers by using relational operators the expressions such as p1 >p2 , p1==p2 and
p1!=p2 are allowed.
Call by value:
We have seen that a function is invoked there will be a link established between the formal and actual
parameters. A temporary storage is created where the value of actual parameters is stored. The formal
parameters picks up its value from storage area the mechanism of data transfer between actual and
formal parameters allows the actual parameters mechanism of data transfer is referred as call by value.
The corresponding formal parameter represents a local variable in the called function. The current value
of corresponding actual parameter becomes the initial value of formal parameter. The value of formal
parameter may be changed in the body of the actual parameter. The value of formal parameter may be
changed in the body of the subprogram by assignment or input statements. This will not change the
value of actual parameters.
fncn(p,q)
int p,q;
{
p=p+p;
q=q+q;
}
Call by Reference:
When we pass address to a function the parameters receiving the address should be pointers. The
process of calling a function by using pointers to pass the address of the variable is known as call by
reference. The function which is called by reference can change the values of the variable used in the
call.
fncn(p,q)
int p,q;
{
*p=*p+*p;
*q=*q+*q;
}
Pointer to arrays:
an array is actually very much like pointer. We can declare the arrays first element as a[0] or as int *a
because a[0] is an address and *a is also an address the form of declaration is equivalent. The difference
is pointer is a variable and can appear on the left of the assignment operator that is lvalue. The array
name is constant and cannot appear as the left side of assignment operator.
Strings are characters arrays and here last element is \0 arrays and pointers to char arrays can be used to
perform a number of string functions.
struct products
{
char name[30];
int manufac;
float net;
item[2],*ptr;
this statement declares item as array of two elements, each type struct products and ptr as a pointer data
objects of type struct products, the
assignment ptr=item;
would assign the address of zeroth element to product[0]. Its members can be accessed by using the
following notation.
ptr- >name;
ptr- >manufac;
ptr- >net;
The symbol - > is called arrow pointer and is made up of minus sign and greater than sign. Note that
ptr- > is simple another way of writing product[0].
When the pointer is incremented by one it is made to pint to next record ie item[1]. The following
statement will print the values of members of all the elements of the product array.
(*ptr).number
to access the member number. The parenthesis around ptr are necessary because the member operator
‘.’ Has a higher precedence than the operator *.
In programming we may come across situations where we may have to deal with data, which is
dynamic in nature. The number of data items may change during the executions of a program. The
number of customers in a queue can increase or decrease during the process at any time. When the list
grows we need to allocate more memory space to accommodate additional data items. Such situations
can be handled move easily by using dynamic techniques. Dynamic data items at run time, thus
optimizing file usage of storage space.
The process of allocating memory at run time is known as dynamic memory allocation. Although c does
not inherently have this facility there are four library routines which allow this function.
Many languages permit a programmer to specify an array size at run time. Such languages have the
ability to calculate and assign during executions, the memory space required by the variables in the
program. But c inherently does not have this facility but supports with memory management functions,
which can be used to allocate and free memory during the program execution. The following functions
are used in c for purpose of memory management.
Function Task
malloc Allocates memory requests size of bytes and returns a pointer to the Ist byte of allocated
space
calloc Allocates space for an array of elements initializes them to zero and returns a pointer to the
memory
free Frees previously allocated space
realloc Modifies the size of previously allocated space.
ptr=(cast_ype*) calloc(n,elem_size);
free(ptr);
This function allocates new memory space of size newsize to the pointer variable ptr ans returns a
pointer to the first byte of the memory block. The allocated new block may be or may not be at the
same region.
FILE *fp;
fp=fopen(“filename”,”mode”);
The first statement declares the variable fp as a pointer to the data type FILE. As stated earlier, File is a
structure that is defined in the I/O Library. The second statement opens the file named filename and
assigns an identifier to the FILE type pointer fp. This pointer, which contains all the information about
the file, is subsequently used as a communication link between the system and the program.
The second statement also specifies the purpose of opening the file. The mode does this job.
In these statements the p1 and p2 are created and assigned to open the files data and results respectively
the file data is opened for reading and result is opened for writing. In case the results file already exists,
its contents are deleted and the files are opened as a new file. If data file does not exist error will occur.
A file must be closed as soon as all operations on it have been completed. This would close the file
associated with the file pointer.
Observe the following program.
….
FILE *p1 *p2;
p1=fopen (“Input”,”w”);
p2=fopen (“Output”,”r”);
….
…
fclose(p1);
fclose(p2)
The above program opens two files and closes them after all operations on them are completed, once a
file is closed its file pointer can be reversed on other file.
The getc and putc functions are analogous to getchar and putchar functions and handle one character at
a time. The putc function writes the character contained in character variable c to the file associated
with the pointer fp1. ex putc(c,fp1); similarly getc function is used to read a character from a file that
has been open in read mode. c=getc(fp2).
The program shown below displays use of a file operations. The data enter through the keyboard and
the program writes it. Character by character, to the file input. The end of the data is indicated by
entering an EOF character, which is control-z. the file input is closed at this signal.
putw(integer,fp);
getw(fp);
Where fp id a file pointer associated with a file that has been opened for writing. The control string is
file output specifications list may include variable, constant and string.
fprintf(f1,%s%d%f”,name,age,7.5);
Here name is an array variable of type char and age is an int variable
The general format of fscanf is
fscanf(fp,”controlstring”,list);
Example:
fscanf(f2,”5s%d”,item,&quantity”);
Like scanf, fscanf also returns the number of items that are successfully read.
If all pictures are built by concept of pixel then wondering how each picture differ that is how some
picture appear more brighter while some other have a shady effect. All this is by the concept or
technically terminology called as resolution.
So let’s have an insight on this important terminology.
Resolution is the number of rows that appear from top to bottom of a screen and in turn the number of
pixels or pixel elements that appear from left to right on each scan line. Based on this resolution only
the effect of picture appears on screen. In other words greater the resolution greater will be the clarity of
picture. This is because greater the number of dots greater will be sharpness of picture. That is
resolution value is directly proportional to clarity of picture.
There are generally two modes available namely text and graphics. In a graphics mode we have
generally the following adapters namely CGA called as Color Graphics Adapter, EGA and VGA. Each
adapter differs in the way of generating colors and also in the number of colors produced by each
adapter. Pixel being a picture element when we consider the graphics mode each pixel has a color
associated with it. But the way these colors are used depends on adapters because each adapter differs
in the way they handle colors and also in the number of colors supported.
Having known about adapters now let us start knowing on how to start switching to graphics mode
from text mode in other words how to start using pixel and resolution concepts.
This is done by a function called intigraph ( ).This intigraph ( ) takes in it 2 main arguments as input
namely gd and gm.
In this gd has the number of mode which has the best resolution. This is very vital for graphics since
the best resolution only gives a sharper picture as we have seen before. This value is obtained by using
the function called as getgraphmode ( ) in C graphics. The other argument gm gives insight about the
monitor used, the corresponding resolution of that, the colors that are available since this varies based
on adapters supported. This value is obtained by using the function named as getmodename ( ) in C
graphics.
There are numerous graphics functions available in c. But let us see some to have an understanding of
how and where a pixel is placed in each when each of the graphics function gets invoked.
Function:
putpixel(x, y, color)
Purpose:
The functionality of this function is it put a pixel or in other words a dot at position x, y given in
inputted argument. Here one must understand that the whole screen is imagined as a graph. In other
words the pixel at the top left hand corner of the screen represents the value (0, 0).
Here the color is the integer value associated with colors and when specified the picture element or the
dot is placed with the appropriate color associated with that integer value.
Function:
Line(x1, y1, x2, y2)
Purpose:
The functionality of this function is to draw a line from (x1,y1) to (x2,y2).Here also the coordinates are
passed taking the pixel (0,0) at the top left hand corner of the screen as the origin. And also one must
note that the line formed is by using number of pixels placed near each other.
Function:
getpixel(x, y)
Purpose:
This function when invoked gets the color of the pixel specified. The color got will be the integer value
associated with that color and hence the function gets an integer value as return value.
So the smallest element on the graphics display screen is a pixel or a dot and the pixels are used in this
way to place images in graphics screen in C language.
//Drawing Lines
#include<graphics.h>
void main()
{int gd= DETECT, gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
line(90,70,60,100);
line(200,100,150,300);
setcolor(WHITE);
getch();
closegraph();
// Drawing rectangle
#include<graphics.h>
void main()
{int gd= DETECT, gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
rectangle(200,100,150,300);
setcolor(WHITE);
getch();
closegraph();
}
//Constructing Triangle
#include<graphics.h>
void main()
{int gd= DETECT, gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
line(200,100,10,20);line(10,20,50,60);line(50,60,200,100);
setcolor(WHITE);
getch();
closegraph();