Advertisement
omegastripes

xtimestable1.01.vbs

Apr 11th, 2014
304
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ' ==== Script Information Header ====
  2. ' script name:   xtimestable
  3. ' version:       1.01
  4. ' date:          06.11.2011
  5. ' autor:         Alexander Zakharov
  6. ' description:   Скрипт навязчиво задает вопросы по таблице умножения, показывает прогресс ответов.
  7. '                Добавить в автозагрузку учетной записи для детей, вероятно, поможет обучению.
  8. '                ... Для прекращения работы скрипта нужно завершить его процесс wscript.exe в диспетчере.
  9. '
  10. ' ==== Script Main Logic ====
  11. ' настраиваемые значения
  12. const probty = 0.5 ' вероятность предложения правильных ответов
  13. const convent = 7 ' на каком уровне изменить обычную таблицу на пифагорову
  14. const delmint = 45000 ' минимальная задержка между вопросами, мсек
  15. const delmaxt = 270000 ' максимальная задержка между вопросами, мсек
  16. const delmink = 0.5 ' правильность ответов для минимальной задержки
  17. const delmaxk = 0.7 ' правильность ответов для максимальной задержки
  18. const delqty = 10 ' количество ответов для определения задержки
  19. const levdeck = 0.5 ' правильность ответов для понижения уровня
  20. const levinck = 0.83 ' правильность ответов для повышения уровня
  21. const levqty0 = 3 ' учитывать levqty0 последних ответов + ...
  22. const levqty1 = 1.5 ' ... + учитывать levqty1 * level последних ответов + ...
  23. const levqty2 = 0.25 ' ... + учитывать levqty2 * level^2 последних ответов для изменения уровня
  24. const markqty = 0.8 ' какую часть ответов от levqty использовать для выставления оценки
  25. '
  26. dim dat (), a (), b (), c (), answer (), level ()
  27. set ofso = createobject("Scripting.FileSystemObject")
  28. set oshell = wscript.createobject("WScript.Shell")
  29. ' имя лог файла
  30. logname = "xtimestable.log"
  31. ' пользовательская папка
  32. userfolder = oshell.expandenvironmentstrings("%USERPROFILE%")
  33. logfile = ofso.buildpath(userfolder, logname) '
  34. set ouserfolder = ofso.getfolder(userfolder)
  35. ' проверка наличия лога
  36. logexs = ofso.fileexists(logfile)
  37. if logexs then
  38.     ' лог имеется - сделать запись в логе
  39.    set olog = ofso.opentextfile(logfile, 8)
  40.     olog.writeline(now & " RunScript")
  41.     olog.close
  42. else
  43.     ' лога нет - создать файл
  44.    set olog = ofso.createtextfile(logfile, true)
  45.     olog.writeline(now & " Create")
  46.     olog.writeline(now & " Level 1")
  47.     olog.close
  48. end if
  49. '
  50. ' начало основного цикла
  51. do
  52.     ' открыть лог для чтения
  53.    set olog = ofso.opentextfile(logfile, 1)
  54.     n = 0
  55.     do while olog.atendofstream <> true
  56.         ' увеличить индекс массивов
  57.        redim preserve dat(n)
  58.         redim preserve a(n)
  59.         redim preserve b(n)
  60.         redim preserve c(n)
  61.         redim preserve answer(n)
  62.         redim preserve level(n)
  63.         ' чтение строки
  64.        l = olog.readline
  65.         ' дата и время
  66.        d = getnext(l) ' дата
  67.        d = d & " " & getnext(l) ' дата и время
  68.        dat(n) = cdate(d) ' дата и время в массив
  69.        ' тэг
  70.        d = getnext(l)
  71.         select case d
  72.             case "Level"
  73.                 level(n) = cint(getnext(l))
  74.             case "Sample"
  75.                 a(n) = cint(getnext(l))
  76.                 b(n) = cint(getnext(l))
  77.                 c(n) = cint(getnext(l))
  78.                 if getnext(l) = "Y" then
  79.                     answer(n) = true
  80.                 else
  81.                     answer(n) = false
  82.                 end if
  83.         end select
  84.         n = n + 1
  85.     loop
  86.     olog.close
  87.     n = n - 1
  88.     ' определить level
  89.    levelnow = 1 ' по умолчанию 1
  90.    for k = n to 0 step -1
  91.         if level(k) <> "" then
  92.             levelnow = level(k)
  93.             exit for
  94.         end if
  95.     next
  96.     randomize
  97.     x = 1 + int(rnd*levelnow) ' множитель 1
  98.    y = 1 + int(rnd*levelnow) ' множитель 2
  99.    zok = x*y ' правильный ответ
  100.    zoks = "" & zok
  101.     zokl = len(zoks)
  102.     zoklasts = mid(zoks, zokl, 1)
  103.     ' какой ответ предлагается
  104.    if rnd > probty then
  105.         ' предлагается неправильный ответ
  106.        if y<x then ' минимальный ответ это наибольший множитель
  107.            zmin = x
  108.         else
  109.             zmin = y
  110.         end if
  111.         zmax = zmin * zmin ' максимальный ответ это квадрат минимального ответа
  112.        if zmin = 1 then
  113.             dz = 2
  114.         else
  115.             dz = zmax - zmin + 1
  116.         end if
  117.         do
  118.             do
  119.                 z = zmin + int(rnd^1.5 * dz)
  120.                 zs = "" & z
  121.                 zl = len(zs)
  122.             loop while zl <> zokl or z > 2*zok or z < zok/2 ' условия допустимого неправильного ответа
  123.            if zl > 2 then  ' для 2-х значных и более чисел последняя цифра как в правильном ответе
  124.                zs = mid(zs, 1, zl-1) & zoklasts
  125.                 z = eval(zs)
  126.             end if
  127.         loop while z = zok
  128.     else
  129.         ' предлагается правильный ответ
  130.        z = zok
  131.     end if
  132.     ' какую таблицу выводить
  133.    if levelnow >= convent then
  134.         conv = false ' пифагорова таблица
  135.    else
  136.         conv = true ' обычная таблица
  137.    end if
  138.     ' формирование вопроса
  139.    guess = ""
  140.     guess = guess & chr(13)
  141.     guess = guess & chr(9) & chr(9) & x & "x" & y & "=" & z & chr(13)
  142.     guess = guess & chr(13)
  143.     guess = guess & chr(9) & chr(9) & "Правильно ?" & chr(13)
  144.     ' вывод окна с таблицей и вопросом
  145.    do
  146.         popmsg = oshell.popup(table(x, y, conv) & guess, 20, "Таблица умножения - уровень " & levelnow, 4 + 32 + 4096)
  147.     loop while popmsg = -1 ' получен ответ пользователя 6 - Y , 7 - N
  148.    datnow = now
  149.     if popmsg = 6 then
  150.         answernow = "Y"
  151.         answernowbool = true
  152.     else
  153.         answernow = "N"
  154.         answernowbool = false
  155.     end if
  156.     ' открыть лог для внесения записи
  157.    set olog = ofso.opentextfile(logfile, 8)
  158.     wrline = datnow & " Sample " & x & " " & y & " " & z & " " & answernow
  159.     ' записать в лог результат
  160.    olog.writeline(wrline)
  161.     ' внести данные в массив
  162.    n = n + 1
  163.     redim preserve dat(n)
  164.     redim preserve a(n)
  165.     redim preserve b(n)
  166.     redim preserve c(n)
  167.     redim preserve answer(n)
  168.     redim preserve level(n)
  169.     dat(n) = datnow
  170.     a(n) = x
  171.     b(n) = y
  172.     c(n) = z
  173.     answer(n) = answernowbool
  174.     ' анализ массива
  175.    msg = "" ' сообщение
  176.    samplesnow = samples ' анализ массива - последний ответ
  177.    'msgbox(kcor(1))
  178.    'msgbox(samples)
  179.    ' анализ массива - изменение уровня
  180.    levqty = int(levqty0 + levqty1 * levelnow + levqty2 * levelnow^2) ' количество ответов, необходимых для анализа и изменения уровня
  181.    if kcor(levqty) >= levinck and samplesnow >= levqty then ' повышение
  182.        levelnow = levelnow + 1
  183.         wrline = datnow & " Level " & levelnow
  184.         olog.writeline(wrline)
  185.         msg = msg & chr(13) & levqty*kcor(levqty) & " из " & levqty & " ответов правильные - уровень повышен до " & levelnow
  186.     end if
  187.     if kcor(levqty) <= levdeck and samplesnow >= levqty then ' понижение
  188.        if levelnow > 1 then
  189.             levelnow = levelnow - 1
  190.             wrline = datnow & " Level " & levelnow
  191.             olog.writeline(wrline)
  192.             msg = msg & chr(13) & levqty*kcor(levqty) & " из " & levqty & " ответов правильные - уровень понижен до " & levelnow
  193.         else
  194.             msg = msg & chr(13) & chr(9) & "Слишком много неправильных ответов"
  195.         end if
  196.     end if
  197.     ' закрыть лог
  198.    olog.close
  199.     ' анализ массива - выставление оценки
  200.    kmark = kcor(int(levqty * markqty))
  201.     if kmark < levdeck then
  202.         mark = 1
  203.     end if
  204.     if (kmark >= levdeck) and (kmark < levdeck + (levinck - levdeck)/3) then
  205.         mark = 2
  206.     end if
  207.     if (kmark >= levdeck + (levinck - levdeck)/3) and (kmark < levinck - (levinck - levdeck)/3) then
  208.         mark = 3
  209.     end if
  210.     if (markk >= levinck - (levinck - levdeck)/3) and (kmark < levinck) then
  211.         mark = 4
  212.     end if
  213.     if kmark >= levinck then
  214.         mark = 5
  215.     end if
  216.     msg = chr(13) & "Последние ответы: оценка " & mark & msg
  217.     ' анализ массива - время задержки
  218.    delk = kcor(delqty) ' текущая корректность ответов
  219.    if delk > delmaxk then
  220.         delk = delmaxk
  221.     end if
  222.     if delk < delmink then
  223.         delk = delmink
  224.     end if
  225.     delp = (delk - delmink) / (delmaxk - delmink) ' позиция между мин и макс
  226.    delay = delmint + delp * (delmaxt - delmint) ' задержка
  227.    msg = msg & chr(13)
  228.     ' последний ответ
  229.    if kcor(1) = 0 then ' неправильный
  230.        msg = "Ответ неправильный ..." & chr(13) & chr(13) & chr(9) & x & "x" & y & "=" & x * y & chr(13) & msg
  231.         popmsg = oshell.popup(msg, 25, "Неправильно", 16)
  232.     else
  233.         msg = "Правильный ответ !!!" & chr(13) & chr(13) & chr(9) & x & "x" & y & "=" & x * y & chr(13) & msg
  234.         popmsg = oshell.popup(msg, 15, "Правильно", 64)
  235.     end if
  236.     wscript.sleep(delay)
  237. loop
  238. '
  239. function getnext (byref txt)
  240.     do while left(txt, 1) = " "
  241.         txt = right(txt, len(txt) - 1)
  242.     loop
  243.     p = instr (txt, " ")
  244.     if p = 0 then
  245.         getnext = txt
  246.         txt = ""
  247.     else
  248.         getnext = left(txt, p - 1)
  249.         txt = right (txt, len(txt) - p)
  250.     end if
  251. end function
  252. '
  253. function kcor(qty)
  254.     qtytot = 0 ' счетчик ответов
  255.    qtyok = 0 ' счетчик правильных ответов
  256.    for k = n to 0 step -1 ' проверка необходимого числа записей
  257.        if answer(k) <> "" then
  258.             if ((answer(k) = true) and (a(k) * b(k) = c(k))) or ((answer(k) = false) and (a(k) * b(k) <> c(k))) then ' правильно
  259.                qtyok = qtyok + 1
  260.             end if
  261.             qtytot = qtytot + 1
  262.             if qtytot = qty then
  263.                 exit for
  264.             end if
  265.         end if
  266.     next
  267.     kcor = qtyok/qtytot
  268. end function
  269. '
  270. function samples()
  271.     samples = 0 ' счетчик ответов
  272.    for k = n to 0 step -1 ' проверка необходимого числа записей
  273.        if answer(k) <> "" then
  274.             samples = samples + 1
  275.         end if
  276.     next
  277. end function
  278. '
  279. function table(x, y, tabletype)
  280.     ' version:       1.10
  281.     ' date:          12.04.2014
  282.    table = ""
  283.     if tabletype then ' обычная таблица умножения
  284.        table = table & chr(13)
  285.         for v = 1 to 9
  286.             table = table & chr(9)
  287.             for h = 1 to 5
  288.                 if ((v = y) and (h = x)) or ((v = x) and (h = y)) then
  289.                     exmpl = h & "x" & v & "="
  290.                 else
  291.                     exmpl = h & "x" & v & "=" & v*h
  292.                 end if
  293.                 table = table & exmpl & chr(9)
  294.             next
  295.             table = table & chr(13)
  296.         next
  297.         table = table & chr(13)
  298.         for v = 1 to 9
  299.             table = table & chr(9)
  300.             for h = 6 to 9
  301.                 if ((v = y) and (h = x)) or ((v = x) and (h = y)) then
  302.                     exmpl = h & "x" & v & "="
  303.                 else
  304.                     exmpl = h & "x" & v & "=" & v*h
  305.                 end if
  306.                 table = table & exmpl & chr(9)
  307.             next
  308.             table = table & chr(13)
  309.         next
  310.     else ' таблица пифагора
  311.         table = table & chr(9)
  312.         for h = 1 to 9
  313.             table = table & "  " & h & "      "
  314.         next
  315.         table = table & chr(13) & chr(13) & chr(13) & chr(13)
  316.         for v = 1 to 9
  317.             table = table & v & chr(9)
  318.             for h = 1 to 9
  319.                 if ((v = y) and (h = x)) or ((v = x) and (h = y)) then
  320.                     exmpl = "    "
  321.                 else
  322.                     exmpl = v*h
  323.                 end if
  324.                 if len(exmpl) = 1 then exmpl = "  " & exmpl
  325.                 table = table & exmpl & "      "
  326.             next
  327.             table = table & chr(13) & chr(13)
  328.         next
  329.     end if
  330. end function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement