Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ' ==== Script Information Header ====
- ' script name: xtimestable
- ' version: 1.01
- ' date: 06.11.2011
- ' autor: Alexander Zakharov
- ' description: Скрипт навязчиво задает вопросы по таблице умножения, показывает прогресс ответов.
- ' Добавить в автозагрузку учетной записи для детей, вероятно, поможет обучению.
- ' ... Для прекращения работы скрипта нужно завершить его процесс wscript.exe в диспетчере.
- '
- ' ==== Script Main Logic ====
- ' настраиваемые значения
- const probty = 0.5 ' вероятность предложения правильных ответов
- const convent = 7 ' на каком уровне изменить обычную таблицу на пифагорову
- const delmint = 45000 ' минимальная задержка между вопросами, мсек
- const delmaxt = 270000 ' максимальная задержка между вопросами, мсек
- const delmink = 0.5 ' правильность ответов для минимальной задержки
- const delmaxk = 0.7 ' правильность ответов для максимальной задержки
- const delqty = 10 ' количество ответов для определения задержки
- const levdeck = 0.5 ' правильность ответов для понижения уровня
- const levinck = 0.83 ' правильность ответов для повышения уровня
- const levqty0 = 3 ' учитывать levqty0 последних ответов + ...
- const levqty1 = 1.5 ' ... + учитывать levqty1 * level последних ответов + ...
- const levqty2 = 0.25 ' ... + учитывать levqty2 * level^2 последних ответов для изменения уровня
- const markqty = 0.8 ' какую часть ответов от levqty использовать для выставления оценки
- '
- dim dat (), a (), b (), c (), answer (), level ()
- set ofso = createobject("Scripting.FileSystemObject")
- set oshell = wscript.createobject("WScript.Shell")
- ' имя лог файла
- logname = "xtimestable.log"
- ' пользовательская папка
- userfolder = oshell.expandenvironmentstrings("%USERPROFILE%")
- logfile = ofso.buildpath(userfolder, logname) '
- set ouserfolder = ofso.getfolder(userfolder)
- ' проверка наличия лога
- logexs = ofso.fileexists(logfile)
- if logexs then
- ' лог имеется - сделать запись в логе
- set olog = ofso.opentextfile(logfile, 8)
- olog.writeline(now & " RunScript")
- olog.close
- else
- ' лога нет - создать файл
- set olog = ofso.createtextfile(logfile, true)
- olog.writeline(now & " Create")
- olog.writeline(now & " Level 1")
- olog.close
- end if
- '
- ' начало основного цикла
- do
- ' открыть лог для чтения
- set olog = ofso.opentextfile(logfile, 1)
- n = 0
- do while olog.atendofstream <> true
- ' увеличить индекс массивов
- redim preserve dat(n)
- redim preserve a(n)
- redim preserve b(n)
- redim preserve c(n)
- redim preserve answer(n)
- redim preserve level(n)
- ' чтение строки
- l = olog.readline
- ' дата и время
- d = getnext(l) ' дата
- d = d & " " & getnext(l) ' дата и время
- dat(n) = cdate(d) ' дата и время в массив
- ' тэг
- d = getnext(l)
- select case d
- case "Level"
- level(n) = cint(getnext(l))
- case "Sample"
- a(n) = cint(getnext(l))
- b(n) = cint(getnext(l))
- c(n) = cint(getnext(l))
- if getnext(l) = "Y" then
- answer(n) = true
- else
- answer(n) = false
- end if
- end select
- n = n + 1
- loop
- olog.close
- n = n - 1
- ' определить level
- levelnow = 1 ' по умолчанию 1
- for k = n to 0 step -1
- if level(k) <> "" then
- levelnow = level(k)
- exit for
- end if
- next
- randomize
- x = 1 + int(rnd*levelnow) ' множитель 1
- y = 1 + int(rnd*levelnow) ' множитель 2
- zok = x*y ' правильный ответ
- zoks = "" & zok
- zokl = len(zoks)
- zoklasts = mid(zoks, zokl, 1)
- ' какой ответ предлагается
- if rnd > probty then
- ' предлагается неправильный ответ
- if y<x then ' минимальный ответ это наибольший множитель
- zmin = x
- else
- zmin = y
- end if
- zmax = zmin * zmin ' максимальный ответ это квадрат минимального ответа
- if zmin = 1 then
- dz = 2
- else
- dz = zmax - zmin + 1
- end if
- do
- do
- z = zmin + int(rnd^1.5 * dz)
- zs = "" & z
- zl = len(zs)
- loop while zl <> zokl or z > 2*zok or z < zok/2 ' условия допустимого неправильного ответа
- if zl > 2 then ' для 2-х значных и более чисел последняя цифра как в правильном ответе
- zs = mid(zs, 1, zl-1) & zoklasts
- z = eval(zs)
- end if
- loop while z = zok
- else
- ' предлагается правильный ответ
- z = zok
- end if
- ' какую таблицу выводить
- if levelnow >= convent then
- conv = false ' пифагорова таблица
- else
- conv = true ' обычная таблица
- end if
- ' формирование вопроса
- guess = ""
- guess = guess & chr(13)
- guess = guess & chr(9) & chr(9) & x & "x" & y & "=" & z & chr(13)
- guess = guess & chr(13)
- guess = guess & chr(9) & chr(9) & "Правильно ?" & chr(13)
- ' вывод окна с таблицей и вопросом
- do
- popmsg = oshell.popup(table(x, y, conv) & guess, 20, "Таблица умножения - уровень " & levelnow, 4 + 32 + 4096)
- loop while popmsg = -1 ' получен ответ пользователя 6 - Y , 7 - N
- datnow = now
- if popmsg = 6 then
- answernow = "Y"
- answernowbool = true
- else
- answernow = "N"
- answernowbool = false
- end if
- ' открыть лог для внесения записи
- set olog = ofso.opentextfile(logfile, 8)
- wrline = datnow & " Sample " & x & " " & y & " " & z & " " & answernow
- ' записать в лог результат
- olog.writeline(wrline)
- ' внести данные в массив
- n = n + 1
- redim preserve dat(n)
- redim preserve a(n)
- redim preserve b(n)
- redim preserve c(n)
- redim preserve answer(n)
- redim preserve level(n)
- dat(n) = datnow
- a(n) = x
- b(n) = y
- c(n) = z
- answer(n) = answernowbool
- ' анализ массива
- msg = "" ' сообщение
- samplesnow = samples ' анализ массива - последний ответ
- 'msgbox(kcor(1))
- 'msgbox(samples)
- ' анализ массива - изменение уровня
- levqty = int(levqty0 + levqty1 * levelnow + levqty2 * levelnow^2) ' количество ответов, необходимых для анализа и изменения уровня
- if kcor(levqty) >= levinck and samplesnow >= levqty then ' повышение
- levelnow = levelnow + 1
- wrline = datnow & " Level " & levelnow
- olog.writeline(wrline)
- msg = msg & chr(13) & levqty*kcor(levqty) & " из " & levqty & " ответов правильные - уровень повышен до " & levelnow
- end if
- if kcor(levqty) <= levdeck and samplesnow >= levqty then ' понижение
- if levelnow > 1 then
- levelnow = levelnow - 1
- wrline = datnow & " Level " & levelnow
- olog.writeline(wrline)
- msg = msg & chr(13) & levqty*kcor(levqty) & " из " & levqty & " ответов правильные - уровень понижен до " & levelnow
- else
- msg = msg & chr(13) & chr(9) & "Слишком много неправильных ответов"
- end if
- end if
- ' закрыть лог
- olog.close
- ' анализ массива - выставление оценки
- kmark = kcor(int(levqty * markqty))
- if kmark < levdeck then
- mark = 1
- end if
- if (kmark >= levdeck) and (kmark < levdeck + (levinck - levdeck)/3) then
- mark = 2
- end if
- if (kmark >= levdeck + (levinck - levdeck)/3) and (kmark < levinck - (levinck - levdeck)/3) then
- mark = 3
- end if
- if (markk >= levinck - (levinck - levdeck)/3) and (kmark < levinck) then
- mark = 4
- end if
- if kmark >= levinck then
- mark = 5
- end if
- msg = chr(13) & "Последние ответы: оценка " & mark & msg
- ' анализ массива - время задержки
- delk = kcor(delqty) ' текущая корректность ответов
- if delk > delmaxk then
- delk = delmaxk
- end if
- if delk < delmink then
- delk = delmink
- end if
- delp = (delk - delmink) / (delmaxk - delmink) ' позиция между мин и макс
- delay = delmint + delp * (delmaxt - delmint) ' задержка
- msg = msg & chr(13)
- ' последний ответ
- if kcor(1) = 0 then ' неправильный
- msg = "Ответ неправильный ..." & chr(13) & chr(13) & chr(9) & x & "x" & y & "=" & x * y & chr(13) & msg
- popmsg = oshell.popup(msg, 25, "Неправильно", 16)
- else
- msg = "Правильный ответ !!!" & chr(13) & chr(13) & chr(9) & x & "x" & y & "=" & x * y & chr(13) & msg
- popmsg = oshell.popup(msg, 15, "Правильно", 64)
- end if
- wscript.sleep(delay)
- loop
- '
- function getnext (byref txt)
- do while left(txt, 1) = " "
- txt = right(txt, len(txt) - 1)
- loop
- p = instr (txt, " ")
- if p = 0 then
- getnext = txt
- txt = ""
- else
- getnext = left(txt, p - 1)
- txt = right (txt, len(txt) - p)
- end if
- end function
- '
- function kcor(qty)
- qtytot = 0 ' счетчик ответов
- qtyok = 0 ' счетчик правильных ответов
- for k = n to 0 step -1 ' проверка необходимого числа записей
- if answer(k) <> "" then
- if ((answer(k) = true) and (a(k) * b(k) = c(k))) or ((answer(k) = false) and (a(k) * b(k) <> c(k))) then ' правильно
- qtyok = qtyok + 1
- end if
- qtytot = qtytot + 1
- if qtytot = qty then
- exit for
- end if
- end if
- next
- kcor = qtyok/qtytot
- end function
- '
- function samples()
- samples = 0 ' счетчик ответов
- for k = n to 0 step -1 ' проверка необходимого числа записей
- if answer(k) <> "" then
- samples = samples + 1
- end if
- next
- end function
- '
- function table(x, y, tabletype)
- ' version: 1.10
- ' date: 12.04.2014
- table = ""
- if tabletype then ' обычная таблица умножения
- table = table & chr(13)
- for v = 1 to 9
- table = table & chr(9)
- for h = 1 to 5
- if ((v = y) and (h = x)) or ((v = x) and (h = y)) then
- exmpl = h & "x" & v & "="
- else
- exmpl = h & "x" & v & "=" & v*h
- end if
- table = table & exmpl & chr(9)
- next
- table = table & chr(13)
- next
- table = table & chr(13)
- for v = 1 to 9
- table = table & chr(9)
- for h = 6 to 9
- if ((v = y) and (h = x)) or ((v = x) and (h = y)) then
- exmpl = h & "x" & v & "="
- else
- exmpl = h & "x" & v & "=" & v*h
- end if
- table = table & exmpl & chr(9)
- next
- table = table & chr(13)
- next
- else ' таблица пифагора
- table = table & chr(9)
- for h = 1 to 9
- table = table & " " & h & " "
- next
- table = table & chr(13) & chr(13) & chr(13) & chr(13)
- for v = 1 to 9
- table = table & v & chr(9)
- for h = 1 to 9
- if ((v = y) and (h = x)) or ((v = x) and (h = y)) then
- exmpl = " "
- else
- exmpl = v*h
- end if
- if len(exmpl) = 1 then exmpl = " " & exmpl
- table = table & exmpl & " "
- next
- table = table & chr(13) & chr(13)
- next
- end if
- end function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement