##Nancy Bailey ##CSCI 582 Summer 2019 ##Facts Fun Lab or Assignment...need to decide what to have students do on their own. Complete solution below without extension. ##Create a basic facts generator...using OOP ##Score is kept until Quit ##Select: addition, subraction, multiplication, division, potpourri ##Add, Subtract, Mult, Div are restricted to basic facts families generated with random integers -12 to 12 ##Extensions: #1. Add mod. #2. Define a new operation. #3. Add different comments. #4. Generalize: Prompt for min/max numbers import random class Operation: """Common base class for basic math operation""" def __init__(self): """Constructor with default values""" self.number1 = random.randint(-12,12) # first number to operate / randint includes both endpoints self.number2 = random.randint(-12,12) # 2nd number to operate /randint includes both endpoints #self.number2 = 0 #check that zero logic works for Division Class self.operator = "operator symbol" self.result = 0 def get_number1(self): """Reader method to return a random integer from -12 to 12 inclusive""" return(self.number1) def get_number2(self): """Reader method to return a random integer from -12 to 12 inclusive""" return(self.number2) def set_number1(self, number1): """Writer method to set a random integer from -12 to 12 inclusive""" self.number1 = number1 def set_number2(self, number2): """Writer method to set a random integer from -12 to 12 inclusive""" self.number2 = number2 def get_result(self): """Reader method to return a random integer from -12 to 12 inclusive""" return(self.result) def __str__(self): """ Convert object to a string""" return "(" + str(self.number1)+")" + self.operator + "(" + str(self.number2)+") = ? " class Addition(Operation): """Define additon to be a subclass of Operation""" def __init__(self): Operation.__init__(self) self.operator = " + " self.result = self.get_number1() + self.get_number2() class Subtraction(Operation): """Define Subtraction to be a subclass of Operation""" def __init__(self): """Constructor with default values""" Operation.__init__(self) self.operator = " - " self.result = self.get_number1() - self.get_number2() class Multiplication(Operation): """Define Multiplication to be a subclass of Operation""" def __init__(self): """Constructor with default values""" Operation.__init__(self) self.operator = "" self.result = self.get_number1() * self.get_number2() class Division(Operation): """Define Division to be a subclass of Operation""" def __init__(self, check_for_zero): #students should note how division is different than the other three """Constructor with default values""" Operation.__init__(self) self.operator = " / " self.dividend = self.get_number1()*self.get_number2() if self.number2 == 0: self.divisor = random.randint(1,12)*check_for_zero else: self.divisor = self.get_number2() self.result = self.get_dividend() / self.get_divisor() def get_dividend(self): """Reader method to return dividend""" return(self.dividend) def get_divisor(self): """Reader method to return divisor""" return(self.divisor) def __str__(self): """ Convert object to a string""" return "(" + str(self.dividend)+")" + self.operator + "(" + str(self.divisor)+") = ? " # --------------------------------------------- # do_choice # --------------------------------------------- def do_choice(choice_number, operation): answer = 145 print(operation) while answer != operation.get_result(): answer = int(input(" " )) if operation.get_result() == answer: print("Correct!") else: print ("Wrong, please try again!:\n") return answer # --------------------------------------------- # Print choices # --------------------------------------------- def print_choices(): print() print("1. Add") print("2. Subtract") print("3. Multiply") print("4. Divide") print("5. Potpourri") #select one of 1-4 randomly generated print("6. Quit") print() # --------------------------------------------- # main application # --------------------------------------------- def main(): choice = 0 score = 0 while choice != 6: fix_zero = random.randrange(-1,2,2) #choice of -1 or +1 to be used later for Division constructor print("Score: ", score) print_choices() choice = int(input("Enter choice: ")) if choice == 1: add1 = Addition() do_choice(1, add1) score +=1 elif choice == 2: sub2 = Subtraction() do_choice(2, sub2) score +=1 elif choice == 3: mul3 = Multiplication() do_choice(3, mul3) score +=1 elif choice == 4: div4 = Division(fix_zero) do_choice(4, div4) score +=1 elif choice == 5: choice = random.randint(1,4)-1 add1 = Addition() sub2 = Subtraction() mul3 = Multiplication() div4 = Division(fix_zero) choice_list = [add1, sub2, mul3, div4] do_choice(choice, choice_list[choice]) score +=1 elif choice == 6: print("Goodbye!") else: print("Invalid choice. Please try again.") # --------------------------------------------- main()