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调用shell判断当前进程是否存在

    使用subprocess模块判断当前进程是否存在 #! /usr/bin/env python import subprocess res = subprocess.Popen(r'ps -ef |g ...

  2. Cisco交换机基础命令 + Win Server08 R2 多网卡配置链路聚合

    最近捣鼓服务器链路集合需要配置交换机… 以前没弄过交换机,现学现卖… 一般交换机是支持telnet的,配置好ip可以直接telnet,当然如果没配的话就要用串口了,串口要选择Serial… 还好我们万 ...

  3. 常用js正则表达式大全

    常用js正则表达式大全.一.校验数字的js正则表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和 ...

  4. hdu2036

    题解: 求多边形面积 分成很多块三角形求就可以了 凹的也是支持的 代码: #include <bits/stdc++.h> using namespace std; #define rin ...

  5. Spring boot自定义启动字符画(banner)

    spring boot项目启动时会打印spring boot的ANSI字符画,可以进行自定义. 如何自定义 实现方式非常简单,我们只需要在Spring Boot工程的/src/main/resourc ...

  6. C语言关于进制转换,补码, 整数的位操作

    菜单导航: 1.二进制.八进制.十进制.十六进制的相互转换 2.原码.反码.补码 3.举例证明整数在计算机内是以补码的形式存在(以负数为例) 4.整数的位操作:按位且&.或|.异或^.取反~ ...

  7. 【Android】Android自定义属性,attr format取值类型

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> <attr name = &quo ...

  8. python全栈开发day81--jsonp

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088)案例分析

    部署ActiveMQ运行环境 在linux上部署apache-activemq-5.10.0-bin.tar.gz 通过tar -zxvf  apache-activemq-5.10.0-bin.ta ...

  10. 关于ubuntu的ssh远程登录的问题

    一. 安装ssh(参考:http://liuyifan789.iteye.com/blog/2068263) sudo apt-get install openssh-server openssh-c ...