CS 1MD3 - Winter 2006 - Assignment #2

Generated for Student ID: 0448615

Due Date: Wednesday, February 8th

(You are responsible for verifying that your student number is correct!)

Part 1: Debugging

The following four functions are infested with bugs. Correct them by adding or changing a single line in each one. Clearly indicate your changes with comments. If you add a line, append the comment, "# added." If you change a line, append a comment to it containing the original, erroneous line. Solutions submitted without comments will not be marked.

1
def mean(numberList):
	"""Returns the mean (i.e. average) value of the elements in the list"""
	n = len(numberList)
	if n == 0:
		return None
	theSum = 0
	i = 1 
	while i > -n:
		x = numberList[i]
		theSum = theSum + x
		i = i - 1
	return float(theSum) / float(n)

2
def deinterlaceOdd(interlacedList):
	"""Returns a list consisting of only the odd elements of the given list.
	For example, deinterlaceOdd(['1', 'a', '2', 'b', '3', 'c']) returns [a,b,c]."""
	n = len(interlacedList)
	if n <= 1:
		return None
	i = 1
	oddList = []
	while i < n:
		oddList.append(interlaceList[i])	
		i = i+2
	return oddList

3
def product(numberList):
	"""Computes the product of all the list elements."""
	n = len(numberList)
	if n <= 0:
		return None
	theProduct = 1
	i = 0
	while i <= n-1:
		theProduct = theProduct * numberList[i]
		i = i-1	
	return theProduct

4
def hammingDistance(str1, str2):
	"""Returns the Hamming distance (or "edit distance") between two strings of the
	same length.  Hamming distance is defined as the minimum number of characters which
	must be changed	to make the strings identical.  For example, the Hamming distance
	between	"Python" and "Athlon" is 4 (only the last two letters are the same);
	the Hamming distance between "noodle" and "needle" is 2 (only the second and 
	third letters differ)."""
	if len(str1) != len(str2):
		return None
	list1 = list(str1)
	list2 = list(str2)
	n=len(list1)
	distance = 0
	i=0
	while i < n:
		if list1[i] != list2[i]:
		distance = distance + 1	
		i=i+1
	return distance


Part 2: Testing

Create automated tests for the following function using PyUnit. Your tests should ensure that the code produces the expected result in all cases.

def isAnagram(str1, str2):
	"""Returns True if the two strings are anagrams of each other (i.e. if str2 is 
	simply a permutation of the letters of str1); otherwise returns False."""
	if len(str1) != len(str2):
		return False
	list1 = list(str1)
	list2 = list(str2)
	n = len(list1)
	for x in list1:		# For each character in list1...
		if x in list2:	# ...if that character appears in list2, remove it from list2.
			xPos = list2.index(x)
			list2 = list2[0:xPos] + list2[xPos+1:len(list2)]
		else:
			return False	
	if len(list2) == 0:	# If list2 is empty by this point, then the strings were anagrams
		return True
	else:
		return False