• — Можно ли миллион записать в один бит?
    — Конечно: 1 — есть миллион, 0 — нет миллиона…

Обучалка

Проект «Обучалка» появился на свет лет 15 назад, когда мне пришлось первый раз заменять учителя математики в младших классах. Школьники вроде бы уже прошли и вроде бы даже знали таблицу умножения, однако… На поверку выяснилось, что большинство не только не знает саму таблицу умножения, но и плохо понимает, что такое умножение и зачем оно нужно. По факту в наличии были не знания, а задолбленный бессмысленный набор данных, который не понятно из чего следовал, и как следствие — было совершенно не ясно, как его использовать. В итоге задач стояло три:
— объяснить до понимания,
— научить применять понятое
— и предоставить возможность выучить на будущее.

Первые две задачи вполне решались лично мной или другим учителем в пределах уроков и домашних заданий, а вот на решение третьей — времени просто не оставалось. Чтобы решить третью задачу нужен был тренажёр. Простой, надёжный, не требующий участия взрослых. Таким тренажёром стала программа «Обучалка», написанная на языке программирования BASIC. Вы можете посмотреть его в этом спойлере (весь программный код расположен в спойлерах — чтобы не загромождать статью. Для просмотра — нажмите   +).

Первая Обучалка на BASIC. Программный код
CLS
PRINT
PRINT
PRINT
PRINT
PRINT "                        ╔══════════════════════════════╗"
PRINT "                        ║          ПРИВЕТ!             ║"
PRINT "                        ║  Я программа Обучалка v.1.0  ║"
PRINT "                        ╚══════════════════════════════╝"
PRINT
PRINT
PRINT "Сегодня "; DATE$; " Сейчас "; TIME$
BEEP
FOR i = 0 TO 3000000
NEXT i

REM ***** количество примеров
r = 20

start:
CLS
PRINT
PRINT "Выбери режим обучения:"
PRINT "  1 - Табличное умножение"
PRINT "  2 - Табличное деление"
PRINT "  3 - Табличное умножение и деление"
PRINT "  4 - Внетабличное умножение"
PRINT "  5 - Внетабличное деление"
PRINT "  6 - Внетабличное умножение и деление"
PRINT "  7 - Сложение"
PRINT "  8 - Вычитание"
PRINT "  9 - Сложение и вычитание"
PRINT " 10 - Все операции вперемешку (+, -, x, :)"
PRINT "  0 - Выход из программы"
INPUT "Введи номер режима: "; n
SELECT CASE n

REM -------------------------------------------------------------
CASE 1
CLS
PRINT
PRINT
PRINT "Будем повторять знание таблицы умножения."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER

n = 0
FOR i = 1 TO r
a = INT(RND * 9) + 1
b = INT(RND * 9) + 1
PRINT i; ") "; a; " x "; b; " = ";
INPUT c
IF c <> a * b THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a * b
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF
NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
PRINT "Оценка: "; INT((((i - n) / i) + .5) * 5)
REM ////PRINT "Плохо! Очень медленно и много ошибок!"
GOTO vopr1

REM -------------------------------------------------------------
CASE 2
CLS
PRINT
PRINT
PRINT "Будем повторять деление в пределах таблицы умножения."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER

n = 0
FOR i = 1 TO r
a = INT(RND * 9) + 1
b = INT(RND * 9) + 1
PRINT i; ") "; a * b; " : "; b; " = ";
INPUT c
IF c <> a THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF
NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
GOTO vopr1

REM -------------------------------------------------------------
CASE 3
CLS
PRINT
PRINT
PRINT "Будем повторять умножение и деление в пределах таблиуы умножения."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER

n = 0
FOR i = 1 TO r
a = INT(RND * 10)
b = INT(RND * 9) + 1
d = RND * 2
IF d <= 1 THEN

PRINT i; ") "; a * b; " : "; b; " = ";
INPUT c
IF c <> a THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

ELSE

PRINT i; ") "; a; " x "; b; " = ";
INPUT c
IF c <> a * b THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a * b
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

END IF

NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
GOTO vopr1

REM -------------------------------------------------------------
CASE 4
CLS
PRINT
PRINT
PRINT "Будем повторять внетабличное умножение."
BEEP
PRINT "*** UNDER CONSTRUCTION! ***"

