燕山大学Linux的OJ系统设计样例

 

燕山大学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

代码链接:

https://download.csdn.net/my

共勉!

猜你喜欢

转载自blog.csdn.net/lzjstudy/article/details/81101071