Presentation is loading. Please wait.

Presentation is loading. Please wait.

EECS 110: Lec 9: Review for the Midterm Exam

Similar presentations


Presentation on theme: "EECS 110: Lec 9: Review for the Midterm Exam"— Presentation transcript:

1 EECS 110: Lec 9: Review for the Midterm Exam
Aleksandar Kuzmanovic Northwestern University

2 General Info Wednesday, April 26, 9:30-11:30am, Pancoe Life Science Pavilion (PLSAUD) To be done individually Closed book One 8.5” by 11” sheet of paper permitted Please do not discuss the exam with others until everyone has taken it. There are six questions. Each question is worth 20 points. Hence, you can acquire 120 points in total. Those who get > 90 points will get an A. Those who get >80 points and <90 points will get a B, etc.  

3 Midterm Exam 6 questions: What Python would say? Functions Recursion
List comprehensions Lists of lists Bugs

4 Question 1: What Python Would Say?
>> x = 41 >> y = x + 1 >> x ??

5 What Python Would Say? >> x = 41 >> y = x + 1 >> x

6 What Python Would Say? >> x = 41 >> y = x + 1 >> x
??

7 What Python Would Say? >> x = 41 >> y = x + 1 >> x
42

8 What Python Would Say? >> x = 41 >> y = x + 1 >> x
42 >> x = x + y ??

9 What Python Would Say? >> x = 41 >> y = x + 1 >> x
42 >> x = x + y 83

10 What Python Would Say? >> x = 41 >> y = x + 1 >> x
42 >> x = x + y 83 ??

11 What Python Would Say? >> x = 41 >> y = x + 1 >> x
42 >> x = x + y 83

12 What will these results be?
Python (numeric) data types What will these results be? Dominant float 1 / 5 long 10** **100 int 1 // 5 bool 41 + True Recessive

13 x%y returns the remainder when x is divided by y
% the “mod” operator x%y returns the remainder when x is divided by y 7 % 3 8 % 3 9 % 3 16 % 7 x%2 == 0 For what values of x are these True? x%2 == 1 x%4 == 0

14 string functions str len + * str(42) returns '42'
converts input to a string len('42') returns 2 returns the string’s length 'XL' + 'II' returns 'XLII' concatenates strings 'VI'*7 returns 'VIVIVIVIVIVIVI' repeats strings

15 s = ’northwestern university'
String surgery s = ’northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ ] indexes into the string, returning a one-character string index s[0] returns 'n' Read "s-of-zero" or "s-zero" s[12]returns S[ ] returns 'h' Which index returns 'e'? s[len(s)] returns python != English

16 s = ’northwestern university'
String surgery s = ’northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ ] indexes into the string, returning a one-character string index s[0] returns 'n' Read "s-of-zero" or "s-zero" s[12]returns ' ' S[ ] returns 'h' Which index returns 'e'? s[len(s)] returns python != English

17 s = ’northwestern university'
String surgery s = ’northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ ] indexes into the string, returning a one-character string index s[0] returns 'n' Read "s-of-zero" or "s-zero" s[12]returns ' ' S[4] returns 'h' Which index returns 'e'? s[len(s)] returns python != English

18 s = ’northwestern university'
String surgery s = ’northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ ] indexes into the string, returning a one-character string index s[0] returns 'n' Read "s-of-zero" or "s-zero" s[12]returns ' ' S[4] returns 'h' Which index returns 'e'? s[len(s)] returns ERROR python != English

19 s = ‘northwestern university'
Slicing s = ‘northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ : ] slices the string, returning a substring What's going on here? s[0:5] returns 'north' s[5:9] returns 'west' s[17:] returns 'ersity' s[:] returns 'northwestern university'

20 s = ‘northwestern university'
Slicing s = ‘northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ : ] slices the string, returning a substring the first index is the first character of the slice the second index is ONE AFTER the last character a missing index means the end of the string s[0:5] returns 'north' s[5:9] returns 'west' s[17:] returns 'ersity' s[:] returns 'northwestern university'