REM -------------------------------------------------------------
CASE 5
CLS
PRINT
PRINT
PRINT "Будем повторять внетабличное деление."
BEEP
PRINT "*** UNDER CONSTRUCTION! ***"

REM -------------------------------------------------------------
CASE 6
CLS
PRINT
PRINT
PRINT "Будем повторять внетабличное умножение и деление."
BEEP
PRINT "*** UNDER CONSTRUCTION! ***"

REM -------------------------------------------------------------
CASE 7
CLS
PRINT
PRINT
PRINT "Будем повторять сложение."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER

n = 0
FOR i = 1 TO r
a = INT(RND * 100)
b = INT(RND * 100)
PRINT i; ") "; a; " + "; b; " = ";
INPUT c
IF c <> a + b THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a + b
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF
NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
GOTO vopr1

REM -------------------------------------------------------------
CASE 8
CLS
PRINT
PRINT
PRINT "Будем повторять вычитание."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER

n = 0
FOR i = 1 TO r
a = INT(RND * 100)
b = INT(RND * 100)
PRINT i; ") "; a + b; " - "; b; " = ";
INPUT c
IF c <> a THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF
NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
GOTO vopr1

REM -------------------------------------------------------------
CASE 9
CLS
PRINT
PRINT
PRINT "Будем повторять сложение и вычитание."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER

n = 0
FOR i = 1 TO r
a = INT(RND * 100)
b = INT(RND * 100)
d = RND * 2
IF d <= 1 THEN

PRINT i; ") "; a + b; " - "; b; " = ";
INPUT c
IF c <> a THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

ELSE

PRINT i; ") "; a; " + "; b; " = ";
INPUT c
IF c <> a + b THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a + b
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

END IF

NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
GOTO vopr1

REM -------------------------------------------------------------
CASE 10
CLS
PRINT
PRINT
PRINT "Будем повторять сложение, вычитание, умножение и деление."
BEEP
PRINT "Когда будешь готов нажми клавишу Enter(Ввод)."
INPUT "Готов"; n
myt = TIMER
RANDOMIZE TIMER
n = 0
FOR i = 1 TO r

d = RND * 2
IF d <= 1 THEN
REM *********************** + / -
a = INT(RND * 100)
b = INT(RND * 100)
d = RND * 2
IF d <= 1 THEN

PRINT i; ") "; a + b; " - "; b; " = ";
INPUT c
IF c <> a THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

ELSE

PRINT i; ") "; a; " + "; b; " = ";
INPUT c
IF c <> a + b THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a + b
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

END IF

ELSE
REM ********* x / :

a = INT(RND * 10)
b = INT(RND * 9) + 1
d = RND * 2
IF d <= 1 THEN

PRINT i; ") "; a * b; " : "; b; " = ";
INPUT c
IF c <> a THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

ELSE

PRINT i; ") "; a; " x "; b; " = ";
INPUT c
IF c <> a * b THEN
BEEP
PRINT "- НЕПРАВИЛЬНО!  Правильный ответ "; a * b
n = n + 1
ELSE
PRINT "+ ПРАВИЛЬНО!"
END IF

END IF

END IF

NEXT i

i = i - 1
PRINT "Сейчас "; TIME$
myt = TIMER - myt
BEEP
PRINT "Всего решено "; i; " примеров."
PRINT "Из них "; i - n; " правильно."
BEEP
PRINT "Общее время решения "; INT(myt); " сек. ("; myt / 60; "мин.)"
PRINT "Среднее время решения одного примера - "; myt / i; " сек."
IF (myt / i) < 5 THEN
PRINT "Хорошая скорость!"
ELSEIF (myt / i) < 10 THEN
PRINT "Средняя скорость."
ELSE
PRINT "Очень медленно!"
END IF
BEEP
GOTO vopr1

REM -------------------------------------------------------------
CASE 0
GOTO fin
END SELECT

vopr1:
k = 5
INPUT "Еще посчитаем (да-1/нет-0)"; k
IF k = 0 THEN
GOTO fin
ELSEIF k = 1 THEN
GOTO start
ELSE
PRINT " Внмательнее!"
BEEP
GOTO vopr1
END IF

