13. Тест по математике для 2-го класса (добавить деление).

(открыть в новой вкладке)

Условие:

Необходимо дополнить предыдущую программу классом для деления цифр.
Необходимо дать возможность ученику один раз исправить допущенные ошибки.

Код:

import abc, random, pyinputplus


class Math_operation(abc.ABC):                                                      
    '''Интерфейс для реализации математических операций.'''
     
    @abc.abstractmethod
    def action(self):
        '''Возвращает результат математической операции.'''
        pass

    @abc.abstractmethod
    def name_action(self):
        '''Возвращает описание математической операции.'''
        pass


class Plus(Math_operation):                                                         
    def __init__(self, a, b):                                                                                                  
        self._a = a
        self._b = b

    def action(self):                                                               
        return (self._a + self._b)
     
    def name_action(self):                                                          
        return f"Сумма {self._a} и {self._b}."


class Minus(Math_operation):                                                        
    def __init__(self, a, b):                                                                                                  
        self._a = a
        self._b = b

    def action(self):                                                               
        return (self._a - self._b)
     
    def name_action(self):                                                          
        return f"Разница {self._a} и {self._b}."
    

class Composition(Math_operation):                                                  
    def __init__(self, a, b):                                                                                                  
        self._a = a
        self._b = b

    def action(self):                                                               
        return (self._a * self._b)
     
    def name_action(self):                                                          
        return f"Произведение {self._a} и {self._b}."
    

class Division(Math_operation):                                                     # добавлен класс для операции деления                                                  
    def __init__(self, a, b):                                                                                                  
        self._a = a
        self._b = b

    def action(self):                                                               
        return int(self._a / self._b)
     
    def name_action(self):                                                          
        return f"Деление {self._a} на {self._b}."


class Test:
    count = 0
    max_count = 20
    mistakes = 0
    mistakes_list = []
    mistakes_2 = 0                                                                  # добавлен атрибут класса
    mistakes_list_2 = []                                                            # добавлен атрибут класса
    temp = []                                                                       # добавлен атрибут класса
    def __init__(self):
        raise Exception("Нельзя создать экземпляр данного класса!")
    
    @classmethod
    def __get_example(cls):                                                          
        x = random.randint(1, 4)                                                    # строка изменена
        if x == 1:
            return Plus(random.randint(1, 99), random.randint(1, 99))
        elif x == 2:
            while True:
                a = random.randint(1, 99)
                b = random.randint(1, 99)
                if a >= b:
                    break
            return Minus(a, b)       
        elif x == 3:
            return Composition(random.randint(1, 9), random.randint(1, 9))
        elif x == 4:                                                                # добавлен блок для условия
            while True:
                a = random.randint(1, 99)
                b = random.randint(1, 99)
                if a % b == 0:
                    break
            return Division(a, b)

    @classmethod
    def __run(cls):                                                                 
        example = cls.__get_example()                                                                                            
        print(example.name_action())                                                
        answer = pyinputplus.inputNum()                                             
        if int(answer) != example.action():                                         
            cls.mistakes += 1
            cls.mistakes_list.append(example.name_action())
        cls.mistakes_list.sort()

    @classmethod                                                                    # добавлен метод для класса
    def __run_2(cls, i):                                                                 
        if "Сумма" in i:
            example = Plus(int(i[1]), int(i[-1][0:-1]))                                                                                            
            print(example.name_action())                                                
            answer = pyinputplus.inputNum()                                             
            if int(answer) != example.action():                                         
                cls.mistakes_2 += 1
                cls.mistakes_list_2.append(example.name_action())
        elif "Разница" in i:
            example = Minus(int(i[1]), int(i[-1][0:-1]))                                                                                            
            print(example.name_action())                                                
            answer = pyinputplus.inputNum()                                             
            if int(answer) != example.action():                                         
                cls.mistakes_2 += 1
                cls.mistakes_list_2.append(example.name_action())
        elif "Произведение" in i:
            example = Composition(int(i[1]), int(i[-1][0:-1]))                                                                                            
            print(example.name_action())                                                
            answer = pyinputplus.inputNum()                                             
            if int(answer) != example.action():                                         
                cls.mistakes_2 += 1
                cls.mistakes_list_2.append(example.name_action())
        elif "Деление" in i:
            example = Division(int(i[1]), int(i[-1][0:-1]))                                                                                            
            print(example.name_action())                                                
            answer = pyinputplus.inputNum()                                             
            if int(answer) != example.action():                                         
                cls.mistakes_2 += 1
                cls.mistakes_list_2.append(example.name_action())
        cls.mistakes_list.sort()    

    @classmethod                                                                    
    def play(cls):                                                                  
        print()
        print(f"Тест по математике для второго класса.")
        while cls.count != cls.max_count:
            cls.count += 1            
            print(f"№ {cls.count}")
            cls.__run()
        print()
        if len(cls.mistakes_list) > 0:
            print(f"Ошибки в {cls.mistakes_list}.") 
        print(f"Количество ошибок равно {cls.mistakes}.")           
        if len(cls.mistakes_list) > 0:                                              # добавлен блок условия для ошибок
            print()                                                                     
            print("Давайте попробуем их исправить.")                                    
            for i in cls.mistakes_list:
                i = i.split(" ")                
                cls.temp.append(i)
            for i in cls.temp:
                cls.__run_2(i)
            print()
            if len(cls.mistakes_list_2) > 0:                                                                                 
                print(f"Не исправленные ошибки: {cls.mistakes_list_2}.")                
            print(f"Количество не исправленных ошибок равно {cls.mistakes_2}.")     
        print()                                                                 
        print("Тест окончен.")                                                          
        print()                                                                     


if __name__ == "__main__":    
    print("Скрипт запущен напрямую.")
    Test.play()
else:    
    print("Скрипт импортирован.")