Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_c
提交
aaeb95f7
S
skill_tree_c
项目概览
CSDN 技术社区
/
skill_tree_c
通知
24
Star
4
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_c
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
aaeb95f7
编写于
11月 09, 2021
作者:
M
Mars Liu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
documents
上级
a45a2b20
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
78 addition
and
58 deletion
+78
-58
README.md
README.md
+78
-58
未找到文件。
README.md
浏览文件 @
aaeb95f7
...
...
@@ -97,118 +97,138 @@ pip install -r requirement.txt
## `知识节点` 的导出习题选项配置编辑
首先,在知识节点下增加一个习题代码,例如在
`data/1.C语言初阶/1.C语言概述/1.C语言发展史/`
下增加一个
`helloworld.c`
代码:
目前我们支持使用 markdown 语法直接编辑习题和各选项。
```
c
#include <stdio.h>
int
main
(
int
argc
,
char
**
argv
){
printf
(
"Hello,Wrold!"
);
return
0
;
首先,编辑知识节点的配置,导出习题:
```
json
{
//
...
"export"
:
[
"hellowworld.json"
]
}
```
其次,增加一个同名的选项配置文件
`helloworld.json`
,目前有两种配置规则
**单行替换规则**
:
然后在
`data/1.C语言初阶/1.C语言概述/1.C语言发展史/`
下增加一个
`helloworld.json`
定义文件
:
*
配置由
`one_line`
字段指定的单行替换字典
*
格式是:
`"<源字符串>"`
: [
`"<替换字符串A>"`
,
`<替换字符串B>`
,...],
*
其中每个
`"<源字符串>"`
`/`
`"<替换字符串A>"`
被生成为是一个替换选项
*
指定的配置应该能至少生成
`3+`
个替换选项
```
json
{
"one_line"
:
{
"printf"
:
[
"print"
],
"return 0;"
:
[
"return 0"
],
"(\"Hello,Wrold!\")"
:
[
"
\"
Hello,Wrold!
\"
"
]
}
"type"
:
"code_options"
,
"author"
:
"刘鑫"
,
"source"
:
"helloworld.md"
,
"notebook_enable"
:
true
}
```
上面的替换规则会将代码替换成 3 个变种的代码:
其中 type 字段目前都固定是
`code_options`
,notebook_enable 字段决定这个习题是否生成对应的 notebook 。根据具体情况写好其它字段,注意这里 source 的文件名,我们指定了一个 markdwon 文件。现在我们新建一个 HelloWorld.md 并编辑为:
````
mardown
# Hello World
以下 `Hello World` 程序中,能够正确输出内容的是:
## 答案
```c
// 变种代码1
#include <stdio.h>
int main(int argc, char** argv){
print
(
"Hello,Wrold!"
);
print
f
("Hello,Wrold!");
return 0;
}
```
## 选项
### main 函数定义错误
```c
// 变种代码2
#include <stdio.h>
int
main
(
int
argc
,
char
**
argv
){
print
(
"Hello,Wrold!"
);
return
0
void main(
){
print
f
("Hello,Wrold!");
return 0
;
}
```
### Print 函数调用错误
```c
// 变种代码3
#include <stdio.h>
int main(int argc, char** argv){
print
"Hello,Wrold!"
;
return
0
print
f("Hello,Wrold!")
;
return 0
;
}
```
这些变种代码将会作为技能树该知识点该代码选择题的选项。
**多行替换规则**
:
### Java 风格的导入
*
配置由
`multiline`
字段指定的多行替换数组
*
数组的每个元素是一组替换规则,会整组被替换
例如:
```c
import stdio;
```
json
{
"multiline"
:
[
{
"printf"
:
"print"
},
{
"int main(int argc, char** argv){"
:
"int main(char** argv){"
,
"return 0;"
:
"return 0"
,
},
{
"#include <stdio.h>"
:
""
}
]
int main(int argc, char** argv){
stdio.printf("Hello,Wrold!");
return 0;
}
```
同样,该配置将支持将源代码生成3个变种代码
### 函数错误
```c
// 变种代码1
#include <stdio.h>
int main(int argc, char** argv){
print("Hello,Wrold!");
return 0;
}
```
````
### 增强信息
为了编写习题和生成 notebook 的需要,markdown 解释器支持两种模板能力,如果我们在答案之前,有一个名为 aop 的二级标题:
````
markdown
## aop
### before
```
c
// 变种代码2, 注意第2组替换规则,包含了两行替换
#include <stdio.h>
int
main
(
char
**
argv
){
print
(
"Hello,Wrold!"
);
return
0
}
print
(
"hello world"
);
```
### after
```
c
// 变种代码3
main
(
0
,
NULL
);
```
````
那么在创建notebook的时候,before 会插入到源代码前一个单元,after 则会插入到源代码后。aop 章节可以只包含 before 或 after 中的某一个,也可以两个都有。
另一些情况下,我们可能需要把各个选项中重复的代码提取出来,建立一个模板,此时可以在答案之前建立一个名为 template 的二级标题,例如:
````
markdwon
## template
```c
```c
#include <stdio.h>
int main(int argc, char** argv){
print
(
"Hello,Wrold!"
);
$code
return 0;
}
```
````
注意这里的代码中,有一个
`$code`
占位符,它在管道程序处理过程中,会替换成答案和个选项内容中的代码
## 技能树合成
在根目录下执行
`python main.py`
会合成技能树文件,合成的技能树文件:
`data/tree.json`
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录