fin:
CLS
PRINT
PRINT
PRINT "                                 До свиданья!"
BEEP
END

Довольно долгое время программа работала на BSAIC’е. А затем как-то под настроение я переписал её на MS Small Basic в течение пары вечеров. Сейчас подобных программ довольно много, однако большинство из них представляют из себя интернет-сервисы.

Спустя некоторое время в дополнение к «Обучалке» была написана ещё программа «Контроша», которая генерировала примеры для контрольных работ — с возможностью вывода на печать. Многие интернет-сервисы сейчас решают именно эту задачу. Однако, наиболее важные функции всё-таки остаются у «Обучалки»: она позволяет контролировать время и правильность потокового решения задач устного счёта.

Здесь вы можете скачать любую из этих программ. В пакет каждой программы входит текст на MS Small Basic, что позволяет понять, как программа работает и самостоятельно внести в неё желаемые изменения.

Важно! Для работы всех программ, написанных на MS Small Basic необходимо установить на компьютер фреймворк MS .Net версии 4.8.

Обучалка 0-9 (сложение-вычитание до 18)

Первый вариант программы (по смыслу, а не по времени создания) предназначен для обучения первоклассников устному счёту (только сложение и вычитание) в пределах 18 (слагаемые или вычитаемое — целые числа от 0 до 9). Эта программа называется «Обучалка 0-9». Кроме интерактивного взаимодействия с учащимся в консоли (текстовом окне) программа записывает все результаты в файл, расположенный в корне диска С:\  —  C:\обучалка.log. В файл также пишется время начала и окончания серии примеров для удобства контроля.  Ниже находится её программный код. Саму программу можно скачать по следующей ссылке.

Программный код расположен в спойлерах — чтобы не загромождать статью. Для просмотра — нажмите   + .

Обучалка 0-9. Программный код
TextWindow.WriteLine("Программа Обучалка 2.1 (0 - 9)")
TextWindow.WriteLine("")

TextWindow.WriteLine("Привет, будем учить математику (сложение и вычитание в пределах 18)? (да/нет)")
a=TextWindow.Read()
If a="нет" Or a="НЕТ" Or a="Нет" Or a="нЕт" Or a="неТ" Or a="НЕт" Or a="нЕТ" Or a="НеТ" Then
  TextWindow.WriteLine("До свиданья!") 
  Program.End()
ElseIf a="Да" Or a="ДА" Or a="да" Or a="дА" Then
  TextWindow.WriteLine("Начинаем!")
EndIf

start:
TextWindow.WriteLine("Считаем примеры на сложение и вычитание в пределах 18.")

TextWindow.WriteLine("Сколько примеров?")
n=TextWindow.ReadNumber()

prav=0

File.AppendContents("c:\обучалка.log","Дата: "+Clock.Day+"/"+Clock.Month+"/"+Clock.Year+", "+Clock.WeekDay+".")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log", "Считаем до 18 от 0 до 9")
File.AppendContents("c:\обучалка.log", "Примеров - "+n)
File.AppendContents("c:\обучалка.log","")

For i=1 To n
  
  b=Math.Floor(Math.GetRandomNumber(10))-1
  c=Math.Floor(Math.GetRandomNumber(10))-1
  d=b+c
  
  'сложение-вычитание
  o=Math.GetRandomNumber(4)
  If o<=2 Then
    TextWindow.Write(i+")  "+b+" + "+c+" = ? ")
    a=TextWindow.ReadNumber()
    If a=d Then
      pp="+"
    Else
      pp="-"
    EndIf  
    File.AppendContents("c:\обучалка.log",i+") "+b+" + "+c+" = "+a+"  "+pp)
    If a=d Then
      TextWindow.WriteLine("Правильно!") 
      prav=prav+1
    Else
      TextWindow.WriteLine("Ошибка! Правильный ответ - "+d)
    EndIf  
  Else
    TextWindow.Write(i+")  "+d+" - "+c+" = ? ")
    a=TextWindow.ReadNumber()
    If a=b Then
      pp="+"
    Else
      pp="-"
    EndIf  
    File.AppendContents("c:\обучалка.log",i+") "+d+" - "+c+" = "+a+"  "+pp)
    If a=b Then
      TextWindow.WriteLine("Правильно!") 
      prav=prav+1
    Else
      TextWindow.WriteLine("Ошибка! Правильный ответ - "+b)
    EndIf     
  EndIf
  
