SPJ详解

· · 个人记录

大家大多应该不想用SPJ······

原文:SPJ

看起来······好懵啊

于是!

我决心

出完第一道SPJ后出详解

现在

是时候召唤超级飞侠详解了!!!

(此篇默认Windows 10 && Dev C++ 5.11)

话说怎么打?

第一步,在https://github.com/MikeMirzayanov/testlib/archive/master.zip下载testlib-master.zip

解压到桌面

叫做testlib-master吧

ng

well

第二步

打开testlib-master,千万别手贱继续打开,

新建

checker.cpp in.txt out.txt ans.txt

为了让大家练手,这里提供kkksc03的代码

#include "testlib.h"

int main(int argc, char* argv[]) {
    registerTestlibCmd(argc, argv);
    double pans = ouf.readDouble();
    double jans = ans.readDouble();

    if (fabs(pans - jans)<0.01)
        quitf(_ok, "The answer is correct.");
    else
        quitf(_wa, "The answer is wrong: expected = %f, found = %f", jans, pans);
}

打开checker.cpp,将其复制到里面

用TDM-GCC 4.9.2 64-bit Release编译

               ^^

这是一个一直用TDM-GCC 4.9.2 32-bit Release编译testlib.h编了3天的人的警告

当然,如果你直接运行的话会出现让人尴尬的字眼

FAIL Program must be run with the following arguments: <input-file> <output-file> <answer-file> [<report-file> [<-appes>]]
Use "--help" to get help information

--------------------------------
Process exited after ----- seconds with return value 3
请按任意键继续. . .

你这么想就错了!

你以为kkksc03会这么天真吗?

你们的第一直觉去哪了?

却说世界上有一个黑框框

可以打入某些东西

让你的电脑爆炸

这是

什么?

什么??

什么???

当然是cmd啊!

打开搜索栏(Win7是打开开始后下面的一个条条,有一些是在任务栏上),打入cmd,就会弹出一个叫做命令提示符(cmd.exe)的东西。

点进去,假如你听话地把testlib-master丢进了桌面,就可以打这些东东

cd C:\Users\ASUS\Desktop\testlib-master
checker.exe in.txt out.txt ans.txt

什么?

怎么会出现

wrong output format Unexpected end of file - double expected

?

你想想

从前

我们定义了

checker.cpp时

还定义了什么?

赶紧去改out.txt和ans.txt啊!

kkksc03这段代码的意思是在out.txt和ans.txt中读入一个double数,如果两数差小于0.01就能

ok The answer is correct.

else

就会

wrong answer The answer is wrong: expected = -.------, found = -.------

如果出现了这些

这说明

你人生中第一个SPJ代码

成功了!

欢呼一下

然后

参照附录指引

测完真正的代码

checker.cpp

丢进你的测试数据

万白丛中一点蓝

必须把其压缩成checker.zip

提交吧!

还有一件事

记得加SPJ标签!

附录:

testlib基本语法

1.

kkksc03的函数

void registerTestlibCmd(argc, argv)

初始化checker,必须在最前面调用一次。

char readChar()

读入一个char,指针后移一位。

char readChar(char c)

和上面一样,但是只能读到一个字母c

char readSpace()

同 readChar(' ').

string readToken()

读入一个字符串,但是遇到空格、换行、eof为止、

long long readLong()

读入一个longlong/int64

long long readLong(long long L, long long R)

同上,但是限定范围(包括L,R)

int readInt()

读入一个int

int readInt(int L, int R),

同上,但是限定范围(包括L,R)`

double readReal()

读入一个实数

double readReal(double L, double R),

同上,但是限定范围(包括L,R)

double readStrictReal(double L, double R, int minPrecision, int maxPrecision),

读入一个限定范围精度位数的实数。

string readString(),

string readLine()

碰撞一行string,到换行或者eof为止

void readEoln()

读入一个换行符

void readEof()

读入一个eof

int eof()

判断下一个字符是否为eof

2.kkksc03的判断

quitf(\_ok, "The answer is correct. answer is %d", ans);

给出AC

quitf(\_wa, "The answer is wrong: expected = %f, found = %f", jans, pans);

给出WA

quitp(0.5,"Partially Correct get %d percent", 50);

给出PC(Partially Correct),并且可以获得该点50%的分数

当然,里面的ans,jans,pans自己选(kkk的举例)

3.个人tips

在调用前面的函数(1.)时

记得

前面加---.(结构体)

inf对应in.txt(输入)

ouf对应out.txt(输出)

ans对应ans.txt(答案)

其他都一样

头文件只要testlib.h

而且要""包起来(! <>)

OK
就讲这么多

祝你

配数据

对拍

快乐!