Template for CS203-DSAA Based on C++11 and Modern CMake
AGPL-3.0 License
OJ系统存在着一些特殊要求-因此考虑到下面的因素,设计了一套代码模板,以适应OJ系统的独特环境.
This is an example of how to list things you need to use the software and how to install them.
sudo apt install build-essential ccache
# username @ ${pcName} in ${path}
gcc --version
# username @ ${pcName} in ${path}
g++ --version
# username @ ${pcName} in ${path}
ccache --version
点击绿色按钮Use This Template,生成仓库
# 在use this template之后
git clone https://github.com/${YOUE_GITHUB_USER_NAME}/CS203_DSAA_template.git
使用CLion打开仓库
可选项:
./.idea
中的#set( ${GITHUB_USER} = "Certseeds")
-> #set( ${GITHUB_USER} = "YOUR_GITHUB_NAME")
./script/file_template.py
里面的 Certseeds
to YOUR_GITHUB_NAME
,nanoseeds
to YOUR_USER_NAME
,./script
下,编辑file_template
的labs
& problem_orders
,python3 ./file_template.py
,出现produce files finish
提示,即为创建成功.使用clion打开文件夹,配置好C++环境的基础上,会自动识别CmakeList.txt
.
产生CS203_lab${order}_${ques_Order}
,CS203_lab${order}_${ques_Order}_test
形式的复数个可以运行的可选项.
lab${order}_${ques_Order}
为对应题号,比如lab07_01
对应lab_07的C1题.
CS203_lab07_01
将调用lab_07\lab_07_C1\lab07_C1.cpp
,为将要提交的源文件.CS203_lab07_01_test
将调用lab_07\lab_07_C1\lab07_C1_test.cpp
,对其进行测试.lab_*\lab_*_*\lab_*_*_test.cpp
目的为方便测试,同时便于分享测试用例.读取
数据处理
输出
分开?显然,有更好的解决方式:使用测试框架.
Catch2
测试框架.
CS203_DSAA_template_test
, 对其进行调用,就能验证其在所有的测试用例上的正确性.Catch::Matchers
上面的例子里,输出值只是一个值,所以手动检查的难度不大,但是如果目标输出是一个数组,那么手动检查的难度就非常大了.
举例:Crzay Plan,输入可能有1.1*10^6个.
这种情况下对这么多值进行直接的观察就很难,所以我们预先将期望的值直接写在测试文件里,用Catch2内置的Matcher比较(见test_for_lab00_B的CHECK_THAT()
部分.)
PS: 当然,这种情况也只适用于规模比较小的情况,规模再大的话,直接由人手动写在测试文件里也太占空间了.
常见于tree,graph类的问题,debug需要的数据集都比较大,不方便直接写在代码中.
比如判断二分图,一张图可以有几十上百个node,写在内部占用空间太大.
而在这里,使用CS203_redirect
对象,便可以省去手动输入的方式.
TEST_CASE("test case 1", "[test 00 C]") {
const CS203_redirect cr{"01.data.in", ""};
// 重定向开始,开始run
// or CS203_redirect cr{"01.data.in"};
const auto output_data = isBipartite(read());
// 重定向结束
CHECK_FALSE(output_data);
}
只需要准备好输入的数据与结果,就可以从文件中读取,执行后判断结果是否符合预期.
PS: 此处注意,引用文件的相对路径,不是直接的test/lab_00/lab_00_C/resource/01.data.in
,
而是编译出的文件相对于测试数据的相对路径.
在样例中,编译出的文件在CS203_DSAA_template/cmake-build-debug
下,所以需要加./../
TEST_CASE("test case 2", "[test 00 D]") {
SECTION("do") {
const CS203_redirect cr{"01.data.in", "01.test.out"};
auto input_data = read();
cal(input_data);
} SECTION("compare files") {
CHECK(compareFiles("01.test.out", "01.data.out"));
}
}
这样就将标准输出重定向到了01.test.out中,并与01.data.out比对.
PS: 至于比较文件之间的差异,可以使用内置的compareFiles(string path1,string path2)
函数进行比较.
DSAA既然内含Data structure,就势必涉及到类似Node,Tree,Graph等等数据结构,这类数据结构使用C++写,比较方便理解.
之前写树和图相关的题目时,最头疼的就是Java的爆栈,有一段时间只要用递归就爆栈,相同算法修改为C++之后问题就消失了.
不管怎么说,c++是dalao的选择,所以在网络上搜索题目,得到的大多数答案都是C/C++,java的数量很少.
static const auto faster_streams = [] {
srand(time(nullptr));
// use time to init the random seed
std::ios::sync_with_stdio(false);
std::istream::sync_with_stdio(false);
std::ostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
// 关闭c++风格输入输出 , 与C风格输入输出的同步,提高性能.
return 0;
}();
已放置在源文件最下方,注意不要混用C风格输入输出(scanf
,printf
)与c++风格输入输出(cin
,cout
)
通常情况下,可以将运行时间缩短到1/2甚至更少.
FrameWork | Catch2 | Google Test | CPPUnit | Boost.Test | Microsoft 单元测试框架 |
---|---|---|---|---|---|
跨平台 | √ | √ | √ | √ | X |
是否需要提前在系统内安装 | X | √ | √ | √ | √(and visual studio make it) |
语法 | 简单 | 简单 | 复杂 | 简单 | Unknown |
先筛选跨平台,去掉了Microsoft,再筛选不需要安装,只剩Catch2, 结束.
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
git checkout -b feature/AmazingFeature
)git commit -m 'Add some AmazingFeature'
)git push origin feature/AmazingFeature
)绝大多数代码(*.cpp
,*.hpp
,etc)基于 AGPLv3.0+协议: 限制最强的主流开源协议
LICENSE_AGPL_V3_0.md
所有其他非代码部分(主要是*.md)基于CC-BY-NC-SA-4.0(或以后版本)协议.
LICENSE_CC_BY_NC_SA_V4_0.md
格式/版权/转载/etc 这类非内容相关问题,请提 issue
添加/删除/修改内容,修改repo相关的,请提 pull_request
讨论内容相关的,请到 Discussion
Project Link: https://github.com/Certseeds/CS203_DSAA_template
Use this space to list resources you find helpful and would like to give credit to. I've included a few of my favorites to kick things off!
考虑到whexy 的博客文章用两个晚上做超简易 OpenJudge里因平台显著降低了作业难度。按任课教师要求已经关停。
这一句.
设计时将分布式1 去中心化2 跨平台3都纳入考虑.