CS 1MD3 - Winter 2006 - Assignment #2
Generated for Student ID: 0361850
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 product(numberList):
"""Computes the product of all the list elements."""
n = len(numberList)
if n <= 0:
return None
theProduct = l
i=0
while i < n:
theProduct = theProduct * numberList[i]
i=i+1
return theProduct
3
def argMax(aList):
"""Returns the index of the largest element in the list"""
n = len(aList)
if n <= 0:
return None
i = 0
theArgMax = i
theMax = aList[theArgMax]
while i < n:
x = aList[i]
if x > theMax:
theMax = x
theArgMax = i
i = i + 1
return theArgMax
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 gcd(intList):
"""Finds the greatest common divisor among the list elements (in an inefficient way)."""
if len(intList) == 0:
return None
isDivisor = False
divider = 0
listMin = min(intList)
candidate = 1
while isDivisor == False:
divider = divider + 1
if listMin != divider * (listMin / divider): # if divider isn't a factor of listMin...
continue
candidate = listMin / divider
isDivisor = True
for x in intList:
if x != candidate * (x / candidate):
isDivisor = False
break
return candidate