Найти тему

Пишем тренажеры по арифметике в Python. Сложение однозначных чисел и частный случай сложения до десяти.

Оглавление

Я уже писала о том, как сделать в Python тренажер табличного умножения, а сегодня хочу рассказать о том, как изменить такой тренажер для тренировки других вычислительных навыков. Сначала частично повторюсь и кратко расскажу как написать "исходный тренажер" (он будет на сложение однозначных чисел), а потом приведу пример как его модифицировать (мы попробуем обойтись без вычислений через десяток).

Программа, которую будем модифицировать.

Что должен делать тренажер?

  1. Сгенерировать числовые значения для примера
  2. Вывести пример в консоли
  3. Получить ответ
  4. Проверить правильность ответа
  5. Вывести результат
  6. Повторить пункты 1-5 10 раз
  7. Сообщить о завершении программы

Теперь о том, как это все объяснить компьютеру.

Если у вас не установлена среда разработки, то вполне можно обойтись онлайн - компилятором, например вот этим https://www.online-python.com/ Если вы программируете первый раз, то можете посмотреть в предыдущей статье или на скриншоте ниже место для размещения кода. Все строки уже набраны, можете их просто скопировать из статьи в нужное место, но в некоторых местах потребуется добавить пробелы в начале строк.

Для работы нам потребуется подключить библиотеку, содержащую генератор случайных чисел. Для этого первой строчкой кода вводим

from random import randint

Пункты 1-5 выполняются многократно, так что сразу запускаем цикл из десяти повторов.

for i in range (10):

Все действия, которые должны повторятся в данном цикле записываются строго со сдвигом вправо ( в начале строки нажимаем клавишу Tab или 4 пробела). К сожалению, Дзен эти пробелы убирает при публикации, так что я не могу разместить здесь текст программы "под ключ".

Пункт 1. Генерируем значения

a = randint(1,9)
b = randint(1,9)

И сразу считаем ответ. Зачем? На случай, если мы захотим генерировать примеры не только на сложение (а мы захотим). В этом случае все строчки, которые нам придется редактировать, будут в одном месте.

rez = a+b

Пункт 2. Выводим пример на печать.

print(a,"+",b,"=")

Пункт 3. Получаем ответ от пользователя

c = int(input())

Пункт 4,5. Проверяем правильность ответа и выводим результат. Если Вы читали мою прошлую статью по тренажеру в Python, то обратите внимание на отличие - в этом блоке мы используем только готовый результат и нам не важно, умножением он получен, делением или здесь вообще сравниваются последовательности символов.

if c==rez :
print("Верно!")
else :
print("Нет, получится ", rez)

Только все, что должно выполняться в случае выполнения условия надо сдвинуть вправо, так что выглядеть это в редакторе кода должно вот так:

Оператор if требует пробелов в начале строк, которые нужно исполнить в случае выполнения условия
Оператор if требует пробелов в начале строк, которые нужно исполнить в случае выполнения условия

Пункт 7. Выводим сообщение о завершении работы программы

print("Урок окончен!")

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

Внешний вид программы - тренажера на тему "Сложение однозначных чисел"
Внешний вид программы - тренажера на тему "Сложение однозначных чисел"

Общие слова про гибкость программы.

Еще раз посмотрим на полный получившийся код:

from random import randint
for i in range (10):
a = randint(1,9)
b = randint(1,9)
rez=a+b
print(a,"+",b,"=")
c = int(input())
if c==rez :
print("Верно!")
else :
print("Нет, получится ", rez)
print("Урок окончен")

Основная его часть будет одинакова в любом тренажере для отработки навыков счета с натуральными числами. Изменять нам придется только 4 строчки: генерация чисел, определение результата и выводы задания на экран.

Все, что может потребоваться изменить, собрано в одном месте.
Все, что может потребоваться изменить, собрано в одном месте.

Иногда нет ничего проще, чем адаптировать эту программу под свои нужды. Например, заменить сложение на умножение (поменять символ в двух местах). Или задать другой диапазон исходных значений (генерировать числа не до 9, а до 100), но иногда бывает, что приходится изменить немного и некоторые команды. Обсудим один из таких случаев.

Сложение в пределах десятка.

Что, если мы хотим, чтобы наш тренажер не выводил нас за пределы первого десятка? Если ребенок проходит только счет до десяти? Как нам дать компьютеру это понять?

Вариант1. Ограничим а и b

a = randint(1,5)
b = randint(1,5)
rez=a+b
print(a,"+",b,"=")

Тогда мы не будем выходить за пределы десятка, но, правда, примера вроде 7+1 ребенок тоже не получит. Так себе вариант, хотя в некоторых случаях неплохой.

Вариант 2. Определяем значение a, а потом b выбираем в диапазоне от 1 до 10-a, тогда их сумма точно не будет больше, чем 10.

a = randint(1,9)
b = randint(1,10-a)
rez=a+b
print(a,"+",b,"=")

Неплохо, но есть еще один недостаток: пример 9+1 будет появляться в тренажерах примерно каждый раз (девятка генерируется в одном из девяти случае, а единственное, с чем она может складываться - это 10) а пример 3+5 - только в одном тренажере из шести. Не самое удачное распределение. Как с ним можно бороться?

Вариант 3. Генерировать примеры как в первом тренажере, а потом бороться с неугодными.

Давайте посмотрим на таблицу сложения:

Если программа сгенерировала числа 9 и 3, то их сумма 12, нам такой вариант не подойдет, заменяем 9 на 1, а 3 на 7 и все! 1+7=8.
Если программа сгенерировала числа 9 и 3, то их сумма 12, нам такой вариант не подойдет, заменяем 9 на 1, а 3 на 7 и все! 1+7=8.

Если мы генерируем значения a и b независимо друг от друга, то с равной вероятностью генерируется любой пример из таблицы. Если он нам подходит, то оставляем, а если нет, то немного изменяем. Например так: каждое из чисел заменим на его разницу с числом 10. То есть a заменим на 10-a, а b на 10-b.

Значит вместо выделенных строчек надо добавить вот такой фрагмент кода (не забудьте добавить пробелы в начале двух строчек после оператора if, чтобы они выполнялись только тогда, когда условие выполняется):

a = randint(1,9)
b = randint(1,9)
if a+b>10 :
a=10-a
b=10-b
rez a+b
print(a,"+",b,"=")

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

Итак, теперь у нас готова программа - репетитор по сложению в пределах десятка. Выглядит она вот так:

Текст программы - тренажера на тему "Сложения в пределах десятка".
Текст программы - тренажера на тему "Сложения в пределах десятка".

Осталось запустить ее и можно тренироваться. Про то, как сделать тренажер на деление и вычитание, расскажу в следующей статье.

Приятного решения! И успехов в обучении!

Наука
7 млн интересуются