--------------------------------------------------------------------
[005目录结构]
--------------------------------------------------------------------
.
|-- book-2008-08-24
|-- install.sh
|-- judge.sh
|-- readme
`-- sample.sh
0 directories, 5 files
--------------------------------------------------------------------
[./readme]
--------------------------------------------------------------------
程序功能:
类似于JudgeOnline的程序本地测试工具
安装方法:
./install.sh
使用说明:
1.sample.sh
(1)
首次运行sample.sh
生成
input/
output/
standard/
tmp/
提示异常退出不用理会
(2)
测试数据放于input/中,测试数据文件后缀为.in
即使不用输入数据的程序也应放入一个新建文件,后缀为.in
(3)
标准源程序编译后,生成a.out
将a.out放在standard/
(4)
运行sample.sh即可生成对应测试数据的结果于output/
供judge.sh使用
2.judge.sh
(1)
先确认运行了sample.sh,已经配置好标准数据环境
(2)
运行judge.sh source_file_name
即可查看程序运行结果是否正确,是否符合标准答案
注意:
本程序目前只支持c,c++和pascal源代码
--------------------------------------------------------------------
[./judge.sh]
--------------------------------------------------------------------
#!/bin/sh
#程序名称:JudgeOnline本地练习版
#联系方式:babyaries@126.com
#查看程序运行时间: /usr/bin/time -f "time(s):%e memory(kb):%t" judge.sh main.c
e_param_error=65
info="程序异常退出!"
infile=
filenum=0
process_gcc()
{
gcc "$1"
if [ $? -ne 0 ] ; then
echo "源代码"$1"语法错误"
echo "$info"
exit 1
fi
}
process_fpc()
{
fpc -oa.out "$1"
if [ $? -ne 0 ] ; then
echo "源代码"$1"语法错误"
echo "$info"
exit 1
fi
}
compare()
{
for name in input/*
do
if [ -f "$name" ] ; then
case "$name" in
*.in)
get_filename "$name"
output
judge
filenum=$(($filenum+1))
;;
esac
fi
done
}
get_filename()
{
infile=${1##*/};
infile=${infile%%.*}
}
output()
{
/usr/bin/time -f "time(s):%e memory(kb):%t" ./a.out < input/"$infile".in > tmp/"$infile".out
}
judge()
{
diff output/"$infile".out tmp/"$infile".out
if [ $? -ne 0 ] ; then
echo "$infile.in输出的数据和标准答案不符"
exit 1
fi
}
param_error()
{
echo "usage: ./`basename "$0"` source_file_name"
exit $e_param_error
}
if [ $# != 1 ] ; then
param_error
fi
if [ ! -e "$1" ] ; then
echo "$1 不存在"
echo "$info"
exit 1
fi
if [ ! -f "$1" ] ; then
echo "$1 不是正规文件"
echo "$info"
exit 1
fi
case "$1" in
*.c)
process_gcc "$1"
compare
;;
*.cpp)
process_gcc "$1"
compare
;;
*.pas)
process_fpc "$1"
compare
;;
*)
echo "$1 文件后缀不为c,cpp或pas"
echo "$info"
;;
esac
if [ $filenum -eq 0 ] ; then
echo "input文件夹内不存在标准数据文件"
echo "$info"
fi
echo "答案正确!"
exit 0
--------------------------------------------------------------------
[./install.sh]
--------------------------------------------------------------------
#!/bin/sh
#程序名称:JudgeOnline本地练习版
#联系方式:babyaries@126.com
info="安装文件缺失,安装过程中断!"
name="JudgeOnline本地练习版"
installdir="/usr/local/bin/"
if [ ! -e sample.sh ] ; then
echo "$info"
exit 1
fi
if [ ! -e judge.sh ] ; then
echo "$info"
exit 1
fi
chmod +x sample.sh
chmod +x judge.sh
cp sample.sh "$installdir"
cp judge.sh "$installdir"
echo "$name安装成功!"
exit 0
--------------------------------------------------------------------
[./sample.sh]
--------------------------------------------------------------------
#!/bin/sh
#程序名称:JudgeOnline本地练习版
#联系方式:babyaries@126.com
#若不用get_filename() 去除最大匹配前缀要考虑用string=
checkfile=
infile=
filenum=0
info="目录结构不完整,程序中断!"
get_filename()
{
infile=${1##*/}
infile=${infile%%.*}
}
output()
{
./standard/a.out < input/"$infile".in > output/"$infile".out
}
echo "检查目录结构的完整性"
for checkfile in input output standard tmp
do
if [ ! -e "$checkfile" ] ; then
mkdir "$checkfile"
fi
done
for checkfile in standard/a.out
do
if [ ! -e "$checkfile" ] ; then
echo "$info"
exit 1
fi
done
echo "目录结构检查完毕"
echo "开始制作judge.sh所需的标准数据文件"
for name in input/*
do
if [ -f "$name" ] ; then
case "$name" in
*.in)
get_filename "$name"
output
filenum=$(($filenum+1))
;;
esac
fi
done
echo "$filenum个标准数据文件制作完成!"
exit 0
--------------------next---------------------