Cena评测系统,最受欢迎的信息学竞赛离线评测系统。

它是开放源程序的信息学竞赛评测系统,能满足大多数程序设计竞赛的测评需求。

特色功能:

通过局域网自动收取选手程序。

高效率的数据文件配置工具。

自动选用对应的编译器来编译选手程序,也能使用解释器或直接评测可执行文件。

能准确测出选手程序的运行时间和内存使用量,并可加入对运行时间和内存使用的限制。

自动比较选手程序的输出和标准输出的差异,并能将两者出现差异的具体位置告诉评测者。

支持使用自定义校验器,可评测有多解的试题。

可对评测结果进行统计分析。

可将评测结果以各种样式打印或导出。

注意事项:

Cena 0.8.1 安装程序: cena-0.8.1-20110710-setup.exe[1]  。如果它崩溃,就用这个补丁 cena-0.8.2-patch.zip 里的文件覆盖到安装目录。2011-08-21 发布0.8.2版本。但愿它不再崩溃。(截止2013年8月1日最新版)

自定义校验器(Special Judge)编辑

Cena评测软件提供了使用自定义校验器进行评分的功能。可以使用C++或者Pascal进行编写评测插件,其中Pascal需要载入软件所提供的运行库。cena的用处还是很大的,以下是一个关于自定义校验器的模板,使用时需要放在data文件夹下,要有exe文件

cena的SJ主要是由pascal语言编写的,其原因是cena附的用于SJ的库函数是给pascal使用的。

那个库文件位于cena安装文件夹/lib/libcheck.pas。

使用时把写好的SJ程序和libcheck.pas放到同一目录下,然后编译出exe。

在cena的试题配置选项卡当中,"比较方式"选"使用自定义校验器",然后下面"自定义校验器"一栏选择刚刚编译出来的exe就好了。

想用C++编写SJ的朋友,我也百度到了一个不错的模板。已经试用过了。下面会一起给出一个sample。当然C++代码的编译就和libcheck.pas没关系了,确实省事一些。

{cena的帮助文件中对于libcheck.pas的说明}
{注意其中 fso : double 有误,这一变量名应为fsco}
libcheck.pas(位置:安装路径\lib\) 说明如下:
变量:
std: Text; { 用于读取标准输出文件 }
rep: Text; { 用于写入校验信息 }
fso: Double; { 为这个测试点的满分 }
过程:
procedure Score(AScore: Double); { 用于向评测系统报告得分 }
procedure Finish; { 结束 }
{这个是CEOI 2011 Day1 T1 balloons的SPJ的代码}
{读入n并判断选手输出的n个浮点数是否在允许的误差范围内}
uses
libcheck;
var
n,i: longint;
x,y: extended;
bin,bout: text;
procedure ends(x:double); {返回得分为x并结束程序}
begin
score(x);
writeln(rep,n,' lines checked');
writeln(rep,'SJ by wyl8899');
Finish;
halt;
end;
begin
assign(bin,'balloons.in'); reset(bin);
readln(bin,n); close(bin);
assign(bout,'balloons.out'); reset(bout);
for i:=1 to n do
begin
readln(std,y);
if seekeof(bout) then
begin
writeln(rep,'Output Too Short');
ends(0);
end;
readln(bout,x);
if (x-y>0.001001)or(y-x>0.001001) then
begin
writeln(rep,'Line ',i);
writeln(rep,'Std:',y:0:3);
writeln(rep,'W A:',x:0:3);
ends(0);
end;
end;
if not seekeof(bout) then
begin
writeln(rep,'Output Too Long');
ends(0);
end;
ends(fsco);
end.
//CEOI 2011 Day1 T1 balloons的SPJ的代码 ( C++ 模板 )
#include<cstdio>
#include<cstdlib>
FILE *fscore,*freport,*fstd,*fin,*fout;
bool Judge()
{
double x,y,dif;
fscanf(fstd,"%lf",&x);
fscanf(fout,"%lf",&y);
dif=(x>y)?(x-y):(y-x);
fprintf(freport,"Std:%.10lf\nYour Ans:%.10lf\nDiffer:%.10lf\n",x,y,dif);
return dif<=0.000001;
}
int main(int argc,char *argv[])
{
fscore=fopen("score.log","w"); //打开得分文件
freport=fopen("report.log","w");//打开报告文件
fstd=fopen(argv[2],"r"); //打开测试点标准输出文件
int score=atoi(argv[1]); //取得测试点的分数 fin=fopen("elephant.in","r"); //打开测试点标准输入文件
fout=fopen("elephant.out","r"); //打开用户的数据输出文件
if (!fout)
{
fprintf(fscore,"%d",0); //返回0分
fprintf(freport,"no output");//报告Judge结果为no output
}
else if (Judge()) //Judge后结果为真
{
fprintf(fscore,"%d",score);//返回满分
fprintf(freport,"right"); //报告Judge结果为right
}
else
{
fprintf(fscore,"%d",0); //返回0分
fprintf(freport,"wrong");//报告Judge结果为wrong
} fclose(fscore);//关闭得分文件
fclose(freport);//关闭报告文件
return 0;
}

实例演示:

1299. bplusa
☆   输入文件:bplusa.in   输出文件:bplusa.out   评测插件

【题目描述】

输入一个整n,将其拆为两个非负整数a,b,使a,b的和等于n。

【输入格式】

输入数据只有一行,为一个整数。

【输出格式】

输出数据只有一行,两个整数,中间用一个空格隔开。

【样例输入】

5

【样例输出】

2 3

选手代码:

#include<stdio.h>

int main()
{
freopen("bplusa.in","r",stdin);
freopen("bplusa.ans","w",stdout);
int n;
scanf("%d",&n);
printf("1 %d",n-1);
return 0;
}

