C Programing Notes
C Programing Notes
Chapter 0: Introduction
What is Programming?
Computer programming is a medium for us to communicate with computers, just like we use Hindi or
English to communicate with each other. Programming is a way for us to deliver our instructions to the
computer.
What is C?
C is a programming language. C is one of the oldest and finest programming languages. C was developed
by Dennis Ritchie in 1972.
Uses of C
C is a language that is used to program a wide variety of systems. Some of the uses of C are as follows:
1. Major parts of Windows, Linux, and other operating systems are written in C.
2. C is used to write driver programs for devices like Tablets, Printers, etc.
3. C language is used to program embedded systems where programs need to run faster in limited
memory.
4. C is used to develop games, an area where latency is very important, i.e., a computer has to
react quickly to user input.
Variables
A variable is a container that stores a ‘value.’ In the kitchen, we have containers storing rice, dal, sugar,
etc. Similar to that variable in c stores the value of a constant. Example:
Types of constant
Keywords
These are reserved words whose meaning is already known to the compiler. There are 32 keywords
available in c:
do static if while
#include<stdio.h>
int main() {
return 0;
}
File : first.c
All c programs have to follow a basic structure. A c program starts with the main function and executes
instructions presents inside it. Each instruction terminated with a semicolon(;)
There are some basic rules which are applicable to all the c programs:
Comments
Comments are used to clarify something about the program in plain language. It is a way for us to add
notes to our program. There are two types of comments in c:
A compiler is a computer program that converts a c program into machine language so that it can be
easily understood by the computer.
A program is written in plain text. This plain text is a combination of instructions in a particular
sequence. The compiler performs some basic checks and finally converts the program into an
executable.
Library functions
C language has a lot of valuable library functions which is used to carry out a certain task; for instance,
printf function is used to print values on the screen.
printf(“This is %d”,i);
// %d for integers
// %c for characters
Types of variables
In order to take input from the user and assign it to a variable, we use scanf function.
& is the “address of” operator, and it means that the supplied value should be copied to the address
which is indicated by variable i.
Q2. Calculate the area of a circle and modify the same program to calculate the volume of a cylinder
given its radius and height.
Q4. Write a program to calculate simple interest for a set of values representing principle, no of years,
and rate of interest.
A C-program is a set of instructions. Just like a recipe - which contains instructions to prepare a
particular dish.
Types of instructions:
2. Arithmetic instruction
3. Control instruction
int a;
float b;
other variations:
int j1 = a + j - i;
float b = a+3; float a = 1.1; ==>Error! As we are trying to use a before defining it.
int a,b,c,d;
Arithmetic Instructions
Note:
Type conversion
NOTE:
int a = 3.5; //In this case, 3.5 (float) will be denoted to a 3 (int) because a cannot store floats.
Quick Quiz:
Solution- 3.0/9=0.333, but since k is an int, it cannot store floats & value 0.33 is demoted to 0.
Operator Precedence in C
The answer to the above question is provided by operator precedence & associativity.
Operator precedence
Priority Operators
1st */%
2nd + -
3rd =
Operator associativity
x * y / z => (x * y) / z
x / y * z => (x / y) * z
4. Case-Control Instruction
1. int a; b=a;
2. int v=3^3;
Q4. Explain step by step evaluation of 3*x/y-z +k, Where x=2, y=3, z=3 and k=1
Integer
Floating number
Character
Sometimes we want to watch comedy videos on youtube if the day is Sunday. Sometimes we order junk
food if it is our friend's birthday in the hostel. You might want to buy an umbrella if it's raining and you
have the money. You order the meal if dal or your favorite bhindi is listed on the menu.
In ‘C’ language, too, we must be able to execute instructions on a condition(s) being met.
Decision-making instructions in C
If-else statement
Switch statement
If-else statement
if ( condition to be checked) {
Statements-if-condition-true ;
else{
statements-if-condition-false ;
Code Example
int a=23;
if (a>18){
Relational Operators in C
Relational operators are used to evaluate conditions (true or false) inside the if statements. Some
examples of relational operators are:
== equals to
Important Note: '=' is used for an assignment, whereas '==' is used for an equality check.
The condition can be any valid expression. In C, a non-zero value is considered to be true.
Logical Operators
&&, ||, and ! are the three logical operators in C. These are read as “and,””or,” and “not.” They are used
to provide logic to our c programs.
As the number of conditions increases, the level of indentation increases. This reduces readability.
Logical operators come to the rescue in such cases.
Else if clause
Instead of using multiple if statements, we can also use else if along with if, thus forming an if-else if-
else ladder.
if {
// statements ;
else if { //statements;
}
else { //statements;
Using if-else if-else reduces indents. The last “else” is optional. Also, there can be any number of “else
if.”
Operator Precedence
Priority Operator
1st !
2nd *,/,%
3rd +,-
4th <>,<=,>=
5th ==,!=
6th &&
7th ||
8th =
Conditional operators
Switch-case is used when we have to make a choice between the number of alternatives for a given
variable.
Syntax,
Switch(integer-expression)
{
Case c1:
Code;
Case c3:
Code;
default:
Code;
The value of integer-expression is matched against c1,c2,c3......if it matched any of these cases, that case
along with all subsequent “case” and “default” statements are executed.
Quick Quiz: Write a program to find the grade of a student given his marks based on below:
Important notes
We can use switch case statements even by writing in any order of our choice
Char values are allowed as they can be easily evaluated to an integer
A switch can occur within another, but in practice, this is rarely done
if(a=11)
printf(“I am 11”);
else
printf(“I am not 11”);
2. Write a program to find out whether a student is pass or fail; if it requires a total of 40% and at
least 33% in each subject to pass. Assume 3 subjects and take marks as input from the user.
3. Calculate income tax paid by an employee to the government as per the slabs mentioned below:
2.5L-5.0L 5%
5.0L-10.0L 20%
Note that there is no tax below 2.5L. Take income amount as an input from the user.
4. Write a program to find whether a year entered by the user is a leap year or not. Take the year
as input from the user.
5. Write a program to determine whether a character entered by the user is lowercase or not.
6. Write a program to find the greatest of four numbers entered by the user.
Why loops?
Sometimes we want our programs to execute a few sets of instructions over and over again, for eg.
Printing 1 to 100, first 100 even numbers, etc. Hence loops make it easy for a programmer to tell the
computer that a given set of instructions must be executed repeatedly.
1.While loop
2.do-while loop
3.for loop
While Loop
While(condition is true) {
// Code
An example:
int i=0;
while (i<10){
Note:
If the condition never becomes false, the while loop keeps getting executed. Such a loop is known as an
infinite loop.
Quick Quiz: Write a program to print natural numbers from 10 to 20 when the initial loop counter i is
initialized to 0. The loop counter need not be int, it can be a float as well.
i++ (i is increased by 1)
i-- (i is decreased by 1)
printf(“—i=%d”,--i);
printf(“i--=%d”,i--);
Do-while loop:
do {
//code;
//code;
}while(condition)
While -> checks the condition & then executes the code
Do-while -> executes the code & then checks the condition
For Loop
//code;
//code;
An example:
for(i=0;i<3;i++)
printf(“%d”,i);
printf(“\n”);
Output: 0, 1 and 2
Quick Quiz: Write a program to print first n natural numbers using for loop.
for(i=5; i; i--)
printf(“%d\n”,i);
i is initialized to 5
The condition “i” (0 or none) is tested
The code is executed
i is decremented
Condition i is checked, and the code is executed if it's not 0.
& so on until i is non 0.
The break statement is used to exit the loop irrespective of whether the condition is true or false.
Whenever a “break” is encountered inside the loop, the controls are sent outside the loop.
printf("%d\n",i);
if (i==5){
break;
The continue statement in c is used to immediately move to the next of the loop. The control is taken to
the next iteration, thus skipping everything below continue inside the loop for that iteration.
int skip=5;
int i=0;
while(i<10){
if(i != skip)
continue;
else
printf(%d”,i);
Notes:
1. Sometimes, the name of the variable might not indicate the behavior of the program.
2. Break statement completely exits the loop
Problem: This is going to be fun!! We will write a program that generates a random number and asks
the player to guess it. If the player’s guess is higher than the actual number, the program displays
“Lower number please.” Similarly, if the user’s guess is too low, the program prints “Higher number
please.”When the user guesses the correct number, the program displays the number of guesses the
player used to arrive at the number.
Hints:
Use loops
Use a random number generator.
Code:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int number, guess, nguesses=1;
srand(time(0));
number = rand()%100 + 1; // Generates a random number between 1 and 100
// printf("The number is %d\n", number);
// Keep running the loop until the number is guessed
do{
printf("Guess the number between 1 to 100\n");
scanf("%d", &guess);
if(guess>number){
printf("Lower number please!\n");
}
else if(guess<number){
printf("Higher number please!\n");
}
else{
printf("You guessed it in %d attempts\n", nguesses);
}
nguesses++;
}while(guess!=number);
return 0;
}
Sometimes our program gets bigger in size, and its not possible for a programmer to track which piece
of code is doing what.
The function is a way to break our code into chunks so that it is possible for a programmer to reuse
them.
What is a function?
A function is a block of code that performs a particular task. A function can be reused by the
programmer in a given program any number of times.
#include<stdio.h>
void display(); // Function prototype
int main(){
int a;
return(0);
printf(“Hi I am display”);
Function prototype:
Function prototype is a way to tell the compiler about the function we are going to define in the
program. Here void indicates that the function returns nothing.
Function call:
Function call is a way to tell the compiler to execute the function body at the time the call is made.
Note that the program execution starts from the main function in the sequence the instructions are
written.
Function definition:
This part contains the exact set of instructions that are executed during the function call. When a
function is called from main(), the main function falls asleep and gets temporarily suspended. During this
time, the control goes to the function being called when the function body is done executing main()
resumes.
Important Points:
Types of Functions:
Library functions: Commonly required functions grouped together in a library file on disk.
User-defined functions: These are the functions declared and defined by the user.
We can pass values to a function and can get a value in return from a function
The above prototype means that sum is a function which takes values a(of type int) and b(of type int)
and returns a value of type int
c=a+b;
return c;
Now we can call sum(2,3) [here 2 and 3 are arguments]; from main to get 5 in return
Note:
Parameters are the values or variable placeholders in the function definition. Ex: a & b
Arguments are the actual values passed to the function to make a call. Ex: 2 & 3
A function can return only one value at a time.
If the passed variable is changed inside the function, the function call doesn’t change the value
in the calling function.
int change(int a){
return 0;
change is a function which changes a to 77. No, if we call it from main like this.
int b=22;
Quick Quiz: Use the library function to calculate the area of a square with side a.
Recursion
Example of Recursion:
factorial(n) = 1x 2 x 3...........x n
factorial(n)= 1 x 2 x 3...........n-1 x n
Since we can write factorial of a number in terms of itself, we can program it using recursion.
int f;
if(x==0||x==1)
return 1;
else
f=x * factorial(x-1);
return f;
Important Notes:
***
*****
Chapter 6 – Pointers
j points to i.
The address of operator is used to obtain the address of a given variable. If you refer to the
diagrams above
&i=> 87994
&j=>87998
The value at address or * operator is used to obtain the value present at a given memory address. It
is denoted by *
*(&i) = 72
*(&j) = 87994
Just like pointer type integer, we also have pointers to char, float, etc.
#include<stdio.h>
int main()
{
int i=8;
int *j;
j=&i;
printf(“Add i=%u\n”,&i);
printf(“Add i=%u\n”,j);
printf(“Add j=%u\n”,&j);
printf(“Value i=%d\n”,i);
printf(“Value i=%d\n”,*(&i));
printf(“Value i=%d\n”,*j);
return 0;
}
Output:
Add i=87994
Add i=87994
Add j=87998
Value i=8
Value i=8
Value i=8
This program sums it all. If you understand it, you have got the idea of pointers.
Pointers to a pointer:
Just like j is pointing to i or storing the address of i, we can have another variable, k which can store the
address of j. What will be the type of k?
int **k;
k= &j;
Call by value:
Here the values of the arguments are passed to the function. Consider this example:
If sum is defined as sum(int a, int b), the values 3 and 4 are copied to a and b. Now even if we change a
and b, nothing happens to the variables x and y. This is call by value.
Call by reference:
Now since the addresses are passed to the function, the function can now modify the value of a variable
in calling function using * and & operators. Example:
int temp;
temp= *x;
*x = *y;
*y = temp;
This function is capable of swapping the values passed to it. If a=3 and b=4 before a call to swap(a,b),
a=4 and b=3 after calling swap.
int main()
int b=4;
swap(a,b)
1. Write a program to print the address of a variable. Use this address to get the value of this
variable.
2. Write a program having a variable i. Print the address of i. Pass this variable to a function and
print its address. Are these addresses same? Why?
3. Write a program to change the value of a variable to ten times its current value. Write a function
and pass the value by reference.
4. Write a program using a function that calculates the sum and average of two numbers. Use
pointers and print the values of sum and average in main().
5. Write a program to print the value of a variable i by using the "pointer to pointer" type of
variable.
6. Try problem 3 using call by value and verify that it doesn’t change the value of the said variable.
Chapter 7 – Arrays
Syntax,
marks[0]=33;
marks[1]=12;
Note: It is very important to note that the array index starts with 0.
Accessing Elements
Quick Quiz: Write a program to accept marks of five students in an array and print them to the screen.
Initialization of an array
float marks[]={33,40}
Arrays in memory
This will reserve 4x3=12 bytes in memory. 4 bytes for each integer.
1 2 3
A pointer can be incremented to point to the next memory location of that type.
int i = 32;
char a = 'A';
float i = 1.7;
Quick Quiz: Try these operations on another variable by creating pointers in a separate program.
Demonstrate all four operations.
This way we can have an integer pointer pointing to the first element of the array like this:
int * ptr = & arr[0]; => or simply arr
ptr++;
or
Multidimensional arrays
{1,4}
{7,9}
{11;22}
};
We can access the elements of this array as arr [0] [0], arr [0] [1] & so on...
At arr [0] [0] value would be 1 and at arr [0] [1] value would be 4.
A 2-d array like a 1-d array is stored in contiguous memory blocks like this:
Quick Quiz: Create a 2-d array by taking input from the user. Write a display function to print the
content of this 2-d array on the screen.
1. Create an array of 10 numbers. Verify using pointer arithmetic that (ptr+2) points to the third
element where ptr is a pointer pointing to the first element of the array.
2. If S[3] is a 1-D array of integers, then *(S+3) refers to the third element: True, False, Depends
3. Write a program to create an array of 10 integers and store a multiplication table of 5 in it.
4. Repeat problem 3 for a general input provided by the user using scanf()
5. Write a program containing a function that reverses the array passed to it.
6. Write a program containing functions that counts the number of positive integers in an array.
7. Create an array of size 3x10 containing multiplication tables of the numbers 2,7 and 9,
respectively.
8. Repeat problem 7 for a custom input given by the user.
9. Create a three-dimensional array and print the address of its elements in increasing order.
Chapter 8 – Strings
A string is a 1-d character array terminated by a null(‘\0’) => {this is null character}
The null character is used to denote string termination, characters are stored in contiguous memory
locations.
Initializing Strings
char s[]={‘H’,’A’,’R’,’R’,’Y’,’\0’}
Strings in memory
Printing Strings
A string can be printed character by character using printf and %c. But there is another convenient way
to print strings in C.
We can use %s with scanf to take string input from the user:
char st[50];
scanf(“%s”,&st);
scanf automatically adds the null character when the enter key is pressed.
Note:
char st[30];
Multiple gets() calls will be needed for multiple strings. Likewise, puts can be used to output a string.
puts(st); =>Prints the string and places the cursor on the next line
Declaring a string using pointers
This tells the compilers to store the string in the memory and the assigned address is stored in a char
pointer.
Note:
Once a string is defined using char st[]= ”harry”, it cannot be initialized to something else.
A string defined using pointers can be reinitialized. => ptr=”rohan”;
strlen() - This function is used to count the number of characters in the string excluding the null ('\0')
character.
int length=strlen(st);
strcpy() - This function is used to copy the content of second string into first string passed to it.
char target[30];
Target string should have enough capacity to store the source string.
strcmp() - This function is used to compare two strings. It returns: 0 if strings are equal
Negetive value if first strings mismatching character's ASCII value is not greater than second string's
corresponding mismatching character. It returns positive values otherwise.
strcmp(“For”, “Joke”); => positive value
Chapter 9 - Structures
struct employee{
float salary;
char name[10];
}; • semicolon is important
e1.code=100;
e1.salary=71.22;
Quick Quiz: Write a program to store the details of 3 employees from user-defined data. Use the
structure declared above.
We can create the data types in the employee structure separately but when the number of properties
in a structure increases, it becomes difficult for us to create data variables without structures. In a
nutshell:
Array of Structures
Just like an array of integers, an array of floats, and an array of characters, we can create an array of
structures.
facebook[0].code=100;
facebook[1].code=101;
..........and so on.
Initializing structures
Structures in memory
Structures are stored in contiguous memory locations for the structures e1 of type struct employee,
memory layout looks like this:
In an array of structures, these employee instances are stored adjacent to each other.
Pointer to structures
ptr=&e1;
printf(“%d”,*(ptr).code);
Arrow operator
Instead of writing *(ptr).code, we can use an arrow operator to access structure properties as follows
*(ptr).code or ptr->code
A structure can be passed to a function just like any other data type.
Quick Quiz: Complete this show function to display the content of the employee.
Typedef keyword
We can use the typedef keyword to create an alias name for data types in c.
float img;
};
float real;
}ComplexNo;
The random access memory is volatile and its content is lost once the program terminates. In order to
persist the data forever, we use files.
A file data stored in a storage device. A-C program can talk to the file by reading content from it and
writing content to it.
File pointer
The “File” is a structure that needs to be created for opening the file. A file pointer is a pointer to this
structure of the file.
File pointer is needed for communication between the file and the program.
FILE *ptr;
ptr=fopen(“filename.ext”,”mode”);
Types of Files
Reading a file
FILE *ptr;
ptr=fopen(“Harry.txt”,”r”);
int num;
Quick Quiz: Modify the program above to check whether the file exists or not before opening the file.
It is very important to close file after read or write. This is achieved using fclose as follows:
fclose(ptr);
This will tell the compiler that we are done working with this file and the associated resources could be
freed.
Writing to a file
FILE *fptr;
fptr=fopen(“Harry.txt”,”w”);
int num=432;
fprintf(fptr,”%d”,num);
fclose(fptr);
fgetc and fputc are used to read and write a character from/to a file.
fgetc returns EOF when all the characters from a file have read. So we can write a check like below to
detect the end of file.
while(1){
ch=fgetc(ptr); // When all the content of a file has been read, break the loop
if(ch==EOF){
break;
}
//code
name1, 3300
name2, 7700
Snake, Water, Gun or Rock, Paper, Scissors is a game most of us have played during school time. Write a
C program capable of playing this game with you.
Your program should be able to print the result after you choose Snake/Water or Gun.
Code:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
// Non-draw conditions
// Cases covered:
// sg
// gs
// sw
// ws
// gw
// wg
}
int main(){
char you, comp;
srand(time(0));
int number = rand()%100 + 1;
if(number<33){
comp = 's';
}
else if(number>33 && number<66){
comp='w';
}
else{
comp='g';
}
printf("Enter 's' for snake, 'w' for water and 'g' for gun\n");
scanf("%c", &you);
int result = snakeWaterGun(you, comp);
if(result ==0){
printf("Game draw!\n");
}
else if(result==1){
printf("You win!\n");
}
else{
printf("You Lose!\n");
}
printf("You chose %c and computer chose %c. ", you, comp);
return 0;
}
C is a language with some fixed rules of programming. For example: changing the size of an array is not
allowed.
Dynamic memory allocation is a way to allocate memory to a data structure during the runtime we can
use DMA function available in C to allocate and free memory during runtime.
1. malloc()
2. calloc()
3. free()
4. realloc()
malloc() function
Malloc stands for memory allocation. It takes number of bytes to be allocated as an input and returns a
pointer of type void.
Syntax:
Quick Quiz: Write a program to create a dynamic array of 5 floats using malloc().
calloc() function
Syntax:
If the space is not sufficient, memory allocation fails and a NULL pointer is returned.
Quick Quiz: Write a program to create an array of size n using calloc() where n is an integer entered by
the user.
free() function
Syntax:
Quick Quiz: Write a program to demonstrate the usage of free() with malloc().
realloc() function
realloc is used to allocate memory of new size using the previous pointer and size.
Syntax:
ptr = realloc(ptr,newSize);
ptr = realloc(ptr, 3* sizeof(int)) //ptr now points to this new block of memory, which is capable of storing
3 integers