21 s = ‘northwestern university'
Skip-slicing s = ‘northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ : : ] skip-slices, returning a subsequence the third index is the "stride" length it defaults to 1 s[0:8:2] returns 'nrhe' 'ruv' What skip-slice returns What does this return? s[1::6]

22 s = ‘northwestern university'
Skip-slicing s = ‘northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ : : ] skip-slices, returning a subsequence the third index is the "stride" length it defaults to 1 s[0:8:2] returns 'nrhe' 'ruv' s[10:17:3] What skip-slice returns What does this return? s[1::6]

23 s = ‘northwestern university'
Skip-slicing s = ‘northwestern university' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 s[ : : ] skip-slices, returning a subsequence the third index is the "stride" length it defaults to 1 s[0:8:2] returns 'nrhe' 'ruv' s[10:17:3] What skip-slice returns What does this return? s[1::6] 'osus'

24 Lists ~ Strings of anything
Commas separate elements. Lists ~ Strings of anything L = [ 3.14, [2,40], 'third', 42 ] Square brackets tell python you want a list. len(L) L[0] Indexing: could return a different type Slicing: always returns the same type L[0:1] How could you extract from L 'hi'

25 Lists ~ Strings of anything
Commas separate elements. Lists ~ Strings of anything L = [ 3.14, [2,40], 'third', 42 ] Square brackets tell python you want a list. len(L) 4 L[0] Indexing: could return a different type Slicing: always returns the same type L[0:1] How could you extract from L 'hi'

26 Lists ~ Strings of anything
Commas separate elements. Lists ~ Strings of anything L = [ 3.14, [2,40], 'third', 42 ] Square brackets tell python you want a list. len(L) 4 L[0] 3.14 Indexing: could return a different type Slicing: always returns the same type L[0:1] How could you extract from L 'hi'

27 Lists ~ Strings of anything
Commas separate elements. Lists ~ Strings of anything L = [ 3.14, [2,40], 'third', 42 ] Square brackets tell python you want a list. len(L) 4 L[0] 3.14 Indexing: could return a different type Slicing: always returns the same type L[0:1] [3.14] How could you extract from L 'hi'

28 Lists ~ Strings of anything
Commas separate elements. Lists ~ Strings of anything L = [ 3.14, [2,40], 'third', 42 ] Square brackets tell python you want a list. len(L) 4 L[0] 3.14 Indexing: could return a different type Slicing: always returns the same type L[0:1] [3.14] How could you extract from L 'hi' L[2][1:3]

29 >>> 3*'i' in 'alien'
The in thing >>> 3*'i' in 'alien' False >>> 'i' in 'team' False >>> 'cs' in 'physics' True >>> ‘sleep' not in ‘EECS 110' True >>> 42 in [41,42,43] True a little bit different for lists… >>> 42 in [ [42], '42' ] False

30 Some basic, built-in functions:
Question 2: Functioning in Python Some basic, built-in functions: abs max min sum range round bool float int long list str absolute value of lists these change data from one type to another creates lists only as accurately as it can! The most important: help dir

31 Functioning in Python Some of Python's baggage… # my own function!
def dbl( x ): """ returns double its input, x """ return 2*x keywords Some of Python's baggage… def starts the function return stops it immediately and sends back the return value Docstrings They become part of python's built-in help system! With each function be sure to include one that Comments describes overall what the function does, and explains what the inputs mean/are They begin with #

32 How functions work… What is demo(-4) ? def demo(x): return x + f(x)
def f(x): return 11*g(x) + g(x/2) def g(x): return -1 * x What is demo(-4) ?

33 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) def g(x): return -1 * x What is demo(-4) ?

34 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1 * x return 11*g(x) + g(x/2) What is demo(-4) ?

35 How functions work… These are different x's ! What is demo(-4) ?
def demo(x): return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1 * x return 11*g(x) + g(x/2) These are different x's ! What is demo(-4) ?

36 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1 * x return 11*g(-4) + g(-4/2) g x = -4 What is demo(-4) ? return -1.0 * x