EndFor

File.AppendContents("c:\обучалка.log","")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log","Решено "+n+" примеров. Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(Math.Ceiling(prav*5/n))+".")
File.AppendContents("c:\обучалка.log","")
TextWindow.WriteLine("Решено "+n+" примеров. Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(Math.Ceiling(prav*5/n))+".")

TextWindow.WriteLine(" ")
TextWindow.WriteLine("Заканчиваем? (да/нет)")

a=TextWindow.Read()
If a="нет" Or a="НЕТ" Or a="Нет" Or a="нЕт" Or a="неТ" Or a="НЕт" Or a="нЕТ" Or a="НеТ" Then
  Goto start
Else  
  TextWindow.WriteLine("Пока!")
  Program.End()
EndIf

Обучалка lite (сложение-вычитание)

Следующий вариант — программа для обучения сложению и вычитанию целых чисел устно в любых, задаваемых пользователем пределах (хоть до миллионов). На самом деле до миллионов — никому не нужно. Как правило, достаточно научить считать в пределах 100 — 150, максимум 200. Эта программа делает всё то же самое, что и предыдущий вариант. Называлась она «Обучалка lite». Саму программу скачать можно по этой сылке. К программе прилагается файл ярлыка для запуска, где в настройках текст выводится черным по белому (а не как в стандартной консоли Windows — белым по чёрному) достаточно крупным шрифтом. Ниже представлен программный код.

Обучалка lite. Программный код
TextWindow.WriteLine("Программа 'Обучалка 2.1 lite'")
TextWindow.WriteLine("")

TextWindow.WriteLine("Привет, будем изучать математику (сложение-вычитание)? (да/нет)")
a=TextWindow.Read()
If a="нет" Or a="НЕТ" Or a="Нет" Or a="нЕт" Or a="неТ" Or a="НЕт" Or a="нЕТ" Or a="НеТ" Then
  TextWindow.WriteLine("До свиданья!") 
  Program.End()
ElseIf a="Да" Or a="ДА" Or a="да" Or a="дА" Then
  TextWindow.WriteLine("Начинаем!")
EndIf
start:

TextWindow.WriteLine("До скольки умеем считать?")
m=TextWindow.ReadNumber()

TextWindow.WriteLine("Сколько примеров?")
n=TextWindow.ReadNumber()

prav=0

File.AppendContents("c:\обучалка.log","Дата: "+Clock.Day+"/"+Clock.Month+"/"+Clock.Year+", "+Clock.WeekDay+".")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log", "Считаем до "+m)
File.AppendContents("c:\обучалка.log", "Примеров - "+n)
File.AppendContents("c:\обучалка.log","")

For i=1 To n
  
  b=Math.Floor(Math.GetRandomNumber(m/2+1))-1
  c=Math.Floor(Math.GetRandomNumber(m/2+1))-1
  d=b+c
  
  o=Math.GetRandomNumber(4)
  If o<=2 Then
    TextWindow.Write(i+")  "+b+" + "+c+" = ? ")
    a=TextWindow.ReadNumber()
    If a=d Then
      pp="+"
    Else
      pp="-"
    EndIf  
    File.AppendContents("c:\обучалка.log",i+") "+b+" + "+c+" = "+a+"  "+pp)
    If a=d Then
      TextWindow.WriteLine("Правильно!") 
      prav=prav+1
    Else
      TextWindow.WriteLine("Ошибка! Правильный ответ - "+d)
    EndIf  
  Else
    TextWindow.Write(i+")  "+d+" - "+c+" = ? ")
    a=TextWindow.ReadNumber()
    If a=b Then
      pp="+"
    Else
      pp="-"
    EndIf  
    File.AppendContents("c:\обучалка.log",i+") "+d+" - "+c+" = "+a+"  "+pp)
    If a=b Then
      TextWindow.WriteLine("Правильно!") 
      prav=prav+1
    Else
      TextWindow.WriteLine("Ошибка! Правильный ответ - "+b)
    EndIf     
  EndIf
  
EndFor

File.AppendContents("c:\обучалка.log","")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log","Решено "+n+" примеров. Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(Math.Ceiling(prav*5/n))+".")
File.AppendContents("c:\обучалка.log","")
TextWindow.WriteLine("Решено "+n+" примеров. Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(Math.Ceiling(prav*5/n))+".")

TextWindow.WriteLine("")
TextWindow.WriteLine("Заканчиваем? (да/нет)")

a=TextWindow.Read()
If a="нет" Or a="НЕТ" Or a="Нет" Or a="нЕт" Or a="неТ" Or a="НЕт" Or a="нЕТ" Or a="НеТ" Then
  Goto start
Else  
  TextWindow.WriteLine("Пока!")
  Program.End()
EndIf

Обучалка (таблица умножения)

А вот и самая первая версия программы, написанная для изучения и заучивания таблицы умножения, которая называлась просто «Обучалка». Эта программа была написана с таким расчетом, чтобы можно было учить как отбельные столбцы таблицы умножения, например, умножение на 7, так и всю таблицу умножения целиком (для этого нужно ввести 0 в начале). Принципиально эта программа ничем не отличается от двух предыдущих. Скачать её можно по этой ссылке. Программный код — ниже под спойлером.

Обучалка (таблица умножения). Программный код
TextWindow.WriteLine("Программа 'Обучалка 2.1' Таблица умножения")
TextWindow.WriteLine(" ")

TextWindow.WriteLine("Привет, будем повторять таблицу умножения? (да/нет)")
a=TextWindow.Read()
If a="нет" Or a="НЕТ" Or a="Нет" Or a="нЕт" Or a="неТ" Or a="НЕт" Or a="нЕТ" Or a="НеТ" Then
  TextWindow.WriteLine("До свиданья!") 
  Program.End()
ElseIf a="Да" Or a="ДА" Or a="да" Or a="дА" Then
  TextWindow.WriteLine("Начинаем!")
EndIf
start:

TextWindow.WriteLine("Таблица умножения Х1 - Х9? (ведите число от 0 до 9. 0 - вся таблица от Х1 до Х10)")
m=TextWindow.ReadNumber()
If m<0 Or m>9 Then
  TextWindow.WriteLine("Введите число от 0 до 9! (0 - вся таблица от Х1 до Х10)")
  Goto start
EndIf

TextWindow.WriteLine("Сколько примеров?")
n=TextWindow.ReadNumber()

prav=0

File.AppendContents("c:\обучалка.log","Дата: "+Clock.Day+"/"+Clock.Month+"/"+Clock.Year+", "+Clock.WeekDay+".")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log", "Считаем умножение на "+m+" (0 - вся таблица)")
File.AppendContents("c:\обучалка.log", "Примеров - "+n)
File.AppendContents("c:\обучалка.log","")

For i=1 To n
  
  If m=0 Then
    b=Math.Floor(Math.GetRandomNumber(10+1))-1
  Else
    b=m
  EndIf 
  c=Math.Floor(Math.GetRandomNumber(10+1))-1
  d=b*c
  
  o=Math.GetRandomNumber(4)
  If o<=2 Then
    TextWindow.Write(i+")  "+b+" х "+c+" = ? ")
    a=TextWindow.ReadNumber()
    If a=d Then
      pp="+"
    Else
      pp="-"
    EndIf  
    File.AppendContents("c:\обучалка.log",i+") "+b+" x "+c+" = "+a+"  "+pp)
    If a=d Then
      TextWindow.WriteLine("Правильно!") 
      prav=prav+1
    Else
      TextWindow.WriteLine("Ошибка! Правильный ответ - "+d)
    EndIf  
  Else
    TextWindow.Write(i+")  "+c+" х "+b+" = ? ")
    a=TextWindow.ReadNumber()
    If a=d Then
      pp="+"
    Else
      pp="-"
    EndIf  
    File.AppendContents("c:\обучалка.log",i+") "+c+" x "+b+" = "+a+"  "+pp)
    If a=d Then
      TextWindow.WriteLine("Правильно!") 
      prav=prav+1
    Else
      TextWindow.WriteLine("Ошибка! Правильный ответ - "+d)
    EndIf     
  EndIf
  
EndFor

File.AppendContents("c:\обучалка.log","")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log","Решено "+n+" примеров. Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(Math.Ceiling(prav*5/n))+".")
File.AppendContents("c:\обучалка.log","")
TextWindow.WriteLine("Решено "+n+" примеров. Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(Math.Ceiling(prav*5/n))+".")

TextWindow.WriteLine(" ")
TextWindow.WriteLine("Заканчиваем? (да/нет)")

a=TextWindow.Read()
If a="нет" Or a="НЕТ" Or a="Нет" Or a="нЕт" Or a="неТ" Or a="НЕт" Or a="нЕТ" Or a="НеТ" Then
  Goto start
Else  
  TextWindow.WriteLine("Пока!")
  Program.End()
EndIf

«Обучалка» быстро расползлась по всей школе, как потом выяснилось, не только нашей, и время от времени меня «находили» в интернете её пользователи с просьбой что-то изменить или дополнить. В итоге получилось целое семейство немного отличающихся «Обучалок».

Обучалка 100t (все операции в пределах 150)

В частности, под какие-то задачи появилась «Обучалка 100t», которая позволяла тренировать навыки устного счёта (сложение, вычитание, умножение, деление) в пределах 150 при этом один из множителей (делителей) может принимать значения от 1 до 12. Кроме того, программа в результате подсчёта количества ошибок предлагает выполнить дополнительное задание. Эту программу можно скачать по следующей ссылке. Программный код — ниже.

Обучалка (таблица умножения). Программный код
TextWindow.BackgroundColor = 15
TextWindow.ForegroundColor = 0
TextWindow.Clear()

TextWindow.WriteLine("Программа Обучалка 100t v 1.7")
TextWindow.WriteLine("")

TextWindow.WriteLine("Привет, будем повторять математику? (да/нет)")
a = TextWindow.Read()
a = Text.ConvertToLowerCase(a)
If a="нет" Then
  TextWindow.WriteLine("До свиданья!") 
  Program.End()
ElseIf a="да" Then
  TextWindow.WriteLine("Начинаем!")
EndIf
start:

TextWindow.WriteLine("Сложение и вычитание, умножение и деление до 150")
m=150 ' предел по сложению-вычитанию
'Сколько примеров?
TextWindow.WriteLine("Сколько примеров?")
n=TextWindow.ReadNumber()
If n=0 Then  ' если ничего не ввели - 1 пример
  n=1
EndIf 
  
mist=10  '  сколько примеров за одну ошибку

prav=0  ' сколько правильных примеров

mistake:  ' повтор при ошибках

TextWindow.WriteLine("Считаем " + n + " примеров на время!")
File.AppendContents("c:\обучалка.log","Дата: "+Clock.Day+"/"+Clock.Month+"/"+Clock.Year+", "+Clock.WeekDay+".")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log", "Считаем до "+m)
File.AppendContents("c:\обучалка.log", "Примеров - "+n)
File.AppendContents("c:\обучалка.log","")

TextWindow.WriteLine("Начали!")
TextWindow.WriteLine("")
tttt=Clock.ElapsedMilliseconds ' записали время начала

For i=1 To n
  
  type=Math.Floor(Math.GetRandomNumber(2)) ' тип операций
  
  If type=1 Then
    
    'сложение-вычитание
    
    b=Math.Floor(Math.GetRandomNumber(m+1))-1
    c=Math.Floor(Math.GetRandomNumber(m-b+1))-1
    d=b+c
    
    o=Math.GetRandomNumber(4)
    If o<=2 Then
      TextWindow.Write(i+")  "+b+" + "+c+" = ? ")
      a=TextWindow.ReadNumber()
      If a=d Then
        pp="+"
      Else
        pp="-"
      EndIf  
      File.AppendContents("c:\обучалка.log",i+") "+b+" + "+c+" = "+a+"  "+pp)
      If a=d Then
        TextWindow.WriteLine("Правильно!") 
        prav=prav+1
      Else
        TextWindow.WriteLine("Ошибка! Правильный ответ - "+d)
      EndIf  
    Else
      TextWindow.Write(i+")  "+d+" - "+c+" = ? ")
      a=TextWindow.ReadNumber()
      If a=b Then
        pp="+"
      Else
        pp="-"
      EndIf  
      File.AppendContents("c:\обучалка.log",i+") "+d+" - "+c+" = "+a+"  "+pp)
      If a=b Then
        TextWindow.WriteLine("Правильно!") 
        prav=prav+1
      Else
        TextWindow.WriteLine("Ошибка! Правильный ответ - "+b)
      EndIf     
    EndIf
    
  ElseIf type=2 Then
    
    ' умножение-деление
    b=Math.Floor(Math.GetRandomNumber(12+1))-1
    c=Math.Floor(Math.GetRandomNumber(11))
    d=b*c
    
    o=Math.Floor(Math.GetRandomNumber(2))
    
    If o=1  Then ' умножение
      
      TextWindow.Write(i+")  "+b+" х "+c+" = ? ")
      a=TextWindow.ReadNumber()
      If a=d Then
        pp="+"
      Else
        pp="-"
      EndIf  
      File.AppendContents("c:\обучалка.log",i+") "+b+" x "+c+" = "+a+"  "+pp)
      If a=d Then
        TextWindow.WriteLine("Правильно!") 
        prav=prav+1
      Else
        TextWindow.WriteLine("Ошибка! Правильный ответ - "+d)
      EndIf
      
    ElseIf o=2 Then ' деление
      
      TextWindow.Write(i+")  "+d+" : "+c+" = ? ")
      a=TextWindow.ReadNumber()
      If a=b Then
        pp="+"
      Else
        pp="-"
      EndIf  
      File.AppendContents("c:\обучалка.log",i+") "+d+" : "+c+" = "+a+"  "+pp)
      If a=b Then
        TextWindow.WriteLine("Правильно!") 
        prav=prav+1
      Else
        TextWindow.WriteLine("Ошибка! Правильный ответ - "+b)
      EndIf
      
    EndIf   
    
  EndIf  
  
EndFor

tttt=Clock.ElapsedMilliseconds-tttt ' миллисекунд прошло
tttt=Math.Ceiling(tttt/1000) ' секунды

File.AppendContents("c:\обучалка.log","")
File.AppendContents("c:\обучалка.log", "Время: "+Clock.Hour+":"+Clock.Minute+":"+Clock.Second+"."+Clock.Millisecond)
File.AppendContents("c:\обучалка.log","Решено "+n+" примеров за "+tttt+" сек (в среднем 1 пример за "+Math.Ceiling(tttt/n)+" сек). Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(2+Math.Ceiling(12*(((prav-n/2)+Math.Abs(prav-n/2))/2)/n/2))+".")
File.AppendContents("c:\обучалка.log","")
TextWindow.WriteLine("")
TextWindow.WriteLine("Решено "+n+" примеров за "+tttt+" сек (в среднем 1 пример за "+Math.Ceiling(tttt/n)+" сек).")
TextWindow.WriteLine("Из них "+prav+" - правильно. Ошибок - "+(n-prav)+". Оценка - "+(2+Math.Ceiling(12*(((prav-n/2)+Math.Abs(prav-n/2))/2)/n/2))+".")

If n-prav>0 Then
  TextWindow.WriteLine("")
  TextWindow.WriteLine("У вас были ошибки!")
  TextWindow.WriteLine("Предлагаю посчитать еще "+(n-prav)*mist+" примеров.")
  TextWindow.WriteLine("Будем делать работу над ошибками (да/нет)?")
  a=Text.ConvertToLowerCase(TextWindow.Read())
  If a="нет" Then
  Else
    n=(n-prav)*mist
    prav=0
    Goto mistake
  EndIf 
EndIf 

TextWindow.WriteLine("")
TextWindow.WriteLine("Заканчиваем? (да/нет)")

a=Text.ConvertToLowerCase(TextWindow.Read())
If a="нет" Then
  Goto start
Else  
  TextWindow.WriteLine("До свидания!")
  Program.Delay(500)
  Program.End()
EndIf

Хочется отметить, что программы эти писались на скорую руку (кто не верит — попробуйте поработать учителем в школе!) в паузах между основной работой, поэтому они совершенно не являются образцом качественного программирования, при желании любой может найти в них массу как минимум неоптимального кода. Разумеется, если есть желание, вы можете переписать эти программы по своему усмотрению, упростив и оптимизировав код, или приспособить их под свои индивидуальные задачи.

Поделиться: