Subversion Repositories wimsdev

Rev

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>&lt;img src="a_random_unrelated_file_name" alt="picture"&gt;</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