# a1q3 (Python) def ave(data, index, width): # returns (data[i] + data[i+1] + ... + data[index+width-1])/width sum = 0.0 for j in range(index, index+width): sum += data[j] return sum/width def averageAndScale(data): # harcode the number of bins size = 20 # bins will store the data for each "bin" (averaged values) bins = [0]*size # determine how many values will be used in each bin # (i.e., the number of values for each average except maybe the last) width = 0 if len(data) % size == 0: width = len(data) // size else: width = (len(data) // size) + 1 # add this many averages using width numbers for the average first = len(data) // width # integer division will round down automatically for index in range(0, first): bins[index] = ave(data, index*width, width) # add the rest of the bin data now if first*width < len(data): # need another average with less numbers bins[first] = ave(data, first*width, len(data)-first*width) # find the largest value of the bins biggest = bins[0] for i in range(size): if biggest < bins[i]: biggest = bins[i] # determine the scaling factor # biggest * scale = 20 scale = 20 / biggest # compute the scaled bins and put in a new list # for output out = [0]*size for i in range(size): out[i] = bins[i]*scale # print statements to trace what is happening in the function print(f' width={width} first={first} biggest={biggest} scale={scale}') print(' bins =' + str(bins)) return out def main(): # for testing in1 = [2*i for i in range(1,21)] print('##\n##', 'len(data) = 20') print('input =' + str(in1)) print('output=' + str(averageAndScale(in1))) print('##\n##', 'len(data) = 40') in2 = [2*i for i in range(1,41)] print('input =' + str(in2)) print('output=' + str(averageAndScale(in2))) print('##\n##', 'len(data) = 17') in3 = [2*i for i in range(1,18)] print('input =' + str(in3)) print('output=' + str(averageAndScale(in3))) print('##\n##', 'len(data) = 38') in4 = [2*i for i in range(1,39)] print('input =' + str(in4)) print('output=' + str(averageAndScale(in4))) if __name__ == '__main__': main()