37 How functions work… What is demo(-4) ? def demo(x): return x + f(x)
return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1 * x return 11* g(-4/2) g x = -4 What is demo(-4) ? return -1 * -4 4

38 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1.0 * x return 11* 4 + g(-4/2) What is demo(-4) ?

39 How functions work… What is demo(-4) ? def demo(x): return x + f(x)
return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1 * x return 11* g(-4/2) g x = -2 What is demo(-4) ? return -1 * -2 2

40 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1.0 * x return 11* What is demo(-4) ?

41 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return -4 + f(-4) def f(x): return 11*g(x) + g(x/2) f x = -4 def g(x): return -1.0 * x return 11* 46 What is demo(-4) ?

42 42 How functions work… What is demo(-4) ? def demo(x): demo
return x + f(x) demo x = -4 return def f(x): return 11*g(x) + g(x/2) def g(x): return -1.0 * x What is demo(-4) ? 42

43 Question 3: Recursion The recursion mantra:

44 The recursion mantra: Recursion def fac(N): if N <= 1: return 1
else: return N * fac(N-1) You handle the base case – the easiest possible case to think of! Recursion does almost all of the rest of the problem!

45 Example 1: Designing numAs
How many A’s are in a particular string? antarctica gattaca Base Case: Recursive Step:

46 How many A’s are in a particular string?
numAs How many A’s are in a particular string? antarctica gattaca Think about the SIMPLEST POSSIBLE case! Base Case: Recursive Step: Do ONLY ONE STEP, and let recursion do the rest…

47 when there are no letters, there are ZERO A’s
numAs How many A’s are in a particular string? antarctica gattaca when there are no letters, there are ZERO A’s Base Case: Recursive Step:

48 numAs How many A’s are in a particular string? antarctica gattaca
when there are no letters, there are ZERO A’s Base Case: if the first letter is NOT an A, the answer is just ___________ Recursive Step:

49 when there are no letters, there are ZERO A’s
numAs How many A’s are in a particular string? antarctica gattaca when there are no letters, there are ZERO A’s Base Case: if the first letter is NOT an A, the answer is just the number of A’s in the rest of the string Recursive Step:

50 numAs How many A’s are in a particular string? antarctica gattaca
when there are no letters, there are ZERO A’s Base Case: if the first letter is NOT an A, the answer is just the number of A’s in the rest of the string Recursive Step: if the first letter IS an A, the answer is just ___________

51 when there are no letters, there are ZERO A’s
numAs How many A’s are in a particular string? antarctica gattaca when there are no letters, there are ZERO A’s Base Case: if the first letter is NOT an A, the answer is just the number of A’s in the rest of the string Recursive Step: if the first letter IS an A, the answer is just 1 + the number of A’s in the rest of the string

52 when there are no letters, there are ZERO A’s
numAs def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) when there are no letters, there are ZERO A’s Base Case: if the first letter is NOT an A, the answer is just the number of A’s in the rest of the string Recursive Step: if the first letter IS an A, the answer is just 1 + the number of A’s in the rest of the string

53 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca')

54 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca')

55 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca')

56 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca')

57 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca') 1+numAs('aca')

58 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca') 1+numAs('aca') 1+1+numAs('ca')

59 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca') 1+numAs('aca') 1+1+numAs('ca') 1+1+numAs('a')

60 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca') 1+numAs('aca') 1+1+numAs('ca') 1+1+numAs('a') 1+1+1+numAs('')

61 def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca') 1+numAs('aca') 1+1+numAs('ca') 1+1+numAs('a') 1+1+1+numAs('')

62 elif s[0] != 'a': return numAs(s[1:])
def numAs( s ): if len(s) == 0: return 0 elif s[0] != 'a': return numAs(s[1:]) elif s[0] == 'a': return 1+numAs(s[1:]) numAs('gattaca') numAs('attaca') 1+numAs('ttaca') 1+numAs('taca') 1+numAs('aca') 1+1+numAs('ca') 1+1+numAs('a') 1+1+1+numAs('') Done! 3