Special Judge 代码(评测插件)

#include<cstdio>
#include<cstdlib>
FILE *fscore,*freport,*fstd,*fin,*fout;
bool Judge()
{
int n,x,y,dif;
fscanf(fin,"%d",&n);
fscanf(fout,"%d%d",&x,&y);
dif=n==(x+y)?1:0;
fprintf(freport,"Std:%d + :%d == n:%d\n",x,y,dif);
return dif;
}
int main(int argc,char *argv[])
{
fscore=fopen("score.log","w"); //打开得分文件
freport=fopen("report.log","w");//打开报告文件
fstd=fopen(argv[2],"r"); //打开测试点标准输出文件
int score=atoi(argv[1]); //取得测试点的分数 fin=fopen("bplusa.in","r"); //打开测试点标准输入文件
fout=fopen("bplusa.ans","r"); //打开用户的数据输出文件
if (!fout)
{
fprintf(fscore,"%d",0); //返回0分
fprintf(freport,"no output");//报告Judge结果为no output
}
else if (Judge()) //Judge后结果为真
{
fprintf(fscore,"%d",score); //返回满分
fprintf(freport,"right"); //报告Judge结果为right
}
else
{
fprintf(fscore,"%d",0);//返回0分
fprintf(freport,"wrong");//报告Judge结果为wrong
} fclose(fscore); //关闭得分文件
fclose(freport); //关闭报告文件
return 0;
}

CENA代码评测软件系列之一:简介

cena评测系统:自定义校验器(自定义评测插件编写)的更多相关文章

  1. 关于CCR测评器的自定义校验器(Special Judge)

    引言 有时我们需要使用CCR测评器(CCR-Plus是一个开源的信息学竞赛测评软件,Github链接https://github.com/sxyzccr/CCR-Plus)进行SpecialJudge ...

  2. struts系列:校验(二)自定义校验器

    一.自定义校验类 public class PasswordValidator extends FieldValidatorSupport { @Override public void valida ...

  3. Bean Validation完结篇:你必须关注的边边角角(约束级联、自定义约束、自定义校验器、国际化失败消息...)

    每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JSR303.JSR349.JSR380)H ...

  4. 【参数校验】 自定义校验器 (实现ConstraintValidator)

    日常工作中写接口时,往往需要校验前端传来的枚举状态码,例如"1","2"等等, 这里使用java 303规范的参数校验框架封装一个自定义参数校验器: /** * ...

  5. struts2内置拦截器和自定义拦截器详解(附源码)

    一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...

  6. 自定义校验注解ConstraintValidator

    一 前言 系统执行业务逻辑之前,会对输入数据进行校验,检测数据是否有效合法的.所以我们可能会写大量的if else等判断逻辑,特别是在不同方法出现相同的数据时,校验的逻辑代码会反复出现,导致代码冗余, ...

  7. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

  8. (转)JVM——自定义类加载器

    背景:为什么要自定义,如何自定义,实现过程 转载:http://blog.csdn.net/SEU_Calvin/article/details/52315125 0. 为什么需要自定义类加载器 网上 ...

  9. JVM——自定义类加载器

    )以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节码,为了安全性,这些字节码经过了加密处理.这个时候你就需要自定义类加载器来从某个网络地址上读取加密后的字节代码,接着 ...

随机推荐

  1. python 内置数据类型之数字

    目录: 1.2. 数字 1.2.1. 数字类型 1.2.2. 浮点数 1.2.3. 进制记数 1.2.4. 设置小数精度 1.2.5. 分数 1.2.6. 除法 1.2 数字   1.2.1 数字类型 ...

  2. String 类的实现(2)引用计数与写时拷贝

    1.引用计数 我们知道在C++中动态开辟空间时是用字符new和delete的.其中使用new test[N]方式开辟空间时实际上是开辟了(N*sizeof(test)+4)字节的空间.如图示其中保存N ...

  3. python爬虫-淘宝商品密码(图文教程附源码)

    今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...

  4. windows上编译boost库

    要用xx库,编译boost时就指定--with-xx.例如: # 下载并解压boost_1.58 # 进入boost_1.58目录 bjam.exe toolset=msvc-14.0 --build ...

  5. python---手动实现两个有序列表的合并

    可能又和标准的实现不一样, 但是自己的实现, 印象就会不一样的. # coding = utf-8 # 两个有序列表的合并,将two_list合并到one_list def merge_order_l ...

  6. OpenJDK-study-002 从GitHub下载openjdk,以及Cygwin的安装

    承前启后 由于上一篇openjdk-study-001中,从Mercurial直接拉取openjdk森林失败,于是网上搜了一下,发现GitHub上有人分享openjdk的源码 https://gith ...

  7. [转] Webpack-CommonsChunkPlugin

    当前项目结构   项目结构 其中 Greeter.js 引用了 config.json main.js 和 second.js 都引用了 Greeter.js main.js 还引用了 onlyfor ...

  8. 【Android】详解Android动画之Interpolator插入器

    Interpolator英文意思是: 篡改者; 分类机; 校对机 SDK对Interpolator的描述是:An interpolator defines the rate of change of ...

  9. python全栈开发day56-mysql

    1.数据库和表 show总结 SHOW DATABASES;返回可用数据库的一个列表. SHOW TABLES;返回当前选择的数据库内可用表的列表. SHOW COLUMNS FROM custome ...

  10. [转]android sqlite db-journal文件产生原因及说明 .

    http://blog.csdn.net/kaiwii/article/details/8609093 今天在android中将sqlite的数据库文件生成在SD卡上的过程中,发现生成的.db文件的旁 ...