一个专为算法竞赛设计的在线代码测试平台,帮助开发者快速验证C++解题方案的正确性
该项目只完成基本内容,剩余部分待完成,待完成清单在同级目录的TODO.MD下
这是一个基于Spring Boot开发的Web应用,专门用于C++算法代码的自动化测试。通过对比用户代码与标准答案的输出结果,快速发现代码中的逻辑错误,提高算法竞赛和编程练习的效率。
- Java JDK 17+ - 运行Spring Boot应用
- Maven 3.6+ - 项目构建工具
- C++编译器 - g++或clang,需添加到系统PATH
-
克隆项目
git clone https://github.com/bob1145/web-judge-c.git cd demo18
-
编译运行
# 使用Maven运行 mvn spring-boot:run # 或者编译后运行 mvn clean package java -jar target/demo18-0.0.1-SNAPSHOT.jar
-
访问应用
http://localhost:1234
-
输入访问码
访问码修改在scr/resources/application.yml 里,默认是 123
judge: auth: access-code: "123" session-timeout: 30d normal-session-timeout: 24h max-attempts: 5 attempt-reset-hours: 1
-
准备代码
- 数据生成器:编写生成随机测试数据的C++代码
- 标准答案:提供已验证正确的解题代码
- 待测代码:需要验证的目标代码
-
配置参数
- 测试点数量:设置测试轮数(建议100-100000)
- 时间限制:单个测试点的最大执行时间(毫秒)
- 浮点精度:数值比较的误差范围
-
执行测试
- 点击"开始对拍"按钮
- 实时观察进度条和状态信息
- 等待测试完成
-
分析结果
- 查看测试结果网格
- 点击失败的测试点查看详情
- 下载问题数据进行本地调试
- 三段式代码输入:数据生成器、标准答案、待测代码
- 自动化测试流程:生成随机数据 → 运行对比 → 结果分析
- 多种判题状态:AC、WA、TLE、RE、CE、SE
- 基于Bootstrap 5的响应式设计
- 实时进度显示和状态更新
- 直观的测试结果网格视图
- 详细的错误分析弹窗
- 异步处理:后台执行判题任务,不阻塞用户界面
- 多线程测试数据点
- WebSocket通信:实时推送测试进度和状态
- 并发支持:可同时处理多个判题请求
- 差异高亮:使用jsdiff库精确标记输出差异
- 数据下载:一键下载失败测试点的输入数据
- 浮点数比较:支持自定义精度的数值比较
- 宽松匹配:智能忽略空格和换行符差异
- Java 17 - 现代化的Java开发环境
- Spring Boot 3.5.3 - 企业级应用框架
- Spring WebSocket - 实时通信支持
- Spring Web - RESTful API服务
- Thymeleaf - 服务端模板引擎
- Apache Commons IO - 文件操作工具
- Lombok - 代码简化工具
- Bootstrap 5 - 现代化UI框架
- JavaScript ES6 - 前端交互逻辑
- WebSocket (STOMP) - 实时通信协议
- jsdiff - 文本差异对比库
┌─────────────────┐ WebSocket ┌─────────────────┐
│ 前端界面 │ ←──────────────→ │ Spring Boot │
│ (Bootstrap) │ │ 后端服务 │
└─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ C++编译器 │
│ (g++/clang) │
└─────────────────┘
数据生成器示例
#include <iostream>
#include <random>
using namespace std;
int main() {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(1, 1000);
int n = dis(gen);
cout << n << endl;
for (int i = 0; i < n; i++) {
cout << dis(gen) << " ";
}
return 0;
}
示例
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
for (int x : arr) {
cout << x << " ";
}
return 0;
}
demo18/
├── src/main/java/com/example/demo/
│ ├── Demo18Application.java # 应用入口
│ ├── config/ # 配置类
│ ├── controller/ # 控制器层
│ ├── dto/ # 数据传输对象
│ └── service/ # 业务逻辑层
├── src/main/resources/
│ ├── static/ # 静态资源
│ ├── templates/ # 模板文件
│ └── application.properties # 应用配置
├── pom.xml # Maven配置
└── README.md # 项目文档
# 开发模式运行
mvn spring-boot:run -Dspring-boot.run.profiles=dev
# 热重载(需要spring-boot-devtools)
mvn spring-boot:run -Dspring-boot.run.fork=false
# 生产环境打包
mvn clean package -Pprod
# Docker部署(如果有Dockerfile)
docker build -t cpp-checker .
docker run -p 1234:1234 cpp-checker
A: 确保系统已安装C++编译器并添加到PATH环境变量中。
A: 适当增加时间限制,或优化代码算法复杂度。
A: 调整浮点精度参数,通常设置为1e-6到1e-9。
A: 点击失败的测试点,在弹窗中查看完整的输入输出对比。
欢迎提交Issue和Pull Request来改进这个项目!
- Fork本项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature
) - 提交更改 (
git commit -m 'Add some AmazingFeature'
) - 推送到分支 (
git push origin feature/AmazingFeature
) - 开启Pull Request
如有问题或建议,请通过以下方式联系:
- 提交Issue
⭐ 如果这个项目对你有帮助,请给个Star支持一下!