63 Example 2: Taking away a letter
returns a string that is the same as s, but without the first 'a' def removeA( s ) Examples: removeA('chatham') returns chtham removeAs('gattaca') returns gttaca removeAs('laura') returns lura removeAs('debbie') returns debbie

64 Taking away… def removeA( s )
returns a string that is the same as s, but without the first 'a' def removeA( s ) when there are no letters, the answer is _____________ Base Case: if the first letter IS an A, the answer is ______________________ Recursive Step: if the first letter IS an A, the answer is __________________

65 when there are no letters, the answer is the EMPTY STRING ''
Taking away… returns a string that is the same as s, but without the first 'a' def removeA( s ) when there are no letters, the answer is the EMPTY STRING '' Base Case: if the first letter IS an A, the answer is THE REST OF THE STRING s[1:] Recursive Step: if the first letter is NOT an A, the answer is s[0] + WHAT YOU GET WHEN YOU TAKE As OUT OF s[1:]

66 def removeA( s ): if len(s) == 0: return ' ' elif s[0] == 'a': return s[1:] elif s[0] != 'a': return s[0]+removeA(s[1:])

67 You can try these (using recursion)
def numBs( s ): Returns the number of 'b' characters in the string s. def num( ch, s ): Returns the number of ch characters in the string s. def match( s2, s ): Returns the number of characters in s2 that are in the string s.

68 You can try these (using recursion)
def numBs( s ): Returns the number of 'b' characters in the string s. def num( ch, s ): Returns the number of ch characters in the string s. def match( s2, s ): Returns the number of characters in s2 that are in the string s.

69 Returns the number of ch characters in the string s.
Question 4: List Comprehensions (1) def num( ch, s ): Returns the number of ch characters in the string s.

70 List Comprehensions (Ex. 1)
def num( ch, s ): LC = [c in ch for c in s] return sum( LC )

71 Returns the number of vowels (‘auioe’) in the string s.
List Comprehensions (Ex. 2) def sajak( s ): Returns the number of vowels (‘auioe’) in the string s.

72 List Comprehensions (Ex. 2)
def sajak( s ): LC = [c in 'auioe' for c in s] return sum( LC )

73 List Comprehensions (Ex. 3)
>> S = [x**2 for x in range(5)] >> V = [2**i for i in range(6)] >> M = [x for x in S if x%2 == 0] >> print S; ??

74 List Comprehensions (Ex. 3)
>> S = [x**2 for x in range(5)] >> V = [2**i for i in range(6)] >> M = [x for x in S if x%2 == 0] >> print S; [0, 1, 4, 9, 16]

75 List Comprehensions (Ex. 3)
>> S = [x**2 for x in range(5)] >> V = [2**i for i in range(6)] >> M = [x for x in S if x%2 == 0] >> print S; print V; [0, 1, 4, 9, 16] ??

76 List Comprehensions (Ex. 3)
>> S = [x**2 for x in range(5)] >> V = [2**i for i in range(6)] >> M = [x for x in S if x%2 == 0] >> print S; print V; [0, 1, 4, 9, 16] [1, 2, 4, 8, 16, 32]

77 List Comprehensions (Ex. 3)
>> S = [x**2 for x in range(5)] >> V = [2**i for i in range(6)] >> M = [x for x in S if x%2 == 0] >> print S; print V; print M [0, 1, 4, 9, 16] [1, 2, 4, 8, 16, 32] ??

78 List Comprehensions (Ex. 3)
>> S = [x**2 for x in range(5)] >> V = [2**i for i in range(6)] >> M = [x for x in S if x%2 == 0] >> print S; print V; print M [0, 1, 4, 9, 16] [1, 2, 4, 8, 16, 32] [0, 4, 16]

79 Question 5: Lists of Lists

80 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]
??

81 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]

82 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]
??

83 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]

84 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]
??

85 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]
ERROR

86 Lists of Lists >> S = [[1,2,3],[4,5,6],[7,8,9]]
ERROR

