DSP Lab Manual (R20a0583)
DSP Lab Manual (R20a0583)
LAB MANUAL
B.TECH CSE
(II YEAR – I SEM)
(2022-23)
Name : ______________________________
Roll no:_____________________________
Section:_____________________________
Year :______________________________
Vision
To acknowledge quality education and instill high patterns of discipline making
the students technologically superior and ethically strong which involves the
improvement in the quality of life in human race.
Mission
To achieve and impart holistic technical education using the best of
infrastructure, outstanding technical and teaching expertise to establish the
students in to competent and confident engineers.
Evolving the center of excellence through creative and innovative teaching
learning practices for promoting academic achievement to produce
internationally accepted competitive and world class professionals.
2.Problem analysis: Identify, formulate, review research literature, and analyze complex
engineering problems reaching substantiated conclusions using first principles of mathematics,
natural sciences, and engineering sciences.
3.Design / development of solutions: Design solutions for complex engineering problems and
design system components or processes that meet the specified needs with appropriate
consideration for the public health and safety, and the cultural, societal, and environmental
considerations.
5.Modern tool usage: Create, select, and apply appropriate techniques, resources, and modern
engineering and IT tools including prediction and modeling to complex engineering activities
with an understanding of the limitations.
6.The engineer and society: Apply reasoning informed by the contextual knowledge to assess
societal, health, safety, legal and cultural issues and the consequent responsibilities relevant to
the professional engineering practice.
8.Ethics: Apply ethical principles and commit to professional ethics and responsibilities and
norms of the engineering practice.
9.Individual and team work: Function effectively as an individual, and as a member or leader
in diverse teams, and in multidisciplinary settings.
12 .Life- long learning: Recognize the need for, and have the preparation and ability to engage
in independent and life-long learning in the broadest context of technological change.
MALLA REDDY COLLEGE OF ENGINEERING & TECHNOLOGY
Maisammaguda, Dhulapally Post, Via Hakimpet, Secunderabad – 500100
1.Write a Python program for class, Flower, that has three instance variables of type str,
int, and float, that respectively represent the name of the flower, its number of petals,
and its price. Your class must include a constructor method that initializes each variable
to an appropriate value, and your class should include methods for setting the value of
each type, and retrieving the value of each type.
Program:-
class Flower:
#Common base class for all Flowers
def __init__(self, petalName, petalNumber, petalPrice): self.name =
petalName
self.petals = petalNumber self.price = petalPrice
def getName(self):
return self.name
def getPetals(self):
return self.petals
def getPrice(self):
return self.price
Output:
2.Develop an inheritance hierarchy based upon a Polygon class that has abstract
methods area( ) and perimeter( ). Implement classes Triangle, Quadrilateral, Pentagon,
that extend this base class, with the obvious meanings for the area( ) and perimeter( )
methods. Write a simple program that allows users to create polygons of the various
types and input their geometric dimensions, and the program then outputs their area
and perimeter.
Program:
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
def __repr__(self):
return (str(self._side_lengths))
class Triangle(Polygon):
def __init__(self, side_lengths):
super().__init__(side_lengths, 3)
self._perimeter = self.perimeter()
self._area = self.area()
def perimeter(self):
return(sum(self._side_lengths))
def area(self):
#Area of Triangle
s = self._perimeter/2 product = s
for i in self._side_lengths: product*=(s-i)
return product**0.5
class Quadrilateral(Polygon):
def __init__(self, side_lengths):
super().__init__(side_lengths, 4)
self._perimeter = self.perimeter()
self._area = self.area()
def perimeter(self):
return(sum(self._side_lengths))
def area(self):
# Area of an irregular Quadrilateral
semiperimeter = sum(self._side_lengths) / 2
return math.sqrt((semiperimeter - self._side_lengths[0]) * (semiperimeter -
self._side_lengths[1]) * (semiperimeter - self._side_lengths[2]) * (semiperimeter -
self._side_lengths[3]))
class Pentagon(Polygon):
def __init__(self, side_lengths):
super().__init__(side_lengths, 5)
self._perimeter = self.perimeter()
self._area = self.area()
def perimeter(self):
return((self._side_lengths) * 5)
def area(self):
# Area of a regular Pentagon
a = self._side_lengths
return (math.sqrt(5*(5 + 2 * (math.sqrt(5)))) * a * a) / 4
#object of Triangle
t1 = Triangle([1,2,2])
print(t1.perimeter(), t1.area())
#object of Quadrilateral
q1 = Quadrilateral([1,1,1,1])
print(q1.perimeter(), q1.area())
Output:
Method Overloading
Method overloading is an OOPS concept which provides ability to have several methods
having the same name with in the class where the methods differ in types or number of
arguments passed.
Method overloading in its traditional sense (as defined above) as exists in other
languages like method overloading in Java doesn’t exist in Python.
In Python if you try to overload a function by having two or more functions having the
same name but different number of arguments only the last defined function is
recognized, calling any other overloaded function results in an error.
Since using the same method name again to overload the method is not possible in
Python, so achieving method overloading in Python is done by having a single method
with several parameters. Then you need to check the actual number of arguments
passed to the method and perform the operation accordingly.
Program:
class OverloadDemo:
# sum method with default as None for parameters
def sum(self, a=None, b=None, c=None):
# When three params are passed
if a!=None and b!=None and c!=None:
s=a+b+c
print('Sum = ', s)
# When two params are passed
elif a!=None and b!=None:
s=a+b
print('Sum = ', s)
od = OverloadDemo()
od.sum(7, 8)
od.sum(7, 8, 9)
Output:
When the method is called with parent class object, method of the parent class is
executed. When method is called with child class object, method of the child class is
executed. So the appropriate overridden method is called based on the object type,
which is an example of Polymorphism.
Program:
class Person:
def init (self, name, age):
self.name = name
self.age = age
def displayData(self):
print('In parent class displayData method')
print(self.name)
print(self.age)
class Employee(Person):
def __init__(self, name, age, id):
# calling constructor of super class
super().__init__(name, age)
self.empId = id
def displayData(self):
print('In child class displayData method')
print(self.name)
print(self.age)
print(self.empId)
Output:
Comprehensions in Python
Comprehensions in Python provide us with a short and concise way to construct new
sequences (such as lists, set, dictionary etc.) using sequences which have been already
defined. Python supports the following 4 types of comprehensions:
a)List Comprehensions
b)Dictionary Comprehensions
c)Set Comprehensions
d)Generator Comprehensions
a)List Comprehensions:
List Comprehensions provide an elegant way to create new lists. The following is the
basic structure of a list comprehension:
Note that list comprehension may or may not contain an if condition. List
comprehensions can contain multiple for (nested list comprehensions).
Example: Suppose we want to create an output list which contains only the even
numbers which are present in the input list. Let’s see how to do this using for loop and
list comprehension and decide which method suits better.
Using Loop:
Output:
Output:
b)Dictionary Comprehensions
Extending the idea of list comprehensions, we can also create a dictionary using
dictionary comprehensions. The basic structure of a dictionary comprehension
looks like below.
output_dict = {key:value for (key, value) in iterable if (key, value satisfy this condition)}
Using Loop:
input_list = [1, 2, 3, 4, 5, 6, 7]
output_dict = {}
# Using loop for constructing output dictionary
for var in input_list:
if var % 2 != 0:
output_dict[var] = var**3
print("Output Dictionary using for loop:",output_dict)
Output:
output:
Example 2: Given two lists containing the names of states and their corresponding
capitals, construct a dictionary which maps the states with their respective capitals.
Let’s see how to do this using for loops and dictionary comprehension.
Using Loop:
Output:
c) Set Comprehensions:
Set comprehensions are pretty similar to list comprehensions. The only difference
between them is that set comprehensions use curly brackets { }. Let’s look at the
following example to understand set comprehensions.
Example : Suppose we want to create an output set which contains only the even
numbers that are present in the input list. Note that set will discard all the duplicate
values. Let’s see how we can do this using for loops and set comprehension.
Using Loop:
input_list = [1, 2, 3, 4, 4, 5, 6, 6, 6, 7, 7]
output_set = set()
# Using loop for constructing output set
for var in input_list:
if var % 2 == 0:
output_set.add(var)
print("Output Set using for loop:", output_set)
output:
Output:
d)Generator Comprehensions:
Generator Comprehensions are very similar to list comprehensions. One difference
between them is that generator comprehensions use circular brackets whereas list
comprehensions use square brackets. The major difference between them is that
generators don’t allocate memory for the whole list. Instead, they generate each value
one by one which is why they are memory efficient. Let’s look at the following example
to understand generator comprehension:
input_list = [1, 2, 3, 4, 4, 5, 6, 7, 7]
output_gen = (var for var in input_list if var % 2 == 0)
print("Output values using generator comprehensions:", end = ' ')
for var in output_gen:
print(var, end = ' ')
5.Write a Python program to generate the combinations of n distinct objects taken from
the elements of a given list. Example: Original list: [1, 2, 3, 4, 5, 6, 7, 8, 9] Combinations
of 2 distinct objects: [1, 2] [1, 3] [1, 4] [1, 5] [7, 8] [7, 9] [8, 9].
Program.
n_list = [1,2,3,4,5,6,7,8,9]
print("Original list:")
print(n_list)
n=2
result = combination(n, n_list)
print("\nCombinations of",n,"distinct objects:")
for e in result:
print(e)
Output:
Output:
for i in range(ArraySize):
print("Enter ",str(i+1),"Element")
list1.append(int(input()))
t = lst1[i]
lst1[i] = lst1[mini]
lst1[mini] = t
return lst1
if i > mid:
while j <= high:
temp.append(a[j])
j=j+1
else:
while i <= mid:
temp.append(a[i])
i=i+1
#copying back values from temp array to main array
k = low
for z in temp:
a[k] = z
k = k+1
down = low
up = high
pivot = down
while down < up:
while x[down] <= x[pivot] and down < high:
down = down + 1
while x[up] > x[pivot]:
up = up-1
if down < up:
t = x[down]
x[down] = x[up]
x[up] = t
t = x[pivot]
x[pivot] = x[up]
x[up] = t
return up
return x
for i in range(num):
list1.append(int(input()))
print('Sorted list is ')
res = quicksort(list1, 0, num-1)
for i in range(num):
print(res[i], end=" ")
class Stack:
def __init__(self):
self.stk = []
self.top = int(-1)
self.max=int(3)
def Push(self):
if self.top == self.max-1:
print("Stack Full")
else:
val = input("Enter Value to be Pushed")
self.top = self.top+1
self.stk.append(val)
print(val,"Pushed on to the stack")
def Pop(self):
if self.top == -1:
print("Stack is Empty")
else:
val = self.stk.pop(self.top)
self.top = self.top-1
print(val,"Poped from the stack")
def Peek(self):
if self.top == -1:
print("Stack is Empty")
else:
print("Topest Element:",self.stk[self.top])
def Display(self):
if self.top == -1:
print("Stack is Empty")
else:
print("Elements in the Stack are:")
new_lst = self.stk[::-1]
for x in new_lst:
print("|", x, "|")
StackObj = Stack()
while True:
print("\n****Operations On Stack ***")
print("1.Push")
print("2.PoP")
print("3.Peek")
print("4.Display")
print("5.Exit")
choice = int(input("Enter Your Choice:"))
if choice == 1:
StackObj.Push()
elif choice == 2:
StackObj.Pop()
elif choice == 3:
StackObj.Peek()
elif choice == 4:
StackObj.Display()
elif choice == 5:
exit(0)
else:
print("Invalid Choice! Try Again:")
Output:
class Node:
def __init__(self, data=None):
self.data = data
self.link = None
class Stack:
def __init__(self):
self.top = None
def Push(self):
data_in = input("Enter Value to be Pushed")
NewNode = Node(data_in)
NewNode.link = self.top
self.top = NewNode
print(data_in," Pushed on to stack")
def Pop(self):
temp = self.top
if temp is not None:
self.top = temp.link
print(temp.data,"is Deleted from Stack")
temp = None
else:
print("Stack is Empty")
def Peek(self):
temp = self.top
if temp is None:
print("Stack is Empty")
else:
print("Topest Element:",temp.data)
def Display(self):
temp = self.top
if temp is None:
print("Stack is Empty")
else:
while temp is not None:
print("|", temp.data,"|", end="\n")
temp = temp.link
StackObj = Stack()
while True:
print("\n****Operations On Stack ***")
print("1.Push")
print("2.PoP")
print("3.Peek")
print("4.Display")
print("5.Exit")
choice = int(input("Enter Your Choice:"))
if choice == 1:
StackObj.Push()
elif choice == 2:
StackObj.Pop()
elif choice == 3:
StackObj.Peek()
elif choice == 4:
StackObj.Display()
elif choice == 5:
exit(0)
else:
print("Invalid Choice! Try Again:")
class Queue:
def __init__(self):
self.Q = []
self.front = int(-1)
self.rear = int(-1)
self.max = int(3)
def Enqueue(self):
if self.front>self.rear:
self.front = int(-1)
self.rear = int(-1)
self.Q = []
if self.rear == int((self.max-1)):
print("Queue is Full")
else:
if self.front == -1:
self.front = 0
val = input("Enter an Element into Queue")
self.rear = self.rear + 1
self.Q.append(val)
print(val,"Inserted sucessfully into Queue")
def Dequeue(self):
if (self.front==-1 and self.rear== -1)or(self.front>self.rear):
self.front=self.rear=-1
self.Q = []
print("Queue is Empty")
else:
val = self.Q[self.front]
self.Q[self.front]=""
self.front = self.front+1
print(val," is deleted Sucesfully")
def Display(self):
if (self.front==-1 and self.rear==-1)or(self.front>self.rear):
self.front=self.rear=-1
print("Queue is Empty")
self.Q = []
else:
for i in range(self.front,self.rear+1):
print(self.Q[i],"<--",end="")
Qobj = Queue()
while True:
print("\n****Operations On Stack ***")
print("1.Enqueue")
print("2.Dequeue")
print("3.Display")
print("4.Exit")
choice = int(input("Enter Your Choice:"))
if choice == 1:
Qobj.Enqueue()
elif choice == 2:
Qobj.Dequeue()
elif choice == 3:
Qobj.Display()
elif choice == 4:
exit(0)
else:
print("Invalid Choice! Try Again:")
class Node:
def __init__(self, data=None):
self.data = data
self.link = None
class Queue:
def __init__(self):
self.front = None
self.rear = None
def Enqueue(self):
temp = self.front
data_in=input("Enter an Element into Queue")
NewNode = Node(data_in)
if temp is None:
self.front = NewNode
self.rear = NewNode
else:
while temp.link is not None:
temp = temp.link
temp.link = NewNode
self.rear = NewNode
print(data_in, " Inserted sucessfully into Queue")
def Dequeue(self):
temp = self.front
if temp is not None:
self.front = temp.link
print(temp.data, "is deleted Sucesfully")
if self.front is self.rear:
self.front=self.rear=None
temp = None
else:
print("Queue is Empty")
def Display(self):
temp = self.front
if temp is None:
print("Queue is Empty")
else:
while temp is not None:
print(temp.data,"<--", end="")
temp = temp.link
Qobj = Queue()
while True:
Output:
Program:
class Node:
def __init__(self, data=None):
self.data = data
self.link = None
class SLinkedList:
def __init__(self):
self.head = None
def RemoveNodeAtEnd(self):
temp = self.head
if temp==None:
print("List Empty")
elif temp.link == None:
def TraverseList(self):
temp = self.head
if temp is None:
print("Linked List is Empty")
else:
while temp is not None:
print("-->", temp.data, end="")
temp = temp.link
def NodeCount(self):
count = 0
temp = self.head
if temp is None:
return count
else:
while temp is not None:
count = count+1
temp = temp.link
return count
prev = cur
cur = cur.link
count = count+1
if pos==1:
NewNode.link = self.head
self.head = NewNode
else:
NewNode.link = cur
prev.link = NewNode
self.TraverseList()
temp = temp.link
if Loc != -1:
print(key ,"Found at Location ",Loc)
else:
print(key, "NOt Found in the List ")
while True:
print("\n****Operations On Single Linked List***")
print("1.Insert at Begining")
print("2.Insert at End")
print("3.Delete at Begining")
print("4.Delete at End")
print("5.Traverse the List")
print("6.Node Count")
print("7.Insert at a Position")
print("8.Delete at a Position")
print("9.Search for a Node")
print("10.Exit")
choice = int(input("Enter Your Choice:"))
if choice == 1:
data = input("Enter a Value:")
llist.InsertAtBeg(data)
elif choice == 2:
data = input("Enter a Value:")
llist.InsertAtEnd(data)
elif choice == 3:
llist.RemoveNodeAtBeg()
elif choice == 4:
llist.RemoveNodeAtEnd()
elif choice == 5:
llist.TraverseList()
elif choice == 6:
print("Total nodes in the List:",llist.NodeCount())
elif choice == 7:
data = input("Enter a Value:")
nCount=int(llist.NodeCount())
if nCount==0:
print("Empty List:")
else:
print("Available max position is ",nCount )
pos = int(input("Enter position of insertion:"))
llist.InsertAtPos(data, pos)
elif choice == 8:
pos = int(input("Enter position for Deletion:"))
llist.DelAtPos(pos)
elif choice == 9:
keyVal = int(input("Enter key for searching:"))
llist.search(keyVal)
elif choice == 10:
exit(0)
else:
print("Invalid Choice! Try Again:")
class Node:
def __init__(self, data=None):
self.data = data
self.prev = None
self.next = None
class DLinkedList:
def __init__(self):
self.head = None
def RemoveNodeAtEnd(self):
temp = self.head
if temp==None:
print("List is Empty")
elif temp.next == None:
print(temp.data, "is Deleted from List")
temp = None
self.head=None
else:
while temp.next is not None:
pr = temp
temp = temp.next
print(temp.data,"is Deleted from List")
temp = None
pr.next = None
self.DisplayList()
def DisplayList(self):
temp = self.head
if temp is None:
print("Doubly Linked List is Empty")
else:
while temp is not None:
print("<==>", temp.data, end="")
temp = temp.next
print()
def NodeCount(self):
count = 0
temp = self.head
if temp is None:
return count
else:
while temp is not None:
count = count+1
temp = temp.next
return count
count = int(1)
while count < pos:
print("While")
pr = cr
cr = cr.next
count = count+1
if pos==1:
NewNode.next = self.head
self.head = NewNode
else:
NewNode.next = cr
cr.prev = NewNode
pr.next = NewNode
NewNode.prev = pr
self.DisplayList()
Nc = int(self.NodeCount())
if pos > Nc:
print("Invalid Position\nTry Again")
elif Nc == 0 :
print("List is empty")
elif pos == 1:
temp = self.head
print(temp.data, "is Deleted from List")
temp = temp.next
self.head = temp
if temp is None:
pass
else:
temp.prev = None
temp = None
elif Nc==pos:
temp = self.head
while temp.next is not None:
pr = temp
temp = temp.next
print(temp.data, "is Deleted from List")
temp = None
pr.next = None
else:
cr = self.head
pr = cr
count = int(1)
while count < pos:
pr = cr
cr = cr.next
count = count+1
Dnode=cr
print(Dnode.data, " is Deleted from List")
Dnode = None
pr.next = cr.next
temp = cr.next
temp.prev = pr
self.DisplayList()
#Search
def search(self, key):
count = 1
Loc = int(-1)
temp = self.head
if temp is None:
print("List is Empty")
else:
while temp is not None:
if key == int(temp.data):
Loc = count
count = count+1
temp = temp.next
if Loc != -1:
print(key ,"Found at Location ",Loc)
else:
print(key, "NOt Found in the List ")
elif choice == 3:
dll.RemoveNodeAtBeg()
elif choice == 4:
dll.RemoveNodeAtEnd()
elif choice == 5:
dll.DisplayList()
elif choice == 6:
print("Total nodes in the List:",dll.NodeCount())
elif choice == 7:
data = input("Enter a Value:")
nCount=int(dll.NodeCount())
if nCount==0:
print("Empty List:")
else:
print("Available max position is ",nCount )
pos = int(input("Enter position of insertion:"))
dll.InsertAtPos(data, pos)
elif choice == 8:
pos = int(input("Enter position for Deletion:"))
dll.DelAtPos(pos)
elif choice == 9:
keyVal = int(input("Enter key for searching:"))
dll.search(keyVal)
elif choice == 10:
exit(0)
else:
print("Invalid Choice! Try Again:")
class BSTNode:
def __init__(self, val=None):
self.left = None
self.right = None
self.val = val
if self.val == val:
return
if self.right:
self.right.insert(val)
return
self.right = BSTNode(val)
def get_min(self):
current = self
while current.left is not None:
current = current.left
return current.val
def get_max(self):
current = self
while current.right is not None:
current = current.right
return current.val
self.right = self.right.delete(val)
return self
if self.right == None:
return self.left
if self.left == None:
return self.right
min_larger_node = self.right
while min_larger_node.left:
min_larger_node = min_larger_node.left
self.val = min_larger_node.val
self.right = self.right.delete(min_larger_node.val)
return self
if self.right == None:
return False
return self.right.exists(val)
print("postorder:")
print(bst.postorder([]))
print("#")
print("inorder:")
print(bst.inorder([]))
print("#")
print("4 exists:")
print(bst.exists(4))
print("2 exists:")
print(bst.exists(2))
print("12 exists:")
print(bst.exists(12))
print("18 exists:")
print(bst.exists(18))