20. Таблица умножения. Интерактивный тест для начальной школы.

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

Условие:

Программа должна спрашивать мультипликатор от 2 до 9 и произвести тест ученика на знание таблицы умножения.
Программа должна вывести итоговый результат тестирования.

Пример:

Код:

import random, time, bext, 


"""КЛАСС ТАБЛИЦА УМНОЖЕНИЯ"""
class Multiplication:
    test_pass, test_no = 0, 0  # правильные и неправильные ответы
    count = 0  # счётчик объектов
    wrong_answeres = []  # неправильные ответы
    time_limit = 15
    # конструктор
    def __init__(self, multiplicator):
        self._digit = random.randint(1, multiplicator)  # первый множитель
        self._digit2 = random.randint(1, multiplicator)  # второй множитель
        self._composition = self._digit * self._digit2  # произведение
        Multiplication.count += 1  # при создании объекта увеличивает на 1 счётчик объектов (атрибут класса)

    # метод, задающий вопрос
    def question(self):
        print(f"\nУ вас 15 секунд для ответа !!!\n\nПриготовьтесь !!! {Multiplication.count}-й вопрос.\n")
        # обратный отсчёт
        print("3 сек...")
        time.sleep(1)
        print("2 сек...")
        time.sleep(1)
        print("1 сек...")
        time.sleep(1)
        print(f"\nВопрос: произведение {self._digit} на {self._digit2} ???\n")

    # метод, получающий ответ
    def answer(self):
        time_count_start = time.time()  # старт счётчика времени
        test = input("Ваш ответ: \n")
        time_count_end = time.time()  # конец счётчика времени
        time_count = time_count_end - time_count_start  # затраченное время на ответ
        if test == str(self._composition) and time_count <= Multiplication.time_limit:
            Multiplication.test_pass += 1
        else:
            Multiplication.test_no += 1
            Multiplication.wrong_answeres.append(f"{self._digit} * {self._digit2}")

    # метод класса, визуализация списка неправильных ответов
    @classmethod
    def class_method(cls):
        print()
        print("ИТОГО:")
        print(f"Количество вопросов: {Multiplication.count}.")
        print(f"Количество правильных ответов: {Multiplication.count - len(Multiplication.wrong_answeres)}.")
        print(f"Количество неправильных ответов: {len(Multiplication.wrong_answeres)}.")
        if len(Multiplication.wrong_answeres) > 0:
            print("По следующим вопросам были даны неправильные ответы:")
            for i in cls.wrong_answeres:
                print(i)
        print()


# функция для ВВОДА ДАННЫХ
def main():
    while True:
        try:
            mult = int(input("Введите мультипликатор от 2 до 9: \n"))
            if mult < 2 or mult > 9:
                print()
                continue
            break
        except:
            print("\nВы ввели не мультипликатор!!!\n")
    return mult
    

try:
    # КОД ПРОГРАММЫ
    bext.clear()
    bext.fg("magenta")
    quantity_tests = 20  # количество вопросов
    print(f"\nТЕСТ. \nТАБЛИЦА УМНОЖЕНИЯ.\nВсего {quantity_tests} вопросов.")
    mult = main()  # ввод мультипликатора
    # ОВНОВНОЙ ЦИКЛ
    while Multiplication.count < quantity_tests:
        a = Multiplication(mult)
        a.question()
        a.answer()
    # ИТОГИ ТЕСТА (ВЫВОД)
    Multiplication.class_method()

except KeyboardInterrupt:
    sys.exit()