87 Brightening a Picture def modify(pic):
""" modify modifies an image to make it brighter """ pixels = getPixels(pic) if len(pixels) == 0: return newPixels = [ [setNewPixel( pixels, row, col ) for col in range(len(pixels[0]))] for row in range(len(pixels))] setPixels(pic, newPixels) def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW imanges (row, col) (r,g,b) value input pixels: a 2D list containing RGB information in the pixels in a picture input row: the row of the pixel in question input col: the column of the pixel in question """ rval= min(pixels[row][col][0]+30, 255) gval = min(pixels[row][col][1]+30, 255) bval = min(pixels[row][col][2]+30, 255) return (rval, gval, bval)

88 Representing the Pixels in a Picture
[ [(3, 10, 100), (3, 11, 110)], [(3, 10, 200), (10, 110, 290)] ] Width: len(pixels[0]) Height: len(pixels) 2x2 pixel image

89 Tuples vs. Lists Tuples use ( ); lists use [ ]
[ [(3, 10, 100), (3, 11, 110)], [(3, 10, 200), (10, 110, 290)] ] Tuples use ( ); lists use [ ] But otherwise, they are the same… (for now, almost) >>> t = (1, 2, 3) >>> t[1] 2 >>> t[1:] (2, 3) >>> (x, y, z) = t >>> x 1 >>> y

90 Brightening a Picture def modify(pic):
""" modify modifies an image to make it brighter """ pixels = getPixels(pic) if len(pixels) == 0: return newPixels = [ [setNewPixel( pixels, row, col ) for col in range(len(pixels[0]))] for row in range(len(pixels))] setPixels(pic, newPixels) def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW imanges (row, col) (r,g,b) value input pixels: a 2D list containing RGB information in the pixels in a picture input row: the row of the pixel in question input col: the column of the pixel in question """ rval= min(pixels[row][col][0]+30, 255) gval = min(pixels[row][col][1]+30, 255) bval = min(pixels[row][col][2]+30, 255) return (rval, gval, bval)

91 "Quiz“ It's all clear to me now!
Name(s): Write a function that tints the top half of the picture red (how red is up to you): def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW image's (row, col) (r,g,b) value """ Write a function that copies the top half of an image to the bottom half. def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW image's (row, col) (r,g,b) value """ Want more? How would you turn only the sky red?

92 "Quiz“ It's all clear to me now!
Name(s): Write a function that tints the top half of the picture red (how red is up to you): def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW image's (row, col) (r,g,b) value """ if row <= len(pixels)//2: rval = min(pixels[row][col][0]+75,255) else: rval = pixels[row][col][0] return (rval, pixels[row][col][1], pixels[row][col][2]) Write a function that copies the top half of an image to the bottom half. def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW image's (row, col) (r,g,b) value """ Want more? How would you turn only the sky red?

93 "Quiz“ It's all clear to me now!
Name(s): Write a function that tints the top half of the picture red (how red is up to you): def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW image's (row, col) (r,g,b) value """ if row <= len(pixels)//2: rval = min(pixels[row][col][0]+75,255) else: rval = pixels[row][col][0] return (rval, pixels[row][col][1], pixels[row][col][2]) Write a function that copies the top half of an image to the bottom half. def setNewPixel( pixels, row, col ): """ setNewPixel returns the NEW image's (row, col) (r,g,b) value """ if row > len(pixels)//2: return pixels[row-len(pixels)//2][col] else: return pixels[row][col] Want more? How would you turn only the sky red?

94 Question 6: Bugs

95 >>> answer = dbl(21) >>> answer = dbl(21)
return vs print def dbl(x): """ doubles x """ return 2*x def dblPR(x): """ doubles x """ print( 2*x ) >>> answer = dbl(21) >>> answer = dbl(21) return provides the function call's value … print just prints

96 Good luck with the Midterm Exam!


Download ppt "EECS 110: Lec 9: Review for the Midterm Exam"

Similar presentations


Ads by Google