Ict Structured Programming
Ict Structured Programming
Structured Programming
C
LECTURE NOTES
Prepared by
DEFINITION OF TERMS
1. HEADER FILE- A header file is a file with extension .h which contains C function
declarations to be shared between several source files. A header file is used in a
program by including it with the use of the preprocessing directive #include, which
comes along with the compiler. #include<stdio.h>
8. SOURCE CODE – Program instructions in their original form. C source code files have
an extension .c
2
9. OBJECT CODE – Code produced by a compiler from source code and exists in
machine readable language.
10. EXECUTABLE FILE – Refers to a file in a format that a computer can directly execute
and is created by a compiler.
12. SIGNED INTEGER – This is an integer that can hold either positive or negative
numbers.
13. COMPILER – This is a program that translates source code into object code.
15. LINKER/Binder/Link Editor – This is a program that combines object modules to form
an executable program. The linker combines the object code, the start up code and the
code for library routines used in the program (all in machine language) into a single file-
the executable file.
16. OPERATOR - A symbol that represents a specific action. For example, a plus sign (+)
is an operator that represents addition. The basic mathematic operators are + addition,
- subtraction,* multiplication,/ division
17. OPERAND - Operands are the objects that are manipulated by operators in
expressions. For example, in the expression 5 + x, x and 5 are operands and + is an
operator. All expressions have at least one operand.
18. EXPRESSION – This is a statement that returns a value. For example, when you add
two numbers together or test to see whether one value is equal to another.
3
19. VARIABLE - A variable is a memory location whose value can change during program
execution. Variable declaration must have a type, which defines what values that
variable can hold.
20. Data type – The data type of a variable etc determines the size and layout of the
variable's memory; the range of values that can be stored within that memory; and the
set of operations that can be applied to the variable.
There must be at least one whitespace character (usually a space) between int and age
for the compiler to be able to distinguish them. On the other hand, in the following
statement
4
INTRODUCTION TO STRUCTURED PROGRAMMING
Programming means to convert problem solutions into instructions for the computer. It
also refers to the process of developing and implementing various sets of instructions to
enable a computer to do a certain task.
They were introduced to mitigate the error prone and excessively difficult nature of binary
programming.
5
• Introduced in the 1950s
• Improved on first generation by providing human readable sourcecode which
must be compiled/assembled into machine code (binary instructions) before it
can be executed by a CPU
• Specific to platform architecture i.e. 2GL source code is not portableacross
processors or processing environments.
• Designed to support logical structure and debugging.
By using codes resembling English, programming becomes much easier. The use of these
mnemonic codes such as LDA for load and STA for store means the code is easier to
read and write. To convert an assembly code program into object code to run on a
computer requires an Assembler and each line of assembly can be replaced by the
equivalent one line of object (machine) code:
Assembly Code Machine Code
LDA A 000100110100
ADD #5 001000000101
STA A
-> Assembler -> 001100110100
JMP #3
010000000011
Such languages are sometimes still used for kernels and device drivers, i.e. the core of the
operating system and for specific machine parts. More often, such languages are used in
areas of intense processing, like graphics programming, when the code needs to be
optimized for performance.
Almost every CPU architecture has a companion assembly language. Most commonly
used are the assembly languages today like Autocoder for IBM mainframe systems,
Linoreum, MACRO -11,etc.
Third generation languages are the primary languages used in general purpose
programming today. They each vary quite widely in terms of their particular abstractions
k e
o.
and syntax. However, they all share great enhancements in logical structure over
s.c
assembly languages. e
not
d f
.p 6
w
w
w
• Introduced in the 1950s
• Designed around ease of use for the programmer (Programmer friendly)
• Driven by desire for reduction in bugs, increases in code reuse
• Based on natural language
• Often designed with structured programming in mind
• The languages are architecture independente.g. C, Java etc.
Examples:
Most Modern General Purpose Languages such as C, C++, C#, Java, Basic, COBOL, Lisp
and ML.
Improves on the previous generations by skipping algorithm writing and instead provide
constraints/conditions.
While 4GL are designed to build specific programs, 5GL are designed to make the computer
solve a given problem without the programmer. The programmer only needs to worry about
what problems needed to be solved and only inputs a set of logical constraints, with
7
no specified algorithm, and the Artificial Intelligence (AI)-based compiler builds the
program based on these constraints
Low-level languages such as machine language and assembly language are closer to
the hardware than are the high-level programming languages, which are closer to human
languages. Low-level languages are converted to machine code without using a compiler
or interpreter, and the resulting code runs directly on the processor. A program written in a
low-level language runs very quickly, and with a very small memory footprint; an
equivalent program in a high-level language will be more heavyweight. Low-level
languages are simple, but are considered difficult to use, due to the numerous technical
details which must be remembered.
High-level languages are closer to human languages and further from machine
languages.
The main advantage of high-level languages over low-level languages is that they are
easier to read, write, and maintain. Ultimately, programs written in a high-level language
. ke
must be translated into machine language by acocompiler or interpreter.
.
t es
The first high-level programming languages f no were designed in the 1950s. Now there are
d
.p
w
dozens of different languages, including
w Ada, Algol, BASIC, COBOL, C, C++, FORTRAN,
LISP, Pascal, and Prolog.
w
PROGRAMMING PARADIGMS
A programming paradigm is a fundamental style of computer programming, a way of
building the structure and elements of computer programs. There are four main paradigms:
a) Unstructured Programming
8
In unstructured programs, the statements are executed in sequence (one after the other)
as written. This type of programming uses the GoTo statement which allows control to be
passed to any other section in the program. When a GoTo statement is executed, the
sequence continues from the target of the GoTo. Thus, to understand how a program
works, you have to execute it. This often makes it difficult to understand the logic of such a
program.
b) Structured Programming
Most programs will require thousands or millions of lines of code. (Windows 2000 – over
35 millions lines of code). The importance of splitting a problem into a series of self-
contained modules then becomes obvious. A module should not exceed 100 lines, and
preferably short enough to fit on a single page or screen.
Examples of structured programming languages include:
C
Pascal
Fortran
Cobol
ALGOL
AdadBASE
etc.
9
c) Object-oriented programming (OOP)
This is a programming paradigm that represents concepts as "objects" that have data
fields (attributes that describe the object) and associated procedures known as methods.
ke used to interact with one another to
Objects, which are usually instances of classes, .are
co
design applications and computer [Link].
not
d f
.p
d) Visual Programming w
w
w
A visual programming language uses a visual representation (such as graphics, drawings,
animation or icons, partially or completely). A visual language manipulates visual
information or supports visual interaction, or allows programming with visual expressions
A VPL allows programming with visual expressions, spatial arrangements of text and
graphic symbols, used either as elements of syntax or secondary notation. For example,
many VPLs (known as dataflow or diagrammatic programming) are based on the idea of
"boxes and arrows", where boxes or other screen objects are treated as entities,
connected by arrows, lines or arcs which represent relations. An example of visual
programming languages is Microsoft Visual Basic which was derived from BASIC and
enables the rapid application development (RAD) of graphical user interface (GUI)
applications.
Programming in VB is a combination of visually arranging components or controls on a
form, specifying attributes and actions for those components, and writing additional lines of
code for more functionality.
SOFTWARE CONSIDERATIONS
Before you can start programming in C, you will need text editor such as a plain text
Notepad Editor though it does not offer code completion or debugging. Many
programmers prefer and recommend using an Integrated Development Environment
10
(IDE) instead of a text editor on which to code, compile and test their programs. Memory
requirements
Disk space required
ADVANTAGES C LANGUAGE
1. Modularity: modularity is one of the important characteristics of C. we can split the C
program into no. of modules instead of repeating the same logic statements
(sequentially). It allows reusability of modules.
2. General purpose programming language: C can be used to implement any kind of
applications such as math’s oriented, graphics, business oriented applications.
3. Portability: we can compile or execute C program in any operating system (UNIX,
dos, windows).
4. Powerful and efficient programming language: C is very efficient and powerful
programming language; it is best used for data structures and designing system
software. Efficient in that it is a modular programming language and thus makes
efficient use of memory and system resources.
k e
co.
.
t es
o
d fn
.p
w
w
w
PROGRAM DESIGN AND DEVELOPMENT
11
PROGRAM DEVELOPMENT CYCLE
This refers to the stages that form the framework for planning and controlling the creation
of an information system. Several approaches to program development have been devised
and the System Development Life Cycle (SDLC) is one of the most popular. The SDLC is
a methodology that aims at producing a high quality system that meets or exceeds
customer expectations, reaches completion within
e times and cost estimates, works
o .k
.c cost-effective to enhance.
efficiently and is inexpensive to maintain and
t es
o
d fn
.p
1) Project planning, feasibility study: The fundamental process of understanding
w
w
w and determining how the project team will go about
why a system should be built
building it. It should also establish a clear understanding of the current system. It
involves
a. Technical feasibility study: can the system be built
b. Economic feasibility study: will the system provide business value, and what
are the risks?
c. Organizational feasibility study: if built, will it be used.
2) Systems analysis, requirements definition: the phase identifies the users of the
system, what the system will do. It involves
a. Analysis of the old system and ways to design the new system
b. Requirement gathering. Various tools for collecting information are used.
These include interviews, questionnaires, observation etc.
c. Development of the new system proposal document.
3) Systems design: describes how the system will operate, in terms of hardware,
software, network infrastructure, user interface, forms and reports that will be used,
the specific programs, databases and files that will be needed. Design phase steps
include;
a. Design strategy: method of development, in-house, outsourced, or
purchased
b. Architecture design – hardware , software, internet infrastructure, and user
interface [Link] and file specification
[Link] design: defines the program that needs to be done and exactly what
each will do.
4) System Implementation: The real code is written here.
12
5) Integration and testing:Brings all the pieces of the project together into a special
testing environment, then checks for errors, bugs and interoperability.
6) Acceptance, installation, deployment: The final stage of initial development,
where the software is put into use and runs actual business.
7) Maintenance: What happens during the rest of the software's life: changes,
correction, additions, and moves to a different computing platforms etc. This step,
perhaps most important of all, goes on seemingly forever.
The SDLC is a cycle i.e. iterative in that a new requirement might initiate the whole
process again.
1. TOP-DOWN DESIGN
A top-down approach (also known as stepwise design or deductive reasoning, and in
many cases used as a synonym of analysis or decomposition) is essentially the breaking
down of a system to gain insight into its compositional sub-systems. In a top-down
approach an overview of the system is formulated, specifying but not detailing any first-
level subsystems. Each subsystem is then refined in yet greater detail, sometimes in many
additional subsystem levels, until the entire specification is reduced to base elements. Top-
down approach starts with the big picture. It breaks down from there into smaller
segments.
Top-down design(also called " Modular programming " and "stepwise refinement")
therefore, is a software design technique that emphasizes separating the functionality of a
program into independent modules such that each module is designed to execute only one
aspect of the desired functionality.
2. BOTTOM-UP DESIGN
A bottom-up approach (also known as inductive reasoning, and in many cases used as a
synonym of synthesis) is the piecing together of systems to give rise to larger systems,
thus making the original systems sub-systems of the emergent system. In a bottom-up
approach the individual base elements of the system are first specified in great detail.
These elements are then linked together to form larger subsystems, which then in turn are
linked, sometimes in many levels, until a complete top-level system is formed.
With this approach, there is more user and business awareness of the product.
Benefits are also realized in the early phases of development.
3. MONOLITHIC DESIGN
The monolithic design philosophy is that the application is responsible not just for a
particular task, but can perform every step needed to complete a particular function
A monolithic application describes a software application which is designed without
modularity.
Begin
If A is greater than B
And if A is greater than C, A is the Biggest
14
Otherwise C is the Biggest
Otherwise
If B is greater than C B is the Biggest
Otherwise C is the Biggest
End
Pseudo-code cannot be compiled nor executed, and there are no real formatting or syntax
rules. It is simply one step - an important one - in producing the final code
2. Algorithm
This refers to an established, computational procedure for solving a problem in a finite
number of steps. Algorithms can be expressed in any language including natural
languages such as English. Algorithm means a method/ logic for solving a given problem.
An algorithm to find the largest among three different numbers entered by user.
Step 1: Start
Step 2: Declare variables a, b and c.
Step 3: Read variables a, b and c.
Step 4: If a>b
k e
If a>c co.
s.
Display a is the largest number. Elsete
o
Display c is the largest number. d fn
.p
Else w
w
If b>c w
Display b is the largest number.
Else
Display c is the greatest number.
Step 5: Stop
3. Flowchart
A flowchart is a type of diagram that represents an algorithm or process, showing the
steps as boxes of various kinds, and their order by connecting them with arrows. This
diagrammatic representation illustrates a solution to a given problem. Flowcharts are used
in designing and documenting complex processes or programs. Like other types of
diagrams, they help to visualize what is going on and thereby help the viewer to
understand a process, and perhaps also find flaws/errors, bottlenecks, and other less-
obvious features within it.
15
Symbol Purpose Description
Used for arithmetic operations and
Processing
datamanipulations.
Used to represent the operation in which there are
Decision
two alternatives, true and false.
Draw flowchart to find the largest among three different numbers entered by user.
Different symbols are used for different states in flowcharts. The table below describes all
the symbols that are used in making flowchart
Symbol Purpose Description
Used to indicate the flow of logic by connecting
Flow line
symbols.
Or a flowchart to ask for a number from user and multiply with another number and print
result as follows:
16
Examples of flowcharts include Activity diagram, Data flow diagram and sequence
diagrams etc.
A structure chart illustrates the partitioning of a problem into sub-problems and shows the
hierarchical relationships among the parts. A classic "organization chart" for a
company is an example of a structure chart.
The top of the chart is a box representing the entire problem, the bottom of the chart
shows a number of boxes representing the less complicated sub-problems (e.g. Phone Bill
System).
A structure chart is NOT a flowchart. It has nothing to do with the logical sequence of
tasks. It does NOT show the order in which tasks are performed. It does NOT illustrate an
algorithm.
17
Each block represents some function in the system, and thus should contain a verb phrase, e.g.
"Print report heading."
e
o.k
c
es.
ot
d fn
.p
w
w
w
Decision Tables
Decision tables provide a handy and compact way to represent complex business logic. In
a decision table, business logic is well divided into conditions, actions (decisions) and
rules for representing the various components that form the business logic.
There is one row for each condition and each vertical column for each combination of
values and resulting actions. Conditions are the factors to consider when making certain
business decision.
Actions are the possible actions to take when certain business decision is made.
Each vertical column of a decision table is called a rule and each rule symbolizes the
combinations of condition(s) and action(s) that form the business decision. If constructed
properly, the decision table has a rule to cover every combination. Rules are made of
selectors symbolized by Y (Yes), N (No) and – (for redundant or irrelevant rules).
18
Entries opposite the second lowest condition should be completed using Y an N in pairs
until all the vertical rules have been dealt with.
Entries for the next condition are then completed next using Ys and Ns in fours.
This process continues using twice the number of Ys and Ns each time until all conditions
are completed.
Once entered, the rules are read vertically in each column and an X entered at the action
that appropriately completes that rule. Actions which are mutually exclusive can be
combined on a single line.
EXAMPLE
A student who passes the examinations and completes the coursework and project
satisfactorily is awarded a pass. If the course worke and the project are unsatisfactory, the
o.k
student is asked to resubmit the [Link], as long as the exams have been
t es
passed. A student who fails the examinations o is deemed to have failed the whole course
d fn
.p
unless both the course work and the project are satisfactory, in which case the student is
w
allowed to re-sit the examination. ww
SOLUTION
Rules
Exams Passed? Y Y Y Y N N N N
Conditions Completed Course work? Y Y N Y Y N N
N
Completed Project? Y N Y N Y N Y N
Pass X
Re-sit Exam X
19
ASSIGNMENT 1
Candidates are accepted for employment if they pass the interview and their qualifications
and reference are satisfactory. If they pass the interview and the qualifications or
references (but not both) are unsatisfactory, a job for probationary period is offered. In all
other circumstances, the candidate’s application is rejected.
Assignment 2
• Design the business logic (at least three conditions) that is applicable when a customer
is applying for a bank loan.
• Draw a decision table to represent the business logic.
3. PROGRAM STRUCTURE
STRUCTURE OF A C PROGRAM
The C programming language was designed by Dennis Ritchie as a systems
programming language for Unix.
Example:
#include <stdio.h>
int main()
k e
{ co.
.
t es
/* My first program*/ o
d fn
printf("Hello, World! \n");
.p
w
return 0; w
w
}
20
Preprocessor Commands
These commands tell the compiler to do preprocessing before doing actual
compilation. Like #include <stdio.h> is a preprocessor command which tells a C compiler
to include stdio.h file before going to actual compilation. The standard input and output
header file (stdio.h) allows the program to interact with the screen, keyboard and file
system of the computer.
NB/ Preprocessor directives are not actually part of the C language, but rather instructions
from you to the compiler.
Functions
Theseare main building blocks of any C Program. Every C Program will have one or more
functions and there is one mandatory function which is called main() function. When this
function is prefixed with keyword int, it means this function returns an integer value when it
exits. This integer value is retuned using return statement.
The C Programming language provides a set of built-in functions. In the above example
printf() is a C built-in function which is used to print anything on the screen.
A function is a group of statements that together perform a task. A C program can be
divide up into separate functions but logically the division usually is so each function
performs a specific task. A function declaration tells the compiler about a function's name,
return type, and parameters. A function definition provides the actual body of the function.
The general form of a function definition in C programming language is as follows:
Variable Declarations
In C, all variables must be declared before they are used. Thus, C is a strongly typed
programming language. Variable declaration ensures that appropriate memory space is
21
reserved for the variables. Variables are used to hold numbers, strings and complex data
for manipulation e.g. Int x;
Int num; int z;
/* Author: MzeeMoja */
or
/*
* Author: MzeeMoja
* Purpose: To show a comment that spans multiple
lines.
* Language: C
*/
22
or
Fruit = apples + oranges; // get the total fruit
Escape Sequences
Escape sequences (also called back slash codes) are character combinations that begin
with a backslash symbol used to format output and represent difficult-to-type characters.
They include:
\a Alert/bell
\b Backspace
\n New line
\v Vertical tab
\t Horizontal tab
\\ Back slash
\’ Single quote
\” Double quote
\0 Null
SAMPLE PROGRAM
//First program
#include<stdio.h>
main()
{
int num; // Declaration
Keywords
The following list shows the reserved words in C. These reserved words may not be used
as constants or variables or any other identifier names.
24
do int struct _packed
double
Linking is the process where the object code, the start up code and the code for library
routines used in the program (all in machine language) are combined into a single file- the
executable file.
. ke
o
NB/ An interpreter unlike a compiler sis.c a computer program that directly executes,
ote
i.e. performs, instructions written in a programming, without previously
d fn
.p
compiling them into a machine language program.
w
w
w
If the compiled program can run on a computer whose CPU or operating
system is different from the one on which the compiler runs, the compiler is
known as a crosscompiler.
A program that translates from a low level language to a higher level one is a
decompiler.
25
Library Functions
There is a minimal set of library functions that should be supplied by all C compilers, which
your program may use. This collection of functions is called the C standard library. The
standard library contains functions to perform disk I/O (input/ output), string manipulations,
mathematics and much more. When your program is compiled, the code for library
functions is automatically added to your program. One of the most common library
functions is called printf() which is a general purpose output function. The quoted string
between the parenthesis of the printf() function is called an argument.
Printf(“This is a C program\n”)
The \n at the end of the text is an escape sequence tells the program to print a new line
as part of the output.
C DATA TYPES
In the C programming language, data types refer to a system used for declaring variables
or functions of different types. A data type is, therefore, a data storage format that can
contain a specific type or range of values. The type of a variable determines how much
space it occupies in storage and how the bit pattern stored is interpreted.
Type Description
Char Character data and is used to hold a single character. A character can be a
letter, number, space, punctuation mark, or symbol - 1 byte long
Int A signed whole number in the range -32,768 to 32,767 - 2 bytes long
Float A real number (that is, a number that can contain a fractional part) – 4 bytes
Double A double-precision floating point value. Has more digits to the right of the
decimal point than a float – 8 bytes
26
USING C’S DATA TYPE MODIFIERS
The five basic types (int, float, char,double and void) can be modified to your specific need
using the following specifiers.
. ke
Signed o
s.c
Signed Data Modifier implies that the otedata type variable can store positive values as
n
well as negative values. pdf
.
w
w
The use of the modifier withwintegers is redundant because the default integer
declaration assumes a signed number. The signed modifier is used with char to
create a small signed integer. Specified as signed, a char can hold numbers in the
range -128 to 127.
Unsigned
If we need to change the data type so that it can only store positive values,
“unsigned” data modifier is used.
This can be applied to char and int. When char is unsigned, it can hold positive
numbers in the range 0 to 255.
Long
Sometimes while coding a program, we need to increase the Storage Capacity of
a variable so that it can store values higher than its maximum limit which is there
as default. This can be applied to both int and double. When applied to int, it
doubles its length, in bits, of the base type that it modifies. For example, an
integer is usually 16 bits long. Therefore a long int is 32 bits in length. When long
is applied to a double, it roughly doubles the precision.
Short
A “short” type modifier does just the opposite of “long”. If one is not expecting to see
high range values in a program.
For example, if we need to store the “age” of a student in a variable, we will make
use of this type qualifier as we are aware that this value is not going to be very high
The type modifier precedes the type name. For example this declares a long integer.
27
Integer Types
Following table gives you details about standard integer types with its storage sizes and
value ranges:
Type Storage size Value range
Floating-Point Types
Following table gives you details about standard floating-point types with storage sizes and
value ranges and their precision:
e
Type Storage size Value range o.k Precision
s.c
float 4 byte t e
1.2E-38 to 3.4E+38 6 decimal places
f no
double 8 byte 2.3E-308pdto 1.7E+308 15 decimal places
.
w
long double 10 byte w
3.4E-4932 to 1.1E+4932 19 decimal places
w
1 Function returns as void. There are various functions in C which do not return
value or you can say they return void. A function with no return value has the
return type as void. For example, void exit (int status);
28
3 Pointers to void A pointer of type void * represents the address of an object,
but not its type. For example, a memory allocation function void
*malloc( size_t size ); returns a pointer to void which can be casted to any
data type.
VARIABLES
A variable is a memory location whose value can change during program execution. In C a
variable must be declared before it can be used.
Variable Declaration
Declaring a variable tells the compiler to reserve space in memory for that particular
variable. A variable definition specifies a data type and the variable name and contains a
list of one or more variables of that type .Variables can be declared at the start of any
block of code. A declaration
begins with the type, followed by the name of one or more variables. For
example, Int high, low;
int i, j, k;
char c, ch;
float f, salary;
Variables can be initialized when they are declared. This is done by adding an equals sign
and the required value after the declaration.
TYPES OF VARIABLES
The Programming language C has two main variable types
• Local Variables
• Global Variables
29
Local Variables
Global variable is defined at the top of the program file and it can be visible and modified
by any function that may reference it. Global variables are declared outside all functions.
Sample Program.
#include <stdio.h>
int area; //global variable
int main ()
{
int a, b; //local variable
/* actual initialization */
a = 10;
b = 20;
area = a*b;
printf("\t The area of your rectangle
is : %d \n", area);
return 0;
}
30
Variable Names
Every variable has a name and a value. The name identifies the variable and the value
stores data. Every variable name in C must start with a letter; the rest of the name can
consist of letters, numbers and underscore characters. C is case sensitive i.e. it recognizes
upper and lower case characters as being different. You cannot use any of C’s keywords
like main, while, switch etc as variable names,
It is conventional in C not to use capital letters in variable names. These are used for
names of constants.
Declaration vs Definition
A declaration provides basic attributes of a symbol: its type and its name. A definition
provides all of the details of that symbol--if it's a function, what it does; if it's a class, what
fields and methods it has; if it's a variable, where that
e variable is stored. Often, the
o .k
.c
compiler only needs to have a declaration for something in order to compile a file into an
t es
object file, expecting that the linker can find o the definition from another file. If no source file
d fn
ever defines a symbol, but it is declared,.p you will get errors at link time complaining about
w
undefined symbols. In the following w
w short code, the definition of variable x means that the
storage for the variable is that it is a global variable.
int x; int
main() { x
= 3;
}
31
scanf(“%d”, &num)
The %d is a format specifier which tells the compiler that the second argument will be
receiving an integer value.
The & preceding the variable name means “address of”. The function allows the function to
place a value into one of its arguments.
The table below shows format specifiers or codes used in the scanf() function and their
meaning.
%d Read an integer
%s Read a string
When used in a printf() function, a type specifier informs the function that a different type
item is being displayed.
int main ()
{
int a, b; //local variables
/* actual initialization */
printf("Enter the value of side a: ");
scanf("%d", &a);
32
area = a*b; printf("\t The area of your rectangle
is : %d \n", area);
return 0;
}
CONSTANTS
C allows you to declare constants. When you declare a constant it is a bit like a variable
declaration except the value cannot be changed during program execution. The const
keyword is used to declare a constant, as shown below:
int const A = 1;
const int A =2;
TYPE CASTING
Type casting is a way to convert a variable from one data type to another. For example, if
you want to store a long value into a simple integer then you can type cast long to int. You
can convert values from one type to another explicitly using the cast operator as follows:
(type_name) expression
Consider the following example where the cast operator causes the division of one integer
variable by another to be performed as a floating-point operation:
#include <stdio.h>
33
main() { int sum = 17, count = 5;
double mean;
mean = (double) sum / count; printf("Value of mean is
%d \n", mean );
When the above code is compiled and executed, it produces the following result:
It should be noted here that the cast operator has precedence over division, so the value
of sum is first converted to type double and finally it gets divided by count yielding a
double value.
ke
programming practice to use the cast operator whenever type conversions are necessary.
.
. co
s
ote
d fn
.p
C PROGRAMMING OPERATORS
w
w
w
Operator is the symbol which operates on a value or a variable (operand). For example: +
is an operator to perform addition.
C programming language has a wide range of operators to perform various operations. For
better understanding of operators, these operators can be classified as:
OPERATORS IN C PROGRAMMING
1. Arithmetic Operators
2. Increment and Decrement Operators
3. Assignment Operators
4. Relational Operators
5. Logical Operators
6. Conditional Operators
7. Bitwise Operators
8. Special Operators
34
ARITHMETIC OPERATORS
Assume variable A holds 10 and variable B holds 20 then
In C, ++ and -- are called increment and decrement operators respectively. Both of these
operators are unary operators, i.e, used on single operand. ++ adds 1 to operand and --
subtracts 1 to operand respectively. For example:
When i++ is used as prefix(like: ++var), ++var will increment the value of var and then return
it but, if ++ is used as postfix(like: var++), operator will return the value of operand first and
then increment it. This can be demonstrated by an example:
#include <stdio.h>
int main()
{
35
int c=2;
printf("%d\n",c++); /*this statement displays 2 then, only c incremented by 1
to 3.*/
printf("%d",++c); /*this statement increments 1 to c then, only c is
displayed.*/
return 0;
Output
2
4
= a=b a=b
+= a+=b a=a+b
-= a-=b a=a-b
*= a*=b a=a*b
/= a/=b a=a/b
%= a%=b a=a%b
NB/ += means Add and Assign etc.
36
RELATIONAL OPERATORS - Binary Operators
Relational operators check relationship between two operands. If the relation is true, it
returns value 1 and if the relation is false, it returns value 0. For example:
a>b
Here, > is a relational operator. If a is greater than b, a>b returns 1 if not then, it returns 0.
k e
co.
.
t es
o
d fn
.p
w
w
w
>= Greater than or equal to 5>=3 returns true (1)
<= Less than or equal to 5<=3 return false (0)
Meaning of
Operator Example
Operator
The following table shows the result of operator && evaluating the expression a&&b:
37
&& OPERATOR (and)
a b a && b
The operator || corresponds to the Boolean logical operation OR, which yields true if either
of its operands is true, thus being false only when both operands are false. Here are the
possible results of a || b:
|| OPERATOR (or)
a b a || b
Explanation
For expression, ((c==5) && (d>5)) to be true, both c==5 and d>5 should be true but, (d>5)
is false in the given example. So, the expression is false. For expression ((c==5) || (d>5)) to
be true, either the expression should be true.
Since, (c==5) is true. So, the expression is true. Since, expression (c==5) is true, !(c==5) is
false.
38
. ke
o
s.c
ote
n
df e
. p
o .k
w .c
w s
w e
n ot
CONDITIONAL OPERATOR df – Ternary Operators
.p
w
w
w
Conditional operator takes three operands and consists of two symbols ? and : .
Conditional operators are used for decision making in C. For example: c=(c>0)?10:-
10;
If c is greater than 0, value of c will be 10 but, if c is less than 0, value of c will be -10.
BITWISE OPERATORS
PRECEDENCE OF OPERATORS
If more than one operator is involved in an expression then, C language has a predefined
rule of priority of operators. This rule of priority of operators is called operator
precedence.
39
Here, operators with the highest precedence appear at the top of the table, those with the
lowest appear at the bottom. Within an expression, higher precedence operators will
be evaluated first.
ASSOCIATIVITY OF OPERATORS
Associativity indicates in which order two operators of same precedence (priority)
executes. Let us suppose an expression:
a= =b!=c
Here, operators == and != have the same precedence. The associativity of both == and !=
is left to right, i.e., the expression in left is executed first and execution take pale towards
right. Thus, a==b!=c equivalent to :
(a= =b)!=c
Operators may be left-associative (meaning the operations are grouped from the left),
rightassociative (meaning the operations are grouped from the right)
40
Multiplicative left to right * / %
e
.k
. co
|
t es
o
dfn
. p
w
w
Logical AND left to right &&
41
CONTROL STRUCTURES
Definition
Control structuresrepresent the forms by which statements in a program are executed. Flow
of control refers to the order in which the individual statements, instructions or function calls of
a program are executed or evaluated.
42
allow the program to decide an action based upon user's input or other processes for
instance in password checking.
[Link]/Iterative structures
This is where a group of statements in a program may have to be executed repeatedly until
some condition is [Link] include while, do/while and for
SELECTION STRUCTURES
General form
If
(expression)
statement
Pseudocode:
As in
if (marks>=600)
printf(“Passed”);
43
k
co.
.
t es
o
d fn
If condition is true .p
w
w
w
– Print statement executed and program goes on to next statement
– If false, print statement is ignored and the program goes onto the next statement NB/
Indenting makes programs easier to read
true
grade >= 60 print “Passed”
false
NB/ The statement in the if structure can be a single statement or a block (Compound
statement). If it’s a block of statements, it must be marked off by braces.
if (expression)
{
Block of statements
}
As in
If (salary>5000)
{
tax_amount = salary * 1.5;
printf(“Tax charged is %f”, tax_amount);
}
44
(b) THE IF/ELSE
While if only performs an action if the condition is true, if/else specifies an action to be
performed both
when the condition is true and when it is false. E.g.
Pseudocode:
If student’s grade is greater than or equal to 60
e
Print “Passed”
o.k
else s.c
e
Print “Failed” ot n
df
.p
w
w
w
false true
grade >= 60
Example
if (x >=100)
{
printf(“Let us increment x:\n”);
x++; }
else
45
– Once a condition is met, the other statements are skipped
– Deep indentation usually not used in practice
Example
#include <stdio.h>
k e
co.
.
main() { int marks;
t es
o
printf("Please enter your
d fn
.p
MARKS:"); scanf("%d", w
w
&marks); w
46
printf("Your grade is D\n"); else if
(marks >100) printf("Marks
out of range\n");
else
printf("Your grade is F\n");
}
Syntax
The syntax for a nested if statement is as follows:
if (boolean_expression 1)
{
/* Executes when the boolean expression 1 is true */
if(boolean_expression 2)
{
/* Executes when the boolean expression 2 is
true */ }
}
You can nest else if...else in the similar way as you have nested if statement.
Example
#include <stdio.h>
int main ()
{
/* local variable definition
*/ int a = 100; int b =
200;
/* check the boolean condition
*/ if( a = = 100 ) {
/* if condition is true then check the following */
if( b = = 200 )
47
{
/* if condition is true then print the following
*/ printf("Value of a is 100 and b is 200\
n" ); }
}
return 0;
}
When the above code is compiled and executed, it produces the following result:
Value of a is 100 and b is 200
Exact value of a is : 100
Exact value of b is : 200
Syntax
The syntax for a switch statement in C programming language is as follows:
switch(expression)
{
case constant-expression
statement(s); break;
case constant-
expression :
statement(s);
break;
/* you can have any number of case statements */
default :
statement(s);
}
48
The following rules apply to a switch statement: .k
e
o
1) You can have any number of case [Link] a switch. Each case is followed by the value
s
to be compared to and a colon. ote
n
2) The constant-expression for a case must
pdf be the same data type as the variable in the switch
3) When the variable being switched won . is equal to a case, the statements following that case will
execute until a break statement wiswreached.
4) When a break statement is reached, the switch terminates, and the flow of control jumps to the
next line following the switch statement.
5) Not every case needs to contain a break. If no break appears, the flow of control will fall through
to subsequent cases until a break is reached.
6)A switch statement can have an optional default case, which must appear at the end of the
switch. The default case can be used for performing a task when none of the cases is
true. No break is needed in the default case.
#include<stdio.h>
void main()
{
char grade;
49
switch (grade)
{ case
'A':
printf("Excellent!\n");
break; case 'B':
printf("Very Good!\n");
break; case 'C':
printf("Good!\n");
break; case 'D':
printf("Work harder!\n");
break; default:
printf("Fail!\n");
}
}
Syntax
The syntax for a nested e switch statement is as follows:
o.k
switch(ch1) { case 'A': c
es.
printf("This A is part of outer ot
d fn
switch" ); switch(ch2) .p
w
w
{ case 'A': printf("This A w
is part of inner switch" ); break;
case 'B':
} break; case 'B': }
50
Example
#include <stdio.h>
int main ()
{
/* local variable definition
*/ int a = 100; int b =
200; switch(a) { case
100:
printf("This is part of outer switch\n",
a ); switch(b) { case 200:
printf("This is part of inner switch\n", a );
printf(“A is equals to %d and B is equals to %d”, a, b);
}
}
printf("Exact value of a is : %d\n", a );
printf("Exact value of b is : %d\n", b );
return 0;
}
When the above code is compiled and executed, it produces the following result:
REPETITION/ITERATIVE/LOOP STRUCTURES
– while loop
– for loop
Post-test loops check a logical condition after each repetition for termination. The do-while loop is a post-
51
test loop.
.ke
. co
es
post-test loops. In a pretest loop, a logical condition is checked before each repetition to
determine if the loop should terminate. These loops include:
The statement(s) may be a single statement or a block of statements. The loop iterates while
the condition is true.
When the condition becomes false, program control passes to the line immediately following
the loop.
52
Example
#include <stdio.h> int main ()
{
/* local variable definition */ int a = 10; //loop
index
Syntax
The syntax of a for loop in C programming language is:
53
1. This step initializes any loop control variables. You are not required to put a statement
here, as long as a semicolon appears.
2. Next, the condition is evaluated. If it is true, the body of the loop is executed. If it is false,
the body of the loop does not execute and flow of control jumps to the next statement
just after the for loop.
3. After the body of the for loop executes, the flow of control jumps back up to the update
expression. This statement allows you to update any loop control variables. This
statement can be left blank, as long as a semicolon appears after the condition.
4. The condition is now evaluated again. If it is true, the loop executes and the process
repeats itself. After the condition becomes false, the for loop terminates.
Flow Diagram
k e
co.
.
t es
o
d fn
.p
w
w
w
Example
#include <stdio.h> int main ()
54
{ int a;//loop index /* for loop
execution */ for(a = 10; a < 20;
a++)
{
printf("value of a: %d\n", a);
} return 0;
}
When the above code is compiled and executed, it produces the following result:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
Syntax
do {
statement(s);
}while( condition );
Example
#include <stdio.h> int main ()
{
/* local variable definition */ int a = 10;
/* do loop execution */ do
{ printf("value of a: %d\n", a); a = a + 1;
}while( a < 20 ); return
When the above code is compiled and executed, it produces the following result:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
56
(d) NESTED LOOPS IN C
C programming language allows the use of one loop inside another loop. The following
section shows a few examples to illustrate the concept.
Syntax
The syntax for a nested for loop statement in C is as follows:
k e
for ( init; condition; increment ) co.
.
{ for ( init; condition; increment t es
o
d fn
)
.p
w
{ w
w
statement(s);
} statement(s);
}
The syntax for a nested while loop statement in C programming language is as follows:
while(condition)
{ while(condition)
{
statement(s);
}
statement(s);
}
The syntax for a nested do...while loop statement in C programming language is as follows:
do
{ statemen
t(s);
do {
statement(s);
}while( condition );
}while( condition );
57
A final note on loop nesting is that you can put any type of loop inside of any other type of
loop. For example, a for loop can be inside a while loop or vice versa.
Example
#include <stdio.h>
int main()
{
int n, c, k;
return 0;
}
Result:
If the user interred 5 as the number of rows, the output would be:
1
12
123
1234
12345
58
TERMINATING LOOPS
• Counter-controlled loops - a loop controlled by a counter variable, generally where the
number of times the loop will execute is known ahead of time especially in for loops.
• Event-controlled loops - loops where termination depends on an event rather than
executing a fixed number of times for example when a zero value is keyed in or search through
data until an item is found. Used mostly in while loops and do-while loops.
Using a Sentinel
• The value -999 is sometimes referred to as a sentinel value. The value serves as the
“guardian” for the termination of the loop. It is a good idea to make the sentinel a constant:
#define STOPNUMBER -999 while
(number != STOPNUMBER) ...
BRANCHING STATEMENTS
1. When the break statement is encountered inside a loop, the loop is immediately
terminated and program control resumes at the next statement following the loop.
3. If you are using nested loops (i.e., one loop inside another loop), the break statement will
stop the execution of the innermost loop and start executing the next line of code after the
block.
#include <stdio.h>
int main ()
{
/* local variable definition */ int a = 10;
59
/* do loop execution */ do {
if( a = = 15)
{
/* skip the iteration */ break; }
printf("value of a: %d\n", a); a++;
}while( a < 20 ); return 0;
}
Example
//program to demonstrate the working of continue statement in C programming
# include <stdio.h> int main(){ int
i,num,product; for(i=1,product=1;i<=4;++i)
{ printf("Enter num%d:",i);
scanf("%d",&num); if(num==0)
continue; /*In this program, when num equals to zero, it skips the statement product*=num and
continue the loop. */ product*=num;
} printf("product=%d",product); return 0;
}value of a: 19
60
and hard to modify. Any program that uses a gotocan be rewritten so that it doesn't need the
goto.
Syntax
The syntax for a gotostatement in C is as follows:
goto label;
..
.
k e
co.
.
t es
o
d fn
.p
w
w
w
Example
#include <stdio.h> int main ()
{
/* for loop execution */ int
a,userinput,sum=0;
for(a = 0; a < 5;a++)
{
printf("Enter a number: ");
scanf("%d",&userinput); if (userinput<1)
goto jump;
sum+=userinput;
}
61
jump:
printf("T
he sum
of the
values
is %d\
n",
sum);
return
0;
}
The last of the branching statements is the return statement. The return statement exits from the
current function, and control flow returns to where the function was invoked. The return
statement has two forms: one that returns a value, and one that doesn't. To return a value,
simply put the value (or an expression that calculates the value) after the return keyword. return
count;
The data type of the returned value must match the type of the method's declared return
value. When a function is declared void, use the form of return that doesn't return a value.
return;
e
THE INFINITE LOOP o.k
c
A loop becomes infinite loop if a condition neveres. becomes false. The for loop is traditionally
t
f no
used for this purpose. Since none of the dthree expressions that form the for loop arerequired,
.p
w
you can make an endless loop by leaving the conditional expression empty.
w
w
62
}
When the conditional expression is absent, it is assumed to be true. You may have an
initialization and increment expression, but C programmers more commonly use the for(;;)
construct to signify an infinite loop.
NOTE: You can terminate an infinite loop by pressing Ctrl + C keys.
63
CHAPTER 5
SUBPROGRAMS IN C
A sub-program is a series of C statements that perform a specific task in a
program. A subprogram can be called within another procedure. Every C program
has at least one function, which is main().A C program can be divided up into
separate functions.
A Subprogram is:
64
Programmers working on large projects can divide the workload by making
different functions.
TYPES OF FUNCTIONS
• Library function
• User defined function
LIBRARY FUNCTION
Library functions are the in-built function in C programming system. For example:
printf()
65
e
not
d f
.p
w
w
w
As mentioned earlier, every C program begins from main() and program starts
executing the codes inside main() function. When the control of program reaches
to function_name() inside main() function. The control of program jumps to void
function_name() and executes the codes inside it. When, all the codes inside that
user-defined function are executed, control of the program jumps to the
statement just after function_name() from where it is called. Analyze the figure
below for understanding the concept of function in C programming.
e
o.k
c
es.
t
f no
Remember, the function name is an identifier and should be unique.
d
.p
w
w
w
DEFINING A FUNCTION
The general form of a function definition in C programming language is as follows:
66
A function definition in C programming language consists of a function header
and a function body. Here are all the parts of a function:
1. Return Type: A function may return a value. The return_type is the data
type of the value the function returns. Some functions perform the desired
operations without returning a value. In this case, the return_type is the
keyword void.
2. Function Name: This is the actual name of the function. The function name
and the parameter list together constitute the function signature.
3. Parameters: A parameter is like a placeholder. When a function is invoked,
you pass a value to the formal parameter. This value is referred to as
actual parameter or argument. The parameter list refers to the type,
order, and number of the parameters of a function. Parameters are optional;
that is, a function may contain no parameters.
4. Function Body: The function body contains a collection of statements that
define what the function does.
Example
Following is the source code for a function called max(). This function takes two
parameters num1 and num2 and returns the maximum between the two:
67
FUNCTION DECLARATIONS
ke a function name and how to call
A function declaration tells the compiler .about
c o
s.
the function. The actual body of the function can be defined separately.
e
not
f
. pd
A function declaration has the following parts:
w
w
w
return_typefunction_name( parameter list );
For the above defined function max(), following is the function declaration:
Parameter names are not important in function declaration; only their type is
required, so the following is also valid declaration:
Function declaration is required when you define a function in one source file
and you call that function in another file. In such case you should declare the
function at the top of the file calling the function.
CALLING A FUNCTION
While creating a C function, you give a definition of what the function has to
do. To use a function, you will have to call that function to perform the defined
task. When a program calls a function, program control is transferred to the
called function. A called function performs defined task, and when its return
statement is executed or when its function-ending closing brace is reached, it
returns program control back to the main program. Therefore, the calling
program is suspended during execution of the called subprogram.
To call a function, you simply need to pass the required parameters along with
function name, and if function returns a value, then you can store returned
value. For example:
68
#include <stdio.h> /* function
declaration */ int max(int num1, int
num2); int main ()
{
/* local variable definition */ int a = 100;
int b = 200; int ret;
/* calling a function to get max value */ ret = max(a, b);
printf( "Max value is : %d\n", ret ); return 0;
}
/* function returning the max between two numbers */ int max(int num1, int
num2)
{
/* local variable declaration */ int result; if ke
co.
(num1 > num2) result = num1; else result s.
ote
= num2; fn
d
return result; } .p
w
w
w
The formal parameters behave like other local variables inside the function and
are created upon entry into the function and destroyed upon exit.
While calling a function, there are two ways that arguments can be passed to a
function:
69
Call by reference access the actual argument used in the call. This
means that changes made to the parameter affect the
argument.
By default, C uses call by value to pass arguments. In general, this means that
code within a function cannot alter the arguments used to call the function and
above mentioned example while calling max() function used the same method.
FUNCTION ARGUMENTS
If a function is to use arguments, it must declare variables that accept the
values of the arguments. These variables are called the formal parameters of
the function. The formal parameters behave like other local variables inside
the function and are created upon entry into the function and destroyed upon
exit.
A formal parameter is a dummy variable listed in the subprogram header and
used in the subprogram. An actual parameter represents a value used in the
subprogram call statement.
70
e
o.k
c
When max() is called, we pass it the arguments
es. which the function uses as the values
t
of ret. This process is called parameteropassing.
f n
d
.p in a method declaration. Arguments are the
Parameters refers to the list of variables
w
w the method is invoked. When you invoke a
actual values that are passed in when
w
method, the arguments used must match the declaration's parameters in type and
*****
order.
TYPES OF VARIABLES
The Programming language C has two main variable types
• Local Variables
• Global Variables
LOCAL VARIABLES
GLOBAL VARIABLES
Global variable is defined at the top of the program file and it can be visible and
modified by any function that may reference it. Global variables are declared
outside all functions.
Sample Program.
#include <stdio.h> int
area; //global variable
int main () {
int a, b; //local variable
71
/* actual initialization
*/ a = 10; b = 20;
printf ("\t Side a is %d cm and side b is %d cm long\n", a,
b); area = a*b; printf ("\t The area of your rectangle is :
%d \n", area); return 0; }
EXERCISES
e
[Link] a C program to
o.k add two integers. Define a
c
function add to add es. integers and display sum
ot
in main() function. d fn
.p
w
w
//main function w
#include<stdio.h> int add(int a, int b); int
main() {
int a, b, sum;
sum = add(a,b);
printf("The sum of the two numbers is %d\n", result);
72
return result;
}
[Link] a C program– max()- to determine the greater of two integers. Call the
function from main() and supply it with two integers and then display the
greater of the two.
#include <stdio.h>
return result; }
CHAPTER 6
73
DATA STRUCTURES
These refer togroups of data elements that are organized in a single unit so
that they can be used more efficientlyas compared to the simple data types
such as integers and strings. An example of a data structure is the array.
Ordinary variables store one value at a time while an array will store more than
one value at a time in a single variable name.
Data structures are important for grouping sets of similar data together and
passing them as one. For example, if you have a method that prints a set of
data but you don't know when writing the procedure how large that set is
going to be, you could use an array to pass the data to that method and loop
through it. Data structures can be classified using various criteria.
a)Linear
In linear data structures, values are arranged in linear fashion. A linear data
e
.k
structure traverses the data elements sequentially. The elements in the
co
s. and every element has exactly two
structure are adjacent to one another other
o te
dfn
neighbour elements to which it is connected. Arrays, linked lists, stacks and
. p
queues are examples of linearwdata structures.
w
b)Non-Linear w
The data values in this structure are not arranged in order but every data item
is attached to several other data items in a way that is specific for reflecting
relationships. Tree, graph, table and sets are examples of non-linear data
structures.
c)Homogenous
In this type of data structures, values of the same types of data are stored, as in
an array.
d)Non-homogenous
In this type of data structures, data values of different types are grouped, as in
structures and classes.
74
e)Dynamic
In dynamic data structures such as references and pointers, size and memory
locations can be changed during program execution. These data structures
can grow and shrink during execution. f)Static
With a static data structure, the size of the structure is fixed. Static data
structures such as arrays are very good for storing a well-defined number of
data items.
75
p
.
Instead of declaring individual variables, such as number0, number1, ..., and
w
number99, you declare one array wvariable such as numbers and use numbers[0],
w
numbers[1], and ..., numbers[99] to represent individual variables. A specific element
in an array is accessed by an index.
DECLARING ARRAYS
double balance[10];
Now balance is a variable array which is sufficient to hold up to 10 double
numbers.
INITIALIZING ARRAYS
You can initialize an array in C either one by one or using a single statement as
follows:
The number of values between braces { }can not be larger than the number of
elements that we declare for the array between square brackets [ ]. Following is
an example to assign a single element of the array:
If you omit the size of the array, an array just big enough to hold the initialization is
created. Therefore, if you write:
76
doublebalance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
The above statement will take 10th element from the array and assign the value
to salary variable. Following is an example which will use all the above
mentioned three concepts viz. declaration, assignment and accessing arrays:
#include <stdio.h>
int main () { int n[ 10 ]; /* n is an array of 10 integers */ inti,j;
SORT TECHNIQUES
Bubble Sort
In the bubble sort, as elements are sorted they gradually "bubble" (or rise) to
their proper location in the array, like bubbles rising in a glass of soda. The
bubble sort
repeatedly compares adjacent elements of an array. The first and second
elements are compared and swapped if out of order. Then the second and
third elements are
compared and swapped if out of order. This sorting process continues until the
last two elements of the array are compared and swapped if out of order.
When this first pass through the array is complete, the bubble sort returns to
elements one and two and starts the process all over again.
The table below follows an array of numbers before, during, and after a bubble sort
fordescending order. A "pass" is defined as one full trip through the array
78
comparing and if necessary, swapping, adjacent elements. Several passes have
to be made through the array before it is finally sorted
Array at beginning: 84 69 76 86 94 91
79
{
temp = allmarks[control2];
allmarks[control2]= allmarks[control2+1];
allmarks[control2+1] = temp;
}
}
}
Exchange Sort
The exchange sort is similar to its cousin, the bubble sort, in that it compares
elements of the array and swaps those that are not in their proper positions.
(Some
people refer to the "exchange sort" as a "bubble sort".) The difference between
these two sorts is the manner in which they compare the elements. The
exchange sort compares the first element with each following element of
the array, making any necessary swaps.
80
. ke
o
s.c
ote
When the first pass through the array is complete, the exchange sort then takes the
second element and compares it with eachf n following element of the array swapping
d
elements that are out of order. [Link] process continues until the entire array is
w
ordered. w
w
Let's examine our same table of elements again using an exchange sort for descending
order. Remember, a "pass" is defined as one full trip through the array comparing and
if necessary, swapping elements.
Array at beginning: 84 69 76 86 94 91
The exchange sort, in some situations, is slightly more efficient than the
bubble sort. It is not necessary for the exchange sort to make that final
complete pass needed by the bubble sort to determine that it is finished.
81
//intializearray for(i =0;
i<=4; i++){ printf("Enter a
number:");
scanf("%d",&num[i]);
}
//sort array
for (i=0; i< (4); i++) // element to be compared
{
for(j = (i+1); j < 5; j++) // rest of the elements
{
if (num[i] < num[j]) // descending order
{
temp= num[i]; // swap
num[i] = num[j]; e
o.k
num[j] = temp; c
es.
} ot
d fn
} .p
w
w
} w
//print sorted array
printf("\nSorted array:\n");
Selection Sort
The selection sort is a combination of searching and sorting.
During each pass, the unsorted element with the smallest (or largest) value
is moved to its proper position in the array.
82
The number of times the sort passes through the array is one less than the
number of items in the array. In the selection sort, the inner loop finds the next
smallest (or largest) value and the outer loop places that value into its proper
location.
Let's look at our same table of elements using a selection sort for descending
order. Remember, a "pass" is defined as one full trip through the array comparing
and if necessary, swappingelements.
Array at beginning: 84 69 76 86 94 91
83
}
temp = num[first]; // Swap smallest found with element in position i.
num[first] = num[i];
num[i] = temp;
}
return;
}
Shell Sort
The shell sort is named after its inventor D. L. Shell. Instead of comparing
adjacent elements, like the bubble sort, the shell sort repeatedly compares
elements that are a certain distance away from each other (d represents this
distance). The value of d starts out as half the input size and is halved after
each pass through the array. The elements are compared and swapped
when needed. The equation d= (N + 1) / 2 is used. Notice that only integer
values are used for d since integer division is occurring.
Let's look at our same list of values for descending order with the shell sort.
Remember, a "pass" is defined as one full trip through the array comparing and if
necessary, swappingelements.
Array at beginning: 84 69 76 86 94 91 d
84
This sorting process, with its comparison model, is an efficient sorting
algorithm.
Quick Sort
The quicksort is considered to be very efficient,with its "divide and conquer"
algorithm. This sort starts by dividing the original array into two sections
(partitions) based upon the value of the first element in the array. Since our
example sorts into descending order, the first section will contain all the
elements greater than the first element. The second section will contain
elements less than (or equal to) the first element. It is possible for the first
element to end up in either section.
85
Array at beginning: 84 69 76 86 94 91
= 1st partition 86 94 91 84 69 76
= 2nd partition
94 91 86 84 69 76
94 91 86 84 69 76
94 91 86 84 69 76
Done: 94 91 86 84 76 69
This sort uses recursion - the process of "calling itself". Recursion will be
studied at a later date.
int middle;
if (top < bottom)
{
middle = partition(num, top, bottom);
e
quicksort(num, top, middle); // sort first section
.k o
.c second section
quicksort(num, middle+1, bottom); // sort
es t
} f no
d
return; } .p
w
w
w
86
//Function to determine the partitions
// partitions the array and returns the middle
subscript int main() {
int x =
array[top]; int i =
top - 1; int j =
bottom + 1; int
temp; do {
do
{
j - -;
}while (x >array[j]);
do
{
i++;
} while (x <array[i]);
if (i<j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}while (i< j); return j; // returns
middle subscript }
Merge Sort
The merge sort combines two sorted arrays into one larger sorted
array. As the diagram below shows, Array A and Array B merge to
form Array C.
87
Arrays to be merged MUST be SORTED FIRST!!
If the element from array B should be smaller, it is moved to the new array C.
The subscript of array B is increased. This process of comparing the elements
in the two arrays continues until either array A or array B is empty. When one
array is empty, any elements remaining in the other (non-empty) array are
"pushed" into the end of array C and the merge is complete.
if (arrayA[indexA] <arrayB[indexB])
{
arrayC[indexC] = arrayA[indexA];
indexA++; //increase the subscript
}
else
88
{
arrayC[indexC] = arrayB[indexB]; indexB++;
//increase the subscript }
indexC++; //move to the next position in the new array
}
// Move remaining elements to end of new array when one merging array is empty
while (indexA< 5)
{
arrayC[indexC] = arrayA[indexA];
indexA++;
indexC++;
}
while (indexB< 5)
{
arrayC[indexC] = arrayB[indexB];
indexB++; indexC+
+;
}
return;
}
SEARCHING ARRAYS
e to perform a search or "lookup"
When working with arrays, it is often necessary
.k o
c value that matches a certain key value
to determine whether an array containss.a
o te
The process of locating a particularfnelement value in an array is called
d
.p search mechani[Link] search and
[Link] are two typeswof
w
binary search w
a) Serial Search
The technique used here is called a serial search, because the integer
elements of the array are compared one by one to the user input being looked
for (userValue) until either a match is found or all elements of the array are
examined without finding a match.
In the code below, if a match is found, the text “There is a match” is printed on
the form and the execution of the procedure is terminated (Exit Sub). If no
89
match is found, the program exits the loop and prints the text “No match
found”.
#include <stdio.h>
{
printf("\n\t%d is present at location %d.\n", searchvalue, c+1);
break;
Binary Search
Binary search uses the concept of splitting your searchable array in two, discarding the
half that does not have the element for which you are looking.
You place your items in an array and sort them. Then you simply get the middle
element and test if it is <, >, or = to the element efor which you are searching. If it is
.k
co middle index of the remaining elements
less than, you discard the greater half, get the
s.
te problem in half every time you execute
and do it again. Binary search divides your
no
your loop. df
.p
w
w
w
#include <stdio.h>
int main() { int c, first, last, middle, n, search, array[100];
printf("Enter number of elements\n");
scanf("%d",&n);
printf("Enter %d integers\n", n);
for ( c = 0 ; c < n ; c++ )
scanf("%d",&array[c]);
printf("Enter value to find\n");
scanf("%d",&search);
90
first = 0; last = n - 1; middle =
(first+last)/2;
while( first<= last )
{
if ( array[middle] < search ) first = middle + 1;
else if ( array[middle] == search )
{ printf("%d found at location %d.\n", search, middle+1); break; } else
last = middle - 1;
middle = (first + last)/2; } if ( first >
last ) printf("Not found! %d is not
present in the list.\n", search);
return 0; }
LINKED LISTS
How Linked lists are different from arrays? Consider the following points :
• An array is a static data structure. This means the length of array cannot
be altered at run time. While, a linked list is a dynamic data structure.
e
• .k at consecutive memory locations
In an array, all the elements are kept
. co
es (or nodes) may be kept at any location
while in a linked list the elements
ot
fn
but still connected to each other.
d
.p
w
w
When to prefer linked lists over
w arrays? Linked lists are preferred mostly when
you don’t know the volume of data to be stored. For example, In an employee
management system, one cannot use arrays as they are of fixed length while
any number of new employees can join. In scenarios like these, linked lists (or
other dynamic data structures) are used as their capacity can be increased (or
decreased) at run time (as an when required).
91
How linked lists are arranged in memory?
Linked list basically consists of memory blocks that are located at random memory
locations. Linked lists are connected through pointers.
POINTERS
Here, type is the pointer's base type; it must be a valid C data type and var-
name is the name of the pointer variable. The asterisk * you used to declare a
pointer is the same asterisk that you use for multiplication. However, in this
statement the asterisk is being used to designate a variable as a pointer.
Following are the valid pointer declaration:
The actual data type of the value of all pointers, whether integer, float, character,
or otherwise, is the same, a long hexadecimal number that represents a memory
address. The only difference between pointers of different data types is the data
type of the variable or constant that the pointer points to.
There are few important operations, which we will do with the help of pointers
very frequently. (a) we define a pointer variable (b) assign the address of a
variable to a pointer and (c) finally access the
e value at the address available in
o .k
.c unary operator * that returns the
the pointer variable. This is done by using
t es
o
d fn
.p 92
w
w
w
value of the variable located at the address specified by its operand. Following
example makes use of these operations:
#include <stdio.h>
int main ()
{
int var = 20; /* actual variable declaration */
int *ip; /* pointer variable declaration */
return
0; }
When the above code is compiled and executed, it produces result something
as follows:
NULL Pointers in C
The NULL pointer is a constant with a value of zero defined in several standard
libraries. Consider the following program:
93
#include <stdio.h>
int main ()
{
int *ptr = NULL;
return
0; }
When the above code is compiled and executed, it produces the following result:
C STRINGS
In C, one or more characters enclosed between double quotes is called a
string. C does not have built-in string data type. Instead, C supports strings
using one-dimensional arrays. A string is defined as a null terminated array
i.e. \0. This means that you must define the array that is going to hold a string
to be one byte larger than the largest string it is going to hold, in order to make
room for the null.
94
To read a string from the keyboard, you must use another of C’s standard library
functions, gets( ), which requires the stdio.h header file. The gets ( ) function
reads characters until you presss<ENTER>. The carriage return is not stored,
but it is replaced by a null, wich terminates the string. E.g.
#include<stdio.h>
Main ( )
Char str [80];
Int I;
Printf (ËNter a string: \n”);
gets(str);
The following declaration and initialization create a string consisting of the word
"Hello". To hold the null character at the end of the array, the size of the
character array containing the string is one more than the number of characters
in the word "Hello".
Initialization of strings
95
String can also be initialized using pointers
char *c="abcd";
String variable c can only take a word. It is beacause when white space is
encountered, the scanf() function terminates.
Here, program will ignore Ritchie because, scanf() function takes only string
before the white space.
96
4 strcmp(s1, s2);
Returns 0 if s1 and s2 are the same; less
than 0 if s1<s2; greater than 0 if s1>s2.
5 Returns a pointer
to the first
. ke
o occurrence of
s.c
e
not
strchr(s1, ch);
character ch in
d f
.p string s1.
w
w
w
6 strstr(s1, s2);
Returns a pointer to the first occurrence of
string s2 in string s1.
The C library function int strcmp(const char *str1, const char *str2) compares
the string pointed to by str1 to the string pointed to by str2.
PARAMETERS
RETURN VALUE
97
#include <stdio.h>
#include <string.h>
int main () { char
str1[15]; char
str2[15]; int ret;
strcpy(str1, "abcdef"); strcpy(str2,
"ABCDEF");
ret = strcmp(str1, str2);
if(ret > 0) { printf("str1 is less than str2");
} else if(ret < 0)
{ printf("str2 is less than
str1"); k e
co.
} else { printf("str1 is .
t es
equal to str2"); o
d fn
} return(0);
.p
w
} w
w
More Examples
1)C Program to Find the Length of a String
#include <stdio.h> int main() { char s[1000],i;
printf("Enter a string: "); scanf("%s",s);
for(i=0; s[i]!='\0'; ++i); printf("Length of string:
%d",i); return 0; }
Output
98
Output
QUEUES e
o.k
c
es.
Queue is a specialized data storage structure (Abstract data type). Unlike
ot
fn is restricted. It has two main operations
arrays, access of elements in a Queue
d
.p
enqueue and dequeue. Insertionw in a queue is done using enqueue function
w
w
and removal from a queue is done using dequeue function. An item can be
inserted at the end (‘rear’) of the queue and removed from the front (‘front’) of
the queue. It is therefore, also called First-In-First-Out (FIFO) list. Queue has
five properties - capacity stands for the maximum number of elements Queue
can hold, size stands for the current size of the Queue, elements is the array of
elements, front is the index of first element (the index at which we remove the
element) and rear is the index of last element (the index at which we insert the
element).
Primitive operations
a) enqueue (q, x): inserts item x at the rear of the queue q
b) x = dequeue (q): removes the front element from q and returns its value.
c) isEmpty(q) : true if the queue is empty, otherwise false.
Example
enqueue(q, ‘A’);
enqueue(q, ‘B’);
enqueue(q, ‘C’);
x = dequeue(q);
enqueue(q, ‘D’);
enqueue(q, ‘E’);
99
x= dequeue (q) -> x= ‘A’
STACKS
A stack is a data structure that allows adding and removing elements in a particular
order. Every time an element is added, it goes on the top of the stack; the only
e
element that can be removed is the element that
o .k was at the top of the stack.
Consequently, a stack is said to have "first in c last out" behavior (or "last in, first out").
s.
The first item added to a stack will be thetelast item removed from a stack.
no
pdf
.
w
w
w
100
CHAPTER 7
FILE HANDLING
This chapter explains how C programmers can create, open and close text or
binary files for their data storage.A file represents a sequence of bytes, does not
matter if it is a text file or binary file.
OPENING FILES
You can use the fopen( ) function to create a new file or to open an existing file,
this call will initialize an object of the type FILE, which contains all the information
necessary to control the stream. Following is the prototype of this function call:
Opens a text file for writing in appending mode, if it does not exist then a
new file a is created. Here your program will start appending content in the
existing file content.
Opens a text file for reading and writing both. It creates the file if it does not
exist. a+
The reading will start from the beginning but writing can only be appended.
101
If you are going to handle binary files then you will use below mentioned access
modes instead of the above mentioned:
"rb", "wb", "ab", "ab+", "a+b", "wb+", "w+b", "ab+", "a+b" CLOSING A FILE
To close a file, use the fclose( ) function. The prototype of this function is:
There are various functions provide by C standard library to read and write a file
character by character or in the form of a fixed length string. Let us see few of the
in the next section.
WRITING A FILE
The function fputc() writes the character value of the argument c to the output
stream referenced by fp. It returns the written echaracter written on success
o .k
.c use the following functions to write a
otherwise EOF if there is an error. You can
s
null-terminated string to a stream: ote
d fn
.p
int fputs( const char *s, FILE *fp ); w
w
w
The function fputs() writes the string s to the output stream referenced by fp. It
returns a non-negative value on success, otherwise EOF is returned in case of
any error. You can use int fprintf(FILE *fp,const char *format, ...) function as
well to write a string into a file. Try the following example:
#include <stdio.h>
main()
102
{
FILE *fp;
When the above code is compiled and executed, it creates a new file [Link] in
/tmp directory and writes two lines using two different functions. Let us read this
file in next section.
READING A FILE
If this function encounters a newline character '\n' or the end of the file EOF before
they have read the maximum number of characters, then it returns only the
characters read up to that point including new line character. You can also use int
fscanf(FILE *fp, const char *format, ...) function
to read strings from a file but it stops reading after
k e
the first space character
co. encounters.
.
#include <stdio.h> t es
o
main() d fn
.p
{ w
w
FILE *fp; char buff[255]; w
103
fp = fopen("/tmp/[Link]", "r"); fscanf(fp, "%s",
buff); printf("1 : %s\n", buff );
fgets(buff, 255, (FILE*)fp); printf("2: %s\
n", buff );
fgets(buff, 255, (FILE*)fp); printf("3: %s\
n", buff ); fclose(fp);
When the above code is compiled and executed, it reads the file created in
previous section and produces the following result:
1 : This
2: is testing for fprintf...
Let's see a little more detail about what happened here. First fscanf() method read
just This because after that it encountered a space, second call is for fgets()
which read the remaining line till it encountered end of line. Finally last call fgets()
read second line completely.
There are following two functions, which can be used for binary input and output:
104
k e
co.
.
t es
o
d fn
.p
w
w
w
Chapter 8
SOFTWARE DOCUMENTATION
Software documentation is written text that accompanies computer software. It
both explains how the software operates or how to use it and may mean different
things to people in different roles.
Importance of software documentation
1. Provide for communication among team members
2. They should provide information for management to help them plan, budget
and schedule the software development process.
3. It acts as an information repository to be used by maintenance engineers
4. Describe to users how to operate and administer the system
5. In all software projects some amount of documentation should be created
prior to any code being written for example Design docs, etc.
e
.k code has been completed for
6. Documentation should continue after the
o
example User’s manuals, etc. s.c
ote
d fn
.p
w
w
w
The two main types of documentation created are Process and Product
documents
PROCESS DOCUMENTATION
(a) Used to record and track the development process
105
Planning documentation
Cost, Schedule, Funding tracking
Schedules
Standards e.t.c.
(b) This documentation is created to allow for successful management of a
software product
(c) Has a relatively short lifespan
(d) Only important to internal development process
(e) Except in cases where the customer requires a view into this data
(f) Some items, such as papers that describe design decisions should be
extracted and moved into the product documentation category when they
become implemented
PRODUCT DOCUMENTATION
Describes the delivered product
Must evolve with the development of the software product
There are two main categories of process documentation:
[Link] Documentation
This describes how the system works, but not how to operate it
Examples:
Requirements Spec
Architectural Design
Detailed Design
Commented Source Code
Including output such as JavaDoc
Test Plans
Including test cases
V&V plan and results
List of Known Bugs
106
[Link] Documentation
User Documentation has two main types
End User
System Administrator
In some cases these are the same people. The target audience must be well
understood. There are five important areas that should be documented for a
formal release of a software application. These do not necessarily each have to
have their own document, but the topics should
e be covered thoroughly. These
k
include: co.
es.
ot
Functional Description of the Software
d fn
Installation Instructions .p
w
Introductory Manual w
w
Reference Manual
System Administrator’s Guide
Document Quality
Providing thorough and professional documentation is important for any size
product development team
Document Structure
All documents for a given product should have a similar
structure The authors “best practices” are: Put a cover page
on all documents
Divide documents into chapters with sections and subsections
Add an index if there is lots of reference information
Add a glossary to define ambiguous terms
107