燕山大学Linux的OJ系统设计样例
这个脚本中,最关键的就是编译比较代码,这就是OJ系统的核心,具体代码在链接里面,希望大家好好研究,有不足的地方尽管指出!
通过gcc 编译目录下的.c 文件,将编译的结果写入a.txt
gcc /home/liuzejiang/myfile/cs/temp.c >>a.txt 2>&1
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了a.txt。那么标准错误也会输出到a.txt
cat /dev/null >/home/liuzejiang/myfile/cs/b.txt
可以/dev/null等价于一个只写文件. 写入它的内容都会永远丢失. 从它那读取内容什么也读不到
while read line
do
echo $line | /home/liuzejiang/myfile/cs/a.out >>/home/liuzejiang/myfile/cs/b.txt
echo "写入结果"
done </home/liuzejiang/myfile/T1234/cin.txt
逐行done从cin.txt里面读取内容。参数line,当接收到参数的时候通过管道线传给a.out文件运行 ,将运行结果输出的b.txt
cmp -s /home/liuzejiang/myfile/cs/b.txt /home/liuzejiang/myfile/T1234/cout.txt
if [ $? -eq 0 ];
then
echo -n "答案正确"
cmp比较两个文件 b.txt是得到的结果,a.txt是已经给乐的正确答案,-s 只返回退出值。值 0 指示相同的文件;值 1 指示不同的文件;值 2 指示不可访问的文件或缺少选项。
if diff /home/liuzejiang/myfile/cs/b.txt /home/liuzejiang/myfile/$TMID/cout.txt ;
then
cat /home/liuzejiang/myfile/cs/b.txt
cat /home/liuzejiang/myfile/$TMID/cout.txt
echo -n "答案正确
也可以用diff 来比较。
注意!在输出结果的时候,如果是C语言,一定要带上\n,否则会出错!
printf("%d\n",a-b);
错误原因是因为Linux的TXT的二进制头有隐藏,如果不用\n的话,即使内容一样,它也得不到正确结果!
如果此时打开输出文件b.txt,会发现它的光标在最左侧,即使你人为把光标移动到右侧,两个文件答案一样,判断的也是错误!所以在写OJ用C语言的时候,输出的时候务必加上“\n”
mysql -uroot -p数据库密码 <<EOF
use test;
insert into result values("1","001","`date`","sad","AC" )
EOF
EOF是END Of File的缩写,表示自定义终止符.
好了,这些就是OJ系统的核心了,它就需要一个把咱们写的代码编译成a.out文件,然后拿给定的数据,用这个a.out进行计算,得到的结果于真实结果比较,如果正确,那么AC,如果错误,那么WA, 至于需要的判断超时,可以调用系统的运行进程的时间,超出内存可以调用系统的当前进程的内存大小判断。
目录:
讲解:
1 2 文件夹是存放的cin.txt和cout.txt,意思是测试数据和真实结果。cs文件存放的是temp.c和a.out和b.txt,temp.c是每次从cxpc复制过来的.c 文件,a.out是temp.c的编译后的文件,如果不更改名字每次都默认a.out所以每次编译都会覆盖这个a.out。
b.txt是把cin.txt输入a.out之后得到的结果,存入b.txt。最后用b.txt和cout.txt作比较,判断对错。
right存放的是学生提交的正确的代码,每当结果正确,会把代码从提交初cxpc移动到right。
cxpc里面的123.2.c是学号为123的学生做的第2套.c的题。所以大家测试的时候在cxpc里面的.c 文件命名得是qqq.p.c ,p那个位置是标准答案包的名字,如上图的1 或者 2 ,当然你可以自己写更多标准输入输出包。
如果想从windows转移到虚拟机上记得安装VMware Tools。
如果有问题,可以私信我 QQ:1239825268
备注:CSDN
代码链接:
共勉!