Rev 17347 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
196 | bpr | 1 | |
6133 | bpr | 2 | <h2>OEF的高级技巧</h2> |
196 | bpr | 3 | |
4 | <h3>隐藏图形名称</h3> |
||
5 | 如果你的练习需要识别随机选取的图形, 图形文件名就是一个重要的提示. |
||
14972 | bpr | 6 | 为了隐藏此文件名, 你可以写 in parts |
7 | <span class="tt wims_code_variable">statement</span>, |
||
8 | <span class="tt wims_code_variable">feedback</span>, etc |
||
196 | bpr | 9 | |
6368 | bpr | 10 | <pre>\img{\imagedir/picture.jpg alt="picture"}</pre> |
196 | bpr | 11 | |
12 | 这样学生在浏览器里看到的是 |
||
13 | |||
17347 | bpr | 14 | <pre><img src="a_random_unrelated_file_name" alt="picture"></pre> |
196 | bpr | 15 | |
16 | 真实文件名被隐藏了. |
||
17 | |||
18 | <p><b>注意</b>. 不要直接使用WIMS命令 <em>rename</em> 处理文件名, |
||
19 | 否则练习将不能在被保存的环境里正常工作. |
||
20 | |||
21 | <h3>分步练习</h3> |
||
8367 | bpr | 22 | 分步练习可通过命令 <span class="tt">\steps</span> 定义. 举例来说, 如果你定义 |
196 | bpr | 23 | |
24 | <pre>\steps{choice 1, reply 1 |
||
25 | choice 2, reply 2, reply 3 |
||
26 | choice 3 |
||
27 | }</pre> |
||
6368 | bpr | 28 | <p> |
8367 | bpr | 29 | 此练习将分成3步, 第一步要求多重选择(choice 1)以及自由格式的回答(reply 1), |
196 | bpr | 30 | 第2步是一个多重选择以及两个自由格式的回答的回答, 等等. |
6368 | bpr | 31 | </p><p> |
8367 | bpr | 32 | <span class="tt">\steps</span> 的内容接受(前面已定义的)参数以及条件定义, |
196 | bpr | 33 | 正如对参数的定义一样. 这样就使得你可以选择性地展示回答栏(根据参数的随机变量), |
34 | 甚至只含一步的情形也是如此. |
||
6368 | bpr | 35 | </p><p> |
196 | bpr | 36 | 请注意, 如果用户在前面的步骤里出了错, 以后的步骤就不出现了(可以认为全都错了). |
6368 | bpr | 37 | </p><p> |
5903 | bpr | 38 | 在练习的陈述里, 当前的步数可通过变量 <span class="tt">\step</span> 获得, |
196 | bpr | 39 | 此变量随着用户回答的进展而逐步取值 1,2,... |
6368 | bpr | 40 | </p><p> |
8367 | bpr | 41 | 为了设计动态的分步练习(步数随用户的回答而发生变化), |
5903 | bpr | 42 | 你可以使用命令 <span class="tt">\nextstep{...}</span>. <span class="tt">\nextstep</span> 类似于 <span class="tt">\steps</span>, |
196 | bpr | 43 | 但只有第一行是有效的. 它仅当其内容是由这样的变量给出时才能使用, |
44 | 这个变量应该由 post-reply 的参数定义所改变. |
||
5903 | bpr | 45 | 当在某一步时 <span class="tt">\nextstep</span> 的内容变成空了, 练习就停止了. |
6368 | bpr | 46 | </p><p> |
8367 | bpr | 47 | 在任何情形, 在一个OEF源码内, 最多只能出现一个 <span class="tt">\steps</span> 或 |
5903 | bpr | 48 | <span class="tt">\nextstep</span> 的声明. |
6368 | bpr | 49 | </p> |
196 | bpr | 50 | <h3>条件分叉与循环</h3> |
51 | |||
52 | 可用的命令: |
||
53 | |||
54 | <pre> |
||
55 | \if{条件}{if的内容} |
||
56 | \if{条件}{if的内容}{其它内容} |
||
8367 | bpr | 57 | \ifval{条件}{if的内容} |
58 | \ifval{条件}{if的内容}{其它内容} |
||
196 | bpr | 59 | \for{var=n1 to n2}{循环内容} |
17514 | bpr | 60 | \while{条件}{循环内容} (只用在主环境) |
196 | bpr | 61 | </pre> |
62 | |||
8367 | bpr | 63 | 这些命令(<span class="tt">while</span> 除外)可以被用于陈述(<span class="tt">statement</span>)、提示(<span class="tt">hint</span>)、解答(<span class="tt">solution</span>)或反馈(<span class="tt">feedback</span>)内, |
2071 | zjchen | 64 | 或用于主环境里. |
196 | bpr | 65 | 在最后一种情形, 条件执行只影响参数的定义. |
66 | |||
67 | <h3>预处理资源</h3> |
||
68 | |||
2071 | zjchen | 69 | 本功能不能用于创建练习(createxo). 你可在模块工具(Modtool)下使用它来写OEF(及Deductio)练习. |
196 | bpr | 70 | <p> |
71 | 它使你可以把源码的公共部分包含在几个oef文件里. |
||
72 | 你也可以利用它从一个预资源批生成几个oef, 它们相互之间相差一些宏定义. |
||
6368 | bpr | 73 | </p><p> |
8367 | bpr | 74 | 为使用这个功能, 应在 src 下建立一个子目录 cpp/. |
196 | bpr | 75 | 预资源文件以 .cpp 作为后缀放入此子目录. 在这些文件里, |
8367 | bpr | 76 | 你可以加入 cpp 的指令如 <span class="tt">#include</span> 或 <span class="tt">#if</span>. |
196 | bpr | 77 | (请参看 cpp 手册或 c 的说明以了解语法详情.) |
6368 | bpr | 78 | </p><p> |
196 | bpr | 79 | cpp文件的第一行应该定义一个目标表, 其格式为 |
6368 | bpr | 80 | </p> |
196 | bpr | 81 | <pre> |
82 | target=targ1 targ2 targ3 ... |
||
83 | </pre> |
||
2664 | reyssat | 84 | 这行命令的意义是本cpp文件将生成 targ1.oef, targ2.oef, 等等. |
7423 | bpr | 85 | (输出文件会自动添加后缀 .oef). 而且宏 |
86 | <em>TARGET_targ1</em> 也被定义. |
||
196 | bpr | 87 | 所以在cpp原文件里可以加入如下的行: |
88 | <pre> |
||
7423 | bpr | 89 | #if define TARGET_targ1 |
196 | bpr | 90 | \title{练习1} |
91 | \integer{v1=3} |
||
92 | \text{t1=这是target 1} |
||
93 | #endif |
||
7423 | bpr | 94 | #if define_TARGET_targ2 |
196 | bpr | 95 | \title{练习2} |
96 | \integer{v1=5} |
||
97 | \text{t1=这是target 2} |
||
98 | #endif |
||
99 | </pre> |
||
100 | 使得生成的内容与目标有关. |
||
101 | <p> |
||
8629 | zjchen | 102 | 文件名 (本例中是 |
8559 | bpr | 103 | <span class="tt wims_code_words">targ1</span>, ...) |
8629 | zjchen | 104 | 保存在以下变量里 |
8559 | bpr | 105 | <span class="tt wims_code_words">OEFFILE</span>. |
8629 | zjchen | 106 | 在以下例子里练习的标题是 |
8559 | bpr | 107 | <span class="tt wims_code_words">targ1</span> |
108 | </p> |
||
109 | <pre> |
||
110 | #if defined TARGET_targ1 |
||
111 | \title{OEFFILE} |
||
112 | \integer{v1=3} |
||
113 | \text{t1=dit is target 1} |
||
114 | #endif |
||
115 | </pre> |
||
116 | |||
117 | <p> |
||
196 | bpr | 118 | 包含文件也应加上后缀 .inc 后放到 src/cpp 目录里. 命令行 |
6368 | bpr | 119 | </p> |
196 | bpr | 120 | <pre> |
121 | #include "common.inc" |
||
122 | </pre> |
||
123 | 将把 common.inc 的内容插入生成的oef文件里. |
||
124 | 请注意, 为了安全的原因, 禁止指明包含文件的目录. |
||
125 | <p> |
||
126 | 特别提示; 如果你的cpp文件的文本里含有未关闭的单引号或双引号的话, |
||
8367 | bpr | 127 | cpp会陷于混乱. 在这种情形, |
5903 | bpr | 128 | 你可以利用 c 的注解(<span class="tt">/* ... */</span>)把含有这样文本的命令保护起来. |
6368 | bpr | 129 | </p> |
4892 | bpr | 130 | <div class="wims_warning"> |
4901 | zjchen | 131 | <span class="wims_warning">$wims_name_warning</span> : 在以 # 起首的命令, |
5903 | bpr | 132 | 如 <span class="tt">#include</span> 里, 字符 <span class="tt">#</span> 必须是这一行的第一个字符. |
8367 | bpr | 133 | 不可以把 <span class="tt">#</span> 用作注解字符. |
4892 | bpr | 134 | </div> |
135 | |||
196 | bpr | 136 | <h3>练习环境</h3> |
5903 | bpr | 137 | 特殊变量 <span class="tt">\oefenv</span> 可用来测试练习的环境(如果在练习里没有对它重定义的话). |
196 | bpr | 138 | <p> |
139 | 目前此变量能测试的内容只有 |
||
5903 | bpr | 140 | ``debug''. 在以下情形里, debug将出现在 <span class="tt">\oefenv</span> 里: |
6368 | bpr | 141 | </p> |
2071 | zjchen | 142 | <ol> |
143 | <li>当它在创建练习(createxo)内执行时.</li> |
||
144 | <li>当它在模块工具(modtool)内被测试时, 目的是为了开发.</li> |
||
196 | bpr | 145 | <li>当它是班级的练习, 而且被主持教师执行时. |
2071 | zjchen | 146 | </li> |
196 | bpr | 147 | </ol> |
6368 | bpr | 148 | <p> |
8367 | bpr | 149 | 在这些情形, 许多类型的输入栏里都会显示正确的答案, |
196 | bpr | 150 | 让你看到练习期望的结果是什么. |
6368 | bpr | 151 | </p><p> |
196 | bpr | 152 | 你可以用以下形式在练习里添加纠错信息 |
6368 | bpr | 153 | </p><pre> |
196 | bpr | 154 | \if{debug iswordof \oefenv}{欲添加的纠错信息} |
155 | </pre> |
||
156 | 当练习被测试时, 这些信息会自动显示, 而且学生做作业时又自动隐藏. |
||
157 | |||
158 |