MCS 201
MCS 201
Programming in C
Indira Gandhi National Open University
School of Computer and Information
Sciences (SOCIS)
and Python
An introduction to C 1
MCS-201
BLOCK 1 AN INTRODUCTION TO C
UNIT 1 Programming Fundamentals 5
UNIT 2 Data Types, Operators And Expressions 33
UNIT 3 Decision And Loop Control Statements 60
UNIT 4 Arrays And Strings 84
Happy Programming!!
Indira Gandhi
National Open University MCS-201
School of Computer and
Information Sciences PROGRAMMING IN
C AND PYTHON
Block
1
AN INTRODUCTION TO C
UNIT 1
Programming Fundamentals
UNIT 2
Data Types, Operators and Expressions
UNIT 3
Decision and Loop Control Statements
UNIT 4
Arrays and Strings
Programme / Course Design Committee
Prof. Sanjeev K. Aggarwal, IIT, Kanpur
Prof. V.V. Subrahmanyam
Prof. M. Balakrishnan, IIT , Delhi Director
SOCIS, IGNOU, New Delhi
Prof Harish Karnick, IIT, Kanpur Prof P. Venkata Suresh
SOCIS, IGNOU, New Delhi
Prof. C. Pandurangan, IIT, Madras
Dr. Shashi Bhushan
Dr. Om Vikas, Sr. Director, MIT Associate Professor
SOCIS, IGNOU, New Delhi
Prof P. S. Grover, Sr. Consultant, Shri Akshay Kumar
Prof. (Retd.) S.K. Gupta Associate Professor
IIT, Delhi SOCIS, IGNOU, New Delhi
March, 2021
All rights reserved. No part of this work may be reproduced in any form, by mimeograph or any other means,
without permission in writing from the Indira Gandhi National Open University.
Further information on the Indira Gandhi National Open University courses may be obtained from the
University’s office at Maidan Garhi, New Delhi-110 068.
Programming
UNIT 1 PROGRAMMING FUNDAMENTALS Fundamentals
Structure
1.0 Introduction
1.1 Objectives
1.2 Problem - Solving Techniques
1.2.1 Steps for Problem - Solving
1.2.2 Using Computer as a Problem-Solving Tool
1.3 Basics of Algorithms
1.3.1 Definition
1.3.2 Features of Algorithm
1.3.3 Criteria to be followed by an Algorithm
1.3.4 Top-Down Design
1.4 Flowcharts
1.4.1 Basic Symbols used in Flowchart Design
1.5 Program and a Programming Language
1.6 Structured Programming Concepts
1.7 C Programming Language
1.7.1 History of C Programming Language
1.7.2 Salient Features of C
1.8 Writing a C Program
1.9 Compiling a C Program
1.9.1 The C Compiler
1.9.2 Syntax and Semantic Errors
1.10 Link and Run the C Program
1.10.1 Run the C Program through the Menu
1.10.2 Run from an Executable File
1.10.3 Linker Errors
1.10.4 Logical and Runtime Errors
1.11 Diagrammatic Representation ofC Program Execution Process
1.12 Summary
1.13 Solutions / Answers
1.14 Further Readings
1.0 INTRODUCTION
In our daily life, we routinely encounter and solve problems. We pose
problems that we need or want to solve. For this, we make use of available
resources, and solve them. Some categories of resources include: the time and 5
An Introduction to C efforts of yours and others; tools; information; and money. Some of the
problems that you encounter and solve are quite simple.But some others may
be very complex.
In this unit we introduce you to the concepts of problem-solving, especially as
they pertain to computer programming.
The problem-solving is a skill and there are no universal approaches one can
take to solving problems. Basically one must explore possible avenues to a
solution one by one until s/he comes across a right path to a solution. In
general, as one gains experience in solving problems, one develops one’s own
techniques and strategies, though they are often intangible. Problem-solving
skills are recognized as an integral component of computer programming. It is
a demand and intricate process which is equally important throughout the
project life cycle especially – study, designing, development, testing and
implementation stages. The computer problem solving process requires:
Problem anticipation
Careful planning
Proper thought process
Logical precision
Problem analysis
Persistence and attention.
At the same time it requires personal creativity, analytic ability and expression.
The chances of success are amplified when the problem solving is approached
in a systematic way and satisfaction is achieved once the problem is
satisfactorily solved. The problems should be anticipated in advance as far as
possible and properly defined to help the algorithm definition and development
process.
Computer is a very powerful tool for solving problems. It is a symbol-
manipulating machine that follows a set of stored instructions called a
program. It performs these manipulations very quickly and has memory for
storing input, lists of commands and output. A computer cannot think in the
way we associate with humans. When using the computer to solve a problem,
you must specify the needed initial data, the operations which need to be
performed (in order of performance) and what results you want for output. If
any of these instructions are missing, you will get either no results or invalid
results. In either case, your problem has not yet been solved. Therefore, several
steps need to be considered before writing a program. These steps may free
you from hours of finding and removing errors in your program (a process
called debugging). It should also make the act of problem solving with a
computer a much simpler task.
All types of computer programs are collectively referred to as software.
Programming languages are also part of it. Physical computer equipment such
as electronic circuitry, input/output devices, storage media etc. comes under
hardware. Software governs the functioning of hardware. Operations
6 performed by software may be built into the hardware, while instructions
executed by the hardware may be generated in software. The decision to Programming
Fundamentals
incorporate certain functions in the hardware and others in the software is
made by the manufacturer and designer of the software and hardware. Normal
considerations for this are: cost, speed, memory required, adaptability and
reliability of the system. Set of instructions of the high level language used to
code a problem to find its solution is referred to as Source Program. A
translator program called a compiler or interpreter, translates the source
program into the object program. This is the compilation or interpretation
phase. All the testing of the source program as regards the correct format of
instructions is performed at this stage and the errors, if any, are printed. If there
is no error, the source program is transformed into the machine language
program called Object Program. The Object Program is executed to perform
calculations. This stage is the execution phase. Data, if required by the
program, are supplied now and the results are obtained on the output device.
The complete process is shown in fig 1.1 below:
Results
1.1 OBJECTIVES
After going through this unit, you should be able to:
apply problem solving techniques;
define an algorithm and its features;
design flowcharts;
Define a program;
Understand the history of C programming language;
Compile a C program;
Identify the syntax errors;
Run a C program; and
Understand what are run time and logical errors.
There are many ways of solving a problem and there may be several solutions.
So, it is difficult to recognize immediately which path could be more
productive. Sometimes you do not have any idea where to begin solving a
problem, even if the problem has been defined. Such block sometimes occurs
because you are overly concerned with the details of the implementation even
before you have completely understood or worked out a solution. The best
advice is not to get concerned with the details. Those can come later when the
intricacies of the problem has been understood.
The use of specific examples
To get started on a problem, we can make use of heuristics i.e., the rule of
thumb. This approach will allow us to start on the problem by picking a
specific problem we wish to solve and try to work out the mechanism that will
allow solving this particular problem. It is usually much easier to work out the
details of a solution to a specific problem because the relationship between the
mechanism and the problem is more clearly defined. This approach of focusing
on a particular problem can give us the foothold we need for making a start on
the solution to the general problem.
Similarities among problems
One way to make a start is by considering a specific example. Another
approach is to bring the experience to bear on the current problem. So, it is
important to see if there are any similarities between the current problem and
the past problems which we have solved. The more experience one has the
more tools and techniques one can bring to bear in tackling the given problem.
But sometimes, it blocks us from discovering a desirable or better solution to
the problem. A skill that is important to try to develop in problem - solving is
the ability to view a problem from a variety of angles. One must be able to
metaphorically turn a problem upside down, inside out, sideways, backwards,
forwards and so on. Once one has developed this skill it should be possible to
get started on any problem.
8
Working backwards from the solution Programming
Fundamentals
In some cases we can assume that we already have the solution to the problem
and then try to work backwards to the starting point. Even a guess at the
solution to the problem may be enough to give us a foothold to start on the
problem. We can systematize the investigations and avoid duplicate efforts by
writing down the various steps taken and explorations made. Another practice
that helps to develop the problem solving skills is, once we have solved a
problem, to consciously reflect back on the way we went about discovering the
solution.
The computer is a resource - a versatile tool - that can help you solve some of
the problems that you encounter. A computer is a very powerful general-
purpose tool. Computers can solve or help to solve many types of problems.
There are also many ways in which a computer can enhance the effectiveness
of the time and effort that you are willing to devote to solving a problem. Thus,
it will prove to be well worth the time and effort you spend to learn how to
make effective use of this tool.
In this section, we discuss the steps involved in developing a program.
Program development is a multi-step process that requires you to understand
the problem, develop a solution, write the program, and then test it. This
critical process determines the overall quality and success of your program. If
you carefully design each program using good structured development
techniques, your programs will be efficient, error-free, and easy to maintain.
The following are the steps in detail:
1. Develop an Algorithm and a Flowchart.
2. Write the program in a computer language (for example say C
programming language).
3. Enter the program using some editor.
4. Test and debug the program.
5. Run the program, input data, and get the results.
9
An Introduction to C 1.3.1 Definition
An algorithm is a finite set of steps defining the solution of a particular
problem. An algorithm is expressed in pseudocode - something resembling C
language or Pascal, but with some statements in English rather than within the
programming language. Developing an efficient algorithm requires lot of
practice and skill. It must be noted that an efficient algorithm is one which is
capable of giving the solution to the problem by using minimum resources of
the system such as memory and processor’s time. Algorithm is a language
independent, well structured and detailed. It will enable the programmer to
translate into a computer program using any high-level language.
Example 1.1
Let us try to develop an algorithm to compute and display the sum of two
numbers
1. Start
2. Read two numbers a and b
3. Calculate the sum of a and b and store it in sum
4. Display the value of sum
5. Stop
Example 1.2
Let us try to develop an algorithm to compute and print the average of a set of
data values.
1. Start
2. Set the sum of the data values and the count to zero.
3. As long as the data values exist, add the next data value to the sum and
add 1 to the count.
4. To compute the average, divide the sum by the count.
5. Display the average.
6. Stop
Example 1.3
Write an algorithm to calculate the factorial of a given number.
1. Start
2. Read the number n
3. [Initialize]
i 1 , fact 1
4. Repeat steps 4 through 6 until i = n
11
An Introduction to C 5. fact fact * i
6. i i + 1
7. Print fact
8. Stop
Example 1.4
Write an algorithm to check that whether the given number is prime or not.
1. Start
2. Read the number num
3. [Initialize]
i 2 , flag 1
4. Repeat steps 4 through 6 until i < num or flag = 0
5. rem num mod i
6. if rem = 0 then
flag 0
else
i i + 1
7. if flag = 0 then
Print Number is not prime
Else
Print Number is prime
8. Stop
Once we have defined the problem and have an idea of how to solve it, we can
then use the powerful techniques for designing algorithms. Most of the
problems are complex or large problems and to solve them we have to focus on
to comprehend at one time, a very limited span of logic or instructions. A
technique for algorithm design that tries to accommodate this human limitation
is known as top-down design or stepwise refinement.
Top down design provides the way of handling the logical complexity and
detail encountered in computer algorithm. It allows building solutions to
problems in step by step. In this way, specific and complex details of the
implementation are encountered only at the stage when sufficient groundwork
on the overall structure and relationships among the various parts of the
problem.Before the top down design can be applied to any problem, we must at
least have the outlines of a solution. Sometimes this might demand a lengthy
and creative investigation into the problem while at another time the problem
description may in itself provide the necessary starting point for the top-down
design. Top-down design suggests taking the general statements about the
solution one at a time, and then breaking them down into a more precise
subtask / sub-problem. These sub-problems should more accurately describe
how the final goal can be reached. The process of repeatedly breaking a task
12
down into a subtask and then each subtask into smaller subtasks must continue
until the sub-problem can be implemented as the program statement. With each Programming
Fundamentals
spitting, it is essential to define how sub-problems interact with each other. In
this way, the overall structure of the solution to the problem can be maintained.
Preservation of the overall structure is important for making the algorithm
comprehensible and also for making it possible to prove the correctness of the
solution.
Let us see how to represent the algorithm in a graphical form using a flowchart
in the following section.
1.4 FLOWCHARTS
The next step after the algorithm development is the flowcharting. Flowcharts
are used in programming to diagram the path in which information is
processed through a computer to obtain the desired results. Flowchart is a
graphical representation of an algorithm. It makes use of symbols which are
connected among them to indicate the flow of information and processing. It
will show the general outline of how to solve a problem or perform a task. It is
prepared for better understanding of the algorithm.
13
An Introduction to C 1.4.1 Basic Symbols used in flowchart design
Start/Stop
DECISION MAKING
(Branching)
Input/
Output
Process, Instruction
Example 1.5
Start
Read a,b
Sum = a +b
Print sum
14
Stop
Programming
Fundamentals
Example 1.6
The flowchart for the Example 1.3 (to find factorial of a given number) is
shown low:
Start
Read n
i= 1
fact= 1
is i
<= n?
No
Yes
i = i+1
Print
fact = fact*i fact
Stop
Example 1.7:
15
An Introduction to C
Start
Read num
i=2
flag = 1
no
is
i<num?
yes
no
is
flag = 0?
yes
rem =
num mod i
no
is rem
!= 0?
yes
i=i+1 flag = 0
no
Print is flag
“number is = 1?
not prime”
yes
Print
“Number
stop is prime
16
Check Your Progress 1 Programming
Fundamentals
We have seen in the earlier section’s that a computer has to be fed with a
detailed set of instructions and data for solving a problem. Such a procedure
which we call an algorithm is a series of steps arranged in a logical sequence.
Also we have seen that a flowchart is a pictorial representation of a sequence
of instructions given to the computer. It also serves as a document explaining
the procedure used to solve a problem. In practice it is necessary to express an
algorithm using a programming language. A procedure expressed in a
programming language is known as a computer program.
18
Programming
1.6 C PROGRAMMINGLANGUAGE Fundamentals
20 ……………………………………………………………………………………...
Programming
1.7 STRUCTURE OF A C PROGRAM Fundamentals
As we have already seen, to solve a problem there are three main things to be
considered. Firstly, what should be the output? Secondly, what should be the
inputs that will be required to produce this output and thirdly, the steps of
instructions which use these inputs to produce the required output. As stated
earlier, every programming language follows a set of rules; therefore, a
program written in C also follows predefined rules known as syntax. C is a
case sensitivelanguage. All C programs consist of one or more functions. One
function that must be present in every C program is main(). This is the first
function called up when the program execution begins. Basically, main()
outlines what a program does. Although main is not given in the keyword
list,it cannot be used for naming a variable. The structure of a C program is
illustrated in Figure.1.3 where functions func1() through funcn() represent user
defined functions.
Preprocessor directives
Global data declarations
main ( ) /* main function*/
{
Declaration part;
Program statements;
}
func2 ( )
{
…………
}
.
funcn ( )
{
…………
}
Figure. 1.3: Structure of a C Program.
A Simple C Program
From the above sections, you have become familiar with, a programming
language and structure of a C program. It’s now time to write a simple C
program. This program will illustrate how to print out the message “This is a C
program”.
Example 1.8: Write a program to print a message on the screen.
/*Program to print a message*/
START
INPUT
a, b
Sum = a + b
PRINT
Sum
STOP
Program
#include<stdio.h>
main()
{
int a,b,sum; /* variables declaration*/
sum=a+b;
OUTPUT
In the above program considers two variables a and b. These variables are
declared as integers (int), it is the data type to indicate integer values. Next
statement is the printf statement meant for prompting the user to input the
values of aand b. scanf is the function to intake the values into the program
provided by the user. Next comes the processing / computing part which
computes the sum. Again the printf statement is a bit different from the first
program; it includes a format specifier (%d). The format specifier indicates the 23
An Introduction to C kind of value to be printed. We will study about other data types and format
specifiers in detail in the following units. In the printf statement above, sum is
not printed in double quotes because we want its value to be printed. The
number of format specifiers and the variable should match in the printf
statement.
At this stage, don’t go much in detail. However, in the following units you will
be learning all these details.
Let the name of the program be test.c .If we compile the above program as it is
we will get the following errors:
Error test.c 1:No file name ending
Error test.c 5: Statement missing ;
Error test.c 6: Compound statement missing }
Edit the program again, correct the errors mentioned and the corrected version
appears as follows:
#include <stdio.h>
main( )
{ 25
An Introduction to C printf (“Hello, how are you\n”);
}
Apart from syntax errors, another type of errors that are shown while
compilation are semantic errors. These errors are displayed as warnings. These
errors are shown if a particular statement has no meaning. The program does
compile with these errors, but it is always advised to correct them also, since
they may create problems while execution. The example of such an error is
that say you have declared a variable but have not used it, and then you get a
warning “code has no effect”. These variables are unnecessarily occupying the
memory.
Check Your Progress 3
1. What is the basic unit of a C program?
……………………………………………………………………………………...
……………………………………………………………………………………...
……………………………………………………………………………………...
……………………………………………………………………………………...
……………………………………………………………………………………...
All these options create an executable file and when these options are used we
also get the output on user screen. To see the output we have to shift to user
screen window.
UNIX also includes a very useful program called make. Make allows very
complicated programs to be compiled quickly, by reference to a configuration
file (usually called makefile). If your C program is a single file, you can
usually use make by simply typing –
make testprog
This will compile testprog.c as well as link your program with the standard
library so that you can use the standard library functions such as printf and put
the executable code in testprog.
The first case simply means that the program is correct. In the second case, we
get wrong results; it means that there is some logical mistake in our program.
This kind of error is known as logical error. This error is the most difficult to
correct. This error is corrected by debugging. Debugging is the process of
removing the errors from the program. This means manually checking the
program step by step and verifying the results at each step. Debugging can be
made easier by a tracer provided in Turbo C environment. Suppose we have to
find the average of three numbers and we write the following code:
Example 1.11:Write a C program to compute the average of three
numbers
/* Program to compute average of three numbers *?
#include<stdio.h>
main( )
{
int a,b,c,sum,avg;
a=10;
b=5;
c=20;
sum = a+b+c;
avg = sum / 3;
printf(“The average is %d\n”, avg);
}
OUTPUT
The average is 8.
The exact value of average is 8.33 and the output we got is 8. So we are not
getting the actual result, but a rounded off result. This is due to the logical
error. We have declared variable avgas an integer but the average calculated is
a real number, therefore only the integer part is stored in avg. Such kinds of
errors which are not detected by the compiler or the linker are known as
logical errors.
The third kind of error is only detected during execution. Such errors are
known as run time errors. These errors do not produce the result at all, the
program execution stops in between and the run time error message is flashed
28 on the screen. Let us look at the following example:
Example 1.12: Write a program to divide a sum of two numbers by their Programming
Fundamentals
difference
#include <stdio.h>
main( )
{
int a,b;
float c;
a=10;
b=10;
c = (a+b) / (a-b);
printf(“The value of the result is %f\n”,c);
}
The above program will compile and link successfully, it will execute till the
first printf statement and we will get the message in this statement, as soon as
the next statement is executed we get a runtime error of “Divide by zero” and
the program halts. Such kinds of errors are runtime errors.
WRITE A C PROGRAM
DEBUG SYNTAX
ERRORS (IF ANY), SAVE
AND RECOMPILE
1.12 SUMMARY
To solve a problem different problem - solving tools are available that help in
finding the solution to problem in an efficient and systematic way. Steps
should be followed to solve the problem that includes writing the algorithm
and drawing the flowchart for the solution to the stated problem. Top down
design provides the way of handling the logical complexity and detail
encountered in computer algorithm. It allows building solutions to problems in
a stepwise fashion. In this way, specific and complex details of the
implementation are encountered only at the stage when sufficient groundwork
on the overall structure and relationships among the carious parts of the
problem. We present C language - a standardized, industrial-strength
programming language known for its power and portability as an
implementation vehicle for these problem solving techniques using computer.
In this unit, you have learnt about a program and a programming language.
You can now differentiate between high level and low level languages. You
can now define what is C, features of C. You have studied the emergence of C.
You have seen how C is different, being a middle level Language, than other
High Level languages. The advantage of high level language over low level
language is discussed.
30
You have seen how you can convert an algorithm and flowchart into a C Programming
Fundamentals
program. We have discussed the process of writing and storing a C program in
a file in case of UNIX as well as DOS environment.
You have learnt about compiling and running a C program in UNIX as well as
on DOS environment. We have also discussed about the different types of
errors that are encountered during the whole process, i.e. syntax errors,
semantic errors, logical errors, linker errors and runtime errors. You have also
learnt how to remove these errors. You can now write simple C programs
involving simple arithmetic operators and the printf( ) statement. With these
basics, now we are ready to learn the C language in detail in the following
units.
32
Data Types,
UNIT 2 DATA TYPES, OPERATORS AND Operators and
Expressions
EXPRESSIONS
Structure
2.0 Introduction
2.1 Objectives
2.2 C Language Character Set
2.3 Identifiers and Keywords
2.3.1 Rules for Forming Identifiers
2.3.2 Keywords
2.4 Data Types and Storage
2.5 Data Type Qualifiers
2.6 Variables
2.7 Declaring Variables
2.8 Initializing Variables
2.9 Constants
2.9.1 Integer Constants
2.9.2 Floating Point Constants
2.9.3 Character Constants
2.9.4 String Constants
2.10 Symbolic Constants and Others
2.11 Expressions and Operators – An Introduction
2.12 Assignment Statements
2.13 Arithmetic Operators
2.14 Relational Operators
2.15 Logical Operators
2.16 Comma and Conditional Operators
2.17 Type Cast Operator
2.18 Size of Operator
2.19 C Shorthand
2.20 Priority of Operators
2.21 Summary
2.22 Solutions / Answers
2.23 Further Readings
2.0 INTRODUCTION
As every natural language has a basic character set, computer languages also
have a character set, rules to define words. Words are used to form
statements. These in turn are used to write the programs.
Computer programs usually work with different types of data and need a way
to store the values being used. These values can be numbers or characters. C 33
An Introduction to C language has two ways of storing number values—variables and
constants—with many options for each. Constants and variables are the
fundamental elements of each program. Simply speaking, a program is
nothing else than defining them and manipulating them.
A variable is a data storage location that has a value that can change during
program execution. In contrast, a constant has a fixed value that can’t change.
This unit is concerned with the basic elements used to construct simple C
program statements. These elements include the C character set, identifiers
and keywords, data types, constants, variables and arrays, declaration and
naming conventions of variables.
2.1 OBJECTIVES
After going through this unit, you will be able to:
define identifiers, data types and keywords in C;
know name the identifiers as per the conventions;
describe memory requirements for different types of variables;
define constants, symbolic constants and their use in programs.write and
evaluate arithmetic expressions;
express and evaluate relational expressions;
write and evaluate logical expressions;
write and solve compute complex expressions (containing arithmetic, relational
and logical operators), and
use simple conditions using conditional operators.
34
Data Types,
2.3 IDENTIFIERS AND KEYWORDS Operators and
Expressions
2.3.2 Keywords
Keywords are reserved words which have standard, predefined meaning in C.
They cannot be used as program-defined identifiers.
The list of keywords in C language are as follows:
char while do typedef auto
int if else switch case
printf double struct break static
long enum register extern return
union const float short unsigned
continue for signed void default
goto sizeof volatile
Note: Generally all keywords are in lower case although uppercase of same
names can be used as identifiers.
35
An Introduction to C
2.4 DATA TYPES AND STORAGE
To store data inside the computer we need to first identify the type of data
elements we need in our program. There are several different types of data,
which may be represented differently within the computer memory. The data
type specifies two things:
1. Permissible range of values that it can store.
2. Memory requirement to store a data type.
C Language provides four basic data types viz. int, char, float and double.
Using these, we can store data in simple ways as single elements or we can
group them together and use different ways (to be discussed later) to store
them as per requirement. The four basic data types are described in the
following table 2.1:
Table 2.1: Basic Data Types
DATA TYPE TYPE OF DATA MEMORY RANGE
int Integer 2 Bytes 32,768 to 32,767
char character 1 Byte 128 to 128
float Floating point 4 bytes 3.4e 38 to 3.4e +38
number
double Floating point 8 bytes 1.7e 308 to 1.7e + 308
number with higher
precision
Memory requirements or size of data associated with a data type indicates the
range of numbers that can be stored in the data item of that type.
36
Data Types,
2.6 VARIABLES Operators and
Expressions
For example,
int a;
short int a, b;
int c, d;
long c, f;
float r1, r2;
int a = 10;
float b = 0.4 e –5;
char c = ‘a’;
37
An Introduction to C
b) Using Assignment Statement
The values are assigned just after the declarations are made.
For example,
int a;
float b;
char c;
a = 10;
b = 0.4 e –5;
c = ‘a’;
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
2.9 CONSTANTS
A constant is an identifier whose value cannot be changed throughout the
execution of a program whereas the variable value keeps on changing. In C
there are four basic types of constants. They are:
1. Integer constants
38
2. Floating point constants Data Types,
Operators and
3. Character constants Expressions
4. String constants
Integer and Floating Point constants are numeric constants and represent
numbers.
Rules to form Integer and Floating Point Constants
No comma or blankspace is allowed in a constant.
It can be preceded by – (minus) sign if desired.
The value should lie within a minimum and maximum permissible range
decided by the word size of the computer.
For example,
1 443 32767
are valid decimal integer constants.
Decimal integer
Decimal point
Decimal fraction
e or E and a signed integer exponent (optional)
Type suffix: f or F or l or L (optional)
Either decimal integer or decimal fraction (but not both) can be omitted.
Either decimal point or letter e (or E) with a signed integer exponent (but not
both) can be omitted. These rules allow conventional and scientific
(exponent) notations.
Negative floating constants are taken as positive constants with an unary
operator minus (-) prefixed. If there is a need for a floating-point constant
that exceeds these limits, user should add l or L suffix, making the constant
a long double type.
Here are some examples:
0. // is equal to 0.0
-1.23 // is equal to -1.23
23.45e6 // is equal to 23.45 X 106
2e-5 //is equal to 2.0 X 10-5
3e+10 //is equal to 3.0 X 1010
.09E34 //is equal to 0.09 X 1034
40
For example, some of the character constants are shown below: Data Types,
Operators and
‘A’, ‘x’, ‘3’, ‘$’ Expressions
Escape Sequence
Many programming languages support a concept called Escape Sequence.
When a character is preceded by a backslash (\), it is called an escape
sequence and it has a special meaning to the compiler. For example, \n in the
following statement is a valid character and it is called a new line character in
C language.
Examples:
41
An Introduction to C Advantages of using Symbolic Constants are:
They can be used to assign names to values.
Replacement of value has to be done at one place and wherever the name
appears in the text it gets the value by execution of the preprocessor.
This saves time. if the symbolic constant appears 20 times in the
program; it needs to be changed at one place only.
#include<stdio.h>
int main()
{
typedef unsigned in uint;
uint j=5, k=9;
printf(“j= %d\n”,j);
printf(“k= %d\n”,k);
return 0;
}
Check Your Progress 2
1) Write a preprocessor directive statement to define a constant PI having
the value 3.14.
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
2) Classify the examples into Integer, Character and String constants.
‘A’ 0147 0xEFH
077.7 “A” 26.4
“EFH” ‘\r’ abc
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
3) Name different categories of constants C programming language.
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
43
An Introduction to C
2.11 EXPRESSIONS AND OPERATORS - AN
INTRODUCTION
The data type of the variable on left hand side should match the data type of
constant/variable/expression on right hand side with a few exceptions where
automatic type conversions are possible. Some examples of assignment
statements are as follows:
b =a; /* b is assigned the value of a */
b=5; /* b is assigned the value 5*/
b = a+5; /* b is assigned the value of expr a+5 */
The expression on the right hand side of the assignment statement can be:
an arithmetic expression;
a relational expression;
a logical expression;
a mixed expression.
44
The above mentioned expressions are different in terms of the type of Data Types,
Operators and
operators connecting the variables and constants on the right hand side of the Expressions
variable. Arithmetic operators, relational operators and logical operators are
discussed in the following sections.
For example,
int a;
float b,c ,avg, t;
avg = (b+c) / 2; /*arithmetic expression */
a = b && c; /*logical expression*/
a = (b+c) && (b<c); /* mixed expression*/
Operator Meaning
+ Addition
- Subtraction
* Multiplication
/ Division
% Modular Division
Some of the examples of algebraic expressions and their C notation are given below:
Expression C notation
b* g (b *g) / d
d
The arithmetic operators are all binary operators i.e. all the operators have
two operands. The integer division yields the integer result. For example, the
expression 10/3 evaluates to 3 and the expression 15/4 evaluates to 3. C
provides the modulus operator, %, which yields the reminder after integer
division. The modulus operator is an integer operator that can be used only
with integer operands. The expression x%y yields the reminder after x is
divided by y. Therefore, 10%3 yields 1 and 15%4 yields 3. An attempt to
divide by zero is undefined on computer system and generally results in a
run- time error. Normally, Arithmetic expressions in C are written in straight-
line form. Thus ‘a divided by b’ is written as a/b.
The operands in arithmetic expressions can be of integer, float, double type.
In order to effectively develop C programs, it will be necessary for you to
understand the rules that are used for implicit conversion of floating point
and integer values in C.
45
An Introduction to C They are mentioned below:
An arithmetic operator between an integer and integer always yields an
integer result.
Operator between float and float yields a float result.
Operator between integer and float yields a float result.
If the data type is double instead of float, then we get a result of double data
type.
For example,
Operation Result
5/3 1
5.0/3 1.6666666667
5/3.0 1.6666666667
5.0/3.0 1.6666666667
It may so happen that the type of the expression and the type of the variable
on the left hand side of the assignment operator may not be same. In such a
case the value for the expression is promoted or demoted depending on the
type of the variable on left hand side of = (assignment operator). For
example, consider the following assignment statements:
int i;
float b;
i = 4.6;
b = 20;
In the first assignment statement, float (4.6) is demoted to int. Hence i gets
the value 4. In the second assignment statement int (20) is promoted to float,
b gets 20.0. If we have a complex expression like:
float a, b, c;
int s;
s = a * b / 5.0 * c;
Where some operands are integers and some are float, then int will be promoted or
demoted depending on left hand side operator. In this case, demotion will take place
since s is an integer.
46
For example, Data Types,
( ((3+4)*5)/6 ) Operators and
Expressions
The order of evaluation is given below:
( ( (3+4) * 5) / 6 )
1 2 3
For example,
5*5+6*7
The order of evaluation is given below.
5*5+6*7
1 2
3
For example,
8/5-6+5/2
The order of evaluation is given below.
8/5-6+5/2
1 3 4 2
Apart from these binary arithmetic operators, C also contains two unary
operators referred to as increment (++) and decrement (--) operators, which
we are going to be discussed below:
The two-unary arithmetic operators provided by C are:
Increment operator (++)
Decrement operator (- -)
The importance of pre and post operator occurs while they are used in the
expressions. Preincrementing (Predecrementing) a variable causes the
variable to be incremented (decremented) by 1, then the new value of the
variable is used in the expression in which it appears. Postincrementing
(postdecrementing) the variable causes the current value of the variable is
used in the expression in which it appears, then the variable value is
incremented (decrement) by 1.
The explanation is given in the table below:
Expression Explanation
++a Increment a by 1, then use the new value of a
a++ Use value of a, then increment a by 1
--b Decrement b by 1, then use the new value of b
b-- Use the current value of b, then decrement by 1
The precedence of these operators is right to left. Let us consider the
following examples:
int a = 2, b=3;
int c;
c = ++a – b- -;
printf (“a=%d, b=%d,c=%d\n”,a,b,c);
OUTPUT
a = 3, b = 2, c = 0.
Since the precedence of the operators is right to left, first b is evaluated, since
it is a post decrement operator, current value of b will be used in the
expression i.e. 3 and then b will be decremented by 1.Then, a preincrement
operator is used with a, so first a is incremented to 3. Therefore, the value of
the expression is evaluated to 0.
Let us take another example,
int a = 1, b = 2, c = 3;
int k;
k = (a++)*(++b) + ++a - --c;
printf(“a=%d,b=%d, c=%d, k=%d”,a,b,c,k);
OUTPUT
a = 3, b = 3, c = 2, k = 6
The evaluation is explained below:
k = (a++) * (++b)+ ++a - --c
= (a++) * (3) + 2 - 2 step1
= (2) * (3) + 2 - 2 step2
= 6 final result
48
Check Your Progress 3 Data Types,
Operators and
Expressions
1. Give the C expressions for the following algebraic expressions:
i) a*4c2 - d
m+n
ii) ab - (e+f)4
c
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
2. Give the output of the following C code:
main()
{
int a=2,b=3,c=4;
k = ++b + --a*c + a;
printf(“a= %d b=%d c=%d k=%d\n”,a,b,c,k);
}
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
3. Point out the error:
exp = a**b;
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
50
Data Types,
2.15 LOGICAL OPERATORS Operators and
Expressions
Thus logical operators (AND and OR) combine two conditions and logical
NOT is used to negate the condition i.e. if the condition is true, NOT negates
it to false and vice versa.Let us consider the following is:
i) Suppose the grade of the student is ‘B’ only if his marks lie within the
range 65 to 75,if the condition would be:
if((marks >=65) && (marks <= 75))
printf (“Grade is B\n”);
ii) Suppose we want to check that a student is eligible for admission if his
PCM is greater than 85% or his aggregate is greater than 90%, then,
Logical negation (!) enables the programmer to reverse the meaning of the
condition. Unlike the && and || operators, which combines two conditions
(and are therefore Binary operators), the logical negation operator is a unary
operator and has one single condition as an operand. Let us consider an
example:
if!(grade==’A’)
printf (“the next grade is %c\n”, grade);
The parentheses around the condition grade==A are needed because the
logical operator has higher precedence than equality operator. The truth table
of the logical AND (&&), OR (||) and NOT (!) are given below.
These table show the possible combinations of zero (false) and nonzero (true)
values of x (expression1) and y (expression2) and only one expression in case
of NOT operator. The following table 2.3 is the truth table for && operator.
51
An Introduction to C Table 2.3: Truth table for && operator
x y x&&y
zero zero 0
Non zero zero 0
zero Non zero 0
Non zero Non zero 1
x y x || y
zero zero 0
x !x
zero 1
Non zero 0
The following table 2.6 shows the operator precedence and associativity
Operator Associativity
! Right to left
|| Left to right
52
The syntax is as follows: Data Types,
Operators and
(condition)? (expression1): (expression2); Expressions
54
else if one operand is double, the other is converted to double, Data Types,
Operators and
else if one operand is long, the other is converted to long, Expressions
(type) expression
where type is the standard C data type. For example, if you want to make sure
that the expression a/5 would evaluate to type float you would write it as
( float ) a/5
cast is an unary operator and has the same precedence as any other unary
operator. The use of cast operator is explained in the following example:
main()
{
int num;
printf(“%f %f %f\n”, (float)num/2, (float)num/3, float)num/3);
}
Tha cast operator in this example will ensure that fractional part is also
displayed on the screen.
55
An Introduction to C
2.19 C SHORTHAND
C has a special shorthand that simplifies coding of certain type of assignment
statements. For example: a = a+2;
can be written as: a += 2;
The operator +=tells the compiler that a is assigned the value of a + 2;
This shorthand works for all binary operators in C. The general form is:
variable operator = variable / constant / expression;
These operators are listed below:
Operators Examples Meaning
+= a+=2 a=a+2
-= a-=2 a=a-2
= a*=2 a = a*2
/= a/=2 a=a/2
%= a%=2 a=a%2
Operators Examples Meaning
&&= a&&=c a=a&&c
||= a||=c a=a||c
Operators Associativity
() Left to right
! ++ -- (type) sizeof Right to left
/% Left to right
+- Left to right
< <= > >= Left to right
== != Left to right
&& Left to right
|| Left to right
?: Right to left
= += -= *= /= %= &&= ||= Right to left
, Left to right
56
Check Your Progress 5 Data Types,
Operators and
1. Give the output of the following C code: Expressions
main( )
{
int a,b=5;
float f;
a=5/2;
f=(float)b/2.0;
(a<f)? b=1:b=0;
printf(“b = %d\n”,b);
}
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
2. What is the difference between && and &. Explain with an example.
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
3. Use of Bit Wise operators makes the execution of the program.
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
2.21 SUMMARY
To summarize we have learnt certain basics, which are required to learn a
computer language and form a basis for all languages. Character set includes
alphabets, numeric characters, special characters and some graphical
characters. These are used to form words in C language or names or
identifiers. Variable are the identifiers, which change their values during
execution of the program. Keywords are names with specific meaning and
cannot be used otherwise.
57
An Introduction to C We had discussed four basic data types - int, char, float and double. Some
qualifiers are used as prefixes to data types like signed, unsigned, short, and
long.
The constants are the fixed values and may be either Integer or Floating point
or Character or String type. Symbolic Constants are used to define names
used for constant values. They help in using the name rather bothering with
remembering and writing the values.
In this unit, we discussed about the different types of operators, namely
arithmetic, relational, logical present in C and their use. In the following
units, you will study how these are used in C’s other constructs like control
statements, arrays etc. This unit also focused on type conversions. Type
conversions are very important to understand because sometimes a
programmer gets unexpected results (logical error) which are most often
caused by type conversions in case user has used improper types or if he has
not type cast to desired type.
C is referred to as a compact language which is because lengthy expressions
can be written in short form. Conditional operator is one of the examples,
which is the short form of writing the if/else construct (next unit). Also
increment/decrement operators reduce a bit of coding when used in
expressions.
Since logical operators are used further in all types of looping constructs and
if/else construct (in the next unit), they should be thoroughly understood.
58
ii) a*b-(e+f)*4/c
2. The output would be: Data Types,
Operators and
a=1 b=4 c=4 k=10 Expressions
59
An Introduction to C
UNIT 3 DECISION AND LOOP CONTROL
STATEMENTS
Structure
3.0 Introduction
3.1 Objectives
3.2 Decision Control Statements
3.2.1 The if Statement
3.2.2 The switch Statement
3.3 Loop Control Statements
3.3.1 The while Loop
3.3.2 The do-while Statement
3.3.3 The for Loop
3.3.4 The Nested Loop
3.4 The Goto Statement
3.5 The Break Statement
3.6 The Continue Statement
3.7 Summary
3.8 Solutions / Answers
3.9 Further Readings
3.0 INTRODUCTION
A program consists of a number of statements to be executed by the
computer. Not many of the programs execute all their statements in
sequential order from beginning to end as they appear within the program. A
C program may require that a logical test be carried out at some particular
point within the program. One of the several possible actions will be carried
out, depending on the outcome of the logical test. This is called Branching.
In the Selection process, a set of statements will be selected for execution,
among the several sets available. Suppose, if there is a need of a group of
statements to be executed repeatedly until some logical condition is satisfied,
then looping is required in the program. These can be carried out using
various control statements.
These Control statements determine the “flow of control” in a program and
enable us to specify the order in which the various instructions in a program
are to be executed by the computer. Normally, high level procedural
programming languages require three basic control statements:
Sequence instruction
Selection/decision instruction
Repetition or Loop instruction
60
Decision and Loop
Sequence instruction means executing one instruction after another, in the Control Statements
order in which they occur in the source file. This is usually built into the
language as a default action, as it is with C. If an instruction is not a control
statement, then the next instruction to be executed will simply be the next one
in sequence.
Selection means executing different sections of code depending on a specific
condition or the value of a variable. This allows a program to take different
courses of action depending on different conditions. C provides three
selection structures.
if
if…else
switch
Repetition/Looping means executing the same section of code more than once. A
section of code may either be executed a fixed number of times, or while some
condition is true. C provides three looping statements:
while
do…while
for
This unit introduces you the decision and loop control statements that are
available in C programming language along with some of the example
programs.
3.1 OBJECTIVES
After going through this unit you will be able to:
work with different control statements;
know the appropriate use of the various control statements in
programming;
transfer the control from within the loops;
use the goto, break and continue statements in the programs; and
write programs using branching, looping statements.
61
An Introduction to C
3.2.1 The if Statement
It is used to execute an instruction or sequence/block of instructions only if a
condition is fulfilled. In if statements, expression is evaluated first and then,
depending on whether the value of the expression (relation or condition) is
“true” or “false”, it transfers the control to a particular statement or a group
of statements.
Simple if statement
It is used to execute an instruction or block of instructions only if a condition
is fulfilled.
Example 3.1
Write a program to calculate the net salary of an employee, if a tax of 15% is
levied on his gross-salary if it exceeds Rs. 10,000/- per month.
#include<stdio.h>
main()
{
float gross_salary, net_salary;
if(gross_salary <10000)
net_salary= gross_salary;
if(gross_salary >= 10000)
net_salary = gross_salary- 0.15*gross_salary;
OUTPUT
If … else statement
If…else statement is used when a different sequence of instructions is to be
executed depending on the logical value (True / False) of the condition
evaluated.
Its form used in conjunction with if and the syntax is as follows:
if(condition)
Statement _1;
else
Statement_ 2;
statement_3;
63
An Introduction to C Or
if(condition)
{
Statements_1_Block;
}
else
{
Statements_2_Block;
}
Statements _3_Block;
Example:
#include<stdio.h>
main()
{
int x=2;
int y;
y = (x >= 6) ? 6 : x;
printf(“y = %d”,y);
return 0;
}
OUTPUT : y = 2
else
{
Statements_2_Block;
}
}
else
{
Statements_3_Block;
}
Statement_4_Block;
Example 3.3
Write a program to calculate an Air ticket fare after discount, given the
following conditions:
If passenger is below 14 years then there is 50% discount on fare
If passenger is above 50 years then there is 20% discount on fare
If passenger is above 14 and below 50 then there is 10% discount on
fare.
Here, the coonditions aree evaluated ini order fromm top to botttom. As soonn as
any conditiion evaluatess to true, theen the statem
ment associatted with the given
g
condition iss executed aand control iss transferredd to Statemen
nts_x skippinng the
rest of the conditions
c foollowing it.
OUTPUT
Enter the total marks of a student:
80
Grade A
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
69
An Introduction to C 2. Find the output for the following program:
#include<stdio.h>
main()
{
int a,b=0;
if(a=b=1)
printf("hello");
else
printf("world");
return 0;
}
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
3.2.2 The Switch Statement
Its objective is to check several possible constant values for an expression,
something similar to what we had studied in the earlier sections, with the
linking of several if and else if statements. When the actions to be taken
depending on the value of control variable, are large in number, then the use
of control structure Nested if…else makes the program complex. There
switch statement can be used. Its form is the following:
switch(expression){
case expression 1:
block of instructions1
break;
case expression 2:
block of instructions2
break;
.
.
default:
default block of instructions
}
It works in the following way: switch evaluates expression and checks if it is
equivalent to expression1. If it is, it executes block of instructions 1 until it
finds the break keyword, moment at finds the control will go to the end of
the switch. If expression was not equal to expression 1 it will check whether
expression is equivalent to expression 2. If it is, it will execute block of
instructions 2 until it finds the break keyword.
Finally, if the value of expression has not matched any of the previously
specified constants (you may specify as many case statements as values you
want to check), the program will execute the instructions included in the
default: section, if it exists, as it is an optional statement.
70
Decision and Loop
Let us consider a program to illustrate Switch statement, Control Statements
Example 3.5
Write a program that performs the following, depending upon the choice
selected by the user.
i). calculate the square of number if choice is 1
ii). calculate the square-root of number if choice is 2 and 4
iii). calculate the cube of the given number if choice is 3
iv). otherwise print the number as it is
main()
{
int choice,n;
printf(“\n Enter any number:\n “);
scanf(“%d”,&n);
printf(“Choice is as follows:\n\n”);
printf(“1. To find square of the number\n”);
printf(“2. To find square-root of the number\n”);
printf(“3. To find cube of a number\n”);
printf(“4. To find the square-root of the number\n\n”);
printf(“Enter your choice:\n”);
scanf(“%d”,&choice);
switch(choice)
{
case 1: printf(“The square of the number is %d\n”,n*n);
break;
case 2:
case 4: printf(“The square-root of the given number is %f”,sqrt(n));
break;
case 3: printf(“ The cube of the given number is %d”,n*n*n);
default: printf(“The number you had given is %d”,n);
break;
}
}
OUTPUT
Enter any number: 4
Choice is as follows:
1. To find square of the number
2. To find square-root of the number
3. To find cube of a number
4. To find the square-root of the number
Here, test condition is an expression that controls how long the loop keeps
running. Body of the loop is a statement or group of statements enclosed in
braces and are repeatedly executed till the value of test condition evaluates to
true. As soon as the condition evaluates to false, the control jumps to the first
statement following the while statement. If condition initially itself is false,
the body of the loop will never be executed. While loop is sometimes called
as entry-control loop, as it controls the execution of the body of the loop
depending upon the value of the test condition. This is shown in the figure
5.5 given below:
Example 3.6
Write a program to calculate the factorial of a given input natural number.
#include<stdio.h>
#include<math.h>
main()
{
int x;
long int fact = 1;
printf(“Enter any number to find factorial:\n”); /*read the number*/
scanf(“%d”,&x);
while(x > 0)
{
fact = fact*x; /* factorial calculation*/
x=x-1;
}
printf(“Factorial is %ld”,fact);
}
OUTPUT
Factorial is 24
Here, condition in while loop is evaluated and body of loop is repeated until
condition evaluates to false i.e., when x becomes zero. Then the control is
jumped to first statement following while loop and print the value of factorial.
In do-while loop, the body of loop is executed at least once before the
condition is evaluated. Then the loop repeats body as long as condition is
true. However, in while loop, the statement doesn’t execute the body of the
loop even once, if condition is false. That is why do-while loop is also called
exit-control loop. This is shown in the figure 3.6 given below.
73
An Introduction to C
Example 3.7
Write a program to print first ten even natural numbers.
OUTPUT
2 4 6 8 10 12 14 16 18 20
Example 3.8
Write a program to print first n natural numbers.
75
An Introduction to C /* Program to print first n natural numbers */
#include<stdio.h>
main()
{
int i,n;
printf(“Enter value of n \n”);
scanf(“%d”,&n);
printf(“\nThe first %d natural numbers are :\n”, n);
for(i=1;i<=n;++i)
{
printf(“%d”,i);
}
}
OUTPUT
Enter value of n
6
The first 6 natural numbers are:
123456
The three statements inside the braces of a for loop usually meant for one
activity each, however any of them can be left blank also. More than one
control variables can be initialized but should be separated by comma.
d) for(;;increment/decrement)
body;
Initialization is required to be done before the loop and test condition is
checked inside the loop.
e) for(initialization;;)
body;
Test condition and control variable increment/decrement is to be done
inside the body of the loop.
76
Decision and Loop
(f) for(;condition;) Control Statements
body;
Initialization is required to be done before the loop and control variable
increment/decrement is to be done inside the body of the loop.
g) for(;;;)
body;
Initialization is required to be done before the loop, test condition and
control variable increment/decrement is to be done inside the body of the
loop.
3.3.4 The Nested Loops
C allows loops to be nested, that is, one loop may be inside another. The
program given below illustrates the nesting of loops.
Let us consider a program to illustrate nested loops,
Example 3.9
Write a program to generate the following pattern given below:
1
1 2
1 2 3
1 2 3 4
#include<stdio.h>
main()
{
int i,j;
for(i=1;i<=4;++i)
{
printf("%d\n",i);
for(j=1;j<=i;++j)
printf("%d\t",j);
}
}
Here, an inner for loop is written inside the outer for loop. For every value of
i, j takes the value from 1 to i and then value of i is incremented and next
iteration of outer loop starts ranging j value from 1 to i.
Check Your Progress 2
1. Predict the output :
#include <stdio.h>
main()
{
int i;
for(i=0;i<=10;i++)
printf("%d",i);
return 0;
}
77
An Introduction to C …………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
2. What is the output?
#include<stdio.h>
main()
{
int i;
for(i=0;i<3;i++)
printf("%d ",i);
}
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….
3. What is the output for the following program?
#include<stdio.h>
main()
{
int i=1;
do
{
printf(“%d”,i);
}while(i=i-1);
}
…………………………………………………………………………………
…………………………………………………………………………………
…………………………………………………………………………………
4. Give the output of the following:
#include<stdio.h>
main()
{
int i=3;
while(i)
{
int x=100;
printf(“\n%d..%d”,i,x);
x=x+1;
i=i+1;
}
}
…………………………………………………………………………………
…………………………………………………………………………………
…………………………………………………………………………………
78
Decision and Loop
3.4 THE goto STATEMENT Control Statements
Here, label is an identifier that is used to label the statement to which control
will be transferred. The targeted statement must be preceded by the unique
label followed by colon.
label: statement;
goto can never be used to jump into the loop from outside and it should be
preferably used for forward jump.
Situations may arise, however, in which the goto statement can be useful. To
the possible extent, the use of the goto statement should generally be avoided.
Example 3.10
Write a program to print first 10 even numbers
#include<stdio.h>
main()
{
int i=2;
while(1)
{
printf(“%d ”,i);
i=i+2;
if(i>=20)
goto outside;
}
outside : printf(“over”);
}
OUTPUT
2 4 6 8 10 12 14 16 18 20 over
79
An Introduction to C
3.5 THE break STATEMENT
Sometimes, it is required to jump out of a loop irrespective of the conditional
test value. Break statement is used inside any loop to allow the control jump
to the immediate statement following the loop. The syntax is as follows:
break;
When nested loops are used, then break jumps the control from the loop
where it has been used. Break statement can be used inside any loop i.e.,
while, do-while, for and also in switch statement.
#include<stdio.h>
main()
{
int div,num,i;
printf(“Enter any number:\n”);
scanf(“%d”,&num);
for(i=2;i<=num;++i)
{
if((num % i) == 0)
{
printf(“Smallest divisor for number %d is %d”,num,i);
break;
}
}
}
OUTPUT
Enter any number:
9
Smallest divisor for number 9 is 3
In the above program, we divide the input number with the integer starting
from 2 onwards, and print the smallest divisor as soon as remainder comes
out to be zero. Since we are only interested in first smallest divisor and not all
divisors of a given number, so jump out of the for loop using break statement
without further going for the next iteration of for loop.
Break is different from exit. Former jumps the control out of the loop while
exit stops the execution of the entire program.
Let us see the program given below to know the working of the continue
statement.
Example 3.12
Write a program to print first 20 natural numbers skipping the numbers
divisible by 5.
#include<stdio.h>
main()
{
int i;
for(i=1;i<=20;++i)
{
if((i % 5) == 0)
continue;
printf(“%d ”,i);
}
}
OUTPUT
1 2 3 4 6 7 8 9 11 12 13 14 16 17 18 19
Here, the printf statement is bypassed each time when value stored in i is divisible
by 5.
#include<stdio.h>
main()
{
int i, n = 3;
for(i=3;n<=20;++n)
{
if(n%i == 0)
break;
if(i == n)
printf(“%d\n”,i);
}
}
…………………………………………………………………………………
…………………………………………………………………………………
…………………………………………………………………………………
3.7 SUMMARY
A program is usually not limited to a linear sequence of instructions. During
its process it may require to repeat execution of a part of code more than once
depending upon the requirements or take decisions. For that purpose, C
provides control and looping statements. In this unit, we had seen the
different looping statements provided by C language namely while,
do…while and for.
Using break statement, we can leave a loop even if the condition for its end is
not fulfilled. It can be used to end an infinite loop, or to force it to end before
its natural end. The continue statement causes the program to skip the rest of
the loop in the present iteration as if the end of the statement block would
have reached, causing it to jump to the following iteration.
Using the goto statement, we can make an absolute jump to another point in
the program. You should use this feature carefully since its execution ignores
any type of nesting limitation. The destination point is identified by a label,
82
Decision and Loop
which is then used as argument for the goto instruction. A label is made of a Control Statements
valid identifier followed by a colon (:).
2 hello
2 012
3 1
4 3..100
2..100
1..100
…..
…..
…...
till infinity
2 65
3 3
83
An Introduction to C
UNIT 4 ARRAYS AND STRINGS
Structure
4.0 Introduction
4.1 Objectives
4.2 Array Declaration
4.2.1 Syntax of Array Declaration
4.2.2 Size Specification
4.3 Array Initialization
4.3.1 Initialization of Array Elements in the Declaration
4.3.2 Character Array Initialization
4.4 Subscript
4.5 Processing the Arrays
4.6 Multi-Dimensional Arrays
4.6.1 Multi-Dimensional Array Declaration
4.6.2 Initialization of Two-Dimensional Arrays
4.7 Introduction to Strings
4.8 Declaration and Initialization of Strings
4.9 Display of Strings Using Different Formatting Techniques
4.10 Array of Strings
4.11 String Functions and Applications
4.12 Summary
4.13 Solutions / Answers
4.14 Further Readings
4.0 INTRODUCTION
C language provides four basic data types - int, char, float and double. We
have learnt about them in Unit 2. These basic data types are very useful; but
they can handle only a limited amount of data. As programs become larger and
more complicated, it becomes increasingly difficult to manage the data.
Variable names typically become longer to ensure their uniqueness. And, the
number of variable names makes it difficult for the programmer to concentrate
on the more important task of correct coding. Arrays provide a mechanism for
declaring and accessing several data items with only one identifier, thereby
simplifying the task of data management.
Many programs require the processing of multiple, related data items that have
common characteristics like list of numbers, marks in a course, or enrolment
numbers. This could be done by creating several individual variables. But this
is a hard and tedious process. For example, suppose you want to read in five
numbers and print them out in reverse order. You could do it the hard way as:
84
main n() Arrays and Strings
{
int al,a2,a3,a4,a5
a ;
scannf(“%d %d %d% %d %d”,&a1,&a2,&a3,& &a4,&a5);
printtf(“%d %d %d% %d %d”',a5,a4,a3,a2,a1);
}
Doess it look goood if the probblem is to read in 100 orr more relateed data itemss
and print
p them inn reverse ordder? Of courrse, the soluttion is the usse of the reguular
variaable names a1,
a a2 and so o on. But to remember eeach and every variable aand
perfoorm the operrations on thhe variables is
i not only teedious a job and
disaddvantageouss too. One coommon orgaanizing technnique is to usse arrays in
suchh situations. An
A array is a collectionn of similar kkind of data elements
e stoored
in addjacent memmory locationns and are referred to by a single arraay-name. In the
case of C, you have to declarre and define array befoore it can be used.
Decllaration and definition teell the compiiler the namee of the array, the type oof
eachh element, annd the size orr number off elements. To
T explain it, let us consiider
to store marks off five studennts. They cann be stored using
u five vaariables as
folloows:
int ar1,
a ar2, ar3, ar4, ar5;
Noww, if we wantt to do the saame thing foor 100 studennts in a classs then one wiill
find it difficult too handle 1000 variables. This
T can be obtained by using an arrray.
An array
a declaraation uses itss size in [] brrackets. For above exam
mple, we can
definne an array as:
a
int ar[100];
a
In th
he above figuure, as each integer value occupies 2 bytes, 200 bytes
b were
alloccated in the memory.
m
Thiss unit explainns the use off arrays, typees of arrays, declaration and
initiaalization witth the help of examples ini the first feew sections and
a later on
focuuses on stringg handling inn C program mming languaage.
4.1 OBJECTIVES
S
Afteer going through this unitt you will bee able to:
declare and use arrays of
o one dimennsion;
initialize arrrays; 85
An Introduction to C
use subscripts to access individual array elements;
write programs involving arrays;
do searching and sorting;
handle multi-dimensional arrays;
define, declare and initialize a string;
discuss various formatting techniques to display the strings; and
discuss various built-in string functions and their use in manipulation of
strings.
The declaration of an array is just like any variable declaration with additional
size part, indicating the number of elements of the array. Like other variables,
arrays must be declared at the beginning of a function.
The declaration specifies the base type of the array, its name, and its size or
dimension. In the following section we will see how an array is declared:
data-type array_name[constant-size];
Data-type refers to the type of elements you want to store
Constant-size is the number of elements
Write a program to declare and read values in an array and display them.
# include<stdio.h>
# define SIZE 5 /* SIZE is a symbolic constant */
main()
{
int i=0; /* Loop variable */
int stud_marks[SIZE]; /* array declaration */
OUTPUT:
val 1 is the value for the first array element,val 2 is the value for the second
element,and val n is the value for the n array element. Note that when you are
initializing the values at the time of declaration, then there is no need to specify
the size. Let us see some of the examples given below:
int digits [10]={1,2,3,4,5,6,7,8,9,10};
int digits[]={1,2,3,4,5,6,7,8,9,10};
int vector[5]={12,-2,33,21,13};
float temperature[10]={31.2,22.3,41.4,33.2,23.3,32.3,41.1,10.8,11.3,42.3};
double width[]={17.33333456,-1.212121213,222.191345 };
int height[10]={60,70,68,72,68 };
In the above two statements the assignments are done differently. The first
statement is not a string but simply an array storing three characters ‘T’,‘I’ and
‘N’ and is same as writing:
char thing[3]={‘T’,‘I’,‘N’};
88
Arrays and Strings
whereas,the second one is a four character string TIN\0. The change in the
first assignment, as given below, can make it a string.
char thing [4]=“TIN”;
Subscript is an integer type constant or variable name whose value ranges from
0 to SIZE - 1 where SIZE is the total number of elements in the array. Let us now see
how we can refer to individual elements of an array of size 5:
Here both arrays are of size 5. This is because the country is a char array and
initialized by a string constant “India” and every string constant is terminated
by a null character ‘\0’. And stud is an integer array. country array occupies 5
bytes of memory space whereas stud occupies size of 10 bytes of memory
space. The following table: 4.1 shows how individual array elements of
country and stud arrays can be referred:
Table 4.1: Reference of individual elements
Element Subscript country array stud array
no.
Reference Value Reference Value
1 0 country [0] ‘I’ stud [0] 1
2 1 country [1] ‘n’ stud [1] 2
3 2 country [2] ‘d’ stud [2] 3
4 3 country [3] ‘i’ stud [3] 4
5 4 country [4] ‘a’ stud [4] 5
Example 4.2
Write a program to illustrate how the marks of 10 students are read in an array
and then used to find the maximum marks obtained by a student in the class.
#include< stdio.h>
#define SIZE 10 /* SIZE is a symbolic constant */
main()
{
int i=0;
int max=0;
int stud_marks[SIZE]; /* array declaration */
/* find maximum */
for(i=0;i<SIZE;i ++)
{
if(stud_marks[i]>max)
max= stud_marks[i];
}
printf(“\n\nThe maximum of the marks obtained among all the 10 students is: %d
”,max);
}
OUTPUT
The maximum of the marks obtained among all the 10 students is: 49
Write a program to display the average marks of each student, given the marks
in 2 subjects for 3 students.
for(i=0;i<SIZE;i++)
{
total_marks[i]=stud_marks1[i]+ stud_marks2[i];
avg[i]=total_marks[i]/2;
printf(“Student no.=%d,Average= %f\n”,i+1,avg[i]);
}
}
OUTPUT
Let us now write another program to search an element using the linear search.
Example 4.4
Write a program to search an element in a given list of elements using Linear Search.
/* Linear Search*/
# include<stdio.h>
# define SIZE 05
main()
{
int i =0;
int j;
int num_list[SIZE]; /* array declaration */
OUTPUT
Example 4.5
Write a program to sort a list of elements using the selection sort method
#include <stdio.h>
#define SIZE 5
main()
{
int j,min_pos,tmp;
int i; /* Loop variable */
int a[SIZE]; /* array declaration */
for(i=0;i<SIZE;i++)
{
printf(“Element no.=%d”,i+1);
printf(“Value of the element: “);
scanf(“%d”,&a[i]);
}
for(i=0;i<SIZE;i++)
{
93
An Introduction to C min_pos=i;
for(j=i+1;j<SIZE;j++)
if(a[j] < a[min_pos])
min_pos= j;
tmp=a[i];
a[i]=a[min_pos];
a[min_pos]=tmp;
}
OUTPUT
94 ………………………………………………………………………………
Arrays and Strings
4.6 MULT
TI-DIME
ENSIONA
AL ARR
RAYS
Supppose that youu are writingg a chess-plaaying prograam. A chessbboard is an 8- 8
by-88 grid. What data structure would you use to reprresent it? Yoou could use an
arrayy that has a chessboard-l
c like structuree, i.e. a two-ddimensional array
a , to storre
the positions
p of the
t chess pieeces. Two-diimensional aarrays use tw wo indices too
pinp
point an indivvidual elemeent of the arrray. This is vvery similar to what is
calleed "algebraicc notation", commonly
c u
used in chesss circles to reecord gamess
and chess probleems.
In prrinciple, therre is no limitt to the numbber of subscripts(or dim
mensions) an
arrayy can have. Arrays
A with more than oneo dimensioon are calledd multi-
dimeensional arrayys. While hu umans cannot easily visuualize objectss with more
than three dimennsions, repreesenting multi-dimensionnal arrays prresents no
probblem to compputers. In praactice, howeever, the amoount of mem mory in a
comp
mputer tends to t place limiits on the sizze of an arrayy . A simple four-
dimeensional arraay of double-precision nuumbers, merrely twenty elements
e widde
in eaach dimensioon, takes up 20^4 * 8, orr 1,280,000 bbytes of mem mory - aboutt a
megabyte.
For example,
e 1 elementss.
yoou have ten rows and ten columns, foor a total of 100
It’s really
r no bigg deal. The first
fi number in brackets iis the numbeer of rows, thhe
secoond number in i brackets is the numbeer of columnss. So, the uppper left cornner
of anny grid woulld be elemennt [0][0]. Thee element too its right woould be [0][1],
and so on. Here is a little illuustration to help.
h
Threee-dimensionnal arrays(an nd higher) arre stored in tthe same way as the twoo-
dimeensional onees. They are kept in comp puter memorry as a lineaar sequence oof
variaables, and th
he last index is always thhe one that varies fastest((then the nexxt-
to-laast, and so onn).
In th
he above exaample, variabble_type is thet name of ssome type of variable, suuch
as in
nt. Also, sizee1 and size2 are the sizess of the arrayy’s first and second
dimeensions, resppectively. Heere is an exaample of defi fining an 8-by y-8 array off
integ
gers, similar to a chessbooard. Remem mber, becausse C arrays are a zero-baseed,
95
An Introduction to C
the indices on each side of the chessboard array run 0 through 7, rather than 1
through 8. The effect is the same: a two-dimensional array of 64 elements.
int chessboard [8][8];
The neutral order in which the initial values are assigned can be altered by
including the groups in {} inside main enclosing brackets, like the following
initialization as above:
int table [2][3]={{1,2,3},{4,5,6} };
The value within innermost braces will be assigned to those array elements
whose last subscript changes most rapidly. If there are few remaining values
in the row, they will be assigned zeros. The number of values cannot exceed
the defined row size.
int table [2] [3]={{1, 2, 3},{4}};
table[0][0]=1;
table[0][1]=2;
table[0][2]=3;
table[1][0]=4;
table[1][1]=0;
table[1][2]=0;
96
Arrays and Strings
Check Your Progress 3
1. Declare a multi-dimensioned array of floats called balances having three
rows and five columns.
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
2. Write a for loop to total the contents of the multi-dimensioned float array
balances.
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
3. Write a for loop which will read five characters(use scanf) and deposit
them into the character based array words, beginning at element 0.
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
For example,
char name[20];
char address[25];
char city[15];
Initialization of Strings
The string can be initialized as follows:
char name[8]={‘P’,‘R’,‘O’,‘G’,‘R’,‘A’,‘M’,‘\0’};
Each character of string occupies 1 byte of memory (on 16 bit computing). The
size of character is machine dependent, and varies from 16 bit computers to 64
bit computers. The characters of strings are stored in the contiguous (adjacent)
memory locations.
The C compiler inserts the NULL (\0) character automatically at the end of the
string. So initialization of the NULL character is not essential.
You can set the initial value of a character array when you declare it by
specifying a string literal. If the array is too small for the literal, the literal will
be truncated. If the literal (including its null terminator) is smaller than the
array, then the final characters in the array will be undefined. If you don’t
specify the size of the array, but do specify a literal, then C will set the array to
the size of the literal, including the null terminator.
98
char str[4]={‘u’, ‘n’, ‘i’, ‘x’}; Arrays and Strings
char str[5]={‘u’, ‘n’, ‘i’, ‘x’, ‘\0’};
char str[3];
char str[]=“UNIX”;
char str[4]=“unix”;
char str[9]=“unix”;
All of the above declarations are legal. But which ones don’t work? The first
one is a valid declaration, but will cause major problems because it is not null-
terminated. The second example shows a correct null-terminated string. The
special escape character \0 denotes string termination. The fifth example
suffers the size problem, the character array ‘str’ is of size 4 bytes, but it
requires an additional space to store ‘\0’. The fourth example however does
not. This is because the compiler will determine the length of the string and
automatically initialize the last character to a null-terminator. The strings not
terminated by a ‘\0’ are merely a collection of characters and are called as
character arrays.
String Constants
String constants have double quote marks around them, and can be assigned to
char pointers. Alternatively, you can assign a string constant to a char array -
either with no size specified, or you can specify a size, but don’t forget to leave
a space for the null character! Suppose you create the following two code
fragments and run them:
/* Fragment 1 */
{
char *s;
s=hello”;
printf(“%s\n”,s);
}
/* Fragment 2 */
{
char s[100];
strcpy(s,“ hello”);
printf(“%s\n”,s);
}
These two fragments produce the same output, but their internal behaviour is
quite different. In fragment 2, you cannot say s="hello";. To understand the
differences, you have to understand how the string constant table works in C.
When your program is compiled, the compiler forms the object code file,
which contains your machine code and a table of all the string constants
declared in the program. In fragment 1, the statement s="hello"; causes s to
point to the address of the string hello in the string constant table. Since this
string is in the string constant table, and therefore technically a part of the
executable code, you cannot modify it. You can only point to it and use it in a
read-only manner. In fragment 2, the string hello also exists in the constant
table, so you can copy it into the array of characters named s. Since s is not an
address, the statement s="hello"; will not work in fragment 2. It will not even
compile.
99
An Introduction to C Example 4.6
Write a program to read a name from the keyboard and display message Hello onto
the monitor”.
/*Program that reads the name and display the hello along with your name*/
#include <stdio.h>
main()
{
char name[10];
printf(“\nEnter Your Name :);
scanf(“%s”, name);
printf(“Hello %s\n”,name);
}
OUTPUT
In the above example declaration char name [10] allocates 10 bytes of memory
space(on 16 bit computing) to array name []. We are passing the base address
to scanf function and scanf() function fills the characters typed at the keyboard
into array until enter is pressed. The scanf() places ‘\0’ into array at the end of
the input. The printf() function prints the characters from the array on to
monitor, leaving the end of the string ‘\0’. The %s used in the scanf() and
printf() functions is a format specification for strings.
We can also specify the accuracy with which character array (string) is
displayed. For example, if you want to display first 5 characters from a field
width of 15 characters, you have to write as:
printf(“%15.5s”, name);
If you include minus sign in the format (e.g. % –10.5s), the string will be
printed left justified.
printf(“% -10.5s”, name);
Example 4.7
Write a program to display the string “UNIX” in the following format.
U
UN
UNI
UNIX
UNIX
UNI
100
UN Arrays and Strings
U
/* Program to display the string in the above shown format*/
# include<stdio.h>
main()
{
int x, y;
static char string[]=“UNIX”;
printf(“\n”);
for( x=0; x<4; x++)
{
y=x + 1;
/* reserves 4 character of space on to the monitor and minus sign is for left
justified*/
printf(“%-4.*s \n”, y, string);
U
UN
UNI
UNIX
UNIX
UNI
UN
U
0 1 2 3 4 5 6 7 8 9
m a r t i n \0
p h i l \0
c o l l i n s \0
Example 4.9
#include <stdio.h>
main()
{
int n;
char names[3][10]={“Alex”, “Phillip”, “Collins” };
for(n=0; n<3; n++)
printf(“%s \n”,names[n] ); }
OUTPUT
Alex
Phillip
Collins
Check Your Progress 4
1. Which of the following is a static string?
A. Static String;
B. “Static String”;
C. ‘Static String’;
D. char string[100];
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
2. Which character ends all strings?
A. ‘.’
B. ‘ ‘
C. ‘0’
D. ‘n’
………………………………………………………………………………
………………………………………………………………………………
102 ………………………………………………………………………………
Arrays and Strings
3. What is the Output of the following programs?
(a) main()
{
char name[10]=“IGNOU”;
printf(“\n %c”, name[0]);
printf(“\n %s”, name);
}
(b) main()
{
char s[]=“hello”;
int j=0;
while( s[j] !=‘\0’ )
printf(“ %c”,s[j++]);
}
(c) main()
{
char str[]=“hello”;
printf(“%10.2s”, str);
printf(“%-10.2s”, str);
}
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
4 Write a program to read 'n' number of lines from the keyboard using a
two-dimensional character array (ie., strings).
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
The header file <string.h> contains some string manipulation functions. The
following is a list of the common string managing functions in C.
where str is name of the string and n is the length of the string, returned by
strlen function.
Example 4.10
Write a program to read a string from the keyboard and to display the length of
the string on to the monitor by using strlen( ) function.
103
An Introduction to C /* Program to illustrate the strlen function to determine the length of a string */
#include <stdio.h>
#include <string.h>
main()
{
char name[80];
int length;
printf(“Enter your name: ”);
gets(name);
length=strlen(name);
printf(“Your name has %d characters\n”, length);
}
OUTPUT
Example 4.11
Write a program to read a string from the keyboard and copy the string onto
the second string and display the strings on to the monitor by using strcpy( )
function.
/* Program to illustrate strcpy function*/
#include <stdio.h>
#include <string.h>
main()
{
char first[80], second[80];
printf(“Enter a string: ”);
gets(first);
strcpy(second, first);
printf(“\n First string is : %s, and second string is: %s\n”, first, second);
}
OUTPUT
104
Arrays and Strings
4.11.3 Strcmp Function
The strcmp function in the string library function which compares two strings,
character by character and stops comparison when there is a difference in the
ASCII value or the end of any one string and returns ASCII difference of the
characters that is integer. If the return value zero means the two strings are
equal, a negative value means that first is less than second, and a positive value
means first is greater than second. The syntax is as follows:
n=strcmp(str1, str2);
where str1 and str2 are two strings to be compared and n is returned value of
differed characters.
Example 4.12
/* The following program uses the strcmp function to compare two strings. */
#include <stdio.h>
#include <string.h>
main()
{
char first[80], second[80];
int value;
printf(“Enter a string: ”);
gets(first);
printf(“Enter another string: ”);
gets(second);
value=strcmp(first,second);
if(value ==0)
puts(“The two strings are equal”);
else if(value < 0)
puts(“The first string is smaller ”);
else if(value > 0)
puts(“the first string is bigger”);
}
OUTPUT
where str1 and str2 are two string arguments, string str2 is appended to string
str1.
105
An Introduction to C Example 14.13
Write a program to read two strings and append the second string to the first
string.
#include <stdio.h>
#include <string.h>
main()
{
char first[80], second[80];
printf(“Enter a string:”);
gets(first);
printf(“Enter another string: ”);
gets(second);
strcat(first, second);
printf(“\nThe two strings joined together: %s\n”, first);
}
OUTPUT
Example 4.14
Write a program to convert the string into lower case characters using in-built
function.
/* Program that converts input string to lower case characters */
#include <stdio.h>
#include <string.h>
main()
{
char first[80];
printf("Enter a string: ");
gets(first);
printf("Lower case of the string is %s”, strlwr(first));
}
OUTPUT
Example 4.15
Write a program to reverse a given string.
/* Program to reverse a given string */
#include <stdio.h>
#include <string.h>
main()
{
char first[80];
printf(“Enter a string:”);
gets(first);
printf(“\n Reverse of the given string is : %s ”, strrev(first));
}
OUTPUT
where first and second are two strings to be compared, n is the number of
character from which first string does not match with second string.
Example 4.16
Write a program, which returns the position of the string from where first
string does not match with second string.
/*Program which returns the position of the string from where first string does
not match with second string*/
#include <stdio.h>
#include <string.h>
main()
{
char first[80], second[80];
printf("Enter first string: “);
gets(first);
printf(“\n Enter second string: “);
gets(second);
printf(“\n After %d characters there is no match”,strspn(first, second));
}
OUTPUT
stricmp function
The stricmp function is same as strcmp, except it compares two strings
ignoring the case(lower and upper case). The syntax is as follows:
n=stricmp(str1, str2);
strncmp function
The strncmp function is same as strcmp, except it compares two strings up to
a specified length. The syntax is as follows:
n=strncmp(str1, str2, 10);
where 10 characters of str1 and str2 are compared and n is returned value of
differed characters.
strchr function
The strchr funtion takes two arguments(the string and the character whose
address is to be specified) and returns the address of first occurrence of the
character in the given string. The syntax is as follows:
cp=strchr(str, c);
where str is string and c is character and cp is character pointer.
strset function
The strset funtion replaces the string with the given character. It takes two
arguments the string and the character. The syntax is as follows:
strset(first, ch);
where string first will be replaced by character ch.
strchr function
The strchr function takes two arguments(the string and the character whose
address is to be specified) and returns the address of first occurrence of the
character in the given string. The syntax is as follows:
cp=strchr(str, c);
where str is string and c is character and cp is character pointer.
strncat function
The strncat function is the same as strcat, except that it appends upto specified
length. The syntax is as follows:
108
Arrays and Strings
strncat(str1, str2,10);
where 10 character of the str2 string is added into str1 string.
strupr function
The strupr function converts lower case characters of the string to upper case
characters. The syntax is as follows:
strupr(str1);
where str1 is string to be converted into upper case characters.
strstr function
The strstr function takes two arguments address of the string and second
string as inputs. And returns the address from where the second string starts in
the first string. The syntax is as follows:
cp=strstr(first, second);
where first and second are two strings, cp is character pointer.
4.12 SUMMARY
Like other languages, C uses arrays as a way of describing a collection of
variables with identical properties. The group has a single name for all its
members, with the individual member being selected by an index. We have
learnt in this unit, the basic purpose of using an array in the program,
declaration of array and assigning values to the arrays and also the string
handling functions. All elements of the arrays are stored in the consecutive
memory locations. Without exception, all arrays in C are indexed from 0 up to
one less than the bound given in the declaration. This is very puzzling for a
beginner. Watch out for it in the examples provided in this unit. One important
point about array declarations is that they don't permit the use of varying
subscripts. The numbers given must be constant expressions which can be
evaluated at compile time, not run time. As with other variables, global and
static array elements are initialized to 0 by default, and automatic array
elements are filled with garbage values. In C, an array of type char is used to
represent a character string, the end of which is marked by a byte set to 0(also
known as a NULL character).
Whenever the arrays are passed to function their starting address is used to
access rest of the elements. This is called – Call by reference. Whatever
changes are made to the elements of an array in the function, they are also
made available in the calling part. The formal argument contains no size
specification except for the rightmost dimension. Arrays and pointers are
closely linked in C. Multi-dimensional arrays are simply arrays of arrays. To
use arrays effectively it is a good idea to know how to use pointers with them.
More about the pointers can be learnt from Unit -7 (Block -2).
Strings are sequence of characters. Strings are to be null-terminated if you
want to use them properly. Remember to take into account null-terminators
when using dynamic memory allocation. The string.h library has many useful
functions. Losing the ‘ \0’ character can lead to some very considerable bugs.
Make sure you copy \0 when you copy strings. If you create a new string, make
sure you put \0 in it. And if you copy one string to another, make sure the
receiving string is big enough to hold the source string, including \0. Finally, if
you point a character pointer to some characters, make sure they end with \0.
110
Arrays and Strings
String Functions Its Use
strlen Returns number of characters in string.
strlwr Converts all the characters in the string into lower case
strcat characters
strcpy Adds one string at the end of another string
strcmp Copies a string into another
strdup Compares two strings and returns zero if both are equal.
strchr Duplicates a string
strstr Finds the first occurrence of given character in a string
strset Finds the first occurrence of given string in another string
strrev Sets all the characters of string to given character or symbol
Reverse a string
1. B
2. C
3. (a) I
IGNOU
(b) hello
(c) hehe
1. D
2. C
3. /*Program to concatenate two strings without using the strcat() function*/
#include<stdio.h>
#include<string.h>
main()
{
char str1[10];
char str2[10];
char output_str[20];
int i,j,k;
i=0;
j=0;
k=0;
printf("Input the first string: ");
gets(str1);
112
printf("\nInput the second string: "); Arrays and Strings
gets(str2);
while(str1[i]!='\0'
output_str[k++]=str1[i++];
while(str2[j]!='\0')
output_str[k++]=str2[j++];
output_str[k]='\0';
puts(output_str);
}
4. /* Program to find the string length without using the strlen() funtion */
#include<stdio.h>
#include<string.h>
main()
{
char string[60];
int len,i;
len=0;
i=0;
printf("Input the string : ");
gets(string);
while(string[i++]!='\0')
len++;
printf("Length of Input String=%d",len);
getchar();
}
5. /* Program to convert the lower case letters to upper case in a given string
without using strupp() function*/
#include<stdio.h>
main()
{
int i=0;
char source[10],destination[10];
printf(“Input the string in lower-case”);
gets(source);
while(source[i]!=‘\0’)
{
if((source[i]>=97)&&(source[i]<=122))
destination[i]=source[i]-32;
else
destination[i]=source[i];
i++;
}
destination[i]=‘ \0 ’;
puts(destination);
}
114
MCS-201
Programming in C
Indira Gandhi National Open University
School of Computer and Information
Sciences (SOCIS)
and Python
Functions,structures,pointers,
and file handling in C 2
MCS-201
Block
2
FUNCTIONS, STRUCTURES, POINTERS AND FILE
HANDLING IN C
UNIT 5
FUNCTIONS 117
UNIT 6
STRUCTURES AND UNIONS 139
UNIT 7
POINTERS 155
UNIT 8
FILE HANDLING 177
BLOCK 2 INTRODUCTION
Any C program must have a main() function to contain the code executed by default
when the program is run. You can put as many user defined functions as you like in
the program to achieve the modularity in the programming. In C, all functions in a
program are “visible” to all other functions in that. Detail discussion regarding the
types of functions and their invoking is provided in Unit-5.
Pointers and arrays have a special relationship which is discussed in this unit.
The block contains a wide variety of programming examples to support the concepts
given in the material. Whenever possible, examples contain complete programs or
functions rather than incomplete program fragments. To get the maximum benefit
from this, it is necessary that you should understand and execute all the example
programs given in this block, as well, complete the assignment problems given in
the lab manual also.
Unit - 6 provides an overview of the user defined data-type called as the Structures.
Happy Programming!
Indira Gandhi
National Open University MCS-201
School of Computer and
Information Sciences PROGRAMMING IN
C AND PYTHON
Block
2
FUNCTIONS, STRUCTURES, POINTERS AND
FILE HANDLING IN C
UNIT 5
Functions
UNIT 6
Structures and Unions
UNIT 7
Pointers
UNIT 8
File Handling
Programme / Course Design Committee
Prof. Sanjeev K. Aggarwal, IIT, Kanpur
Prof. V.V. Subrahmanyam
Prof. M. Balakrishnan, IIT , Delhi Director
SOCIS, IGNOU, New Delhi
Prof Harish Karnick, IIT, Kanpur Prof P. Venkata Suresh
SOCIS, IGNOU, New Delhi
Prof. C. Pandurangan, IIT, Madras
Dr. Shashi Bhushan
Dr. Om Vikas, Sr. Director, MIT Associate Professor
SOCIS, IGNOU, New Delhi
Prof P. S. Grover, Sr. Consultant, Shri Akshay Kumar
Prof. (Retd.) S.K. Gupta Associate Professor
IIT, Delhi SOCIS, IGNOU, New Delhi
March, 2021
Indira Gandhi National Open University, 2021
ISBN-
All rights reserved. No part of this work may be reproduced in any form, by mimeograph or any other means,
without permission in writing from the Indira Gandhi National Open University.
Further information on the Indira Gandhi National Open University courses may be obtained from the
University’s office at Maidan Garhi, New Delhi-110 068.
Functions
UNIT 5 FUNCTIONS
Structure
5.0 Introduction
5.1 Objectives
5.2 Definition of a Function
5.3 Declaration of a Function
5.4 Function Prototypes
5.5 The Return Statement
5.6 Types of Variables and Storage Classes
5.6.1 Automatic Variables
5.6.2 External Variables
5.6.3 Static Variables
5.6.4 Register Variables
5.7 Types of Function Invoking
5.8 Call by Value
5.9 Recursion
5.10 Summary
5.11 Solutions / Answers
5.12 Further Readings
5.0 INTRODUCTION
To make programming simple and easy to debug, we break a larger program
into smaller subprograms which perform ‘well defined tasks’. These
subprograms are called functions. So far we have defined a single function
main().
After reading this unit you will be able to define many other functions and the
main() function can call up these functions from several different places within
the program, to carry out the required processing.
In this unit, we will discuss how functions are defined and how are they
accessed from the main program? We will also discuss various types of
functions and how to invoke them. And finally you will learn an interesting
and important programming technique known as Recursion, in which a
function calls within itself.
5.1 OBJECTIVES
After going through this unit, you will learn:
the need of functions in the programming; 117
Functions, Structures, how to define and declare functions in ‘C’ Language;
Pointers and
File Handling in C different types of functions and their purpose;
how the functions are called from other functions;
how data is transferred through parameter passing, to functions and the
Return statement;
recursive functions; and
the concept of ‘Call by Value’ and its drawbacks.
#include <stdio.h>
main ()
{
void sample();
printf(“\n You are in main”);
}
void sample()
{
printf(“\n You are in sample”);
}
OUTPUT
You are in sample
You are in main
where,
return data type is the same as the data type of the variable that is returned
by the function using return statement.
a function_name is formed in the same way as variable names / identifiers
are formed.
the list of arguments or parameters are valid variable names as shown
below, separated by commas: (data type1 var1,data type2 var2,…….. data
type n var n)
for example (int x, float y, char z).
arguments give the values which are passed from the calling function.
the body of function contains executable statements.
the return statement returns a single value to the calling function.
Example 5.2
/* square() function */
{
int square(int no) /*passing of argument */
int result ; /* local variable to function square */
result = no*no;
return(result); /* returns an integer value */
}
OUTPUT
For example,
/* square function */
int square(int no) /*passing of argument */
{
int result ; /* local variable to function square */
result = no*no;
return(result); /* returns an integer value */
}
120
Functions
OUTPUT
Points to remember:
Function prototype requires that the function declaration must include the
return type of function as well as the type and number of arguments or
parameters passed.
The variable names of arguments need not be declared in prototype.
The major reason to use this concept is that they enable the compiler to
check if there is any mismatch between function declaration and function
call.
Check Your Progress 1
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
return (expression);
We have seen in the square() function, the return statement, which returns an
integer value.
Points to remember:
121
Functions, Structures, You can pass any number of arguments to a function but can return only
Pointers and
File Handling in C one value at a time.
For example, the following are the valid return statements
a) return (5);
b) return (x*y);
For example, the following are the invalid return statements
c) return (2, 3);
d) return (x, y);
If a function does not return anything, void specifier is used in the function
declaration.
For example:
void square (int no)
{
int sq;
sq = no*no;
printf (“square is %d”, sq);
}
All the function’s return type is by default is “int”, i.e. a function returns
an integer value, if no type specifier is used in the function declaration.
What happens if a function has to return some value other than integer?
The answer is very simple: use the particular type specifier in the function
declaration.
For example consider the code fragments of function definitions below:
1) Code Fragment - 1
2) Code Fragment - 2
float func_float (……..)
{
float f;
…………..
…………..
…………..
122
return(f); Functions
}
Thus from the above examples, we see that you can return all the data types
from a function, the only condition being that the value returned using return
statement and the type specifier used in function declaration should match.
A function can have many return statements. This thing happens when
some condition based returns are required.
For example,
Points to remember:
# include <stdio.h>
main ( int argc, char * argv[ ])
{
int a, b;
double d;
printf(“%d”, argc);
a = 10;
b = 5;
d = (b * b) – (a/2);
printf(“%d, %d, %f”, a, b, d);
}
All the variables a, b, d, argc and argv [ ] have automatic storage class.
These are global and can be accessed by any function within its scope.
Therefore value may be assigned in one and can be written in another.
There is difference in external variable definition and declaration.
External Definition is the same as any variable declaration:
Usually lies outside or before the function accessing it.
It allocates storage space required.
Initial values can be assigned.
The external specifier is not required in external variable definition.
A declaration is required if the external variable definition comes after the
function definition.
A declaration begins with an external specifier.
Only when external variable is defined is the storage space allocated.
External variables can be assigned initial values as a part of variable
definitions, but the values must be constants rather than expressions.
If initial value is not included then it is automatically assigned a value of
zero.
125
Functions, Structures, Let us study these variables by a sample program given below:
Pointers and
File Handling in C Example 5.5
/* Program to illustrate the use of global variables*/
# include <stdio.h>
int gv; /*global variable*/
main ( )
{
void function1(); /*function declaration*/
gv = 10;
printf (“%d is the value of gv before function call\n”, gv);
function1();
printf (“%d is the value of gv after function call\n”, gv);
}
void function1 ( )
{
gv = 15: }
OUTPUT
The specifier precedes the declaration. Static and the value cannot be
accessed outside of their defining function.
The static variables may have same name as that of external variables but
the local variables take precedence in the function. Therefore external
variables maintain their independence with locally defined auto and static
variables.
Initial value is expressed as the constant and not expression.
Zeros are assigned to all variables whose declarations do not include
explicit initial values. Hence they always have assigned values.
Initialization is done only is the first execution.
Let us study this sample program to print value of a static variable:
Example 5.6
/* Program to illustrate the use of static variable*/
#include <stdio.h>
main()
{
int call_static();
126
int i,j; Functions
i=j=0;
j = call_static();
printf(“%d\n”,j);
j = call_static ();
printf(“%d\n”,j);
j = call_static();
printf(“%d\n”,j);
}
int call_static()
{
static int i=1;
int j;
j = i;
i++;
return(j);
}
OUTPUT
1
2
3
This is because i is a static variable and retains its previous value in next
execution of function call_static(). To remind you j is having auto storage
class. Both functions main and call_static have the same local variable i and j
but their values never get mixed.
register int m;
Points to remember:
These variables are stored in registers of computers. If the registers are
not available they are put in memory.
Usually 2 or 3 register variables are there in the program.
Scope is same as automatic variable, local to a function in which they are
declared.
Address operator ‘&’ cannot be applied to a register variable.
127
Functions, Structures, If the register is not available the variable is though to be like the
Pointers and
File Handling in C automatic variable.
Usually associated integer variable but with other types it is allowed
having same size (short or unsigned).
Can be formal arguments in functions.
Pointers to register variables are not allowed.
These variables can be used for loop indices also to increase efficiency.
Example 5.7
/* Program for illustration of the function with no arguments and no return value*/
#include <stdio.h>
main()
{
void message();
printf(“Control is in main\n”);
message(); /* Type 1 Function */
printf(“Control is again in main\n”);
}
void message()
{
printf(“Control is in message function\n”);
} /* does not return anything */
128
OUTPUT Functions
Control is in main
Control is in message function
Control is again in main
Example 5.8
Write a program to find the sum of the first ten natural numbers.
#include <stdio.h>
int cal_sum()
{
int i, s=0;
for (i=0; i<=10; i++)
s=s + i;
return(s); /* function returning sum of first ten natural numbers */
}
main()
{
int sum;
sum = cal_sum();
printf(“Sum of first ten natural numbers is % d\n”, sum);
}
OUTPUT
Before proceeding further, first we discuss the type of arguments or parameters here.
There are two types of arguments:
Actual arguments
Formal arguments
#include <stdio.h>
main()
129
Functions, Structures, {
Pointers and int a1, a2, a3;
File Handling in C void sum(int, int, int);
printf(“Enter three numbers: “);
scanf (“%d%d%d”,&a1,&a2,&a3);
sum (a1,a2,a3); /* Type 3 function */
}
OUTPUT
Here f1, f2, f3 are formal arguments and a1, a2, a3 are actual arguments.
Thus we see in the function declaration, the arguments are formal arguments, but
when values are passed to the function during function call, they are actual arguments.
Note: The actual and formal arguments should match in type, order and number
In this category two-way communication takes place between the calling and called
function i.e. a function returns a value and also arguments are passed to it. We modify
above Example according to this category.
Example 5.10
Write a program to calculate sum of three numbers.
#include <stdio.h>
main()
{
int a1, a2, a3, result;
int sum(int, int, int);
printf(“Please enter any 3 numbers:\n”);
scanf (“%d %d %d”, & a1, &a2, &a3);
result = sum (a1,a2,a3); /* function call */
printf (“Sum of the given numbers is : %d\n”, result);
}
OUTPUT
130
Please enter any 3 numbers: Functions
345
Sum of the given numbers is: 12
#include <stdio.h>
main()
{
int x, y, z;
int mul(int, int);
printf (“Enter two numbers: \n”);
scanf (“%d %d”,&x,&y);
z= mul(x, y); /* function call by value */
printf (“\n The product of the two numbers is : %d”, z);
}
OUTPUT
Now let us see what happens to the actual and formal arguments in memory.
main() function mul() function
131
Functions, Structures,
Pointers and
x
File Handling in C a
2 2
The variables are local
to the mul() function
which are created in
memory with the
3y 3 b function call and are
destroyed with the
return to the called
6 6 function
z c
What are meant by local variables? The answer is local variables are those which can
be used only by that function.
Let us discuss the second disadvantage more clearly using one example:
Example 5.12
Write a program to swap two values.
#include <stdio.h>
main()
{
int x = 2, y = 3;
void swap(int, int);
OUTPUT
x a a
2 2 3
t 2
y b b t
3 3 2
Here we observe that the changes which takes place in argument variables are not
reflected in the main() function; as these variables namely a, b and t will be destroyed
with function return.
All these disadvantages will be removed by using “call by reference”, which will
be discussed with the introduction of pointers in UNIT 11.
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
133
Functions, Structures,
Pointers and 5.9 RECURSION
File Handling in C
Within a function body, if the function calls itself, the mechanism is known as
‘Recursion’ and the function is known as ‘Recursive function’. Now let us
study this mechanism in detail and understand how it works.
Example 5.13
Write a program to find factorial of a number
#include <stdio.h>
main ()
{
int n, factorial;
int fact(int);
printf (“Enter any number:\n” );
scanf ("%d", &n);
factorial = fact ( n); /* function call */
printf (“Factorial is %d\n”, factorial);
}
OUTPUT
How it works?
Iterations:
1. i= 5 res = 1*5 = 5
2. i= 4 res = 5*4 = 20
3. i= 3 res = 20*4 = 60
4. i= 2 res = 60*2 = 120
134
5. i= 1 res = 120*1 = 120 Functions
Now let us write this function recursively. Before writing any function
recursively, we first have to examine the problem, that it can be implemented
through recursion.
That means this function calls itself but with value of argument decreased by ‘1’.
Example 5.14
Modify the program 8 using recursion.
OUTPUT
Enter any number: 5
Factorial is 120
How it works?
5*fact(4) 5*24
Returning Process
4*fact(3) 4*6(=24)
3*fact(2) 3*2*1(= 6)
2*fact(1) 2* 1(=2)
135
Functions, Structures,
Pointers and
File Handling in C 2*1 (It terminates here)
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
………………………………………………………………………………
5.10 SUMMARY
In this unit, we learnt about “Functions”: definition, declaration, prototypes,
types, function calls datatypes and storage classes, types function invoking and
lastly Recursion. All these subtopics must have given you a clear idea of how
to create and call functions from other functions, how to send values through
arguments, and how to return values to the called function. We have seen that
the functions, which do not return any value, must be declared as “void”,
return type. A function can return only one value at a time, although it can
have many return statements. A function can return any of the data type
specified in ‘C’.
Any variable declared in functions are local to it and are created with function
call and destroyed with function return. The actual and formal arguments
should match in type, order and number. A recursive function should have a
terminating condition i.e. function should return a value instead of a repetitive
function call.
2. #include <stdio.h>
main()
{
int x, y, z;
int mul(int, int); /* function prototype */
printf(“Enter two numbers”);
scanf(“%d %d”, &x, &y);
z = mul(x, y); /* function call */
printf(“result is %d”, z); }
void fib(int n)
{
int curr_term, int count = 0;
int first = 1;
int second = 1;
print(“%d %d”, curr_term);
count = 2;
while(count < = n)
{ curr_term = first + second;
printf(“%d”, curr_term);
first = second;
second = curr_term;
count++;
}
}
138
Structures and
UNIT 6 STRUCTURES AND UNIONS Unions
Structure
6.0 Introduction
6.1 Objectives
6.2 Declaration of Structures
6.3 Accessing the Members of a Structure
6.4 Initializing Structure Variables
6.5 Structures as Function Arguments
6.6 Structures and Arrays
6.7 Unions
6.8 Initializing an Union
6.9 Accessing the Members of an Union
6.10 Summary
6.11 Solutions / Answers
6.12 Further Readings
6.0 INTRODUCTION
We have seen so far how to store numbers, characters, strings, and even large sets of
these primitives using arrays, but what if we want to store collections of different
kinds of data that are somehow related. For example, a file about an employee will
probably have his/her name, age, the hours of work, salary, etc. Physically, all of that
is usually stored in someone’s filing cabinet. In programming, if you have lots of
related information, you group it together in an organized fashion. Let’s say you have
a group of employees, and you want to make a database! It just wouldn’t do to have
tons of loose variables hanging all over the place. Then we need to have a single data
entity where we will be able to store all the related information together. But this can’t
be achieved by using the arrays alone, as in the case of arrays, we can group multiple
data elements that are of the same data type, and is stored in consecutive memory
locations, and is individually accessed by a subscript. That is where the user-defined
datatype Structures come in.
Structure is commonly referred to as a user-defined data type. C’s structures allow
you to store multiple variables of any type in one place (the structure). A structure can
contain any of C’s data types, including arrays and other structures. Each variable
within a structure is called a member of the structure. They can hold any number of
variables, and you can make arrays of structures. This flexibility makes structures
ideally useful for creating databases in C. Similar to the structure there is another user
defined data type called Union which allows the programmer to view a single storage
in more than one way i.e., a variable declared as union can store within its storage
space, the data of different types, at different times. In this unit, we will be discussing
the user-defined data type structures and unions.
6.1 OBJECTIVES
After going through this unit you should be able to:
struct structure-tag {
datatype variable1;
datatype variable2;
dataype variable 3;
...
};
For example, consider the student database in which each student has a roll number,
name and course and the marks obtained. Hence to group this data with a structure-tag
as student, we can have the declaration of structure as:
struct student {
int roll_no;
char name[20];
char course[20];
int marks_obtained;
};
The point you need to remember is that, till this time no memory is allocated to the
structure. This is only the definition of structure that tells us that there exists a user-
defined data type by the name of student which is composed of the following
members. Using this structure type, we have to create the structure variables:
At this point, we have created two instances or structure variables of the user-defined
data type student. Now memory will be allocated. The amount of memory allocated
will be the sum of all the data members which form part of the structure template.
struct {
int roll_no;
char name[20];
char course[20];
int marks_obtained;
} stud1,stud2;
In this case, a tag name student is missing, but still it happens to be a valid declaration
of structure. In this case the two variables are allocated memory equivalent to the
members of the structure.
The advantage of having a tag name is that we can declare any number of variables of
the tagged named structure later in the program as per requirement.
If you have a small structure that you just want to define in the program, you can do
the definition and declaration together as shown below. This will define a structure of
type struct telephone and declare three instances of it.
140
Consider the example for declaring and defining a structure for the telephone billing Structures and
Unions
with three instances:
struct telephone{
int tele_no;
int cust_code;
char cust_address[40];
int bill_amt;
}tele1, tele2, tele3;
The structure can also be declared by using the typedefinition or typedef. This can be
done as shown below:
This defines a structure which can be referred to either as struct country or Country,
whichever you prefer. Strictly speaking, you don’t need a tag name both before and
after the braces if you are not going to use one or the other. But it is a standard
practice to put them both in and to give them the same name, but the one after the
braces starts with an uppercase letter.
The typedef statement doesn’t occupy storage: it simply defines a new type. Variables
that are declared with the typedef above will be of type struct country, just like
population is of type integer. The structure variables can be now defined as below:
structurevariable. member-name;
struct coordinate{
int x;
int y;
};
Thus, to have the structure named first refer to a screen location that has coordinates
x=50, y=100, you could write as,
first.x = 50;
first.y = 100;
To display the screen locations stored in the structure second, you could write,
Example 6.1
/*Program to store and retrieve the values from the student structure*/
#include<stdio.h>
struct student {
int roll_no;
char name[20];
char course[20];
int marks_obtained ;
};
main()
{
student s1 ;
printf(“Enter the student roll number:”);
scanf(“%d”,&s1.roll_no);
printf(“\nEnter the student name: “);
scanf(“%s”,s1.name);
printf(“\nEnter the student course”);
scanf(“%s”,s1.course);
printf(“Enter the student percentage\n”);
scanf(“%d”,&s1.marks_obtained);
printf(“\nData entry is complete”);
printf( “\nThe data entered is as follows:\n”);
printf(“\nThe student roll no is %d”,s1.roll_no);
printf(“\nThe student name is %s”,s1.name);
printf(“\nThe student course is %s”,s1.course);
printf(“\nThe student percentage is %d”,s1.marks_obtained);
}
OUTPUT
Another way of accessing the storing the values in the members of a structure is by
initializing them to some values at the time when we create an instance of the data
type.
142
Structures and
6.4 INITIALIZING STRUCTURE VARIABLES Unions
Like other C variable types, structures can be initialized when they’re declared. This
procedure is similar to that for initializing arrays. The structure declaration is followed
by an equal sign and a list of initialization values is separated by commas and
enclosed in braces. For example, look at the following statements for initializing the
values of the members of the mysale structure variable.
Example 6.2
struct sale {
char customer[20];
char item[20];
float amt;
} mysale = { "XYZ Industries",
“toolskit",
600.00
};
In a structure that contains structures as members, list the initialization values in order.
They are placed in the structure members in the order in which the members are listed
in the structure definition. Here’s an example that expands on the previous one:
Example 6.3
struct customer {
char firm[20];
char contact[25];
}
struct sale {
struct customer buyer1;
char item [20];
float amt;
} mysale = {
{ "XYZ Industries", "Tyran Adams"},
"toolskit",
600.00
};
For example let us consider the following program where the data members are
initialized to some value.
Example 6.4
Write a program to access the values of the structure initialized with some initial
values.
143
Functions, Structures, /* Program to illustrate to access the values of the structure initialized with some
Pointers and initial values*/
File Handling in C
#include<stdio.h>
struct telephone{
int tele_no;
int cust_code;
char cust_name[20];
char cust_address[40];
int bill_amt;
};
main()
{
struct telephone tele = {2314345,
5463,
"Ram",
"New Delhi",
2435 };
OUTPUT
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
144
Structures and
3. Why does size of report a larger size than, one expects, for a structure type, as if Unions
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………….
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
Example 6.5
#include <stdio.h>
struct data{
float amt;
char fname [30];
char lname [30];
} per;
main()
{
void print_per(struct data x);
printf(“Enter the donor’s first and last names separated by a space:”);
scanf(“%s %s”, per.fname, per.lname);
printf(“\nEnter the amount donated in rupees:”); 145
Functions, Structures, scanf(“%f”, &per.amt);
Pointers and print_per(per);
File Handling in C return 0;
}
OUTPUT
Enter the donor’s first and last names separated by a space: RAVI KANT
Enter the amount donated in rupees: 1000.00
RAVI KANT gave donation of the amount Rs. 1000.00.
You can also pass a structure to a function by passing the structure’s address(that is, a
pointer to the structure which we will be discussing in the next unit). In fact, in the
older versions of C, this was the only way to pass a structure as an argument. It is not
necessary now, but you might see the older programs that still use this method. If you
pass a pointer to a structure as an argument, remember that you must use the indirect
membership operator () to access structure members in the function.
Please note the following points with respect to passing the structure as a parameter to
a function.
The return value of the called function must be declared as the value that is being
returned from the function. If the function is returning the entire structure then the
return value should be declared as struct with appropriate tag name.
The actual and formal parameters for the structure data type must be the same as
the struct type.
The return statement is required only when the function is returning some data.
When the return values of type is struct, then it must be assigned to the structure
of identical type in the calling function.
Let us consider another example as shown in the Example 6.6, where structure salary
has three fields related to an employee, namely - name, no_days_worked and
daily_wage. To accept the values from the user we first call the function get_data that
gets the values of the members of the structure. Then using the wages function we
calculate the salary of the person and display it to the user.
Example 6.6
Write a program to accept the data from the user and calculate the salary of the person
using concept of functions.
/* Program to accept the data from the user and calculate the salary of the person*/
#include<stdio.h>
main()
{
struct sal {
char name[30];
int no_days_worked;
int daily_wage; };
struct sal salary;
struct sal get_dat(struct); /* function prototype*/
float wages(struct); /*function prototype*/
float amount_payable; /* variable declaration*/
146
salary = get_data(salary); Structures and
Unions
printf(“The name of employee is %s”,salary.name);
printf(“Number of days worked is %d”,salary.no_daya_worked);
printf(“The daily wage of the employees is %d”,salary.daily_wage);
amount_payable = wages(salary);
printf(“The amount payable to %s is %f”,salary.name,amount_payable);
}
float wages(struct)
{
struct sal amt;
int total_salary ;
total_salary = amt.no_days_worked * amt.daily_wages;
return(total_salary); }
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
2. How can I pass constant values to functions which accept structure arguments?
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
…………………………………………………………………………………..
3. What will be the output of the program?
#include<stdio.h>
main()
{
struct pqr{
int x ;
};
struct pqr pqr ; 147
Functions, Structures, pqr.x =10 ;
Pointers and printf(“%d”, pqr.x);
File Handling in C }
…………………………………………………………………………………………
…………………………………………………………………………………………
…………………………………………………………………………………………
So, revising the array for a few moments we would refresh the fact that an array is
simply a collection of homogeneous data types. Hence, if we make a declaration as:
int temp[20];
It simply means that temp is an array of twenty elements where each element is of
type integer, indicating homogenous data type. Now in the same manner, to extend the
concept a bit further to the structure variables, we would say,
It means that stud is an array of twenty elements where each element is of the type
struct student (which is a user-defined data type we had defined earlier). The various
members of the stud array can be accessed in the similar manner as that of any other
ordinary array.
For example,
struct student stud[20], we can access the roll_no of this array as
stud[0].roll_no;
stud[1].roll_no;
stud[2].roll_no;
stud[3].roll_no;
…
…
…
stud[19].roll_no;
Please remember the fact that for an array of twenty elements the subscripts of the
array will be ranging from 0 to 19 (a total of twenty elements). So let us now start by
seeing how we will write a simple program using array of structures.
Example 6.7
#include <stdio.h>
struct student { int roll_no;
char name[20];
char course[20];
int marks_obtained ;
};
main()
{
struct student stud [20];
int i;
printf(“Enter the student data one by one\n”);
for(i=0; i<=19; i++)
{
printf(“Enter the roll number of %d student”,i+1);
scanf(“%d”,&stud[i].roll_no);
printf(“Enter the name of %d student”,i+1);
scanf(“%s”,stud[i].name);
printf(“Enter the course of %d student”,i+1);
scanf(“%d”,stud[i].course);
printf(“Enter the marks obtained of %d student”,i+1);
scanf(“%d”,&stud[i].marks_obtained);
}
printf(“the data entered is as follows\n”);
for(i=0;i<=19;i++)
{
printf(“The roll number of %d student is %d\n”,i+1,stud[i].roll_no);
printf(“The name of %d student is %s\n”,i+1,stud[i].name);
printf(“The course of %d student is %s\n”,i+1,stud[i].course);
printf(“The marks of %d student is %d\n”,i+1,stud[i].marks_obtained);
}
}
The above program explains to us clearly that the array of structure behaves as any
other normal array of any data type. Just by making use of the subscript we can access
all the elements of the structure individually.
Extending the above concept where we can have arrays as the members of the
structure. For example, let’s see the above example where we have taken a structure
for the student record. Hence in this case it is a real world requirement that each
student will be having marks of more than one subject. Hence one way to declare the
structure, if we consider that each student has 3 subjects, will be as follows:
struct student {
int roll_no;
char name[20];
char course[20];
int subject1 ;
int subject2;
int subject3;
};
The above described method is rather a bit cumbersome, so to make it more efficient
we can have an array inside the structure, that is, we have an array as the member of
the structure.
struct student {
149
Functions, Structures, int roll_no;
Pointers and char name[20];
File Handling in C char course[20];
int subject[3] ;
};
Hence to access the various elements of this array we can the program logic as
follows:
Example 6.8
/*Program to read and print data related to five students having marks of three
subjects each using the concept of arrays */
#include<stdio.h>
struct student {
int roll_no;
char name[20];
char course[20];
int subject[3] ;
};
main()
{
struct student stud[5];
int i,j;
printf(“Enter the data for all the students:\n”);
for(i=0;i<=4;i++)
{
printf(“Enter the roll number of %d student”,i+1);
scanf(“%d”,&stud[i].roll_no);
printf(“Enter the name of %d student”,i+1);
scanf(“%s”,stud[i].name);
printf(“Enter the course of %d student”,i+1);
scanf(“%s”,stud[i].course);
for(j=0;j<=2;j++)
{
printf(“Enter the marks of the %d subject of the student %d:\n”,j+1,i+1);
scanf(“%d”,&stud[i].subject[j]);
}
}
printf(“The data you have entered is as follows:\n”);
for(i=0;i<=4;i++)
{
printf(“The %d th student's roll number is %d\n”,i+1,stud[i].roll_no);
printf(“The %d the student's name is %s\n”,i+1,stud[i].name);
printf(“The %d the student's course is %s\n”,i+1,stud[i].course);
for(j=0;j<=2;j++)
{
printf(“The %d the student's marks of %d I subject are %d\n”,i+1, j+1,
stud[i].subject[j]);
}
}
printf(“End of the program\n”);
}
Hence as described in the example above, the array as well as the arrays of structures
can be used with efficiency to resolve the major hurdles faced in the real world
programming environment.
150
Structures and
6.7 UNIONS Unions
Structures are a way of grouping homogeneous data together. But it often happens that
at any time we require only one of the member’s data. For example, in case of the
support price of shares you require only the latest quotations. And only the ones that
have changed need to be stored. So if we declare a structure for all the scripts, it will
only lead to crowding of the memory space. Hence it is beneficial if we allocate space
to only one of the members. This is achieved with the concepts of the UNIONS.
UNIONS are similar to STRUCTURES in all respects but differ in the concept of
storage space.
A UNION is declared and used in the same way as the structures. Yet another
difference is that only one of its members can be used at any given time. Since all
members of a Union occupy the same memory and storage space, the space allocated
is equal to the largest data member of the Union. Hence, the member which has been
updated last is available at any given time.
For example a union can be declared using the syntax shown below:
union union-tag {
datatype variable1;
datatype variable2;
...
};
For example,
union temp{
int x;
char y;
float z;
};
In this case a float is the member which requires the largest space to store its value
hence the space required for float(4 bytes) is allocated to the union. All members
share the same space. Let us see how to access the members of the union.
Example 6.9
151
Functions, Structures,
Pointers and
6.8 INITIALIZING AN UNION
File Handling in C
Let us see, how to initialize a Union with the help of the following example:
Example 6.10
union date_tag {
char complete_date [9];
struct part_date_tag {
char month[2];
char break_value1;
char day[2];
char break_value2;
char year[2];
} parrt_date;
}date = {“01/01/05”};
#include<stdio.h>
main()
{
union{
struct{
char x;
char y;
char z;
char w;
}xyz;
struct{
int p;
int q ;
}pq;
long a ;
float b;
double d;
}prq;
printf (“%d”,sizeof(prq));
}
152
Structures and
6.10 SUMMARY Unions
In this unit, we have learnt how to use structures, a data type that you design to meet
the needs of a program. A structure can contain any of C’s data types, including other
structures, pointers, and arrays. Each data item within a structure, called a member, is
accessed using the structure member operator (.) between the structure name and the
member name. Structures can be used individually, and can also be used in arrays.
Unions were presented as being similar to structures. The main difference between a
union and a structure is that the union stores all its members in the same area. This
means that only one member of a union can be used at a time.
3. Structures may have this padding (as well as internal padding), to ensure that
alignment properties will be preserved when an array of contiguous structures is
allocated. Even when the structure is not part of an array, the end padding remains,
so that sizeof can always return a consistent size.
4. struct date {
char month[2];
char day[2];
char year[4];
} current_date;
2. C has no way of generating anonymous structure values. You will have to use a
temporary structure variable or a little structure - building function.
3. 10
Check Your Progress 3
1. 8 153
Functions, Structures,
Pointers and
6.12 FURTHER READINGS
File Handling in C
154
Pointers
UNIT 7 POINTERS
Structure
7.0 Introduction
7.1 Objectives
7.2 Pointers and their Characteristics
7.3 Address and Indirection Operators
7.4 Pointer Type Declaration and Assignment
7.4.1 Pointer to a Pointer
7.4.2 Null Pointer Assignment
7.5 Pointer Arithmetic
7.6 Passing Pointers to Functions
7.6.1 A Function Returning More than One Value
7.6.2 Function Returning a Pointer
7.7 Arrays and Pointers
7.8 Array of Pointers
7.9 Pointers and Strings
7.10 Summary
7.11 Solutions / Answers
7.12 Further Readings
7.0 INTRODUCTION
C uses pointers in three main ways. First, they are used to create dynamic data
structures: data structures built up from blocks of memory allocated from the heap at
run-time. Second, C uses pointers to handle variable parameters passed to functions.
And third, pointers in C provide an alternative means of accessing information stored
in arrays, which is especially valuable when you work with strings.
A normal variable is a location in memory that can hold a value. For example, when
you declare a variable i as an integer, four bytes of memory is set aside for it. In your
program, you refer to that location in memory by the name i. At the machine level,
that location has a memory address, at which the four bytes can hold one integer value.
A pointer is a variable that points to another variable. This means that it holds the
memory address of another variable. Put another way, the pointer does not hold a
value in the traditional sense; instead, it holds the address of another variable. It points
to that other variable by holding its address.
Because a pointer holds an address rather than a value, it has two parts. The pointer
itself holds the address. That addresses points to a value. There is the pointer and the
value pointed to. As long as you’re careful to ensure that the pointers in your
programs always point to valid memory locations, pointers can be useful, powerful,
and relatively trouble-free tools. 155
Functions, Structures,
Pointers and We will start this unit with a basic introduction to pointers and the concepts
File Handling in C surrounding pointers, and then move on to the three techniques described above.
Thorough knowledge of the pointers is very much essential for your future courses
like the data structures etc..
7.1 OBJECTIVES
Example 7.1
Write a program to know the size of the various data types on your system.
# include <stdio.h>
main()
{
printf(“n Size of a int = %d bytes”, sizeof(int));
printf(“\n Size of a float = %d bytes”, sizeof(float));
printf(“\n Size of a char = %d bytes”, sizeof(char));
}
OUTPUT
An ordinary variable is a location in memory that can hold a value. For example,
when you declare a variable num as an integer, the compiler sets aside 2 bytes of
memory (depends up the PC) to hold the value of the integer. In your program, you
refer to that location in memory by the name num. At the machine level that location
has a memory address.
156
int num = 100; Pointers
We can access the value 100 either by the name num or by its memory address. Since
addresses are simply digits, they can be stored in any other variable. Such variables
that hold addresses of other variables are called Pointers. In other words, a pointer is
simply a variable that contains an address, which is a location of another variable in
memory. A pointer variable “points to” another variable by holding its address.
Since a pointer holds an address rather than a value, it has two parts. The pointer
itself holds the address. That addresses points to a value. There is a pointer and the
value pointed to. This fact can be a little confusing until you get comfortable with it,
but once you get familiar with it, then it is extremely easy and very powerful. One
good way to visualize this concept is to examine the figure 7.1 given below:
num
2 bytes – integer variable
ch
1 byte – character variable
temp
ptr1
2 bytes – int pointer variable
ptr2
2 bytes – char pointer variable
i. The program execution time will be faster as the data is manipulated with the
help of addresses directly.
ii. Will save the memory space.
iii. The memory access will be very efficient.
iv. Dynamic memory is allocated.
Now we will consider how to determine the address of a variable. The operator that is
available in C for this purpose is “&” (address of ) operator. The operator & and the
immediately preceding variable returns the address of the variable associated with it.
C’s other unary pointer operator is the “*”, also called as value at address or
indirection operator. It returns a value stored at that address. Let us look into the
illustrative example given below to understand how they are useful.
157
Functions, Structures,
Example 7.2
Pointers and
File Handling in C Write a program to print the address associated with a variable and value
stored at that address.
/* Program to print the address associated with a variable and value stored at that
address*/
# include <stdio.h>
main()
{
int qty = 5;
printf("Address of qty = %u\n",&qty);
printf("Value of qty = %d \n",qty);
printf("Value of qty = %d",*(&qty));
}
OUTPUT
Look at the printf statement carefully. The format specifier %u is taken to increase
the range of values the address can possibly cover. The system-generated address of
the variable is not fixed, as this can be different the next time you execute the same
program. Remember unary operator operates on single operands. When & is
preceded by the variable qty, has returned its address. Note that the & operator can
be used only with simple variables or array elements. It cannot be applied to
expressions, constants, or register variables.
Observe the third line of the above program. *(&qty) returns the value stored at
address 65524 i.e. 5 in this case. Therefore, qty and *(&qty) will both evaluate to 5.
We have seen in the previous section that &qty returns the address of qty and this
address can be stored in a variable as shown below:
ptr = &qty;
In C, every variable must be declared for its data type before it is used. Even this
holds good for the pointers too. We know that ptr is not an ordinary variable like any
integer variable. We declare the data type of the pointer variable as that of the type of
the data that will be stored at the address to which it is pointing to. Since ptr is a
variable, which contains the address of an integer variable qty, it can be declared as:
int *ptr;
158
ptr qty Variable Pointers
Example 7.3
# include <stdio.h>
main()
{
int qty = 5;
int *ptr; /* declares ptr as a pointer variable that points to an integer variable
*/
ptr = &qty; /* assigning qty’s address to ptr -> Pointer Assignment */
OUTPUT
/* Program that tries to reference the value of a pointer even though the pointer is
uninitialized */
# include <stdio.h>
main()
{
int *p; /* a pointer to an integer */
*p = 10;
printf(“the value is %d”, *p);
printf(“the value is %u”,p);
}
This gives you an error. The pointer p is uninitialized and points to a random location
in memory when you declare it. It could be pointing into the system stack, or the
global variables, or into the program’s code space, or into the operating system.
159
Functions, Structures,
When you say *p=10; the program will simply try to write a 10 to whatever random
Pointers and location p points to. The program may explode immediately. It may subtly corrupt
File Handling in C data in another part of your program and you may never realize it. Almost always, an
uninitialized pointer or a bad pointer address causes the fault.
This can make it difficult to track down the error. Make sure you initialize all
pointers to a valid address before dereferencing them.
Example 7.5
Let us say,
# include <stdio.h>
main()
{
int *p; /* a pointer to an integer */
int x;
p = &x;
*p=10;
printf("The value of x is %d",*p);
printf("\nThe address in which the x is stored is %d",p);
}
OUTPUT
The value of x is 10
The address in which the x is stored is 52004
This statement puts the value of 20 at the memory location whose address is the value
of px. As we know that the value of px is the address of x and so the old value of x is
replaced by 20. This is equivalent to assigning 20 to x. Thus we can change the value
of a variable indirectly using a pointer and the indirection operator.
Example 7.6
# include<stdio.h>
main()
{
160
int i = 100; Pointers
int *pi;
int **pii;
pi = &i;
pii = π
OUTPUT
Address of i = 65524
Address of i = 65524
Address of i = 65524
Address of pi = 65522
Address of pi = 65522
Address of pii = 65520
Value of i = 100
Value of i = 100
Value of i = 100
Value of i = 100
Consider the following memory map for the above shown example:
pii pi i Variable
65522 65524 100 Value
Example 7.7
# include<stdio.h>
# define NULL 0
161
Functions, Structures,
main()
Pointers and {
File Handling in C int *pi = NULL;
printf(“The value of pi is %u”, pi);
}
OUTPUT
The value of pi is 0
1. How is a pointer variable being declared? What is the purpose of data type
included in the pointer declaration?
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
2. What would be the output of following programs?
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
3. Explain the effect of the following statements:
(iii) int x;
void *ptr = &x;
*(int *) ptr = 10;
…………………………………………………………………………………………
…………………………………………………………………………………………
…………………………………………………………………………………………
162
Pointers
ptr1 = ptr2 + 3;
ptr ++;
-- ptr;
However, ptr++ will cause the pointer ptr to point the next address value of its type.
For example, if ptr is a pointer to float with an initial value of 65526, then after the
operation ptr ++ or ptr = ptr+1, the value of ptr would be 65530. Therefore, if we
increment or decrement a pointer, its value is increased or decreased by the length of
the data type that it points to.
2. If ptr1 and ptr2 are properly declared and initialized pointers, the following
operations are valid:
Note that there is a blank space between / and * in the last statement because if you
write /* together, then it will be considered as the beginning of a comment and the
statement will fail.
3. Expressions like ptr1 == ptr2, ptr1 < ptr2, and ptr2 != ptr1 are permissible
provided the pointers ptr1 and ptr2 refer to same and related variables. These
comparisons are common in handling arrays.
Suppose p1 and p2 are pointers to related variables. The following operations cannot
work with respect to pointers:
163
Functions, Structures,
In the first method, when arguments are passed by value, a copy of the values of
Pointers and actual arguments is passed to the calling function. Thus, any changes made to the
File Handling in C variables inside the function will have no effect on variables used in the actual
argument list.
However, when arguments are passed by reference (i.e. when a pointer is passed as
an argument to a function), the address of a variable is passed. The contents of that
address can be accessed freely, either in the called or calling function. Therefore, the
function called by reference can change the value of the variable used in the call.
Example 7.8
Write a program to swap the values using the pass by value and pass by reference
methods.
/* Program that illustrates the difference between ordinary arguments, which are
passed by value, and pointer arguments, which are passed by reference */
# include <stdio.h>
main()
{
int x = 10;
int y = 20;
void swapVal( int, int ); /* function prototype */
void swapRef( int *, int * ); /*function prototype*/
printf("PASS BY VALUE METHOD\n");
printf("Before calling function swapVal x=%d y=%d",x,y);
swapVal(x, y); /* copy of the arguments are passed */
printf("\nAfter calling function swapVal x=%d y=%d",x,y);
printf("\n\nPASS BY REFERENCE METHOD");
printf("\nBefore calling function swapRef x=%d y=%d",x,y);
swapRef(&x,&y); /*address of arguments are passed */
printf("\nAfter calling function swapRef x=%d y=%d",x,y);
}
In the function swapVal, arguments x and y are passed by value. So, any changes to
the arguments are local to the function in which the changes occur. Note the values of
x and y remain unchanged even after exchanging the values of x and y inside the
function swapVal.
Now consider the function swapRef. This function receives two pointers to integer
variables as arguments identified as pointers by the indirection operators that appear
in argument declaration. This means that in the function swapRef, arguments x and y
are passed by reference. So, any changes made to the arguments inside the function
swapRef are reflected in the function main(). Note the values of x and y is
interchanged after the function call swapRef.
Example 7.9
Write a program to find the perimeter and area of a rectangle, if length and breadth
are given by the user.
#include <stdio.h>
void main()
{
float len,br;
float peri, ar;
void periarea(float length, float breadth, float *, float *);
printf("\nEnter the length and breadth of a rectangle in metres: \n");
scanf("%f %f",&len,&br);
periarea(len,br,&peri,&ar);
printf("\nPerimeter of the rectangle is %f metres", peri);
printf("\nArea of the rectangle is %f sq. metres", ar);
}
Here in the above program, we have seen that the function periarea is returning two
values. We are passing the values of len and br but, addresses of peri and ar. As we
are passing the addresses of peri and ar, any change that we make in values stored at
addresses contained in the variables *perimeter and *area, would make the change
effective even in main() also.
Example: 7.10
# include<stdio.h>
void main()
{
float *a;
float *func(); /* function prototype */
a = func();
printf("Address = %u", a);
}
float *func()
{
float r = 5.2;
return(&r);
}
OUTPUT
Address = 65516
This program only shows how a function can return a pointer. This concept will be
used later while handling arrays.
1. Tick mark( )whether each of the following statements are true or false.
(v) A function can return more than one value. True False
Pointers and arrays are so closely related. An array declaration such as int arr[ 5 ]
will lead the compiler to pick an address to store a sequence of 5 integers, and arr is a
name for that address. The array name in this case is the address where the sequence
of integers starts. Note that the value is not the first integer in the sequence, nor is it
the sequence in its entirety. The value is just an address.
Now, if arr is a one-dimensional array, then the address of the first array element can
be written as &arr[0] or simply arr. Moreover, the address of the second array
element can be written as &arr[1] or simply (arr+1). In general, address of array
element (i+1) can be expressed as either &arr[ i] or as (arr+ i). Thus, we have two
different ways for writing the address of an array element. In the latter case i.e,
expression (arr+ i) is a symbolic representation for an address rather than an
arithmetic expression. Since &arr[ i] and (ar+ i) both represent the address of the ith
element of arr, so arr[ i] and *(ar + i) both represent the contents of that address i.e.,
the value of ith element of arr.
However, we can assign the value of one array element to another through a pointer,
for example,
Example 7.11
# include<stdio.h>
main()
{
Note that i is added to a pointer value (address) pointing to integer data type (i.e., the
array name) the result is the pointer is increased by i times the size (in bytes) of
integer data type. Observe the addresses 65516, 65518 and so on. So if ptr is a char
pointer, containing addresses a, then ptr+1 is a+1. If ptr is a float pointer, then ptr+
1 is a+ 4.
y
(arr+1) 4 5 6 Second 1-d array
*(arr + 2) *(*(arr+2) + 2)
The way there can be an array of integers, or an array of float numbers, similarly,
there can be array of pointers too. Since a pointer contains an address, an array of
pointers would be a collection of addresses. For example, a multidimensional array
can be expressed in terms of an array of pointers rather than a pointer to a group of
contiguous arrays.
int *arr[3];
168
rather than the conventional array definition, Pointers
int arr[3][5];
The subscript1, subscript2 indicate the maximum number of elements associated with
each subscript.
Example 7.12
# include <stdio.h>
# include <stdlib.h>
# define MAXROWS 3
void main()
{
int *ptr1[MAXROWS], *ptr2 [MAXROWS], *ptr3 [MAXROWS];
int rows, cols, i, j;
void inputmat(int *[ ], int, int);
void dispmat(int *[ ], int, int);
void calcdiff(int *[ ], int *[ ], int *[ ], int, int);
OUTPUT
In this program, ptr1, ptr2, ptr3 are each defined as an array of pointers to integers.
Each array has a maximum of MAXROWS elements. Since each element of ptr1,
ptr2, ptr3 is a pointer, we must provide each pointer with enough memory for each
row of integers. This can be done using the library function malloc included in
stdlib.h header file as follows:
170
This function reserves a block of memory whose size(in bytes) is equivalent to cols * Pointers
sizeof(int). Since cols = 3, so 3 * 2(size of int data type) i.e., 6 is allocated to each
ptr1[ 1 ], ptr1[ 2 ] and ptr1[ 3 ]. This malloc function returns a pointer of type void.
This means that we can assign it to any type of pointer. In this case, the pointer is
type-casted to an integer type and assigned to the pointer ptr1[ 1 ], ptr1[ 2 ] and
ptr1[ 3 ]. Now, each of ptr1[ 1 ], ptr1[ 2 ] and ptr1[ 3 ] points to the first byte of the
memory allocated to the corresponding set of one-dimensional integer arrays of the
original two-dimensional array.
The process of calculating and allocating memory at run time is known as dynamic
memory allocation. The library routine malloc can be used for this purpose.
Instead of using conventional array notation, pointer notation has been used for
accessing the address and value of corresponding array elements which has been
explained to you in the previous section. The difference of the array elements within
the function calcdiff is written as
Each initialize a variable to the string “INDIA”. The second declaration creates a
pointer variable country that points to the letter I in the string "INDIA" somewhere in
memory.
Once the base address is obtained in the pointer variable country, *country would
yield the value at this address, which gets printed through,
printf("%s", *country);
Here is a program that dynamically allocates memory to a character pointer using the
library function malloc at run-time. An advantage of doing this way is that a fixed
block of memory need not be reserved in advance, as is done when initializing a
conventional character array.
Example 7.13
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
main()
171
Functions, Structures,
{
Pointers and char *palin, c;
File Handling in C int i, count;
i = i-1;
palin[i] = '\0';
count = i;
if(palindrome(palin,count) == 1)
printf("\nEntered word is not a palindrome.");
else
printf("\nEntered word is a palindrome");
}
OUTPUT
char *country[ ] = {
“INDIA”, “CHINA”, “BANGLADESH”, “PAKISTAN”, “U.S”
};
172
The *country[ ] of the declaration indicates an array of five elements. The char* of Pointers
the declaration indicates that each element of array country is of type “pointer to
char”. Thus, country [0] will point to INDIA, country[ 1] will point to CHINA, and
so on.
Thus, even though the array country is fixed in size, it provides access to character
strings of any length. However, a specified amount of memory will have to be
allocated for each string later in the program, for example,
The country character strings could have been placed into a two-dimensional array
but such a data structure must have a fixed number of columns per row, and that
number must be as large as the largest string. Therefore, considerable memory is
wasted when a large number of strings are stored with most strings shorter than the
longest string.
Example 7.14
Write a program to enter a list of strings and rearrange them in alphabetical order,
using a one-dimensional array of pointers, where each pointer indicates the beginning
of a string:
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <string.h>
main()
{
char *country[ 5 ];
int i;
for(i = 0; i < 5; i++)
{
country[ i ] =(char *) malloc(15 * sizeof(char));
}
printf("Enter five countries on a separate line\n");
readinput(country, 5);
reorder(country, 5);
printf("\nReordered list\n");
writeoutput(country, 5);
getch();
}
OUTPUT
Reordered list
BANGLADESH
CHINA
INDIA
PAKISTAN
SRILANKA
The limitation of the string array concept is that when we are using an array of
pointers to strings we can initialize the strings at the place where we are declaring the
array, but we cannot receive the strings from keyboard using scanf().
174
…………………………………………………………………………………… Pointers
……………………………………………………………………………………
2. How the indirection operator can be used to access a multidimensional array
element.
……………………………………………………………………………………
……………………………………………………………………………………
3. A C program contains the following declaration.
float temp[ 3 ][ 2 ] = {{13.4, 45.5}, {16.6, 47.8}, {20.2, 40.8}};
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
7.10 SUMMARY
In this unit we have studied about pointers, pointer arithmetic, passing pointers to
functions, relation to arrays and the concept of dynamic memory allocation. A
pointer is simply a variable that contains an address which is a location of another
variable in memory. The unary operator &, when preceded by any variable returns its
address. C’s other unary pointer operator is *, when preceded by a pointer variable
returns a value stored at that address.
Pointers are often passed to a function as arguments by reference. This allows data
items within the calling function to be accessed, altered by the called function, and
then returned to the calling function in the altered form. There is an intimate
relationship between pointers and arrays as an array name is really a pointer to the
first element in the array. Access to the elements of array using pointers is enabled
by adding the respective subscript to the pointer value (i.e. address of zeroth element)
and the expression preceded with an indirection operator.
As pointer declaration does not allocate memory to store the objects it points at,
therefore, memory is allocated at run time known as dynamic memory allocation. The
library routine malloc can be used for this purpose.
1. Refer to section 7.4. The data type included in the pointer declaration, refers to the
type of data stored at the address which we will be storing in our pointer.
2. (i) Compile-time Error : Lvalue Required. Means that the left side of an
assignment operator must be an addressable expression that include a variable
or an indirection through a pointer. 175
Functions, Structures,
Pointers and (ii) Multiplication of a pointer variable with a constant is invalid.
File Handling in C
3. (i) Refer section 7.4
(ii) Refer section 7.4
(iii) This means pointers can be of type void but can’t be de-referenced without
explicit casting. This is because the compiler can’t determine the size of the
object the pointer points to.
1 (i) True.
(ii) True.
(iii) False.
(iv) True.
(v) True.
(vi) True.
(ii) Address of the first element of the last row of array temp i.e. address of
element 20.2.
(iii) Will give you 0. To get the value of the last element of the first array i.e. the
correct syntax would be *(*(temp+0)+1).
(iv) Address of the last element of last row of array temp i.e. of 40.8.
(v) Displays the value 47.8 i.e., second element of last row of array temp.
(vi) Displays the value 20.2 i.e., first element of last row of array temp.
176
File Handling
UNIT 8 FILE HANDLING
Structure
8.0 Introduction
8.1 Objectives
8.2 File Handling in C Using File Pointers
8.2.1 Open a file using the function fopen()
8.2.2 Close a file using the function fclose()
8.3 Input and Output using file pointers
8.3.1 Character Input and Output in Files
8.3.2 String Input / Output Functions
8.3.3 Formatted Input / Output Functions
8.3.4 Block Input / Output Functions
8.4 Sequential Vs Random Access Files
8.5 Positioning the File Pointer
8.6 The Unbufferred I/O - The UNIX like File Routines
8.7 Summary
8.8 Solutions / Answers
8.9 Further Readings
8.0 INTRODUCTION
The examples we have seen so far in the previous units deal with standard input and
output. When data is stored using variables, the data is lost when the program exits
unless something is done to save it. This unit discusses methods of working with files,
and a data structure to store data. C views file simply as a sequential stream of bytes.
Each file ends either with an end-of-file marker or at a specified byte number recorded
in a system maintained, administrative data structure. C supports two types of files
called binary files and text files.
The difference between these two files is in terms of storage. In text files, everything
is stored in terms of text i.e. even if we store an integer 54; it will be stored as a 3-byte
string - “54\0”. In a text file certain character translations may occur. For example a
newline(\n) character may be converted to a carriage return, linefeed pair. This is what
Turbo C does. Therefore, there may not be one to one relationship between the
characters that are read or written and those in the external device. A binary file
contains data that was written in the same format used to store internally in main
memory.
For example, the integer value 1245 will be stored in 2 bytes depending on the
machine while it will require 5 bytes in a text file. The fact that a numeric value is in a
standard length makes binary files easier to handle. No special string to numeric
conversions is necessary.
The disk I/O in C is accomplished through the use of library functions. The ANSI
standard, which is followed by TURBO C, defines one complete set of I/O functions.
But since originally C was written for the UNIX operating system, UNIX standard
defines a second system of routines that handles I/O operations. The first method,
defined by both standards, is called a buffered file system. The second is the
unbuffered file system.
In this unit, we will first discuss buffered file functions and then the unbuffered file
functions in the following sections.
177
Functions, Structures, 8.1 OBJECTIVES
Pointers and
File Handling in C
After going through this unit you will be able to:
As already mentioned in the above section, a sequential stream of bytes ending with
an end-of-file marker is what is called a file. When the file is opened the stream is
associated with the file. By default, three files and their streams are automatically
opened when program execution begins - the standard input, standard output, and
the standard error. Streams provide communication channels between files and
programs.
For example, the standard input stream enables a program to read data from the
keyboard, and the standard output stream enables to write data on the screen.
Opening a file returns a pointer to a FILE structure (defined in <stdio.h>) that
contains information, such as size, current file pointer position, type of file etc., to
perform operations on the file. This structure also contains an integer called a file
descriptor which is an index into the table maintained by the operating system namely,
the open file table. Each element of this table contains a block called file control block
(FCB) used by the operating system to administer a particular file.
The standard input, standard output and the standard error are manipulated using file
pointers stdin, stdout and stderr. The set of functions which we are now going to
discuss come under the category of buffered file system. This file system is referred to
as buffered because, the routines maintain all the disk buffers required for reading /
writing automatically.
To access any file, we need to declare a pointer to FILE structure and then associate it
with the particular file. This pointer is referred as a file pointer and it is declared as
follows:
FILE *fp;
Once a file pointer variables has been declared, the next step is to open a file. The
fopen() function opens a stream for use and links a file with that stream. This function
returns a file pointer, described in the previous section. The syntax is as follows:
where mode is a string, containing the desired open status. The filename must be a
string of characters that provide a valid file name for the operating system and may
include a path specification. The legal mode strings are shown below in the table 12.1:
178
File Handling
Table 8.1: Legal values to the fopen() mode parameter
MODE MEANING
The following code fragment explains how to open a file for reading.
Code Fragment 1
#include <stdio.h>
main()
{
FILE *fp;
if ((fp=fopen(“file1.dat”, “r”))==NULL)
{
printf(“FILE DOES NOT EXIST\n”);
exit(0);
}
}
The value returned by the fopen() function is a file pointer. If any error occurs while
opening the file, the value of this pointer is NULL, a constant declared in <stdio.h>.
Always check for this possibility as shown in the above example.
This function flushes any unwritten data for stream, discards any unread buffered
input, frees any automatically allocated buffer, and then closes the stream. The return
value is 0 if the file is closed successfully or a constant EOF, an end-of file marker, if
an error occurred. This constant is also defined in <stdio.h>. If the function fclose() is
not called explicitly, the operating system normally will close the file when the
program execution terminates.
Once the file is closed, it cannot be used further. If required it can be opened in same
or another mode.
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
After opening the file, the next thing needed is the way to read or write the file. There
are several functions and macros defined in <stdio.h> header file for reading and
writing the file. These functions can be categorized according to the form and type of
data read or written on to a file. These functions are classified as:
getc()
putc()
getc() is used to read a character from a file and putc() is used to write a character to a
file. Their syntax is as follows:
The file pointer indicates the file to read from or write to. The character ch is formally
called an integer in putc() function but only the low order byte is used. On success
putc() returns a character(in integer form) written or EOF on failure. Similarly getc()
returns an integer but only the low order byte is used. It returns EOF when end-of-file
is reached. getc() and putc() are defined in <stdio.h> as macros not functions.
To check the end of file, C includes the function feof() whose prototype is:
It returns 1 if end of file has been reached or 0 if not. The following code fragment
explains the use of these functions.
Example 8.1
#include <stdio.h>
main()
{
FILE *fp1;
FILE *fp2;
int ch;
if((fp1=fopen(“f1.dat”,”r”)) == NULL)
{
printf(“Error opening input file\n”);
exit(0);
}
if((fp2=fopen(“f2.dat”,”w”)) == NULL)
{
181
Functions, Structures, printf(“Error opening output file\n”);
Pointers and exit(0);
File Handling in C }
while (!feof(fp1))
{
ch=getc(fp1);
putc(ch,fp2);
}
fclose(fp1);
fclose(fp2);
}
OUTPUT
If the file ”f1.dat” is not present, then the output would be:
Error opening input file
If the disk is full, then the output would be:
Error opening output file
If there is no error, then “f2.dat” would contain whatever is present in “f1.dat” after
the execution of the program, if “f2.dat” was not empty earlier, then its contents
would be overwritten.
If we want to read a whole line in the file then each time we will need to call character
input function, instead C provides some string input/output functions with the help of
which we can read/write a set of characters at one time. These are defined in the
standard library and are discussed below:
fgets()
fputs()
These functions are used to read and write strings. Their syntax is:
The integer parameter in fgets() is used to indicate that at most num-1 characters are to
be read, terminating at end-of-file or end-of-line. The end-of-line character will be
placed in the string str before the string terminator, if it is read. If end-of-file is
encountered as the first character, EOF is returned, otherwise str is returned. The
fputs() function returns a non-negative number or EOF if unsuccessful.
Example 8.2
Write a program read a file and count the number of lines in the file, assuming that a
line can contain at most 80 characters.
/*Program to read a file and count the number of lines in the file */
#include<stdio.h>
#include<conio.h>
#include<process.h>
void main()
{
FILE *fp;
182
int cnt=0; File Handling
char str[80];
if ((fp=fopen("lines.dat","r"))== NULL)
{ printf("File does not exist\n");
exit(0);
}
/* read the file till end of file is encountered */
while(!(feof(fp)))
{ fgets(str,80,fp); /*reads at most 80 characters in str */
cnt++; /* increment the counter after reading a line */
}
}/* print the number of lines */
printf(“The number of lines in the file is :%d\n”,cnt);
fclose(fp);
}
OUTPUT
Let us assume that the contents of the file “lines.dat” are as follows:
This is C programming.
I love C programming.
These functions are used for formatted input and output. These are identical to scanf()
and printf() except that the first argument is a file pointer that specifies the file to be
read or written, the second argument is the format string. The syntax for these
functions is:
Both these functions return an integer indicating the number of bytes actually read or
written.
183
Functions, Structures, Example 8.3
Pointers and
File Handling in C Write a program to read formatted data (account number, name and balance) from a
file and print the information of clients with zero balance, in formatted manner on the
screen.
#include<stdio.h>
main()
{
int account;
char name[30];
double bal;
FILE *fp;
if((fp=fopen("bank.dat","r"))== NULL)
printf("FILE not present \n");
else
do{
fscanf(fp,"%d%s%lf",&account,name,&bal);
if(!feof(fp))
{
if(bal==0)
printf("%d %s %lf\n",account,name,bal);
}
}while(!feof(fp));
}
OUTPUT
This program opens a file “bank.dat” in the read mode if it exists, reads the records
and prints the information (account number, name and balance) of the zero balance
records.
103 Swathi 0
105 Udit 0
Block Input / Output functions read/write a block (specific number of bytes from/to a
file. A block can be a record, a set of records or an array. These functions are also
defined in standard library and are described below.
fread()
fwrite()
184
These two functions allow reading and writing of blocks of data. Their syntax is: File Handling
In case of fread(), buf is the pointer to a memory area that receives the data from the
file and in fwrite(), it is the pointer to the information to be written to the file.
num_bytes specifies the number of bytes to be read or written. These functions are
quite helpful in case of binary files. Generally these functions are used to read or write
array of records from or to a file. The use of the above functions is shown in the
following program.
Example 8.4
Write a program using fread() and fwrite() to create a file of records and then read and
print the same file.
void main()
{
struct stud
{
char name[30];
int age;
int roll_no;
}s[30],st;
int i;
FILE *fp;
/* writing to a file*/
fwrite(s,sizeof(struct stud),30,fp);
fclose(fp);
#include<stdio.h>
#include<process.h>
#include<conio.h>
main()
{
FILE * fp1, * fp2;
double a,b,c;
fp1=fopen(“file1”, “w”);
fp2=fopen(“file2”, “w”);
fp1=fopen(“file1”, “r”);
fp2=fopen(“file2”,“r”);
fclose(fp1);
fclose(fp2);
}
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
186
File Handling
8.4 SEQUENTIAL Vs RANDOM ACCESS FILES
We have seen in section 12.0 that C supports two type of files – text and binary files,
also two types of file systems – buffered and unbuffered file system. We can also
differentiate in terms of the type of file access as Sequential access files and random
access files. Sequential access files allow reading the data from the file in sequential
manner which means that data can only be read in sequence. All the above examples
that we have considered till now in this unit are performing sequential access.
Random access files allow reading data from any location in the file. To achieve this
purpose, C defines a set of functions to manipulate the position of the file pointer. We
will discuss these functions in the following sections.
To support random access files, C requires a function with the help of which the file
pointer can be positioned at any random location in the file. Such a function defined in
the standard library is discussed below:
The function fseek() is used to set the file position. Its prototype is:
The first argument is the pointer to a file. The second argument is the number of bytes
to move the file pointer, counting from zero. This argument can be positive, negative
or zero depending on the desired movement. The third parameter is a flag indicating
from where in the file to compute the offset. It can have three values:
These three constants are defined in <stdio.h>. If successful fseek() returns zero.
Another function rewind() is used to reset the file position to the beginning of the file.
Its prototype is:
fseek(fp,0,SEEK_SET);
Another function ftell() is used to tell the position of the file pointer. Its prototype is:
Example 8.5
Write a program to search a record in an already created file and update it. Use the
same file as created in the previous example.
#include<stdio.h>
187
Functions, Structures, #include<conio.h>
Pointers and #include<stdio.h>
File Handling in C #include<process.h>
#include<string.h>
void main()
{
int r,found;
struct stud
{
char name[30];
int age;
int roll_no;
}st;
FILE *fp;
/* open the file in read/write mode */
if((fp=fopen("f1.dat","r+b"))==NULL)
{ printf("Error while opening the file \n");
exit(0);
}
OUTPUT
Let the roll_no of the record to be updated be 106. Now since this roll_no is not
present the output would be:
188
If the roll_no to be searched is 103, then if the new name is Sham, the output would File Handling
be the file with the contents:
Geeta 18 101
Leena 17 102
Sham 23 103
Lokesh 21 104
Amit 19 105
The buffered I/O system uses buffered input and output, that is, the operating system
handles the details of data retrieval and storage, the system stores data temporarily
(buffers it) in order to optimize file system access. The buffered I/O functions are
handled directly as system calls without buffering by the operating system. That is
why they are also known as low level functions. This is referred to as unbuffered I/O
system because the programmer must provide and maintain all disk buffers, the
routines do not do it automatically.
The low level functions are defined in the header file <io.h>.
These functions do not use file pointer of type FILE to access a particular file, but
they use directly the file descriptors, as explained earlier, of type integer. They are
also called handles.
Mode:
The access parameter is used in UNIX environment for providing the access to
particular users and is just included here for compatibility and can be set to zero.
open() function returns –1 on failure. It is used as:
Code fragment 2
int fd;
if ((fd=open(filename,mode,0)) == -1)
{ printf(“cannot open file\n”);
exit(1); }
If the file does not exist, open() the function will not create it. For this, the function
creat() is used which will create new files and re-write old ones. The prototype is:
189
Functions, Structures, It returns a file descriptor; if successful else it returns –1. It is not an error to create an
Pointers and already existing file, the function will just truncate its length to zero. The access
File Handling in C parameter is used to provide permissions to the users in the UNIX environment.
The function close() is used to close a file. The prototype is:
The functions read() and write() are used to read from and write to a file. Their
prototypes are:
The first parameter is the file descriptor returned by open(), the second parameter
holds the data which must be typecast to the format needed by the program, the third
parameter indicates the number of bytes to transferred. The return value tells how
many bytes are actually transferred. If this value is –1, then an error must have
occurred.
Example 8.6
Write a program to copy one file to another to illustrate the use of the above functions.
The program should expect two command line arguments indicating the name of the
file to be copied and the name of the file to be created.
main()
{
arr buf;
name fname, sname;
int fd1,fd2,size;
open(argv[2],O_WRONLY);
size=read(fd1,buf,80); /* read till end of file */
190
File Handling
while (size>0)
{ write(fd2,buf,80);
size=read(fd1,buf,80);
}
close(fd1);
close(fd2);
}
OUTPUT
If the number of arguments given on the command line is not correct then output
would be:
One file is opened in the read mode, and another file is opened in the write mode. The
output would be as follows is the file to be read is not present (let the file be f1.dat):
The output would be as follows if the disk is full and the file cannot be created (let the
output file be f2.dat):
lseek()
The function lseek() is provided to move to the specific position in a file. Its prototype
is:
This function is exactly the same as fseek() except that the file descriptor is used
instead of the file pointer.
Using the above defined functions, it is possible to write any kind of program dealing
with files.
2. Write a proper C statement with proper arguments that would be called to move the
file pointer back by 2 bytes.
……………………………………………………………………………………
……………………………………………………………………………………
2. Text files and binary files differ in terms of storage. In text files everything is
stored in terms of text while binary files stores exact memory image of the data i.e.
in text files 154 would take 3 bytes of storage while in binary files it will take 2
bytes as required by an integer.
2. The advantage of using these functions is that they are used for block read/write,
which means we can read or write a large set of data at one time thus increasing
the speed.
3. fscanf() and fprintf() functions are used for formatted input and output from a file.
APPENDIX-A
The ASCII (American Standard Code for Information Interchange) character set
defines 128 characters (0 to 127 decimal, 0 to FF hexadecimal, and 0 to 177 octal).
This character set is a subset of many other character sets with 256 characters,
including the ANSI character set of MS Windows, the Roman-8 character set of HP
systems, and the IBM PC Extended Character Set of DOS, and the ISO Latin-1
character set used by Web browsers. They are not the same as the EBCDIC character
set used on IBM mainframes. The first 32 values are non-printing control characters,
such as Return and Line feed. You generate these characters on the keyboard by
holding down the Control key while you strike another key. For example, Bell is value
7, Control plus G, often shown in documents as ^G. Notice that 7 is 64 less than the
value of G (71); the Control key subtracts 64 from the value of the keys that it
modifies. The table shown below gives the list of the control and printing characters.
196
MCS-201
Programming in C
Indira Gandhi National Open University
School of Computer and Information
Sciences (SOCIS)
and Python
Introduction to python
programming 3
MCS-201
Block
3
INTRODUCTION TO PYTHON PROGRAMMING________
UNIT 9
Introduction to Python 199
UNIT 10
Data Structures and Control Statements in Python 213
UNIT 11
Functions and Files Handling In Python 279
UNIT 12
Modules and Packages 300
BLOCK 3 INTRODUCTION
Happy Programming!!
Indira Gandhi
National Open University MCS-201
School of Computer and
Information Sciences PROGRAMMING IN
C AND PYTHON
Block
3
INTRODUCTION TO PYTHON PROGRAMMING______
UNIT 9
Introduction to Python 199
UNIT 10
Data Structures and Control Statements in Python 213
UNIT 11
Functions and Files Handling In Python 279
UNIT 12
Modules and Packages 300
PROGRAMME/COURSE DESIGN COMMITTEE
All rights reserved. No part of this work may be reproduced in any form, by mimeograph or any other means,
without permission in writing from the Indira Gandhi National Open University.
Further information on the Indira Gandhi National Open University courses may be obtained from the
University’s office at MaidanGarhi, New Delhi-110 068.
Introduction to
UNIT 9 INTRODUCTION TO PYTHON Python
Structure
9.0 Introduction
9.1 Objectives
9.2 History of Python
9.3 Need of Python
9.4 Packages for Cross platform application of Python
9.5 Getting started with Python
9.6 Program structure in python
9.7 Running the First program
9.8 Summary
9.0 INTRODUCTION
Python programming is widely used in Artificial Intelligence, Machine Learning,
Neural Networks and many other advanced fields of Computer Science. Ideally, It is
designed for rapid prototyping of complex applications. Python has interfaces with
various Operating system calls and libraries, which are extensible to C, C++ or Java.
Many large companies like NASA, Google, YouTube, Bit Torrent, etc. uses the
Python programming language for the execution of their valuable projects.
To build the carrier path the skill of programming can be a fun and profitable way,
but before starting the learning of this skill, one should be clear about the choice of
programming language. Before learning any programming language, one should
figure out which language suits best to the learner. As in our case the comparison of
C and Python programming languages may help the learners to analyze and generate
a lot of opinions about their choice of programming language. In this unit, I have
tried to compile a few of them to give you a clear picture.
Metrics Python C
It is a high-level, general-purpose
C is general-purpose procedural
Introduction & interpreted programming
programming language.
language.
Being compiled programming
Being Interpreted programming
language its execution speed is
language its execution speed is
Speed faster then that of the interpreted
slower then that of the compiled
programming language (i.e.
programming language (i.e. C).
Python).
Number of lines of code written Program syntax of C is quite
Usage in Python is quite less in complicated in comparison to
comparison to C Python.
199
Declaration of Variable type is
In C, declaration of variable type
not required, they are un-typed
is must, and it is done at the time
Declaration of and a given variable can be stuck
of its creation, and only values of
variables different types of values at
that declared type must be
different instances during the
assigned to the variables.
execution of any python program.
Error debugging is simple, as it
takes only one instruction at a Being compiler dependent
time. Compilation and execution language, error debugging is
Error
is performed simultaneously. difficult in C i.e. it takes the
Debugging
Errors are instantly shown, and entire source code, compiles it
execution stops at that instruction and finally all errors are shown.
only.
the same function can be used by Function renaming mechanism is
Function
two different names i.e. it not supported by C i.e. the same
renaming
supports the mechanism of function cannot be used by two
mechanism
function renaming different names.
Syntax of Python programs is The syntax of a C program is
Complexity Quite simple, easy to read, write comparatively harder than the
and learn syntax of Python.
It supports automatic garbage In C, the Programmer has to
Memory-
collection for memory explicitly do the memory
management
management. management.
Python is a General-Purpose
C is generally used for hardware
Applications programming language can be
related applications.
used for Microcontrollers also.
Built-in Library of built-in functions is Library of built-in functions is
functions quite large in Python. quite limited in C
Implementing Gives ease of implementing data Explicit implementation of
Data structures with built-in insert, functions is requited for the
Structures append functions. implementation of datastructures
Pointers functionality is not
Pointers Pointers are frequently used in C.
available in Python.
In this course you are given exposure to both programming languages i.e. C
and Python, based on your requirement you can choose your option to build
your carrer in programming.
9.1 OBJECTIVES
After going through this unit you will be able to:
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
202 ……………………………………………………………………………………………
Introduction to
Python
After going through the section 9.2 of this unit, you understood the meaning
of Cross-platform applications and you are now aware of the potential of
204 Python as a cross-platform programming language, you also came to know
that the development of different type of applications require different types Introduction to
of packages, libraries, modules, frameworks etc. Now you might be confused Python
that what is the difference between these terms, are they same or different.
Let’s Clear your confusion first and then we will briefly discuss about the
functionality of different packages, used for the development of various
Python applications.
2) A package must hold the file __init__.py. This does not apply to
modules.
3) To import everything from a module, we use the wildcard *. But this
does not work with packages.
We will learn more about them, as we proceed in this course, don’t worry. To
start with we will discuss about various Frameworks and Libraries first, you
will be learning about their usage and also the usage of methods and
packages, later.
205
Keras : is a leading open-source Python library used for development of
neural networks and machine learning projects. It simplifies the process of
designing and development of neural networks for the beginners of machine
learning. Keras also deals with convolution neural networks(CNN) and
Recurrent Neural Networks (RNN), highly required in the field of Deep
Learning. It includes algorithms for normalization, optimizion, and activation
layers. Instead of being an end-to-end Python machine learning library, Keras
acts as a user-friendly, extensible interface that enhances modularity & total
expressiveness.
range of sources like CSV, SQL databases, JSON files, and Excel, can be
read. The data analysis & manipulation is a pre-requisite for most of the
machine learning projects, where a significant amount of time is spent to
analyse the trends and patterns hidden in the datasets. Using Pandas one can
manage complex data operations with just one or two commands, it comes
with several inbuilt methods for data handling, and it also serves as the
starting point to create more focused and powerful data tools.
may use tools, defined in modules, which may use files, defined in other
modules. Coming to our point, in python a file takes a module to get access
to the tools it defines, and also to the tools defined in other modules included
in programme. In python high level file has important path of control of your
program, where from you can start your application. Just refer to the figure
given below
To understand the structure of Python program, say there exist three files
a.py,b.py and c.py. The file model a.py is chosen for high level file . it is
known as a simple text file of statements. Files b.py and c.py are modules.
They are also text files of statements but they are generally not started
directly, but they are invoked by a.py i.e high level file.
This is the general discussion over the structure of Python program, although
Python includes all the components as they are in any other language such as
data types, conditional statements, looping constructs, functions, file
handling, Classes, Exception handling, Libraries, Modules, packages etc. We
will discuss a few of them over here and the rest will be discussed in the
subsequent units in this course
We will discuss in brief, some of the ways to work with Python, you may
choose any or try all and other options too.
210
Jupyter Notebook, Spyder, VS Code etc., even you can work with R- Introduction to
Programming. Python
Important: Before working with IDEs you need to understand how to work
with them and which ine is suitable, following are observations, currently:
3) Many a times the learners may not be equipped with the systems having
latest hardware configuarations, as desired for the installation of Python,
or their might be compatibility issues with operating syatem or may be
due to any reason you are not able to install and start your work with
Python. Under such circumstances the solution is Google Colab
Notebook (https://colab.research.google.com/notebooks/welcome.ipynb),
use this and just login with your gmail account and start your work on
Jupyter Notebook, as simple as that.
211
9.7 RUNNING THE FIRST PROGRAM
Just click file option and select new workbook, and new Jupyter notebook will open in
Google Colab, now you may start your work
212
9.8 SUMMARY Introduction to
Python
213
Data Structures and
UNIT 10 DATA STRUCTURES AND Control Statements
in Python
CONTROL STATEMENTS IN
PYTHON
Structure
10.1 Introduction
10.2 Objectives
10.3 Identifiers and Keywords
10.4 Statements and Expressions
10.4 Variables
10.5 Operators
10.6 Data Types
10.7 Data Structures
10.8 Control Flow Statements
10.9 Summary
10.1 INTRODUCTION
A Pythonis a general-purpose, high level programming language which is
widely used by programmers. It was created by Guido Van Rossum in 1991
and further developed by the Python Software Foundation. It was designed
with an emphasis on code readability, and its syntax allows programmers to
express their concepts in fewer lines of code. To learn how to code in any
language, it is, therefore, very important to learn its basic components. This is
what is the objective of this chapter. In this chapter, we will learn about the
basic constituents of Python starting from its identifiers, variables, operators
andalso about how to combine them to form expressions and statements. We
will also study about the data types available in Python along with the control
flow statements.
10.2 OBJECTIVES
After going through this unit, you will be able to:
Understand the basic building blocks of Python programming
Language
Understand various Data Structures
Understand usage of control flow statements
213
Identifiers can be a combination of letters in lowercase (a to z) or Data S
Cont
uppercase (A to Z) or digits (0 to 9) or an underscore (_). Names like
myIndia, other_1 and mca_course, all are valid examples. A Python
identifier can begin with an uppercase or a lowercase alphabet or (_).
An identifier cannot start with a digit but is allowed everywhere else.
1plus is invalid, but plus1 is perfectly fine.
Keywords (listed in TABLE1) cannot be used as identifiers.
One cannot use spaces and special symbols like !, @, #, $, % etc. as
identifiers.
Identifier can be of any length. (However, it is preferrd to keep it
short and meaningful).
Examples of valid identifiers are:marksPython, Course, MCA301 etc.
Keywords are a list of reserved words that have predefined meaning to the
Python interpreter.These are special vocabulary and cannot be usd by
programmers as identifiers for variables, functions, constants or with any
identifier name. Attempting to use a keyword as an identifier name will cause
an error. As Python is case sensitive, keywords must be written exactly as
given in TABLE1.
TABLE 1 :List of keywords in Python
214
Q3. All keywords in Python are in _____ Data Structures and
Control Statements
a) lower case in Python
b) UPPER CASE
c) Capitalized
d) None of the above
Print(1)
x=2
print(x)
In[]: 7 + 3
Out[]: 10
But in script, an expression all by itself doesn’t show any output altogether.
You need to explicitly print the result.
10.5 VARIABLES
Avariable is a named placeholder to hold any type of data which the program
can use to assign and modify during the course of execution. Python is a
Dynamically Typed Language. There is no need to declare a variable
explicitly by specifying whether the variable is an integer or a float or any
other type. To define a new variable in Python, we simply assign a value to a
name.
Variable names can be arbitrarily long. They can contain both letters and
numbers, but they cannot start with a number. It is legal to use uppercase
letter; but it is a good idea to begin variable names with a lowercase letter.
Variable names are case-sensitive. E.g., IGNOU and Ignou are different
variables.
The underscore character can appear in a name. it is often used in names with
multiple words, such as my_name or marks_in_maths. Variable names can
start with an underscore character, but we generally avoid doing this unless
we are writing library code for others to use.
variable_name = expression
216
The equal sign (=) also known as simple assignment operator is used to Data Structures and
Control Statements
assign values to variables. In the general format, the operand to the left of the in Python
= operator is the name of the variable and the operand to the right of the =
operator is the expression which can be a value or any code snippet that
results in a value. That value is stored in the variable on the execution of the
assignment statement. Assignment operator should not be confused with the
= used in algebra to denote equality. E.g.,
In Python, not only the value of a variable may change during program
execution but also the type of data that is assigned. You can assign an integer
value to a variable, use it as an integer for a while and then assign a string to
the variable. A new assignment overrides any previous assignments.
Q11. What error occurs when you excecute the following Python Code
snippet?
apple = mango
a) SyntaxError
b) NameError
c) ValueError
d) TypeError
10.6 OPERATORS
Operators are special symbols that represent computations like addition and
multiplication. The values the operator is applied to are called operands.
Python language supports a wide range of operators. They are:
1. Arithmetic Operators
2. Assignment Operators
3. Relational Operators
4. Logical Operators
5. Bitwise Operators
220
Note :For strings, the characters in both the strings are compared one by one Data Structures and
Control Statements
based on their Unicode value. The character with the lower Unicode value is in Python
considered to be smaller.
10.7.1 Number
10.7.2 String
10.7.3 None
223
10.7.4 List Data S
Cont
10.7.5 Tuple
10.7.6 Dictionary
10.7.7 Set
10.7.1 Number
In Numbers or Numerical Data Types, we mainly have numbers. These
numbers are also of four types : Integer, Float, Complex, Boolean.
In Interactive mode:
Note :type() function can be used to check the data type of the variables
Examples:
In[]: type(i)
Out[]: int
In[]: type(c)
Out[]: complex
In[]: b = 10>7
Out[]: bool
Out[]: True
10.7.2 String
224
A string is an ordered sequence of characters. These characters may be Data Structures and
Control Statements
alphabets, digits or special characters including spaces. String values are in Python
enclosed in single quotation marks (e.g. “hello’) or in double quotation marks
(e.g., “python course”). The quotes are not a part of the string, they are used
to mark the beginning and end of the string for the interpreter. In Python,
there is no character data type, a character is a string of length one. It is
represented by str class. Few of the characteristics of strings are:
Out[]: 12
Out[]: ‘o’
Out[]: ‘d’
Out[]: ‘o Fr’
If one omits the first index (before the colon), the slice starts at the beginning
of the string and if second index is omitted, the slice goes to the end of the
string.
In[]: str1[:3]
225
Out[]: ‘hel’ Data S
Cont
In[]: str1[3:]
10.7.3 None
A none is another special data type in Python. A none is frequently used to
represent the absence of a value. For example,
Some literatures on Python consider additional data types like List, Tuple,
Set &Dictionary whereas some others consider them as the built-in data
structures. We will put them in the category of data structures and discuss
considering them in same but considering them as data types is also not
wrong.
10.7.4 List
A list is a sequence of items separated by commas and items enclosed in
square brackets [ ]. These are similar to arrays available with other
programmimg languages but unlike arrays items in the list may be of
different data types. Lists are mutable, and hence, they can be altered even
after their creation. Lists in Python are ordered and have a definite sequence
and the indexing of a list is done with 0 being the first index. Each element in
the list has its definite place in the list, which allows duplicating of elements
in the list, with each element having its own distinct place and creditability. It
is represented by list class.
In[]: list1 = [5, 3.4, ‘IGNOU’, ‘Part 3’, 45] #to create a list
Out[]: 5
Out[]: Part 3
Out[]: 45
Out[]: 'IGNOU'
10.7.5 Tuple
A tuple is similar to the list in many ways. Like lists, tuples also contain the
collection of the items of different data types. The items of the tuple are
separated with a comma and enclosed in parentheses.
A tuple is a read-only data structure as we can’t modify the size and value of
the items of a tuple and it is immutable.
Out[]: 'world'
10.7.6 Dictionary
A dictionary in Python holds data items in key-value pairs of items. The
items in the dictionary are separated with the comma and enclosed in the
curly brackets{}. Dictionaries permit faster access to data. Every key is
separated from its value using a colon(:) sign. The key value pairs of a
dictionary can be accessed using the key. Keys are usually of string type and
their values can be of any data type. In order to access any value in the
dictionary, we have to specify its key in square brackets[]. 227
#Creating dictionary dict1 Data S
Cont
In[]: dict1 = {'Fruit':'Apple','Climate':'Cold','Price(Kg)':120}
Out[]:Cold
10.7.7 Set
In Python, aset is an orderd collection of data type that is iterable, mutable
and has no duplicate elements. The order of elements in a set is undefined
though it may consist of various elements. The major advantage of using a
set, as opposed to a list, is that it has a highly optimized method for checking
whether a specific element is contained in the set.
Sets can be created by using the built-in set() function with an iterable object
or a sequence by placing the sequence inside curly braces, separated by
‘comma’. A set contains only unique elements but at the time of set creation,
multiple duplicate values can also be passed. The order of elements in a set is
undefined and is unchangeable. Type of elements in a set need not be the
same, various mixed-up data type values can also be passed to the set.
In[]: set1
#displaying contents of set1
Out[]: {' ', 'A', 'B', 'C', 'G', 'H', 'I', 'M', 'N', 'O', 'T', 'U'}
In[]: set2
Q25. In which of the following data type duplicate items are not allowed?
a) list
b) set
c) dictionary
d) None of the above
10.8.1 List
A list a container data type that acts as a dynamic aray. That is to say, a list is
a sequence that can be indexed into and that can grow and shrink. A few
characteristics of lists are:
A list has a (current) length – Get the length of a lsit with len()
function.
A list has an order – the items in a list are ordered, order going from
left to right.
A list is heterogeneous –different types of objects can be inserted into
the same list.
Lists are mutable and one can extend, delete, insert or modify items in
the list.
Examples :
list_name [index]
where index should always be an integer value and indicates the item to be
selected.
Out[]: ‘mahesh’
Out[]: 15
Output would be :
231
Traceback (most recent call last): Data S
Cont
File “<stdin>”, line 1, in <module>
numlist[6]
In addition to positive index numbers, one can also access items from the list
with a negative index number, by counting backwards from the end of the
list, starting at -1. It is useful of the list is long and we want to locate an item
towards the end of a list.
Out[]: ‘vishnu’
In[]: numlist[1:3]
Out[]: [6, 7]
In[]: mixed_list[:3]
In[]: mixed_list[2:]
In[]: numlist[:]
If the first index is omitted, the slice starts at the beginning and if the second
index is omitted, the slice goes to the end. So, if both indexes are omitted, the
slice is a copy of the whole list.
In[]: a = [1, 2, 3]
In[]: b = [4, 5, 6]
In[]: a + b
Out[]: [1, 2, 3, 4, 5, 6]
In[]: a == b
Out[]: False
in and not in membership operator are used to check for the presence of an
item in the list.
In[]: 2 in a
Out[]: True
Out[]: True
The built-in-list() function is used to create a list. The syntax for list()
function is,
list([sequence])
where the sequence can be a string, tuple or list itself. If the optional
sequence is not specified then an empty list is created.
In[]: greet
In[]: str_to_list
Lists are mutable in nature as the list items can be modified after a list has
been created. Also, a list can be modified by replacing the older item with a
newer item in its place and without assigning the list to a completely new
variable.
In[]: stringlist
In[]: listofstrings
In[]: stringlist
The most common way to traverse the elements of a list is with a for loop.
print(names)
Out[]: mahesh
ramesh
suresh
vishnu
ganesh
This works well if one needs to read the elements of the list. But if one wants
to write or update the elements, one needs the indices. For this one needs to
combine the functions range and len:
234
In[]: for i in range(len(numlist)) : Data Structures and
Control Statements
in Python
numlist[i] = numlist[i] * 2
In[]: numlist
This loop traverses the list and updates each element. The command len
returns the number of elements in the list.The command range returns a list of
indices from 0 to n-1, where n is the length of the list. Each time through the
loop, the variable i gets the index of the next element. The assignment
statement in the body uses i to read the old value of the element and to assign
the new value.
Python provides methods that operate on lists. For example, append adds a
new element to the end of a list:
In[]: numlist.append(50)
In[]: numlist
In[]: numlist.extend(nlist)
In[]:numlist
Out[]: [8, 12, 14, 20, 30, 26, 50, 25, 35, 45]
In[]: numlist.sort()
In[]: numlist
Out[]: [8, 12, 14, 20, 25, 26, 30, 35, 45, 50]
pop is used to delete elements from a list if the index of the element is
known:
In[]: numlist.pop(5)
Out[]: 26
In[]: numlist
Out[]: [8, 12, 14, 20, 25, 30, 35, 45, 50]
235
pop modifies the list and returns the element that was removed. If the Data S
Cont
removed element is not required then one can use the del operator:
In[]: numlist
To remove more than one element, del can be used with a slice index
In[]: numlist
If element from the list is known which needs to be removed and not the
index, remove can be used:
In[]: numlist.remove(30)
In[]: numlist
To get a list of all the methods associated with the list, pass the list function
to dir()
In[]: dir(list)
236
index() list.index(item) The index() method searches for the Data Structures and
Control Statements
given item from the start of the list and in Python
returns its index. If the value appears
more than once, you will get the index of
the first one. If the item is not present in
the list then ValueError is thrown by this
method.
Note: Replace the word”list” mentioned in the syntax with your actual list
name in your code.
There are many built-in functions for which a list can be passed as an
argument.
Built-In Description
Functions
sum() The sum() function returns the sum of numbers in the list.
all() The all() function returns True if all the Boolean values
237
in the list are True, else returns False. Data S
Cont
sorted() The sorted() function returns a modified copy of the list
while leaving the original list untouched.
In[]: len(stringlist)
Out[]: 5
In[]: sum(numlist)
Out[]: 175
In[]: max(numlist)
Out[]: 50
In[]: min(numlist)
Out[]: 20
Out[]: True
Out[]: True
In[]: sorted_stringlist
A list inside another list is called a nested list and you can get the behavior of
nested lists in Python by storing lists within the elements of another list. The
syntax for nested lists is:
Each list inside another list is separated by a comma. One can traverse
through the items of nested lists using the for loop.
In[]: asia[0][1]
Out[]: ‘Japan’
In[]: asia[1][2]
Out[]: ‘Thailand’
Q28. If we try to access the item outside the list index, then what type of
error it may give?
a) List is not defined
b) List index out of range
c) List index out of bound
d) No error
Q30. The marks of a student on 6 subjects are stored in a list, list1 = [80, 66,
94, 87, 99, 95]. How can the students average marks be calculated?
a) print(avg(list1))
b) print(sum(list1)/len(list1))
c) print(sum(list1)/sizeof(list1))
d) print(total(list1)/len(list1))
10.8.2 Tuple
In mathematics, a tuple is a finite ordered list (sequence) of elements. A tuple
is defined as a data structure that comprises an ordered, finite sequence of
immutable, heterogeneous elements that are of fixed sizes. Often, we may
want to return more than one value from a function. Tuples solve this
problem. They can also be used to pass multiple values through one function
parameter.
241
Although it is not necessary, it is common to enclose tuples in parantheses to Data S
Cont
help us quickly identify tuples when Python code is looked at:
It is actually the comma that forms a tuple making the commas significant
and not the parentheses.
To create a tuple with a single element, one must include the final comma:
In[]: t1 = (‘a’,)
In[]: type(t1)
Out[]: tuple
In Python, the tuple type is tuple. Without the comma Python treats (‘a’) as
an expression with a string in parentheses that evaluates to a string:
In[]: t2 = (‘a’)
In[]: type(t2)
Out[]: str
One can create an empty tuple without any values. The syntax is,
tuple_name = ()
In[]: empty_tuple = ()
In[]: empty_tuple
Out[]: ()
One can store any type of type string, number, object, another variable, and
even another tuple itself. One can have a mix of different types of items in
tuples, and they need not be homogeneous.
In[]: ignou
Most list operators also work on tuples. The bracket operator indexes an
element:
In[]: t[0]
Out[]: ‘a’
242
And the slice operator selects a range of elements. Data Structures and
Control Statements
in Python
In[]: t[1:3]
But if you try to modify one of the elemnts of the tuples, one will get an
error:
We can’t modify the elements of a tuple, but can replace one tuple with
another:
In[]: t
In[]: t * 2
Out[]: (‘A’, ‘b’, ‘c’, ‘d’, ‘e’, ‘A’, ‘b’, ‘c’, ‘d’, ‘e’)
in and not in membership operator are used to check for the presence of an
item in a tuple.
Comparison operators like <, <=, >, >=, == and != are used to compare
tuples.
Python starts by comparing the first element from each sequence. If they are
equal, it goes on to the next element, and so on, until it finds elements that
differ. Subsequent elements are not considered even if they are really big.
Out[]: True
Out[]: True
The built-in tuple() function is used to create a tuple. The syntax for the
tuple() function is:
tuple([sequence])
243
where sequence can be a number, string or tuple itself. If the optional Data S
Cont
sequence is not specified, then an empty tuple is created.
In[]: t3 = tuple()
In[]: t3
Out[]: ()
If the argument is a sequence (string, list or tuple), the result of the call to
tuple is a tuple with the elements of the sequence:
In[]: t3 = tuple(‘IGNOU’)
In[]: t3
In[]: t4 = (1, 2, 3, 4)
In[]: nested_t
There are many built-in functions as listed in TABLE for which a tuple can
be passed as an argument.
In[]: len(t3)
Out[]: 5
In[]: sum(t4)
Out[]: 10
In[]: t5 = sorted(t3)
244
In[]: t5 Data Structures and
Control Statements
in Python
Out[]: [‘G’, ‘I’, ‘N’, ‘O’, ‘U’]
One of the unique syntactic features of the Python language is the ability to
have a tuple on the left side of an assignment statement. This allows one to
assign more than one variable at a time when the left side is a sequence.
In[]: x, y = m
In[]: x
Out[]: ‘good’
In[]: y
Out[]: ‘luck’
In[]: x = m[0]
In[]: y = m[1]
Stylistically, when we use a tuple on the left side of the assignment statement,
we omit the parentheses, but the following is an equally valid syntax:
In[]: (x, y) = m
Though tuples may seem similar to lists, they are often used in different
situations and for different purposes. Tuples are immutable, and
usuallycontain a heterogeneous sequence of elements that are accessed via
unpacking or indexing. Lists are mutable, and their items are accessed via
indexing. Items cannot be added, removed or replaced in a tuple.
If an item within a tuple is mutable, then you can change it. Consider the
presence of a list as an item in a tuple, then any changes to the list get
reflected on the overall items in the tuple.
In[]: univ[3].append(‘soss’)
In[]: univ
To get a list of all the methods associated with the tuple, pass the tuple
function to dir().
Note: Replace the word “tuple_name” mentioned in the syntax with your
actual tuple name in the code.
In[]: channels.count(“dd”)
Out[]: 2
In[]: channels.index(“dd”)
Out[]: 0
In[]: channels.index(“zee”)
Out[]: 3
246
In[]: channels.count(“sab”) Data Structures and
Control Statements
in Python
Out[]: 1
1. tuple_items = ()
2. total_items = int(input("Enter the total number of items: "))
3. for i in range(total_items):
4. user_input = int(input("Enter a number: "))
5. tuple_items += (user_input,)
6. print(f"Items added to tuple are {tuple_items}")
7. list_items = []
8. total_items = int(input("Enter the total number of items: "))
9. for i in range(total_items):
10. item = input("Enter an item to add: ")
11. list_items.append(item)
12. items_of_tuple = tuple(list_items)
13. print(f"Tuple items are {items_of_tuple}")
247
Data S
Cont
Items are inserted into the tuple using two methods: using continuous
concatenation += operator and by converting list items to tuple items. In the
code, tuple_itemsis of tuple type. In both the methods, the total number of
items are specified which will be inserted to the tuple beforehand. Based on
this number, the for loop is iterated using the range() function. In the first
method, the user entered items are continuously concatenated to the tuple
using += operator. Tuples are immutable and are not supposed to be changed.
During each iteration, each original_tuple is replaced by original_tuple +
(new_element), thus creating a new tuple. Notice a comma after
new_element. In the second method, a list is created. For each iteration, the
user entered value is appended to the list_variable. This list is then converted
to tuple type using tuple() function.
The contents of variables a and b are reversed. The tuple variables are on the
left side of the assignment operator and, on the right side, are the tuple
values. The number of variables on the left and the number of values on the
right has to be the same. Each value is assigned to its respective variable.
Q38. Choose the correct way to access value 20 from the following tuple
aTuple = (“Orange”, [10, 20, 30], (5, 15, 25))
a) aTuple[1:2][1]
b) aTuple[1:2](1)
c) aTuple[1:2][1]
d) aTuple[1][1]
Q42. Which of the following options will not result in an error when
performed on tuples in python where tupl = (5, 2, 7, 0, 3)?
a) tupl[1] = 2
b) tupl.append(2)
c) tupl1 = tupl + tupl
d) tupl.sort()
10.8.3 Dictionaries
In the real world, you have seen your Contact-list in your phone. It is
practically impossible to memorize the mobile number of everyone you come
across. In the Contact-list, you store the name of the person as well as his
number. This allows you to identify the mobile number based on a person’s
name. One can think of a person’s name as the key that retrives his mobile
number, which is the value associated with the key. So, dictionary can be
thought of :
The keys of the dictionary must be immutable object types and are case
sensitive. Keys can be either a string or a number. But lists can not be used as
keys. A value in the dictionary can be of any data type including string,
number, list or dictionary itself.
250
Dictionaries are constructed using curly braces {}, wherein a list of key:value Data Structures and
Control Statements
pairs get separated by commas. There is a colon(:) separating each of these in Python
keys and value pairs, where the words to the left of the colon operator are the
keys and the words to the right of the colon operator are the values.
In[]: eng2sp
In[]: eng2sp[‘two’]
Out[]: ‘dos’
The key ‘two’ always maps to the value ‘dos’ so the order of the items
doesn’t matter. If the key isn’t in the dictionary, one get an exception:
In[]: eng2sp[‘four’]
Slicing in dictionaries is not allowed since they are not ordered like lists.
There are many built-in functions for which a dictionary can be passed as an
argument. The main operations on a dictionary are storing a value with some
key and extracting the value for a given key.
Built – in Description
Functions
all() The all() function returns Boolean True value if all the
keys in the dictionary are True else retuens False.
In[]: len(eng2sp)
Out[]: 3
len() function can be used to find the number of key:value pairs in the
dictionary eng2sp. In Python, any non-zero integer value is True, and zero is
interpreted as False. With all() function, if all the keys are Boolean True
values, then the output is True else it is False.
In[]: all(dict_func)
Out[]: False
For any() function, if any one of the keys is True then it results in a True
Boolean value else False Boolean value.
In[]: any(dict_func)
Out[]: True
The sorted() function returns the sorted list of keys by default in ascending
order without modifying the original key:value pairs. For list of keys sorted
in descending order by passing the second argument as reverse = True.
In[]: sorted(eng2sp)
Out[]: True
Out[]: False
The in operator uses different algorithms for lists and dictionaries. For lists, it
uses a linear search algorithm. As a list gets longer, the search time gets
252 longer in direct proportion to the length of the list. For dictionaries, Python
uses an algorithm called a hash table, so, the in operaor takes about the same Data Structures and
Control Statements
amount of time no matter how many items there are in a dictionary. in Python
clear() dictionary_name.clear() The clear() method removes all the key:value pairs
from the dictionary.
get() dictionary_name.get(key[, The get() method returns the value associated with the
default]) specified key in the dictionary. If the key is not present
then it returns the default value. If default is not given,
it defaults to None, so that this method never raises a
KeyError.
keys() dictionary_name.keys() The keys() method returns a new view consisting of aall
the keys in the dictionary.
pop() dictionary_name.pop(key[, The pop() method removes the key from the dictionary
default]) and returns its value. If the key is not present, then it
returns the default value. If the default is not given and
the key is not in the dictionary, then it results in
KeyError.
setdefault() dictionary_name.setdefault The setdefault() method returns a value for the key
(key[, default]) present in the dictionary. If the key is not present, then
insert the key into the dictionary with a default value
and return the default value. If key is present, default
defaults to None, so that this methos never raises a
KeyError.
update() dictionary_name.update([o The update() method updates the dictionary with the
key:value pairs from other dictionary object and it
253
ther]) returns None. Data S
Cont
values() dictionary_name.values() The values() method returns a new view consi
all the values in the dictionary.
Note: Replace the word “dictionary_name” mentioned in the syntax with the
actual dictionary name.
In[]: bolwd_million_dollar =
million_dollar.fromkeys(million_dollar, “1,00,00,000”)
In[]: bolwd_million_dollar
'dangal': '1,00,00,000',
'bajrangibhaijaan': '1,00,00,000'}
Out[]: 2015
In[]: million_dollar.keys()
In[]: million_dollar.values()
In[]: million_dollar.items()
In[]: million_dollar
Out[15]:
{'sanju': 2018,
'bajrangibhaijaan': 2015,
In[]: states.update({"Haryana":"Chandigarh"})
In[]: states.update({"Bihar":"Patna"})
In[]: states
print(key, states[key])
Out[]:
Haryana Chandigarh
Bihar Patna
west bengalkolkata
To delete the key:value pair, use the del statement followed by the name of
the dictionary along with the key you want to delete.
In[]: states
In[]:pm_year =
(('jln',1947),('lbs',1964),('ig',1966),('rg',1984),('pvn',1991),('abv',1998),('n
m',2014))
In[]: pm_year
Out[]:
(('jln', 1947),
('lbs', 1964),
('ig', 1966),
('rg', 1984),
('pvn', 1991),
('abv', 1998),
('nm', 2014))
In[]: pm_year_dict = dict(pm_year)
In[]: pm_year_dict
Out[]:
256
{'jln': 1947, Data Structures and
Control Statements
'lbs': 1964, in Python
'ig': 1966,
'rg': 1984,
'pvn': 1991,
'abv': 1998,
'nm': 2014}
The tuples can be converted to dictionaries by passing the tuple name to the
dict() function. This is achieved by nesting tuples within tuples, wherein each
nested tuple item should have two items in it. The first item becomes the key
and the second item as its value when the tuple gets converted to a
dictionary.
Q45. Items are accessed by their position in a dictionary and all the keys in a
dictionary must be of the same type.
a) True
b) False
Q50. Select all correct ways to remove the key ‘marks‘ from a dictionary
student = {
“name” : “Emma”,
“class” : 9,
“marks” : 75
}
a) student.pop(“marks”)
b) del student[“marks”]
c) student.popitem()
d) dict1.remove(“key2”)
Curly braces{} or the set() function can be used to create sets with a comma-
separated list of items inside curly brackets{}. Note: to create an empty set
you have to use set() and not{} as the latter creates an empty dictionary.
258
Sets are mutable. Indexing is not possible in sets, since set items are Data Structures and
Control Statements
unordered. One cannot access or change an item of the set using indexing or in Python
slicing.
In[]: basket
A set is a collection of unique items. Duplicate items are removed from the
set basket. Here, the set will contain only one item of ‘orange’ and ‘apple’.
Out[]: True
Out[]: False
One can test for the presence of an item in a set using in and not in
membership operators.
In[]: len(basket)
Out[]: 4
In[]: sorted(basket)
Total number of items in the set basket is found using the len() function. The
sorted() function returns a new sorted list from items in the set.
In[]: a = set('abrakadabra')
In[]: a
In[]: b = set('alexander')
In[]: b
Out[]: {'a', 'b', 'd', 'e', 'k', 'l', 'n', 'r', 'x'}
A list of all the methods associated with the set can be obtained by passing
the set function to dir().
Note: Replace the words “set_name”, “other” and “others” mentioned in the
syntax with your actual set names in your code.
In[]: flowers2.add('orchids')
In[]: flowers2.difference(flowers1)
In[]: flowers2.intersection(flowers1)
In[]: flowers2.isdisjoint(flowers1)
Out[]: False
In[]: flowers2.issuperset(flowers1)
Out[]: False
In[]: flowers2.issubset(flowers1)
Out[]: False
In[]: flowers2.symmetric_difference(flowers1)
In[]: flowers2.union(flowers1)
Out[]:
{'daisies',
'goldcrest',
'lavender', 261
'lilies', Data S
Cont
'orchids',
'roses',
'sunflower',
'tulips'}
In[]: flowers2.update(flowers1)
Out[]: flowers2
Out[]:
{'daisies',
'goldcrest',
'lavender',
'lilies',
'orchids',
'roses',
'sunflower',
'tulips'}
In[]: flowers2.discard("roses")
In[]: flowers2
Out[]:
{'daisies',
'goldcrest',
'lavender',
'lilies',
'orchids',
'sunflower',
'tulips'}
In[]: flowers1.pop()
Out[]: 'roses'
In[]: flowers2.clear()
In[]: flowers2
Out[]: set()
10.8.4.2Traversing of Sets
One can iterate through each item in a set using a for loop.
tulips is a flower
goldcrest is a flower
sunflower is a flower
10.8.4.3Frozenset
In[]: fs = frozenset(["g","o","o","d"])
#creating/declaring frozenset
In[]: pets
In[]: lang_used
Q56. The isdisjoint() method returns True if none of the items are present in
both sets, otherwise, it returns False.
a) True
b) False
264
Q58. The symmetric_difference() method returns a set that contains all items Data Structures and
Control Statements
from both sets, but not the items that are present in both sets. in Python
a) False
b) True
10.9.1 Sequential Control Flow Statements :This refers to the line by line
execution, in which the statements are executed sequentially, in the
same order in which they appear in the program.
10.9.2 Decision Control Flow Statements :Depending on whether a
condition is True or False, the decision structure may skip the
execution of an entire block of statements or even execute one block
of statements instead of other (if, if…else and if…elif…else).
10.9.3 Loop Control Flow Statements : This is a control structure that
allows the execution of a block of statements multiple times until a
loop termination condition is met (for loop and while loop). Loop
Control Flow statements are also called Repetition statements ot
Iteration Statements.
if Boolean_Expression :
statement (s)
The Boolean expression after the if statement is called the condition. We end
the if statement with a colon character (:) and the line(s) after the if statement
are indented. The if statement decides whether to run statement (s) or not
depending upon the value of the Boolean expression. If the Boolean
expression evaluates to True then indented statements in the if block will be
executed,otherwise if the result is False then none of the statements are
executed. E.g.,
265
is x > 0? Yes
If x >0 : Data S
Cont
print ( ‘x is positive’) print(‘x is positive’)
Fig. 5: If Logic
Here, depending on the value of x, print statement will be executed i.e. only
if x > 0.
There is no limit on the number of statements that can appear in the body, but
there must be at least one. In Python, the if block statements are determined
through indentation and the first unindented statement marks the end. You
don’t need to use the == operator explicitly to check if the variable’s value
evaluates to True as the variable name can itself be used as a condition.
Here, condition is False, so indented block would not be executed and only
the unindented statement after the if block would be executed.
if Boolean_Expression :
statement_blk_1
else
statement_blk_2
No
Yes
num % 2 == 0
A number is read and stored in the variable named num. The num is checked
using modulus operator to determine whether the num is perfectly divisible
by 2 or not. Num entered is 15 which makes the evaluated expression False,
so the else statement is executed and num is odd.
267
Data S
Cont
if Boolean_Expression_1 :
statement_blk_1
elif Boolean_Expression_2 :
statement_blk_2
elif Boolean_Expression_3 :
statement_blk_3
:
:
:
else :
statement_blk_last
Program 10.7 : Write a program to prompt for a score between 0.0 and
1.0. If the score is out of range, print an error. If the score is between 0.0
and 1.0, print a grade using the following table
268
Score Grade Data Structures and
Control Statements
>= 0.9 A in Python
>= 0.8 B
>= 0.7 C
>= 0.6 D
< 0.6 F
Yes
score >= 0.7
Your Grade is “C”
Yes
score >= 0.6 Your Grade is “D”
The outer conditional contains two branches. The first branch contains a
simple statement. The second branch contains another if statement has two
branches of its own. Those two branches are both simple statements, although
they could have been conditional statements as well.
Ye No
x == y
Ye No
x<y
print(‘equal’)
print(‘less’) print(‘greater’)
All years which are perfectly divisible by 4 are leap years except for century
years (years ending with 00) which is a leap year only it is perfectly divisible
by 400. For example, years like 2012, 2004, 1968 are leap years but 1971,
2006 are not leap years. Similarly, 1200, 1600, 2000, 2400 are leap years but
1700, 1800, 1900 are not.
You can almost read the while statement as if it were English. It means,
“While n is greater than 0, display the value of n and then reduce the value of
n by 1. When you get to 0, exit the while statement and display the word
Blastoff!”
The for loop is incomplete without the use of range() function which is a
built-in function. It is very useful in demonstrating for loop. The range()
function generates a sequence of numbers which can be iterated through
using for loop. the syntax for range() function is,
range([start ,] stop [, step])
Both start and step arguments are optional and is represented with the help of
square brackets and the range argument value should always be an iteger.
start value indicates the beginning of the sequence. If the start
argument is not specified, then the sequence of numbers start from zero by
default.
stop generates numbers up to this value but not including the
number itself.
step indicates the difference between every two consecutive
numbers in the sequence. The step value can be both negative and positive
but not zero.
PROGRAM 10.11 : Program to find the sum of all odd and even
numbers up to a number specified by the user.
1. number = int(input(“Enter a number”))
2. even = 0
274
3. odd = 0 Data Structures and
Control Statements
4. for i in range(number) : in Python
5. if i % 2 == 0 :
6. even = even + i
7. else :
8. odd = odd + i
9. print(f”Sum of Even numbers are {even} and Odd numbers are
{odd}”)
Fig. 14: Screen Shot of execution of Program 10.11
A range of numbers are generated using range() function. As only stop value
is indicated in the range() function, so numbers from 0 to 9 are generated.
Then the generated numbers are segregated as odd or even by using the
modulus operator in the for loop. All the even numbers are added up and
assigned to even variable and odd numbers are added up and assigned to odd
variable and print the result. The for loop will be executed / iterated number
of times entered by user which is 10 in this case.
PROGRAM 10.12 : Program to find the factorial of a number.
1. number = int(input(‘Enter a number’))
2. factorial = 1
3. if number <0 :
4. print(“Factorial doesn’t exist for negative numbers”)
5. elif number == 0 :
6. print(“The factorial of 0 is 1”)
7. else :
8. for i in range(1, number + 1) :
9. factorial = factorial * i
10. print(f”The factorial of number {number} is {factorial}”)
Fig. 15: Screen Shot of execution of Program 10.12
275
Data S
Cont
Read the number from user. A value of 1 is assigned to variable factorial. To find
the factorial of a number it has to be checked for a non – negative integer. If the user
entered number is zero then the factorial is 1. To generate numbers from 1 to the
user entered number range() function is used. Every number is multiplied with the
factorial variable and is assigned to the factorial variable inside the for loop. The for
loop block is repeated for all the numbers starting from 1 up to the user entered
number. Finally, the factorial value is printed.
276
Data Structures and
Control Statements
in Python
Fig. 16: Screen Shot of execution of Program 10.13
The continue statement in the while loop will not let the print statement to execute if
the count value is even and control will go for next iteration. Here, loop will go
through all the iterations and the continue statement will affect only the statements
in the loop to be executed or not occurring after the continue statement. Whereas,
the break statement will not let the loop to complete its iterations depending on the
condition specified and control is transferred to the statement outside the loop.
PROGRAM 10.15 : Program to check whether a number is prime or not
277
1. number = int(input(‘Enter a number: ‘)) Data S
Cont
2. prime = True
3. for i in range(2, number) :
4. if number % i == 0 :
5. prime = False
6. break
7. if prime :
8. print(f”{number} is a prime number”)
9. else :
10. print(f”{number} is not a prime number”)
Fig. 18: Screen Shot of Program 10.15
Q62. Given the nested if-else below, what will be the value x when the code
executed successfully?
x=0
278
a=5 Data Structures and
Control Statements
b=5 in Python
if a > 0:
if b < 0:
x=x+5
elif a > 5:
x=x+4
else:
x=x+3
else:
x=x+2
print(x)
a) 0
b) 4
c) 2
d) 3
279
Q66. What is the value of the var after the for loop completes its execution? Data S
Cont
var = 10
for i in range(10):
for j in range(2, 10, 1):
if var % 2 == 0:
continue
var += 1
var+=1
else:
var+=1
print(var)
a) 20
b) 21
c) 10
d) 30
10.10 SUMMARY
After the completion of this chapter, I am sure, you would be able to learn
and understand the basics of Python language. Using the contents explained
in this chapter, you would be able to turn your logic into codes where
identifiers and variables would help you to form statements and expressions
using operators, lists, tuples, sets and dictionries which are the back bone of
Python language which makes it unique and easy to program with. All the
basic structures of Python can be bound together with the control flow
statements which ultimately form a Python program.However, this is not all;
there is still a long way to go. Python has many more unique features which
make it a programmer’s language. So, Happy Programming!
280
Data Structures and
SOLUTIONS TO CHECK YOUR PROGRESS Control Statements
in Python
1. a 2. d 3. d 4. a 5. c 6. d
7. b 8. e 9. b 10. a 11. b 12. a
13. d 14. c 15. b 16. e 17. d 18. a
19. a 20. d 21. b 22. c 23. c 24. c
25. b 26. b 27. b 28. b 29. c 30. b
31. c 32. b 33. b 34. c 35. a 36. b
37. c 38. d 39. a,c 40. b 41. b 42. c
43. c 44. a,b 45. b 46. b 47. b 48. d
49. c 50. a,b,c 51. a,b,c 52. a,b,c 53. c 54. b
55. a 56. a,c,d 57. a,c,d 58. b 59. b 60. b
61. a 62. d 63. a 64. a 65. d 66. b
67. d
281
Functions and Files
UNIT 11 FUNCTIONS AND FILE HANDLING Handling in Python
IN PYTHON
Structure
11.0Introduction
11.1 Objectives
11.2Function definition and calling
11.3 Function Scope
11.4 Function arguments
11.5 Returning from a function
11.6 Function objects
11.7 Lambda / Anonymous Functions
11.8 File Operations
11.9 Summary
11.0 INTRODUCTION
Python provides a way of organizing the tasks into more manageable units called
functions. Functions make the code modular which is one of the characteristics of an
object oriented programming language (OOPs). Modularity is the process of
decomposing a problem into set of sub-problems so as to reduce the complexity of a
problem. It also makes the code reusable. File handling is another important aspect
discussed in this unit. File handling includes- creation, deletion and manipulations of
files using python programming.
11.1 OBJECTIVES
279
1. Built-in functions – these are the functions which are already defined in the Funct
language. Exampleprint( ), max( ), input( ), etc. Hand
2. User Defined functions- these are the functions that can be created or
defined by the users according to their needs.
3. Anonymous functions
A function can be defined using def statement and giving suitable name to a
function by following the rules of identifiers. The process of defining a function is
called function definition.
Deffunction_name( list_of_parameters ) :
Statement (s)
Where,
List_of _parameters –is an optional field which is used to pass values or inputs to a
function. It can be none or a comma separated list of variables.
Even if the function is defined, it can never be executed till the time it is called.
Hence, for using a function, it must be called using function call statement. A
function can be called by its name with set of parenthesis and optional list of
arguments.
function_name(list_of_arguments)
Function needs to be defined only once, but it can be called any number of times by
using calling statements. They can not only be called in the same program, but they
can also be called in different programs. This will further be discussed in the next
chapter.
280
Another example shown below is the program having a function to calculate Functions and Files
factorial of a number. Handling in Python
Local variables are the variable created within a function’s body or function’s
scope. They cannot be accessed outside the function. Their scope is only limited to
the function in which they are created.
Global variables are the variable created outside any function. Their scope is
global, hence can be used anywhere. Global variables can also be created within
function using keyword global.
In Example 3, variable created x is global, hence, can be used both inside and
outside any function. Variable y is created inside function test(), therefore, its scope
is only limited to this function and hence cannot be used outside.Global variables
can be created in functions using global keyword as shown in example 4.
281
Example 4: Program to create global variable inside function. Funct
Hand
If we create a variable inside function having same name as that of global variable,
then a separate variable of same name gets created. Function in this case can access
local variable and hence, cannot refer to global variable as shown in example 5.
Example 5: Program showing use of Local and global variables of same name.
In python, global variable can be accessed in function directly (as shown in Example
3) but they cannot be directly modified inside the function (shown in example 6).
Then how can we modify global variables inside function? Answer to this question
is throughglobal keyword. It can not only be used for creating global variables
inside functions, but it can also be used for modifying global variables inside
functions. See example 7.
282
Functions and Files
Example 7: Program to show modification of global variable using global keyword Handling in Python
Ex1. What are the benefits of using functions? Also differentiate between function
definition and function calling.
Ex2. What is Scope of a variable? Explain local and global variables with example.
Ex3. Write a function named patternto display the pattern given below-
1
12
123
1234
12345
1. Required arguments
2. Default arguments
3. Keyword arguments
4. Arbitrary arguments
283
Funct
Hand
2. Default arguments
Default values of variables can be given in the parameters itself. So if any argument
is not given at the calling time, it will be replaced by the default value. Default
values can be given for any number of arguments. It must be taken care that default
argument must follow non-default arguments.
3. Keyword Arguments
We have seen above that arguments must be given in the order in which parameters
are defined otherwise the result will be effected. Keyword arguments are one way by
which we can give arguments in any order. They are given by specifying the
parameter name with each argument during function call. In this case position does
not matter but name matters hence they are also called named arguments.
284
Example 10: Use of Keyword Arguments Functions and Files
Handling in Python
4. Arbitrary Arguments
Sometimes it is required to pass different number of arguments to a same function or
it is not known at function definition time that how many arguments could be used at
calling time. Python provides the feature of arbitrary arguments to deal with this
issue. Arbitrary arguments can be declared using * symbol.
deffunction_name( arg1,arg2.... ) :
......................
......................
return value
285
Example12: Function with return statement Funct
Hand
There can be only one return statement in a function. It doesn’t mean that we can
return only one value. It means that the return statement can return only one object
and object in python can contain single (variable) or multiple values (List, tuple).
Hence, we can return multiple values with a single return statement.See example13.
Example 13: Function returning more than one value
286
Functions and Files
It is also possible to break out of a function in the middle of statements in function Handling in Python
using return. The statements following the return statement will never be executed.
In example 15, inside a function, there is loop ranging from 1 to 9, but it will only be
executed 4 times, since the function will return when value of i reaches 5, hence
remaining iterations will be skipped.
Ex 2. Write a function which takes list of numbers as argument and returns a list of
unique elements from it.
Ex 3. Write a function to display all prime numbers between a range which is passed
as arguments.
In python, data is represented as objects. Like Lists, Strings etc, functions are also
treated as objects. Functions in python are first class objects. Since functions are
objects,it provides various features with additional to the existing ones. These are-
287
Funct
Example 16: Function assigned to variable Hand
In the following console window it can be clearly seen that after deleting a
function, it cannot be accessed with the same name. But it can still be called using
another name as shown in example 17.
Example 17: Deleting reference to a function
Functions can be passed as an element to any data structure. This is very useful at
times when we want to apply different functions to same input. Below is the
example 18 to show that. We are using various built-in functions to demonstrate
that.
288
Functions and Files
Handling in Python
4. Nested function
Functions created within another function are called nested function. This is one of
the unique properties in python since functions are objects. The inner function which
is created within some outer function has access to all the variables of enclosing
scope. Inner functions can never be directly called outside outer function. Hence, it
provides security feature called Encapsulation. It can only be called by the use of
enclosing function.
Given below is example 21 in which two lambda functions are created. First
function calculates cube of a given argument and second function gives addition to
two given arguments. Lambda function is then assigned to a variable (function
assigned to variable, discussed in previous section), which can then be used to call
function with arguments and set of parenthesis.
Lambda functions are mostly used as argument to other high-order function like map
() and filter () function.
map() function : map () is a built-in function which takes two arguments, first
argument given is function (can be lambda function), second argument is given as a
list. map () function returns a list of elements obtained by applyinggiven function to
each element of alist.
filter() function : filter() is another built-in function which takes two arguments.
First argument is a function and second is list of elements, just as map() function.
Here, given function is applied to each of the elements of list and returns a list of
items for which the function evaluates to True.
290
Example 22: Application of map() function with lambda function Functions and Files
Handling in Python
Ex 3. Write a program to display vowels from a given list of characters using filter
function.
There are two types of files supported by python- Binary and Text.
Binary files – These are the files that can be represented as 0’s and 1’s. These files
can be processed by applications knowing about the file’s structure. Image files are
example of binary files.
291
Text files – These files are organized as sequence of characters. Here, each line is Funct
separated by a special end of line character. Hand
1. Opening a file
2. Operating on file – read , write , append etc
3. Closing a file
1. Opening a file
A file can be opened in a Python using built-in function open(). By default the files
are opened in read text (‘r’) file mode.
Where,
File_name.ext - is the name of the file to be opened and ext is the extension of file.
file – is the object returned by the function. This object can be used for further
operations on file
‘w+’ Same as ‘r+’ but creates new file if does not exist and
overwrites if exists
292
Functions and Files
Handling in Python
2. Operating on file
There are many ways to read from a file. Given below are the functions
available for reading from a file.
In the below table assume that file is the object returned from open()
function.
Function Syntax Description
3. Closing a file
After completing all the operations on file, it must be closed properly. This step
frees up the resources and allows graceful termination of file operations.
file.close()
It may be noted that the file that we want to read or write, may be present in some
other directory or folder. In that case, we can give absolute or relatative path of that
294 file along with its name, shown in the example below. The path separated by \ must
be proceeded by one more \ (backslash) to turn-off special feature of this character. Functions and Files
If the file to be read or written is in the same folder, in which python program is Handling in Python
present, we need not give its path.
For creation of new file, the file can be opened in ‘w’ mode. If the file already
exists, the contents can be overwritten. Also, if we want to be sure that no existing
file gets overwritten, then ‘x’ mode can be used to create new file. If the file already
exists, it will show error message. Given below is the example to open a file and
write contents to it.
Example24 : Program to create file and add contents to it.
After executing this program a file name second.txt gets created in the mentioned
drive with the added contents.
The methods of dealing with files used in the above section may not be safe
sometimes. It may happen that an exception occurs as a result of operations on file
and the code exits without closing the file. To make it more convenient python
introduced another statement called with statement which ensures that file is closed
when the code within with is exited. Call to close() function is not required
explicitly. The syntax of how to use with statement for reading, writing and
appending file is given below.
295
Syntax of read,write and append with with statement: Funct
Hand
296 Ex 2. Write a program to display first n lines from a file, where n is given by user.
Functions and Files
Ex 3. Write a program to display size of a file in bytes. Handling in Python
11.9 SUMMARY
A Function is a block of code that performs a specific task. In this chapter, we
have discussed various aspects of functions such as how to create functions,
their scope, passing arguments to function, andLambda functions. In addition
to these topics, file handling operations are also discussed in detailssuch as
how to interact with file, copying, deleting, etc.
Syntax deffunction_name():
….. # body of function
……
Even if the function is defined, it can never be executed till the time it is called.
Hence, for using a function, it must be called using function call statement.
Calling of a function includes function name and list of arguments (no function
body).
Syntax function_name()
Local variables are the variable created within a function’s body or function’s
scope. They cannot be accessed outside the function. Their scope is only
limited to the function in which they are created.
Global variables are the variable created outside any function. Their scope is
global, hence can be used anywhere. Global variables can also be created
within function using keyword global.
deff():
s =1 # s is local variable
print(s)
r ="IGNOU" # r is global variable
f() 297
print(
(r) Fu
Ex 3. Ha
Check you
ur Progress 2
Ex 2.
Ex 3.
Check you
ur Progress 3
Ex 1.
298
8
Ex
x 2. Functions aand Files
Handling in
n Python
Ex
x 3.
Ch
heck your Progress
P 4
Ex
x 1.
Ex
x 2.
Ex
x 3.
299
UNIT 12 MODULES AND PACKAGES
Structure
12.0 Introduction
12.1 Objectives
12.2 Module Creation and Usage
12.3 Module Search Path
12.4 Module Vs Script
12.5 Package Creation and Importing
12.6 Standard Library Modules
12.7 Summary
12.0 INTRODUCTION
Modules are files that contain various functions, variables or classes which are
logically related in some manner. Modules like functions are used to implement
modularity feature of OOPs concept. Related operations can be grouped together in
a file and can be imported in other files. Package is a collection of modules and
other sub-modules. Modules can be well organized and easily accessible if
collectively stored in a package.
12.1 OBJECTIVES
Our module is successfully created. Now let us test our module by importing in
some other file and check whether it is working or not. For verifying that, in a new
file, two steps are needed to be done-
301
Similar to the above example, we can call another function created in the module
fibonacci() by following the same process.
import series
Series. fibonacci ( 2, 10 )
Importing a module
In this method, we can import the whole module all together with a single
import statement. In this process, after importing the module, each function
(or variable, objects etc.) must be called by the name of the module followed
by dot (.) symbol and name of the function.
import module
module.function_name()
For example, let us import the built-in module random, and call its function
randint(), which generates a random integer between a range given by user.
302
This can be done by running the code below in console window directly or in Modules and
Packages
a python file.
Let us take an example of another module called math. This module contains
various functions and variables. One such variable is pi, which contains value
of π.
303
3. Importing entire module using from import *
This method can be used to import the entire module using from import *
statement. Here,*represents all the functions of a module. Like previous
method, an object can be accessed directly with its name.
Upto now, we were able to import our modules without doing anything
special because they were all created in the same current directory. But if we
move to some other directory, and try to import modules located in previous
directories, we will not be able to use it.
In example 1 of this unit, we have created a module named series.py and used
304 this module in a file named demo.py in example2. We were able to import
modulessince both of themwere in the same directory. But when we re-start Modules and
Packages
shell, we move to python’s default location. In this location, we will not be
able to import of series.py module. Shown in example 3 below.
Example 3:
Therefore, any modules created must be located inpython’s search path for its
global identification. This can be done in either of the ways-
1. Creating module in one of the locations already present in search path
2. Adding your module path in the search path using sys.path.
3. Updating PYTHONPATH environment variable.
4.
305
As we can see in above example, our directory is now present in the list of
search directories. Hence, now we can import series module from any
location. This method is not robust since it adds modules only for current
session. For each new session, path needs to be added again.
SCRIPTS
Scripts are the files with sequence of instructions, which are executed each
time the script is executed. There are various ways to execute a script,
provided by different IDEs. It can also be executed in the console ( shell in
Unix/Linux and cmd in windows) using the command given below.
It should be noted that this command should be run in the directory where
your python script exists otherwise no file or directory exists error will be
shown.
306
MODULES Modules and
Packages
Functions which can be called from multiple scripts should be created within
a module or we can say that a module is a file which is created for the
purpose of importing. They are used to organize code in hierarchy. Module
after creation should be added to search path.
When a module is imported, it runs the file from top to bottom. But when a
module is executed, it runs the entire file and set the __name__ attribute to
the value “__main__”. This allows us to put a special code in a particular
section which we want and we execute only when the module is executed
directly. This section will not be executed during import.
Packages like modules are also used to organize the code in a better way. A
package is a directory which contains multiple python modules. It is used to
group multiple related python modules together. A python package in
addition to modules must contain a file called __init__.py. This file may be
empty or contains data like other modules of package.
307
File __init__.py
It is a file that makes the package importable. When a package is imported in
a script, this file is automatically executed. It initializes variables, objects and
makes the functions in the package accessible.
Let us create a package namedpack and within this package create two
modules first.py and second.py .
The __init__.py file created is empty. Module one contains function abc()
and module two contains function xyz().
importpack.first
pack.first.abc()
There are more methods to import. We have used * to import all the functions
from a module in the previous section. This method can also be used here.
But by default importing package modules using * will show error.
308
Modules and
Packages
This can be made possible using __all__ variable. This variable when added
to __init__.py file, can make modules within package accessible outside
using from import * statement.
Hence, we need to add __all__ statement in __init__.py
__all__= [‘ first ’]
The above statement makes module first.py accessible using from import *
statement.
Here, we can clearly see that first.py module is now accessible, since we have
added it to __all__ variable. But second.py module is not
accessiblesimultaneously, since it was not added to __all__ attribute in
__init__.py.
309
Check your Progress 2
Ex. 1 What are packages ?How are they different from modules ?
Ex. 2 What is module search path ?How can we check it ?State the ways of
adding a user defined module to search path.
sys
os
math
random
statistics
Module Attributes
There are some attributes or functions that work for every module whether it
is built-in library module or custom module. These attributes help in smooth
operations of these modules. Some of them are explained below:
310
2. dir ()- it is a function which is used to display objects or functions present Modules and
Packages
in a specific module.Before using dir() function, module should be first
imported.
3. __name__ attribute
This attribute returns name of the module. By default its value is the same as
the name of the module.
When a module or script is executed, its value becomes ‘__main__’. Also,
when called without module name, it returns ‘__main__’.
4. __file__ attribute
This attribute returns the location or path of the module.
5. __doc__ attribute
OS MODULE
311
below. It should be noted that before using these functions, the module
should be imported.
importos
function Description
SYS MODULE
This module contains various variables and functions that can manipulate
python runtime environment. Some of them are listed intable given below:
Function Description
MATH MODULE
STATISTICS MODULE
This module contains various functions used in statistics. These functions are
widely used for data analysis or data science.
Function Description
12.7 SUMMARY
In this unit, we have discussed modules and package creations in details.
Modules are python files which can be imported in other files. A package is a
folder which can store multiple modules and sub-packages within. Moreover,
313
built-in modules are also discussed in details that add real power to python
programming.
A module can be created like any other python file i.e. with .py extension. Name of
the module is the same as the name of a file.
1. import module
module.function()
This method can be used to import the entire module using from import
* statement. Here, * represents all the functions of a module. Like
previous method, an object can be accessed directly with its name.
314
Exx. 2 When wew use imporrt statementss to import a module, it is searched in a Mod
dules and
P
Packages
ories or search paths stored by the environment variaable
listt of directo
PYYTHONPAT TH. This is called
c modu ule search ppath. This list of directoories
cann be check ked using syys.path varriable. Any modules crreated mustt be
loccated in pyth
hon’s search path for its global identtification.
Mo
odules can be
b added to search
s path by
b either of tthe ways-
1. Creatin
ng module in
n one of the locations
l alrready presennt in search ppath
2. Addingg module patth in the searrch path usinng sys.path.
3. Updatinng PYTHON NPATH envvironment vaariable.
Exx. 3 First of all,ceate a folder naamed area and place 4 file nameed –
cirrcle.py, squaare.py, rectanngle.py and __init__.py
_ in folder.
circle.py
c
square.py
reectangle.py
No
ow, we can import
i the paackage alongg with all thee modules inn any file.
315
MCS-201
Programming in C
Indira Gandhi National Open University
School of Computer and Information
Sciences (SOCIS)
and Python
Block
4
ADVANCED FEATURES IN PYTHON
UNIT 13
Classes in Python 317
UNIT 14
Exception Handling in Python Programming 339
UNIT 15
Python-Advance Concepts 350
UNIT 16
Data Access Using Python 361
BLOCK 4 INTRODUCTION
Happy Programming!!
Indira Gandhi
National Open University MCS-201
School of Computer and
Information Sciences PROGRAMMING IN
C AND PYTHON
Block
4
ADVANCED FEATURES IN PYTHON
UNIT 13
Classes in Python 317
UNIT 14
Exception Handling in Python Programming 339
UNIT 15
Python-Advance Concepts 350
UNIT 16
Data Access Using Python 361
PROGRAMME/COURSE DESIGN COMMITTEE
All rights reserved. No part of this work may be reproduced in any form, by mimeograph or any other means,
without permission in writing from the Indira Gandhi National Open University.
Further information on the Indira Gandhi National Open University courses may be obtained from the
University’s office at MaidanGarhi, New Delhi-110 068.
UNIT 13 CLASSES IN PYTHON
Structure
13.0 Introduction to Object-Oriented Paradigms
13.1 Objectives
13.2 Classes and instances
13.3 Classes method calls
13.4 Inheritance and Compositions
13.5 Static and Class Methods
13.6 Operator Overloading
13.7 Polymorphism
13.8 Summary
The reason to define a new class helps in solving the structured application
program in terms of object-oriented programming.In structured programming,
language functions are defined. These functions are used by the users, but the
implementations are hidden by the users. Similarly, a class defines methods and
these methods are used by the users but how these methods are implemented are
hidden from the users. A customized namespace is associated with every class and
objects.
13.1 OBJECTIVES
After going through this unit you will be able to :
317
13.2 CLASSES AND INSTANCES
Classes
Classclass_name:
class_variable1= value_of_variable
class_variable2= value_of_variable
class_variable3= value_of_variable
…
defclass_method1(self,arg1,arg2,…):
method1_code
def class_method2(self,arg1,arg2,…):
method2_code
…
The first class we defined is a Rectangle.
>>>
class Rectangle:
defsetsides (self,x,y):
self.height=x
self.width=y
print('The sides of the rectangle are {} and
{}:'.format(self.height,self.width))
def area(self):
return(self.height*self.width)
def parameter(self) :
return(2*(self.height*self.width))
It’s a convention to write the name of a class with the first character in a capital
letter. But it supportsa small letter also. After writing the name of a class,it must be
preceded by a colon ‘:’. In C++ or Java, we were using pair brackets () but python-
support colon ‘:’ only.The statement is written after the colon ‘:’ will be taken by the
Python interpreter as part of the class document.
When we create a class,a namespace is created for the class Rectangle. This
namespace store all the attributes of the class Rectangle. This namespace will
specify the names of class Rectangle method.
318
Object
In Python, a namespace is created for each class. Each namespace is specified with a
name, and this name is same asclass name—all the attributes of the class use this
namespace for the storage.Thus in our example namespace Rectangle must contain
names of all the class methods.
The function setsides(),area() and parameter() are defined in the name space. The
syntax of methodwould be:
defsetsides(self, x,y):
# implementation of setsides()
def area():
# implementation of area()
def parameter():
# implementation of parameter()
Instance
Variables that point to the object namespace is called instance variables.
Each instance variable containsa different value for different objects. All the
319
variable define inside the __init__valiable are called as instance variables. And all
the variable defined inside the class but outside the __init__valiable is called class
variables.A class variable is also called as static variables.
When we create an object of the class, the constructors declared in the classenvoke
automatically to which it belongs. In Python, there is a unique method _ _init_ _ to
implement constructor of the class in which it is defined. The first argument of the
method _ _init _ _ must be self. Self is a reference to a class to which this object
belongs.
320
Example 2: Program to call a constructor
When two objects obj1 and obj2 are created __init__ method is called automatically.
Class Methods
Predefined word classis used to Predefined word defis used to describe
describe a class. the method of a class.
Each class statement defines a new type A def statement defines a new function
with a given name. with a given name.
Each class name is preceded by a colon Each method name is preceded by a
‘:’ statement. colon ‘:’ statement.
Example -- class Rectangle: Example -- defsetsides(self):
The class which is inherited is called a base class or parent class or superclass, and
the inheriting class is called the derived class or child class or subclass.For our
reference, we will use the term parent class and child class. A child class acquire all
the properties of the parent class, but the vice versa is not true; parent class can’t
access any features of a child class. The main motto behind the inheritance is code
reusability. Once a code is defined in a class if it is required by another class then by
inheriting the class code can be reused.
Syntax of inheritance:
class<Child Class>:
If this child class inherits the parent class, then the statement will be changed to
class<Child Class> (<Parent class>):
321
Consider aclass Parent containing two methods methodA1() and methodA2() and a
class Child with method methodB1() and methodB2().Child class is defined to be
the subclass of Parent class.Therefore it inherits both the methods methodA1() and
methodA2() of Parent class .
Example 3: Inheritance of a parent class by child class
After inheritance class child contains methods methodB1() and methodB2() as well
as methods of class Parent , methodA1() and methodA2().
322
Multilevel inheritance:
Consider three classes class A,class B and class C
Multiple Inheritance:
Consider two classes, class A with two methods methodA1(),methodA2() and class
B with methodB1() and methodB2(). If another class C inherits both class A and
class B,then class B will inherit the features of class A and B.
323
Example 5: Implementation of multiple inheritance
Since the creation of an object of a class will automatically invoke the constructor of
the class. Here in the example class C1 object will call a constructor of class C1
automatically, and creation of an object of class C2 will call the constructor of class
C2 automatically.
324
Example 7:
If we want to call the init method of the parent class also then we can call it with the
help of keyword super.
Thus when we create an object of the child class, it will call the init method of the
child class first. If we have called super, then it will first call init of the parent class
then it will call int of the child class.
If we have two classes, A and B inherited by class C. If init method is defined in all
three classes then what will happen if call inits of the parent class with the help of
super() keyword? Then which class init method will be called?
325
It will first call the init method of the child class then with the help of super()
keyword it will call the init method of the left parent class that is A in our example.
In multiple inheritances, when we inherit the classes, then the method is executed
based on the order specified, and this is called Method Resolution Order (MRO).
If class A is inherited by class B and Class C and then class D inheriting class B and
class C.
Then according to the Method of Resolution Order (MRO) the orderof execution of
the methods and attributes are: class Dclass Bclass Cclass A
A static variable is that variable whose value remainsthe same for all the objects of
the class. It creates one copy of the variable which is shared by all objects of the
class. To declare a static variable, it must be declared inside the class. No method is
used to declare a static variable it is declared without any method.
To use the static variable, we will use the class name to which this static variable
belong, or we will use the reference of the object. But it is always preferred to use
class name in place of reference of the object.
326
In Python, there are three types of methods: Instance methods, class methods and
static methods.
Instance methods:
In the above example first method __init__ is a constructor of the class. The second
method avg(self )is the instance method of the class.This method contains one
parameter self, which points to the instance of the
classMyClass, 3.0 will be printed as an output.
When the method is called Python, replace the self argument with the instance of the
object.Thus instance method always works on the object.
Class method
327
A class method is a method which is bound to the class and not the object of the
class. A special symbol called a decorator ‘ @’ followed by the keyword
classmethod is used to define the class method.
A class method can be called by the class or by the object of the class to which this
method belongs. The first parameter of the class method is class itself.Thus as an
instance method is used to call the instance variable similarly class method is used to
call class variables.
Static method
Suppose we are looking to a method which is not a concern to the instance variable
neither to the class variable. In that case, we will use a static method.Static method
in Python isused when such methods are called another class or methods are used to
perform some mathematic calculations based on the values received as an argument.
A special symbol called as a decorator ‘@’ is used followed by the
keywordstaticmethod is used to define a static method. Thus a static method can be
invoked without the use of the object of the class.
Thus if we want to work with the variables other then class variable and instance
variable, we will use static.
>>>2+5
[2,3,4,5,6]
IGNOU University
>>int(2)._ _ add(5)
7
>>>[2,3,4]._ _add_ _[5,6]
[2,3,4,5,6]
When we add two objects s1 & s2, it will show an error. Here it is not defined to the
Python interpreter to add two objects. Hence we have to overload operator add.
Example 15: Operator overloading
The comparison operator is not defined to the Python interpreter for the objects.
Hence we have to redefine it or overload it. The function which corresponds to the
symbol greater than ‘>’ is __gt__ (refer to table 13.2). So we have to overload this
operator by defining the function.
330
Example 17: Overloading operator ‘>.’
13.7 POLYMORPHISM
Poly means ‘multiple’ and Morph means ‘forms’. Thus polymorphism is multiple
forms. For example, human being behaves differently in a different environment.
The behaviour of a human in the office is different from his behaviour at home,
which is different from his behaviour with friends at a party.
Duck typing
There is a sentence in the English language “if this is a bird which is walking like a
duck,quacking like a duck and swimming like a duck then that bird is a duck”. It
means if the behaviour of the bird is like a duck, then we can say it a Duck.
X=4
and
X= ‘Mohit’
In the first statement, X is a variable storing integer value. The type of the X is int.
However, in the second statement X= ‘Mohit’ the storage memory taken by the
331
variable is a string. In Python, we can’t specify the type explicitly. During the
runtime, whatever value we are storing in a variable the type is considered
automatically. And this is called Duck Typing principle.
In the above example, the obj is an object of class Animal. When we call the code of
Animal class, we have to pass an object ide. So before passing ide, we have to define
it at the object of Duck class,one more ide for the class dog is defined. At the
moment when we assign ide as an object of Dog class, then it will execute the dog
method.
Example 19:
So it doesn’t matter which class object we are passing the matter is that object must
have executed method. And this is called duck typing.
Operator Loading
Consider A=2 and B=5 are two variables. In a programming language, when we are
performing a+b, it will perform the addition of two integer numbers. If X= ‘Hello’
and Y= ‘Hi’ then x+y will perform addition of two strings.
A=2
B=5
332
>>>print(A+B)
…
7
Python interpretor will take it as print(init.__add__(a,b)), where add() is a method
of the init class.
>>>print(init.__add__(a,b))
7
X= ‘Hello’
Y= ‘Hi’
>>>print (X+Y)
HelloHi
Python interpretor will take print(X+Y) as print(str.__add__(X,Y)), where add()is a
method osstr class.
>>>print(str.__add__(X,Y))
HelloHi
Method Overloading
Consider two classes having methods with the same name, but with a different
number of parameters or different types of parameters, then the methods are called
overloaded. In overloaded methods, the number of arguments is different, or types of
arguments are different.
class student:
marks(a,b)
marks(a,b,c)
here two methods marks are defined one with two parameters and another having
three parameters. These two methods are called method overloading. Python does
not support method overloading.
If there are multiple methods in a class having the same name then Python will
consider only the method which is described at the end of the class.
Method Overriding
In Python, we can’t create the same methods with the same name and the same
number of parameters. But we can create methods of the same method in the classes 333
derived in a hierarchy. Thus the child class redefined the method of the parent class,
and this is called method overriding.
A method which is overridden in a child class can also access the method of its
parent class with the help of keyword super().
334
2. Define method overloading and constructor overloading in Python.
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
3.Select the correct output generated from the following program code:
class code1:
def __init__(self,st="Welcome to Python World"):
self.st=st
def output(self):
print(self.st)
obj=code1()
obj.output()
a) The code result an error because constructor are defined with default
arguments
b) Output in not displayed
c) “Welcome to Python World” is printed
d) The code result an error because parameters are not defined in a function
------------------------------------------------------------------------------------------------------
-------------------
------------------------------------------------------------------------------------------------------
-------------------
4.What type of inheritance is illustrated in the following Python code?
class Class1():
pass
class Class2(Class1):
pass
class Class3(Class2):
pass
a) Multilevel inheritance
b) Multiple inheritance
c) Hierarchical inheritance
d) Single-level inheritance
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
5. What is polymorphism and what is the main reason to use it?
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
13.8 SUMMARY
In this unit, we discussed the concepts of classes and objects. Concept of a
namespace to store object and class in memory is also defined in this unit. Different
types of class methods namely static methods ,instance methods and class
methodsare discussed in this unit.
This unit also focused on inheritance and various types of inheritance: single level
inheritance,multilevel inheritance and multiple inheritances.
In this unit, it is described that the same operator can be used for multiple purposes,
and this is called operator overloading. I list of operators and corresponding
methods, also called as magic methods are also given in the unit.
335
Polymorphism means it is the ability to behave differently in a different situation.
The concept of polymorphism and the implementation of polymorphism with Duck
Typing, Operator loading, Method Overloading and Method Overriding are also
described in the unit.
336
Exception Handling in
UNIT 14 EXCEPTION HANDLING IN Python Programming
PYTHON PROGRAMMING
Structure
14.0 Introduction
14.1 Objectives
14.2 Default Exception Handler
14.3 Catching Exceptions
14.4 Raise an exception
14.5 User Defined Exceptions
14.6 Summary
14.0 INTRODUCTION
Programers always try to write an error-free program, but sometimes a
program written by the programmer generates an error or not execute due to
the error generated in the program. Some times the program code is correct,
but still, it generates an error due to the malicious data is given as an input to
the program. This malicious data may be given by the user or from a file that
causes an error generation during the execution. This type of error generally
occurs when we user server-side programs such as web programming and
gaming servers.
Every developer is writing a code that must not generate an error during
execution. We will study various types of errors that generate during the
program execution or before the execution of the program code.
14.1 OBJECTIVES
After going through this unit, you will be able to :
Example 2
>>> list1=[2, 3, 4, 5, 6]
>>>list1[5]
Example 3.
>>>x+3
Example 4.
>>>int('22.5')
Example 5.
>>> '2'*'3'
In each example syntax is correct, but it goes to an invalid state. These are
runtime errors. In such a situation, Python interpreter generates an exception
for run time errors. This exception generates an object which contains all
information related to the error. In Example 5 the error message displayed:
what is happening and at which line number it is happening (here line number
is one because there is only one statement in the code) and the type of error is
also printed.
340
Exception Handling in
14.3 CATCHING EXCEPTIONS Python Programming
In Python, every exception is class, and these classes are the derived class of
the BaseException class. ThusBaseException class is the topmost class in the
hierarchy of exception classes.
Exception handling using try-except:
try:
risky code(generating exception)
except:
corresponding to risky code(handler)
The code which generates an exception must be written in a block with the
name specify by 'try'and the code which will handle the exception will be
given in 'except' block.
If the three lines code are written in Python
print("IGNOU")
print(87/0)
print("Welcome to the University")
>>>
…
Here the first line will be executed, and IGNOU will be printed when Python
interpreter will execute 2nd lines of the program then it generates an
exception, and the default exception handler will print the error code
"division by Zero"then after the program is terminated. Thus the third line of
the program will not execute. And this is also called as abnormal termination.
If we rewrite the code with the try and except then the code will become
print("IGNOU") 341
Example 1: Implementation of try and except block. Excepti
Python
Here program terminated successfully. We can also print the error message
by modifying the code as:
Example 2:
In the above code, the first line executed successfully and "IGNOU" will be
printed. When the python interpreter executes the print statement "(23/0)" an
exception is raised, and a message given in the print statement will be printed
with the name of the exception "division by zero". After that,the interpreter
executes the last statement, and it will print "Welcome to the University."
If there are more than one except block written in the try block,then the try
block will execute the except block which is responsible for the code.
Example 3: Try block with more than one except block.
342
Exception Handling in
Python Programming
With the help of single except block, we can handle multiple exceptions:
Example 4: Multiple exception handling with a single try block and multiple
except block.
343
Corresponding to each error there will be an except block if corresponding Excepti
Python
except block is not there then a except block written at the end of all except
block is used for the error. And it must be the last except block in all.
Example 5: Implementation of default except for block
Some times exceptions may or may not be raised, and sometimes exceptions
may or may not be handled. Irrespective of both of these we still want to
execute some code. And such codes are written in finally block.
try:
Code with Error
except:
Code to handle error
finally:
Necessary code
Example 6: Implementation of finally block.
344
Exception Handling in
Python Programming
In case of different types of error, we can use a default except for block. This
block is generally used to display normal error messages. The default except
block must be the last block of all except blocks.
345
Excepti
14.4 RAISE AN EXCEPTION Python
Some times user want to generate an exception explicitly to inform that this is
the exception in this code. Such type of exceptions is called as user-defined
exceptions or customized exceptions.
This user-defined exception is a class defined by the user, and this class is
derived from the Exception class. Pythoninterpreter does not have any
information related to the user-defined exception class. Thus, it must be
raised explicitly by the user.
The keywordraise is used to raise the class when it is required.
Example 10: Implementation of user-defined exceptions.
classMyException(Exception):
pass
classMyException(Exception)
def __init__(self,argumnet):
346 self.msg=argumnet
Exception Handling in
Python Programming
A raise statement is used to raise the statement.
Example 11: Program to raise an exception.
14.6 SUMMARY
In this unit, it is defined that a program may produce an error even though the
programmer is writing error-free code. These are the mistakes that change the
behaviour of our program code.
In this unit, it is defined that the default exception handlers are there in
Python. How these exception handler works are described in this unit.
By default, there are exception handlers in Python. But a user can also raise
the exception which is a customized exception, not a language defined
exception.
348
UNIT 15 PYTHON-ADVANCE CONCEPTS
Structure
15.0 Introduction
15.1 Objectives
15.2 Decorators
15.3 Iterators
15.4 Generators
15.5 Co-routines
15.6 Summary
15.0 INTRODUCTION
# In-Built Function
Name = “IGNOU-SOCIS”
print(len(Name))
We also learned to define our own function just to recapitulate lets write our
function to add two numbers
# User-Defined Functions
defadd_two(a,b) :
returna+b
total = add_two(5,4)
print(total)
here add_two(a,b) is the user defined function that takes two numbers as
input and return their sum, which is stored in the varable total, the result of
350 total is printed subsequently.
We also learned the concept of anonymous functions i.e lambda functions or
Lambda expressions, the concept was introduced in python and later it was
adopted by many other languages be it C++ or Java. The advantage of using
the lambda function is that, they can we defined with in the code by writing
few lines and they doesn’t need any name, that’s amazing. One example of
Lambda expressions is sited below, here we will write the lambda expression
equivalent for the User-Defined Function add_two, which is given above
def add(a,b)
returna+b
print(add2(2,3))
here, add2 collects the output of the lambda function, we can see the output
by calling lambda function, by writing print(add2(2,3))
Generally lambda functions are not meant for the user defined functions but
are used to facilitate the working of various built in functions like, map,
reduce, filter, etc.
15.1 OBJECTIVES
15.2 DECORATORS
Modern programming paradigm recommends the technique of code
reusability, where we need to customize the code as per our requirements,
without disturbing the actual functionality of the code which is already
written. To achieve this, python introduced the concept of decorators, this 351
concept is used to enhance the functionality of functions, which are already
written, for example say we have two functions func1() and func2() as given
in the python code given below
# Decorators – to enhance functionality of other functions
deffuncA():
print (‘ this is functionA’)
deffuncB():
print (‘ this is functionB’)
funcA()
funcB()
on executing the above mentioned code by running deco.py we will get
output
this is function1
this is function2
but without disturbing the existing code if we want that along with, “this is
function1” the output should contain the line “this is a wonderful function”,
i.e. to enhance the already existing functionality, we need to exercise the
concept of decorators.
To understand this concept lets re-write the code given above
# Decorators – to enhance functionality of other functions
defdecorator_funcn (any_funcn):
defwrapper_funcn():
print(‘this is a wonderful function’)
any_funcn()
returnwrapper_funcn
deffuncA():
print (‘ this is functionA’)
deffuncB():
print (‘ this is functionB’)
variable = decorator_funcn (funcA)
variable( )
Lets understand the concept of Decorators through the above code. Here,
decorator_funcn is defined to enhance the functionality of any function (may
be funcA or funcnB) from printing “this is function A” to “this is a wonderful
function this is function A” or “this is function B” to “this is a wonderful
function this is function B”.
352
Without altering any line of code of already written functions. To achieve this
a decorator function decorator_funcn is defined, this function takes
any_funcn as input argument, it can be any function may it be funcnA or
funcnB. Inside the decorator_funcn, a wrapper function named
wrapper_funcn() is defined to wrapup the new features over the existing
features of the function taken as argument by the decorator_funcn(). The
body of the wrapper_funcn() includes the additional feature, in our case it is
print(‘this is a wonderful function’) an then the original function passed as an
argument to the decorator_funcn() i.e. any_funcn() is called, and finally the
output of wrapper_funcn is returned. To execute the decorator_funcn, the
decorator_funcn with argument funcA is called and its return value is
collected in variable, then variable() is executed and the output received is
“this is a wonderful function this is function A” or “this is a wonderful
function this is function B”.
Lets run some shortcuts also to work with the concept of decorators, which
involves one more concept of syntactic sugar, where w use @ symbol to use
the decorators before executing any function, i.e. to enhance its functionality.
# Decorators – to enhance functionality of other functions
# @ used for decorators
defdecorator_funcn (any_funcn):
defwrapper_funcn():
print(‘this is a wonderful function’)
any_funcn()
returnwrapper_funcn
@decorator_funcn
deffuncA():
print (‘ this is functionA’)
funcA()
@decorator_funcn
deffuncB():
print (‘ this is functionB’)
funcB()
whenever we use @decorator_funcn before any function the output of that
function preceeds with the output “this is a wonderful function”, later the
output of actual function turnsup. As in this code, calling funcA() leads to
output “this is a wonderful function this is function A” or calling funcB()
leads to output “this is a wonderful function this is function B”.
15.3 ITERATORS
In Python Iterator is an object that can be iterated i.e. an object which will
return data or one element at a time. Iterators exist every where, but they are
implemented well in generators, comprehensions and even in for loops; but
are generally hidden in plain sights. In this section we will try to understand
this concept by exploring the functioning of for loops. In our earlier units we
learned about the concepts of Lists, Tuples, Dictionaries, Sets , Strings etc.,
infact most of these built in containers are collectively called, iterables. An
object is called iterable if we can get an iterator from it..In Python any
iterator object must follow the iterator protocol i.e. the implementation of
iter() and next() functions, the iter function returns an iterator, and an object
is called iterable if we can get an iterator from it (for this we use
iter()function). To understand what are iterables lets understand the
functioning of for loop.
# Iterables
numbers = [1,2,3,4]
fori in numbers :
print (i)
now lets understand how for loop works behind the scenes, firstly the for
loop calls a function called iter() function, this iter function changes the
iterable to iterator i.e. it takes list as argument, so in out case we have
iter(numbers), and this is now an iterator. Subsequently the next function is
called whose argument is this iterator i.e. next(iter(numbers)), as the loop
progresses the next function provides the values from the iterable i.e. the list
numbers in our case, first run provides 1, second run provides 2 and so on. i.e
to see how the for loop works we write the logic of for loop as follows
# Iterables
numbers = [1,2,3,4]
number_iter = iter(numbers)
In this way only the for loop works on any of the iterables i.e. List or Tuple
or String. So, iterables are the python data types which uses the iter and next
functions, but iterator can directly use the next function. The iterables uses
the iter() function to generate iterator and then uses next function but iteartors
don’t use iter function they directly use the next function to get the job done.
In Python any iterator object must follow the iterator protocol i.e. the
implementation of iter() and next() functions, the iter function returns an
iterator, and an object is called iterable if we can get an iterator from it (for
this we use iter()function)
# Iterators
In this section we learned about the concept of Iterators and Iterables, now
we will extend our discussion to Generators, in the next section.
15.4 GENERATORS
Generators are also a kind of iterators, but they are quite memory efficient i.e.
needs very less memory hence helps in improving the performance of any
programme. We learned in last section that iterators involves production of
355
any sequence, the generators are also generating the sequence but their
modus operandi is quite different. Like List say L = [1,2,3,4] is a sequence
but it is an iterable, the generator is also a sequence but it is an iterator not a
iterable. You might be thinking that we already have a mechanism to refer a
sequence i.e. say List, then why do we need a generator. To understand this
we need to understand the memory utilization by list and generator. Say, we
are having a list with many numbers, when we create a list then it will take
some time , secondly these numbers will get stored in to the memory i.e
memory usage will also be on higher side. But, I the case of Generators, at
one time only one number is generated and the same is used for further
processing, i.e. both time and memory space are saved, they are
comparatively quite less in case of generators. So, while processing the list
entire list is loaded and processed, but in generators one by one elements are
generated and are processed accordingly.
Now you might be thinking that, when to use lists then ? the answer is that
when you need to use your sequence again and again (may be to perform
some functionality) then list is the best option, but when you simply need to
use the sequence for one time only, then its better to go for generators, you
will understand this, later in this section only.
Lets learn how to write a generator, for this you may use two techniques, i.e.
you may use generator function or generator comprehension, as technique to
develop your own generator. Generator comprehension is the technique
which is quite similar to list comprehension, which is used to generate list.
defnums(n)
fori in range (1, n+1) : # n+1 because for loop goes upto n-1 th term
print(i)
this will print the numbers from 1 to 10, here function is not returning any
thing, but simply printing the numbers. This was quite simple, as you leraned
in your earlier units, but if we need to develop our generator to do the same
task then you need to replace the print command with yield keyword, and the
code will be
defnums(n)
356
fori in range (1, n+1) : # n+1 because for loop goes upto n-1 th term
yield(i)
nums(10)
This yield keyword will create a generator, on executing this code nothing
will be printed, but if in place of nums(10) i.e. the last line of the above code,
we write print(nums(10)) then on execution you will come to know a
generator object nums is produced.
Now, lets understand how a generator function works, for this lets again
explore the functioning with for loop, refer to the code given below
defnums(n)
fori in range (1, n+1) : # n+1 because for loop goes upto n-1 th term
yield(i)
numbers = nums(10)
fornum in numbers :
print(num)
defnums(n)
fori in range (1, n+1) # n+1 because for loop goes upto n-1 th term
yield(i)
fornum in numbers :
print(num)
357
fornum in numbers :
print(num)
execution of the second for loop will not produce any result because the
generaors generates the numbers one by one and they are not retained in to
the memory as in the case of lists. So the execution of first for loop will
produce a sequence from 1 to 10, i.e. the numbers are placed in to the
memory one by one, which is there after refreshed, so past instance is lost.
Thus the execution of second for loop has no databecausenums(n) function
only exists before first for loop not after it. If the nums(n) also exists after
first for loop then data for second for loop is also available.
defnums(n)
fori in range (1, n+1) # n+1 because for loop goes upto n-1 th term
yield(i)
fornum in numbers :
print(num)
fornum in numbers :
print(num)
If we re-execute the above code with list and not generator i.e. with
list(nums(10)) and not nums(10), then the sequence from 1 to 10 will be
printed twice because the content of List persists in the memory, thus the
execution of both for loops will produce a separate sequence from 1 to 10.
15.5 CO-ROUTINES
We learned about functions in our earlier units, and we knew that they are
also referred as procedures, subroutines, sub-processes etc. In fact a function
is packed unit of instructions, required to perform certain task. In a complex
function the logic is to divide its working into several self-contained steps,
which themselves are functions, such functions are called subroutines or
358
helper functions, these subroutines have single entry point. The coordination
of these subroutines is performed by the main function.
Main Function
Subroutines Co-Routines
1. Co-routines have many entry 1. Subroutines have single entry
points for suspending and point for suspending and
resuming execution. resuming execution
2. Co-routine can suspend its 2. Subroutines can’t suspend its
execution and transfer control execution and transfer control to
to other co-routine and can other subroutine and can resume
resume again execution from again execution from the point it
the point it left off. left off.
3. In Co-routines there is no
main function to call co- 3. In Subroutines there is main
routines in particular order function to call subroutines in
and coordinate the results. particular order and coordinate
the results.
From the above discussion it appears that co-routines are quite similar to
threads, both seems to do the same job. But, there is a difference in between
the thread and the Co-routine, in case of threads, it is the operating system i.e.
the run time environment that performs switching in accordance with
scheduler. But, in the case Co-routines the decision making for switching is
performed by the programmer and programming language. In co-routines the
cooperative multitasking, by suspending and resuming at set points is under
the control of programmer.
359
In Python, co-routines are similar to generators but with few extra methods
and slight change in how we use yield statement. Generators produce data for
iteration while co-routines can also consume data. A generator is essentially a
cut down (asymmetric) coroutine. The difference between a coroutine and
generator is that a coroutine can accept arguments after it's been initially
called, whereas a generator can't.In Python the Co-routines are declared with
the async or await syntax, it is the preferred way of writing asyncio
applications.
Example, the following snippet of code (requires Python 3.7+) prints “hello”,
waits 1 second, and then prints “world”:
importasyncio
asyncdef main() :
print (‘hello’)
awaitasyncio.sleep(1)
print (‘world’)
asyncio.run(main())
Example - The following snippet of code will print “hello” after waiting for
1 second, and then print “world” after waiting for another 2 seconds:
importasyncio
import time
asyncdeftell_after(delay_time, what_to_tell):
awaitasyncio.sleep(delay_time)
print(what_to_tell)
360
asyncdef main():
print(f”started at {time.strftime(‘%X’)}”)
awaittell_after(1,’hello’)
awaittell_after(2,’world’)
print(f”finished at {time.strftime(‘%X’)}”)
asyncio.run(main())
Expected output:
Started at 17:11:52
hello
world
finished at 17:11:55
asyncdef main() :
task1 = asyncio.create_task(tell_after(1,’hello’))
task2 = asyncio.create_task(tell_after(2,’world’))
print(f”started at {time.strftime(‘%X’)}”)
# wait until both tasks are completed (should take around 2 seconds)
awaittell_after(1,’hello’)
awaittell_after(2,’world’)
print(f”finished at {time.strftime(‘%X’)}”)
Expected Output:
Started at 17:24:32
hello
world
361
finished at 17:24:34
Note that expected output now shows that the snippet runs 1 second faster
than before
15.6 SUMMARY
In this you learned about decorators, a way to enhance the functionality of
already written functions, which ia useful concept for code reusability.
Further, the discussion was enhanced to the concepts of iterables and
iterators, through the understanding of the execution of For loop. There after
the concept of generators was discussed where the concept of yield keyword
and print command were mentioned, the comparative analysis between the
generator and a function also clars the concept of performance improvement
in python programming. Finally, the understanding of co-routines cleared the
learners understanding towards the cooperative multitasking.
362
Data Access
UNIT 16 DATA ACCESS USING PYTHON Using Python
Structure
16.1 Introduction
16.2 Database Concepts
16.3 Creating Database
16.4 Querying Database
16.5 Using SQL to get more out of Database
16.6 CSV files in Python
16.7 Summary
16.8 Solutions to Check your Progress
16.1 INTRODUCTION
Python is the most popular high-level programming language that can be used for
real-world programming. It is a dynamic and object-oriented programming language
thatcan be used in a vast domain of applications, especially data handling. Python
was designed as a very user-friendly general-purpose language with a collection of
modules and packages and gained popularity in the recent times.Wheneverwe think
of machine learning, big data handling, dataanalysis, statisticalalgorithms, python is
the only name which comes first in our mind. It is a dynamically typed language,
which makes it highly flexible. Furthermore, creating a database and linking of the
database is very fast and secure.It makes the program to compile and run in an
extremely flexible environment can support different styles of programming,
including structural and object-oriented. Its ability to use modular components that
were designed in other programming languages allows a programmer to embed the
code written in python for any interface. Due to its enormous features, python has
become the first choice of learners in the field of data science and machine
learning.This unit is specially designed for beginners to create and connect database
in python. You will learn to connect data through SQL as well as CSV files with the
help of real dataset (PIMA Indian Dataset), used most commonly by researchers and
academia in data analysis.
361
for day to day transactions by hitting the database without worrying about the load
on the processor as it is very fast and consumes power to run the desired query only.
The nature of serendipity in the Python environment is an example of data analysis
in machine learning and datascience.Python is a bucket of packages and libraries
which enables us to perform data classification,prediction and analysis in a very
efficient way.
Now the question is, the database is stored in different forms in different software's
like Oracle, MS-Access etc.,so how any programming language like python can
accessit.For that, we need to learn about database connectivity in python. In this unit
you will learn how to create and connect database in python using MySQL along
with basic knowledge of database and its features.
Database Management system DBMS
Database management systems are software that serves the special purpose of
storing,managing, extracting and modifying data from a database. It contains a set of
programs that allows access to data contained in a database. DBMS also interfaces
with application programs so that data contained in the database can be used by
multiple application and users. It handles all access to the database and responsible
for applying the authorization checks and validation procedures. It acts as a bridge
between users and data, and the bridge is crossed using special query language like
SQL, MYSQL wrote in high-level languages.
A typical DBMS has users with different rights and permissions who use it for
different purposes. Some users retrieve data and some back it up. The users of a
DBMS can be broadly categorized as follows −
END USERS : who actually uses all benefits of DBMS .It could be an
individual or an organisation
DBMS
Limitations of Database:
DBMS is designed on the basis of architecture. This design can be of various forms
centralized, client-server systems, parallel systems, distributed and hierarchical. The
architecture of a DBMS can be seen as either a single tier or multi-tier. An n-tier
363
architecture divides the whole system into related but independent n modules, which
can be independently modified, altered, changed, or replaced. Generally, three-tier
architecture is followed, which consist of three layers:
Once the architecture of DBMS is designed, then the next phase is modelling. The
data model represents the logical structure of the database. It decides how the data
will be stored, connected to each other, processed and stored. Many data models
were proposed to store the data like network model, hierarchical model and
relational model where each new model was invented with improved features. The
first model was based on Flat File, where data is stored in a single table in a file,
which could be a plain text file or binary file. It is suitable only for a small amount
of data. Records follow a uniform format, and there are no structures for indexing or
recognizing relationships between records. Later on, the concept of relation is
introduced where data is stored in the form of multiple tables and tables are linked
using a common field.It is suitable for handling medium to a large amount of data.
This is the most promising model ever implemented for DBMS solutions. So,let us
see in detail about the structure and features of the relational model.
Entity-Relationship Model
364
Attributes: Entities are represented by means of having properties called Data Access
Using Python
attributes. Every attribute is defined by its set of values called domain. For
example, in an employee database, an employee is considered as an entity. An
employee has various attributes like empname, age, department, salary etc.
Relationship: describes the logical association among entities. These
relationships are mapped with entities in various ways, and the number of
association between two entities defines mapping cardinalities. Mapping
cardinalities are one to one, one to many,many to many and many to one.For
example, a doctor can have many patients in a database which shows one to
many relationships.
These E-R diagrams are represented by special symbols which are listed below:
Rectangle: Represents Entity sets.
Ellipses: Attributes
Diamonds: Relationship Set
Lines: They link attributes to Entity Sets and Entity sets to Relationship Set
Now let us take an example of an organization where they want to design an entity
relationship between various departments and their employees. So, In the following
E-Rdiagram we have taken two entities Employee and Department and showing
their relationship. The relationship between Employee and Department is many to
one as a department can have many employees however aemployeecannotwork in
multiple departments at the same time. Employee entity has attributes such as
Emp_Id, Emp_Name&Emp_Addr and Department entity has attributes such as
Dept_ID&Dept_Name.
Works I n
Employee Department
365
Structure of Database
Schema
Data
The Schema is the structure of data, whereas the Data are the "facts". Schema can
be complex to understand to begin with, but really indicates the rules which the Data
must obey. Let us consider a real-world scenario where we want to store facts about
employees for an organization. Such facts may include Emp_ name, Emp_address,
Date of Birth, and salary. In a database, all the information on all employees would
be held in a single storage "container", called a table. This table is a tabular object
like a spreadsheet page, with different employees as the rows, and the facts (e.g.
their names) as columns..Let's call this table EMP, and it could look something like:
Table EMP
From this information, the Schema would define that EMP has four components,
"Emp_name","Emp_address","Date of Birth","Salary". As database designers, we
can call the columns what we like, a meaningful name helps. In addition to the
name, we want to try and make sure that people don't accidentally store a name in
the DOB column, or some other silly error. We can say things like:
TABLE EMPLOYEE
,Noida
Row Or record or Tuple 4
104 Tripti 52,Sector-85 ,Noida 91000 8.11.1980
367
The relational model indicates that each row in a table is unique. If you allow
duplicate rows in a table, then there's no way to uniquely address a given row via
programming. This creates all sorts of ambiguities and problems that are best
avoided. You guarantee uniqueness for a table by designating a primary key—a
column that contains unique values for a table. Each table can have only one primary
key, even though several columns or combination of columns may contain unique
values.
All columns (or combination of columns) in a table with unique values are referred
to as candidate keys, from which the primary key must be drawn. All other
candidate key columns are referred to as alternate keys. Keys can be simple or
composite. A simple key is a key made up of one column, whereas a composite key
is made up of two or more columns.
The relational model also includes concepts of foreign keys, which are primary keys
in one relation,that are kept as non-primary key in another relation ,to allow for the
joining of data.
Now let us see how to choose the primary key in the table.Consider the Product
table given below:
Relating to the employee Table presented in the last section, Now define a second
table, order as shown in the figure provided below:
PRODUCT TABLE
In a database, we can define the structure of the data and manipulate the data using
some commands.The most common data manipulation language is SQL. SQL
commands are instructions used to communicate with the database to perform a
specific task that works with data. SQL commands can be used not only for
searching the database but also to perform various other functions like, for example,
you can create tables, add data to tables, or modify data, drop the table, set
permissions for users. SQL commands are grouped into four major categories
depending on their functionality:
368
Data Definition Language (DDL) - These SQL commands are used for Data Access
Using Python
creating, modifying, and dropping the structure of database objects. The
commands are CREATE, ALTER, DROP, RENAME, and TRUNCATE.
Data Manipulation Language (DML) - These SQL commands are used for
storing, retrieving, modifying, and deleting data. These commands are
SELECT, INSERT, UPDATE, and DELETE.
Transaction Control Language (TCL) - These SQL commands are used for
managing changes affecting the data. These commands are COMMIT,
ROLLBACK, and SAVEPOINT.
Data Control Language (DCL) - These SQL commands are used for
providing security to database objects. These commands are GRANT and
REVOKE.
Some of the commonly used datatyes in SQL AND MYSQL are listed below:
Data type Description
CHAR(n) Character string, fixed length n ,with a maximum size of 2000
characters . Values of this data type must be enclosed in single
quotes '‘ .the storage size of the char value is equal to the
maximum size for this column i.e. nColumns , that will not be
used for arithmetic operations usually are assigned data types of
char.
CHARACTER Variable length character string , can store upto 4000 characters .
,VARYING(n) varchar is a variable-length data type, the storage size of the
or varchar value is the actual length of the data entered, not the
VARCHAR(n) maximum size for this column i.e .n
,VARCHAR2(n)
INT A normal-sized integer that can be signed or unsigned. If signed,
the allowable range is from -2147483648 to 2147483647.
DATE This data type allows to store valid date type data from January
1, 4712 BC to December 31, 4712 AD with standard oracle data
format DD-MM-YY.
TIME Stores the time in a HH:MM:SS format.
TIMESTAMP A timestamp between midnight, January 1st, 1970 and sometime
in 2037. This looks like the previous DATETIME format, only
without the hyphens between numbers; 3:30 in the afternoon on
December 30th, 1973 would be stored as 19731230153000
(YYYYMMDDHHMMSS ).
SQL COMMANDS
CREATE
It is the mostly used, Data definition command in SQL . It is used to create table
index or view. This command describes the layout of the table. The create statement
specifies the name of the table , names and types of each column of the table . Each
table must have at least one column. The general syntax for creating table is shown
below:
369
Syntax for CREATE TABLE is:
CREATE TABLE <table name>
(<attribute name><data type>[<size>]<coloumn constraint>,
(<attribute name><data type>[<size>]<coloumn constraint>,
…………………………………………………………………..)
where
<table name > : It is the name, of the table to be created
<attribute name > : It is the name of the column heading or the field in a table.
<data Type> : It defines the type of values that can be stored in the field or the
column of the table .
Example:
CREATE TABLE Student
( roll_no number (5),
name char(20),
birth_data date ) ;
ALTER
Alter is a DDL command in SQL which is used to perform the following operations
in table.
1. Add column to the existing table
4. To modify the column of the existing table.
Example :
This will modify the column called prod_name to be a data type of varchar2(100)
and force the column to not allow null values.
370
ALTER TABLE table_name Data Access
DROP COLUMN column_name; Using Python
Example:
This will drop the column called prod_name from the table called Product.
Syntax :
Example:If you want to insert a row to the employee table, the query would be like,
NOTE: When adding a row, only the characters or date values should be enclosed
with single quotes.
371
R.No Name Course Age Stream Sports Marks Grade
Solution
UPDATE
UPDATE table_name
SET column1=value, column2=value2,...
WHERE <condition>
Remember : The WHERE clause in the UPDATE syntax specifies which record or
records that should be updated. If you remove the WHERE clause, all records will
be updated by default.
Example :Modify the marks of Anuja from 80 to 87 which was entered wrongly.
UPDATE student
SET marks=87
372
DELETE Statement Data Access
Using Python
The DELETE statement allows you to delete a single record or multiple records or
all records from the table.
Syntax:
Example :
This would delete all records from the Student table where the course opted by
students is MCA
The DB API provides a minimal standard for working with databases using Python
structures and syntax wherever possible. This API includes the following −
ANACONDA
JUPYTER /SPYDER
NOTEBOOK
MYSQL.CONNECTOR
MYSQL SERVER
5.1.33
Fig: shows all applications required to install for setting up database connectivity in
python with mysql.
NOTE: Anaconda is a python and R distribution that aims to provide everything you
need:
https://downloads.mysql.com/archives/community/
2. During the installation setup, you will be prompted for a "root" password in the
server configuration step.
3. Launch workbench, at the home page, setup a new connection profile with the
configuration (Connection method: Standard (TCP/IP), Hostname:
374
127.0.0.1,Port:3306,Username: root, Password: yourpassword) and test your Data Access
connection. Using Python
4. Double click on your local instance and it should bring you the schemas view
where you can see all your databases and tables.
The following screenshot gives a glimpse of the screen you may get:
Mysql.connector
1. Download Mysql API, exe file and install it.(click here to download)
Connect to MySql
2. In the notebook, create a new python file. In the first cell, write the following
code to test the mysql connection.
importmysql.connector
print(mydb)
3. If successful, you should get an object returned with its memory address
<mysql.connector.connection_cext.CMySQLConnection object at 0x10b4e1320>
376
Data Access
Using Python
Cursor object: The MySQLCursor class instantiates objects that can execute
operations such as SQL statements. Cursor objects interact with the MySQL
server using a MySQLConnection object.
How to create a cursor object and use it import mysql.connector
Example
Following is the example of connecting with MySQL and display the version of the
database.
importmysql.connector
mycursor.execute("SELECT VERSION()")
While running this script, it is producing the following result in my machine. (It
could change in your system)
Database version : ('5.1.33-community',)
In the above code we are creating a cursor to execute the sql query to print
database version next line executes the sql query show databases and store
result in mycursor as collection ,whose values are being fetched in data. On
execution of above program cursor will execute the query and print version of
database shown.
Creating Database
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="admin123",charset=’utf8’
)
mycursor = mydb.cursor()
mycursor.execute("CREATEDATABASETEST_DB")
Next, we will try to connect to this new database.
importmysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="admin123",charset=’utf8’,database= TEST_DB
)
1. How will you create a database in mysql .Write the command to create a
database named as Start_db.
2. Name the four arguments required to set connection with
mysql.connector.connect.
Creating Table
Once a database connection is established, we are ready to create tables or records
into the database tables using the execute method of the created cursor.
Example
To create table EMPLOYEE in database TEST_DB with following data
FIRST_NAME,LAST_NAME,AGE,SEX,INCOME.
378
Data Access
Using Python
INSERT Operation
Insert is used to feed the data in the table created. It is required when you want to
create your records into a database table.
379
Example
The following example, executes SQL INSERT statement to create a record into
EMPLOYEE table –
UPDATE OPERATION
UPDATE Operation on any database means to update one or more records, which
are already available in the database. Here is an example to show where we run the
query to updates all the records having SEX as 'M'. Here, we increase the AGE of
all the males by one year.
Example
The above code will update the age of all the male employees in the table
EMPLOYEE.
DELETE Operation
DELETE operation is required when you want to delete some records from your
database. Following example show the procedure to delete all the records from
EMPLOYEE where AGE is more than 20.
380
Data Access
Using Python
The above code will delete all the records from the table EMPLOYEE where age is
greater than 20.
Please refer to the above examples with their screenshots which will help in better
understanding.
1. Write the syntax of the following commands in SQL : insert, update, delete
READ Operation
READ operation on any database means to fetch some useful information from the
database.
Once our database connection is established, you are ready to make a query into
this database. You can use either fetchone() method to fetch a single record
or fetchall() method to fetch multiple values from a database table.
fetchall() − It fetches all the rows in a result set. If some rows have already
been extracted from the result set, then it retrieves the remaining rows from the
result set.
381
fetchone() − It fetches the next row of a query result set. A result set is an
object that is returned when a cursor object is used to query a table.
rowcount − This is a read-only attribute and returns the number of rows that
were affected by an execute() method.
fetchall()
The method fetches all (or all remaining) rows of a query result set and returns a list
of tuples. If no more rows are available, it returns an empty list. The following
procedure queries all the records from the EMPLOYEE table
fetchone()
To fetch one record from the table fetchone is used in the same manner as fetchall()
is shown in above code. This method retrieves the next row of a query result set and
returns a single sequence, or None if no more rows are available. By default, the
returned tuple consists of data returned by the MySQL server, converted to Python
objects.
record = cursor.fetchone()
rowcount()
Rows affected by the query. We can get a number of rows affected by the query by
using rowcount. We will use one SELECT query here.
382
Data Access
Using Python
In the above code buffered=True. We have used mycursor as buffered cursor which
fetches rows and buffers them after getting output from MySQL database. It is used
as an iterator, but there is no point in using buffered cursor for the single record as in
such case if we don't use a buffered cursor, then we will get -1 as output from
rowcount.
Database transaction represents a single unit of work. Any operation which modifies
the state of the MySQL database is a transaction. Python MySQL Connector
provides the following method to manage database transactions.
The following code shows the role of commit, rollback and auto-commit while
performing SQL queries in python.
383
In the above code if update query is successfully executed then commit() method
will be executed otherwise,anexception error part will be executed.Rollback issued
to revert of update query if happened due to error.Finally, we are closing cursor as
well as connection. Here the purpose of conn. Auto-commit = false is to activate the
role of rollback else rollback will not work.
CSV files are ordinarily made by programs that handle a lot of information. Itis just
like a text file in a human-readable format which is used to store tabular data in a
spreadsheet or database.They are a helpful method to send out information from
spreadsheets and data sets just as import or use it in different projects. For instance,
you may trade the aftereffects of an information mining project to a CSV document
and afterwards import that into a spreadsheet to dissect the information, create charts
for an introduction, or set up a report for distribution. The separator character of
CSV files is called a delimiter.Default delimiter is comma (,) others are tab (\t), (: ),
(;) etc.
384
CSV documents are exceptionally simple to work for database connectivity. Any Data Access
Using Python
language that underpins text record info and string control (like python) can work
with CSV documents straightforwardly.
Some of the features of CSV are highlighted below, which makes it exceptionally
useful in the analysis of the large dataset.
Let us see how to import CSV file in python.In this unit, we will be using pandas
module in python to import the CSVfile.Pandas is a powerful Python package that
can be used to perform statistical analysis. In this chapter, you'll also see how to use
Pandas to calculate stats from an imported CSV file.
CASE STUDY OF PIMA INDIAN DATASET
The dataset used here isPima Indian diabetes data for learning purpose.Pima Indian
diabetes dataset describes the medical records for Pima Indiansand whether or not
each patient will have an onset of diabetes within given years.
Fields description follow:
preg = number of times pregnant
plas = Plasma glucose concentration a 2 hours in an oral glucose tolerance test
pres = Diastolic blood pressure (mm Hg)
skin = Triceps skin fold thickness (mm)
test = 2-Hour serum insulin (mu U/ml)
mass = Body mass index (weight in kg/(height in m)^2)
pedi = Diabetes pedigree function
age = Age (years)
class = Class variable (1:tested positive for diabetes, 0: tested negative for diabetes)
It consists of above mentioned eight features, and one class variableandis very
commonly used in the research of diabetes.Given below are the steps and the code to
import CSV file in python.
385
Step2. Capture the file path where CSV file is stored (don't forget to include
filename and file extension ).
import pandas as pd
df = pd.read_csv ('F:\pimaindiansdiabetescsv\pima-indians-diabetes.csv')
print (df)
Note: #read the csv file (put 'r' before the path string to address any special
characters in the path, such as '\'). Don't forget to put the file name at the end of the
path + ".csv".
This path is taken for reference; it will change as per the location of the file.
Output
The above output consists of 769 rows and ninecolumns.TheCSV file is just like
excel file which consists of data in tabular form arranged as rows and columns.But
the columns are without heading.In the next example, column headings are provided
using
Finally you will learn to calculate the following statistics using the Pandas package:
Mean
386 Total sum
Maximum Data Access
Minimum Using Python
Count
Median
Standard deviation
Variance
Simply functions for each of the above mentioned stats is available in pandas
package which can be easily applied in the following manner.
import pandas as pd
colnames=['pre','pgc','dbp','tsf','2hs','bmi','dpf','age','class']
df=pd.read_csv('F:\pimaindiansdiabetescsv\pima-
indiansdiabetes.csv',names=colnames)
mean1 = df['age'].mean()
sum1 = df['age'].sum()
max1 = df['age'].max()
min1 = df['age'].min()
count1 = df['age'].count()
median1 = df['age'].median()
std1 = df['age'].std()
var1 = df['age'].var()
# print block 1
print ('Mean Age: ' + str(mean1))
print ('Sum of Age: ' + str(sum1))
print ('Max Age: ' + str(max1))
print ('Min Age: ' + str(min1))
print ('Count of Age: ' + str(count1))
print ('Median Age: ' + str(median1))
print ('Std of Age: ' + str(std1))
print ('Var of Age: ' + str(var1))
Output:
Mean Age: 33.240885416666664
Sum of Age: 25529
Max Age: 81
Min Age: 21
Count of Age: 768
Median Age: 29.0
Std of Age: 11.76023154067868
Var of Age: 138.30304589037365
We have learnt how to calculate simple stats using Pandas and import any dataset
for machine learning purpose.
16.7 SUMMARY
A database is an organized,logical collection of data.It is designed to facilitate
the access by one or more applications programs for easy access and analysis
and to minimize data redundancy.
DBMS is a software system that enables you to store, modify, and extract
information from a database. It has been designed systematically so that it can
be used by multiple applications and users
A relational database is a collection of related tables
An entity is a person place or things or event.
Tables in the database are entities.
An attribute is a property of entity. Attributes are columns in the table.
A relationship is the association between tables in the database.
Each columns of the table correspond to an attribute of the relation and is
named
Fields : Columns in the table are called fields or attributes.
Rows of the relation is referred as tuples to the relation . A tuple or row
contains all the data of a single instance of the table such as a employee number
201.
Records : Rows in a table often are called records . Rows are also known as
tuples.
The values for an attribute or a column are drawn from a set of values known as
domain.
Primary key : An attribute or a set of attributes which can uniquely identify
each record (tuple) of a relation (table). All values in the primary key must be
unique and not Null, and there can be only one primary key for a table.
Foreign Key : An attribute which is a regular attribute in one table but a
primary key in another table.
Mysql.connector is an interface for connecting to a MySQL database server
from python
connect() is a method used for creating a connection to our database.
Connect has four arguments:hostname,username,password,databasename .
fetchall() − It fetches all the rows in a result set. If some rows have already
been extracted from the result set, then it retrieves the remaining rows from the
result set.
388
fetchone() − It fetches the next row of a query result set. A result set is an Data Access
Using Python
object that is returned when a cursor object is used to query a table.
rowcount − This is a read-only attribute and returns the number of rows that
were affected by an execute() method.
Commit,rollback and autocommit are database transactions commands.
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="admin123",charset=’utf8’
)
mycursor = mydb.cursor()
mycursor.execute("CREATEDATABASEStart_db")
Next, we will try to connect to this new database.
importmysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="admin123",charset=’utf8’,database= Start_db)
1. Syntax of Insert :
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
389
VALUES (value1, value2, value3,...valueN);
Syntax of Update:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
Syntax of Delete:
DELETE FROM table_nameWHERE [condition];
2. importmysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="myusername",
passwd="mypassword"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE mydatabase")
392